From b661d333e7e8c28ce5c47dbdb08990b58ccba85e Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 14 Nov 2025 11:20:52 +0800 Subject: [PATCH 01/46] =?UTF-8?q?feat:=E5=8F=91=E7=A5=A8=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/api/dto/recharge/WalletRechargeApplyDto.java | 5 +++++ .../wallet/api/vo/recharge/WalletRechargeApplyVo.java | 5 +++++ .../resources/mapper/recharge/WalletRechargeApplyMapper.xml | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeApplyDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeApplyDto.java index 57d357aeb..fc072b9d1 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeApplyDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeApplyDto.java @@ -27,4 +27,9 @@ public class WalletRechargeApplyDto extends WalletRechargeApplyEntity { * 审批相关 */ private Boolean isFindCheckUser = false; + + /** + * 发票编号 + */ + private String invoiceCode; } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyVo.java index 76197174a..4d06416cf 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyVo.java @@ -45,4 +45,9 @@ public class WalletRechargeApplyVo extends WalletRechargeApplyEntity implements */ private Integer totalPrice; + /** + * 发票编号 + */ + private String invoiceCode; + } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeApplyMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeApplyMapper.xml index 0ba2c157d..3a71db167 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeApplyMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeApplyMapper.xml @@ -65,14 +65,19 @@ t.unique_code as walletTypeUniqueCode, t.icon as walletTypeIcon, t.is_rule as isRule, + i.code as invoiceCode, (select sum(i.price) from wallet_recharge_import i where i.del_flag = '0' and i.apply_id = a.id) as totalPrice from wallet_recharge_apply a left join wallet_type t on a.wallet_type_id = t.id and t.del_flag = '0' + left join wallet_recharge_invoice i on i.id = a.invoice_id and i.del_flag = '0' + + and i.code = #{dto.invoiceCode} + group by a.id From efc7f1bf2756e85b771db8950e115b98715d5668 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 14 Nov 2025 14:30:38 +0800 Subject: [PATCH 02/46] =?UTF-8?q?fix:=E9=92=B1=E5=8C=85=E6=9F=A5=E8=AF=A2b?= =?UTF-8?q?ug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WalletTransactionController.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java index 6f634d272..21d6c8edc 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.datascope.DataScopeFuncEnum; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.common.security.service.PjcloudUser; @@ -191,7 +192,7 @@ public class WalletTransactionController { dto.setBizTypes(WalletBizEnum.getTopUpCodes()); dto.setType(WalletTransactionDto.TYPE_INCOME); - DataScope dataScope = DataScope.of(); + DataScope dataScope = null; Long count = walletTransactionMapper.count(dto, dataScope); if (count > 5000) throw new RuntimeException("导出数据超出5000条,请缩小查询范围"); @@ -204,7 +205,8 @@ public class WalletTransactionController { public R czTotal(@RequestBody WalletTransactionDto dto) { dto.setBizTypes(WalletBizEnum.getTopUpCodes()); dto.setType(WalletTransactionDto.TYPE_INCOME); - return R.ok(walletTransactionService.walletTypetotal(dto, DataScope.of())); + DataScope dataScope = null; + return R.ok(walletTransactionService.walletTypetotal(dto, dataScope)); } @Operation(summary = "记账扣款导出", description = "记账扣款导出") @@ -214,7 +216,7 @@ public class WalletTransactionController { dto.setBizTypes(WalletBizEnum.getTopUpCodes()); dto.setType(WalletTransactionDto.TYPE_EXPENSE); - DataScope dataScope = DataScope.of(); + DataScope dataScope = null; Long count = walletTransactionMapper.count(dto, dataScope); if (count > 5000) throw new RuntimeException("导出数据超出5000条,请缩小查询范围"); @@ -227,7 +229,8 @@ public class WalletTransactionController { public R jzTotal(@RequestBody WalletTransactionDto dto) { dto.setBizTypes(WalletBizEnum.getTopUpCodes()); dto.setType(WalletTransactionDto.TYPE_EXPENSE); - return R.ok(walletTransactionService.walletTypetotal(dto, DataScope.of())); + DataScope dataScope = null; + return R.ok(walletTransactionService.walletTypetotal(dto, dataScope)); } @@ -237,7 +240,7 @@ public class WalletTransactionController { public void exportXf(HttpServletResponse response, @RequestBody WalletTransactionDto dto) { dto.setBizTypes(List.of(WalletBizEnum.PAYMENT.getCode())); - DataScope dataScope = DataScope.of(); + DataScope dataScope = null; Long count = walletTransactionMapper.count(dto, dataScope); if (count > 5000) throw new RuntimeException("导出数据超出5000条,请缩小查询范围"); @@ -249,7 +252,8 @@ public class WalletTransactionController { @PostMapping("/xf-total") public R xfTotal(@RequestBody WalletTransactionDto dto) { dto.setBizTypes(List.of(WalletBizEnum.PAYMENT.getCode())); - return R.ok(walletTransactionService.walletTypetotal(dto, DataScope.of())); + DataScope dataScope = null; + return R.ok(walletTransactionService.walletTypetotal(dto, dataScope)); } @Operation(summary = "退款导出", description = "退款导出") @@ -259,7 +263,7 @@ public class WalletTransactionController { dto.setBizTypes(List.of(WalletBizEnum.REFUND.getCode())); dto.setIsFindOrder(true); - DataScope dataScope = DataScope.of(); + DataScope dataScope = null; Long count = walletTransactionMapper.count(dto, dataScope); if (count > 5000) throw new RuntimeException("导出数据超出5000条,请缩小查询范围"); @@ -272,7 +276,8 @@ public class WalletTransactionController { public R tkTotal(@RequestBody WalletTransactionDto dto) { dto.setBizTypes(List.of(WalletBizEnum.REFUND.getCode())); dto.setIsFindOrder(true); - return R.ok(walletTransactionService.walletTypetotal(dto, DataScope.of())); + DataScope dataScope = null; + return R.ok(walletTransactionService.walletTypetotal(dto, dataScope)); } @Operation(summary = "后台退还各自食堂记录导出", description = "后台退还各自食堂记录导出") @@ -282,7 +287,7 @@ public class WalletTransactionController { dto.setBizTypes(List.of(WalletBizEnum.RETURN_CANTEEN.getCode())); dto.setIsFindOrder(false); - DataScope dataScope = DataScope.of(); + DataScope dataScope = null; Long count = walletTransactionMapper.count(dto, dataScope); if (count > 5000) throw new RuntimeException("导出数据超出5000条,请缩小查询范围"); @@ -295,7 +300,8 @@ public class WalletTransactionController { public R thTotal(@RequestBody WalletTransactionDto dto) { dto.setBizTypes(List.of(WalletBizEnum.RETURN_CANTEEN.getCode())); dto.setIsFindOrder(false); - return R.ok(walletTransactionService.walletTypetotal(dto, DataScope.of())); + DataScope dataScope = null; + return R.ok(walletTransactionService.walletTypetotal(dto, dataScope)); } } \ No newline at end of file From 3d3c8f17e1c7c629621eb2167bb38f6ff1bd04e1 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 14 Nov 2025 16:59:00 +0800 Subject: [PATCH 03/46] 1 --- .../controller/order/HardOrderController.java | 23 +++++++++++++++++++ .../hard/service/HardOrderService.java | 6 +++++ .../impl/order/HardOrderServiceImpl.java | 13 +++++++++++ 3 files changed, 42 insertions(+) diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java index 6846600a1..bd47a76ce 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java @@ -274,6 +274,29 @@ public class HardOrderController { return R.ok(hardwareOrderService.scopePageList(page, dto, dataScope)); } + @Operation(summary = "分页查询未识别订单", description = "分页查询未识别订单") + @PostMapping("/no-recog/page-join") + @PreAuthorize("@pms.hasPermission('hard_hardwareOrderNoRecog_view')") + public R> noRecogPageJoin(@ParameterObject Page page, @RequestBody HardOrderDto dto) { + DataScope dataScope = DataScope.of().func(DataScopeFuncEnum.ALL); + dataScope.setScopeDeptName("merchant_dept_id"); + PjcloudUser user = SecurityUtils.getUser(); + CurrentUserHardTypeInfoDto hardTypeInfo = hardManagerService.getCurrentUserHardTypeInfo(user); + dto.setMchTypeCodes(hardTypeInfo.getHardTypeList()); + // 查询商户和下面的子商户 + List mchDtoIds = dto.getMchIds(); + if (ObjectUtil.isNotEmpty(mchDtoIds) && mchDtoIds.size() == 1) { + Long mchId = mchDtoIds.get(0); + List mchList = mchService.getByParentId(mchId).getData(); + if (ObjectUtil.isNotEmpty(mchList)) { + List mchIds = mchList.stream().map(MchManageVo::getId).toList(); + mchDtoIds.addAll(mchIds); + dto.setMchIds(mchDtoIds); + } + } + return R.ok(hardwareOrderService.noRecogScopePageJoin(page, dto, dataScope)); + } + @Operation(summary = "通过id查询", description = "通过id查询") @GetMapping("/{id}") @PreAuthorize("@pms.hasPermission('hard_hardwareOrder_view')") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java index b566ce736..e80c4836f 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java @@ -38,6 +38,11 @@ public interface HardOrderService extends IService { Page scopePageList(Page page, HardOrderDto dto, DataScope dataScope); + /** + * 分页查询未识别订单 + */ + Page noRecogScopePageJoin(Page page, HardOrderDto dto, DataScope dataScope); + List scopeList(HardOrderDto dto, DataScope dataScope); HardOrderVo join(Long id); @@ -145,4 +150,5 @@ public interface HardOrderService extends IService { * 是否需要支付 */ boolean isPay(HardOrderTypeEnum type, HardPayTypeEnum payType); + } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index 4c622f1a4..1195c29bf 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -19,6 +19,7 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.admin.api.vo.UserVO; import com.bsd.pjcloud.canteen.api.feign.RemoteOnlineCanteenSpuService; +import com.bsd.pjcloud.canteen.constant.OrderTypeEnum; import com.bsd.pjcloud.canteen.dto.CanteenSpuUpdateStockReqDTO; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.CommonConstants; @@ -60,6 +61,7 @@ import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.HardCreateHardQrCodeScanOrderVo; +import com.bsd.pjcloud.hard.api.vo.order.HardOrderPayTypeVo; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo; import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; @@ -188,6 +190,17 @@ public class HardOrderServiceImpl extends ServiceImpl noRecogScopePageJoin(Page page, HardOrderDto dto, DataScope dataScope) { + dto.setOrderPayTypeCodes(List.of(HardPayTypeEnum.HARD_DOOR_FREE_PAY.getType())); + dto.setOrderStatus(HardOrderStatusEnum.CREATE.getType()); + Page list = baseMapper.scopePageList(page, dto, dataScope); + disposeList(list.getRecords(), dto); + return list; + } @Override public HardOrderVo join(Long id) { From 53d6dfd5510fae7596fd3ab582c80a7ab29cef6a Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Sat, 22 Nov 2025 14:03:56 +0800 Subject: [PATCH 04/46] =?UTF-8?q?feat:=E7=BC=96=E5=88=B6=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/constant/UserStaffingTypeEnum.java | 26 +++++++++++++++++++ .../bsd/pjcloud/admin/api/entity/SysUser.java | 12 +++++++++ .../bsd/pjcloud/admin/api/vo/UserExcelVO.java | 6 +++++ .../com/bsd/pjcloud/admin/api/vo/UserVO.java | 5 ++++ .../service/impl/SysUserServiceImpl.java | 7 +++++ .../main/resources/mapper/SysUserMapper.xml | 7 +++++ 6 files changed, 63 insertions(+) create mode 100644 pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java new file mode 100644 index 000000000..e6d63f96a --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.admin.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户在编情况 + */ +@AllArgsConstructor +@Getter +public enum UserStaffingTypeEnum { + STAFFING("1", "在编"), + NONE_STAFFING("2", "非在编"), + ; + private final String type; + private final String description; + + public static UserStaffingTypeEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().orElse(null); + } + +} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java index b23834d93..29e2f6028 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java @@ -240,9 +240,21 @@ public class SysUser extends Model implements Serializable { @Schema(description = "员工浙政钉编码") private String dingtalkEmployeeCode; + /** + * 员工所属系统类型 + */ @Schema(description = "员工所属系统类型") private String systemType; + /** + * 是否为全局人脸 + */ @Schema(description = "是否为全局人脸") private String isGlobalFace; + + /** + * 编制类型 + */ + @Schema(description = "编制类型") + private String staffingType; } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java index 157b7a794..5482af766 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java @@ -92,6 +92,12 @@ public class UserExcelVO implements Serializable { @ExcelProperty("岗位名称") private String postNameList; + /** + * 编制 + */ + @ExcelProperty("编制") + private String staffingType; + /** * 锁定标记 */ diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java index 4097d9686..a0315c920 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java @@ -241,4 +241,9 @@ public class UserVO implements BaseFacesInterface, Serializable { * 商户相关 */ private String merchantName; + + /** + * 编制类型 + */ + private String staffingType; } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index 2838ebdc3..f59a91e46 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -33,6 +33,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.constant.UserStaffingTypeEnum; import com.bsd.pjcloud.admin.api.constant.UserStateEnum; import com.bsd.pjcloud.admin.api.dto.SysUserFaceDto; import com.bsd.pjcloud.admin.api.dto.UserDTO; @@ -473,6 +474,12 @@ public class SysUserServiceImpl extends ServiceImpl impl excelVO.setRoleNameList(roleNameList); String postNameList = userVO.getPostList().stream().map(SysPost::getPostName).collect(Collectors.joining(StrUtil.COMMA)); excelVO.setPostNameList(postNameList); + if (ObjectUtil.isNotEmpty(userVO.getStaffingType())) { + UserStaffingTypeEnum staffingTypeEnum = UserStaffingTypeEnum.valueOfByType(userVO.getStaffingType()); + if (ObjectUtil.isNotEmpty(staffingTypeEnum)) { + excelVO.setStaffingType(staffingTypeEnum.getDescription()); + } + } return excelVO; }).collect(Collectors.toList()); return userExcelVOList; diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml index 889ba6d9b..eaebeb9e8 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -50,6 +50,7 @@ + @@ -116,6 +117,7 @@ u.create_by, u.create_time ucreate_time, u.update_time uupdate_time, + u.staffing_type, d.name dept_name, d.dept_id @@ -170,6 +172,7 @@ u.name, u.email, u.is_global_face, + u.staffing_type, d.name dept_name FROM sys_user u @@ -194,6 +197,9 @@ AND u.dept_id = #{query.deptId} + + AND u.staffing_type = #{query.staffingType} + and urole.role_id IN @@ -263,6 +269,7 @@ u.nickname, u.name, u.email, + u.staffing_type, d.name dept_name FROM sys_user u From 05480e806b2947b22f2ca8c182cebbd33da2b6bc Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Sat, 29 Nov 2025 15:53:56 +0800 Subject: [PATCH 05/46] =?UTF-8?q?feat:=E5=9C=A8=E7=BC=96=E9=9D=9E=E7=BC=96?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/vo/total/UserStaffingTotalVo.java | 40 ++++++++ .../admin/controller/SysUserController.java | 21 +++-- .../total/SysUserTotalController.java | 41 ++++++++ .../pjcloud/admin/mapper/SysUserMapper.java | 63 +++++++------ .../admin/service/SysUserTotalService.java | 16 ++++ .../impl/total/SysUserTotalServiceImpl.java | 93 +++++++++++++++++++ .../main/resources/mapper/SysUserMapper.xml | 32 +++++++ 7 files changed, 269 insertions(+), 37 deletions(-) create mode 100644 pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/total/SysUserTotalController.java create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTotalService.java create mode 100644 pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/total/SysUserTotalServiceImpl.java diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java new file mode 100644 index 000000000..e9fa29b1c --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java @@ -0,0 +1,40 @@ +package com.bsd.pjcloud.admin.api.vo.total; + +import lombok.Data; + +import java.util.List; + +@Data +public class UserStaffingTotalVo { + + /** + * 部门id + */ + private Long deptId; + + /** + * 部门名 + */ + private String deptName; + + /** + * 部门总人数 + */ + private Long deptTotalPerson = 0L; + + /** + * 在编人数 + */ + private Long staffingPerson = 0L; + + /** + * 非在编人数 + */ + private Long noneStaffingPerson = 0L; + + /** + * 统计人数 + */ + private Long totalPerson = 0L; + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java index 8c37f4894..c69cafa62 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java @@ -133,16 +133,16 @@ public class SysUserController { @GetMapping("/get-name-or-mobile") public R> getUserByNameOrMobile(@RequestParam("keyword") String keyword) { List users = userService.list( - Wrappers.query().lambda() - .eq(SysUser::getName, keyword) - .or() - .eq(SysUser::getPhone, keyword) + Wrappers.query().lambda() + .eq(SysUser::getName, keyword) + .or() + .eq(SysUser::getPhone, keyword) ); if (CollectionUtils.isEmpty(users)) { return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, keyword)); } Map deptListByDeptIds = sysDeptService.getDeptListByDeptIds( - users.stream().map(SysUser::getDeptId).collect(Collectors.toList()) + users.stream().map(SysUser::getDeptId).collect(Collectors.toList()) ); List userDeptSimpleInfos = users.stream().map(user -> { UserDeptSimpleInfo userDeptSimpleInfo = new UserDeptSimpleInfo(); @@ -419,14 +419,15 @@ public class SysUserController { /** * 根据部门id查询用户列表 + * * @param deptId * @return */ // @Inner @GetMapping("/getUserIdListByDeptId") - public R> getUserIdListByDeptId(@RequestParam("deptId")Long deptId, - @RequestParam(value = "name",required = false) String name) { - return R.ok(userService.listUserIdByDeptId(deptId,name)); + public R> getUserIdListByDeptId(@RequestParam("deptId") Long deptId, + @RequestParam(value = "name", required = false) String name) { + return R.ok(userService.listUserIdByDeptId(deptId, name)); } /** @@ -497,7 +498,7 @@ public class SysUserController { @Schema(description = "根据ids获取用户map") public R> getUserMap(@RequestParam(value = "userIds") Set userIds) { LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); - sysUserLambdaQueryWrapper.in(SysUser::getUserId, userIds); + sysUserLambdaQueryWrapper.in(ObjectUtil.isNotEmpty(userIds), SysUser::getUserId, userIds); List list = userService.list(sysUserLambdaQueryWrapper); Map userMap = list.stream().collect(Collectors.toMap(SysUser::getUserId, user -> user)); return R.ok(userMap); @@ -544,7 +545,7 @@ public class SysUserController { } List list = sysUserRoleService.list(Wrappers.lambdaQuery().eq(SysUserRole::getRoleId, sysRole.getRoleId())); List userIds = list.stream().map(sysUserRole -> sysUserRole.getUserId()).collect(Collectors.toList()); - List listData = userService.list(Wrappers.lambdaQuery().in(SysUser::getUserId, userIds)); + List listData = userService.list(Wrappers.lambdaQuery().in(SysUser::getUserId, userIds)); //转换成vo,只返回id+手机号+姓名,安全考虑 List userVOList = listData.stream().map(sysUser -> { UserSimpleVo userVO = new UserSimpleVo(); diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/total/SysUserTotalController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/total/SysUserTotalController.java new file mode 100644 index 000000000..3607b84f9 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/total/SysUserTotalController.java @@ -0,0 +1,41 @@ +package com.bsd.pjcloud.admin.controller.total; + +import com.bsd.pjcloud.admin.api.dto.UserDTO; +import com.bsd.pjcloud.admin.api.vo.total.UserStaffingTotalVo; +import com.bsd.pjcloud.admin.service.SysUserTotalService; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + + +/** + * 用户相关统计 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/user/total") +@Tag(description = "connect", name = "用户相关统计") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class SysUserTotalController { + + private final SysUserTotalService sysUserTotalService; + + @Operation(summary = "用户在/非编人员统计", description = "用户在/非编人员统计") + @PostMapping("/staffing-total") + public R> staffingTotal(@RequestBody UserDTO dto) { + DataScope dataScope = null; + return R.ok(sysUserTotalService.staffingTotal(dto, dataScope)); + } + + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserMapper.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserMapper.java index 707e00eae..23c7e8505 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserMapper.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserMapper.java @@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.dto.UserDTO; import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.vo.UserVO; +import com.bsd.pjcloud.admin.api.vo.total.UserStaffingTotalVo; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -42,35 +43,43 @@ import java.util.List; @Mapper public interface SysUserMapper extends PjcloudBaseMapper { - /** - * 通过用户名查询用户信息(含有角色信息) - * @param username 用户名 - * @return userVo - */ - UserVO getUserVoByUsername(String username); + /** + * 通过用户名查询用户信息(含有角色信息) + * + * @param username 用户名 + * @return userVo + */ + UserVO getUserVoByUsername(String username); - /** - * 分页查询用户信息(含角色) - * @param page 分页 - * @param userDTO 查询参数 - * @param dataScope - * @return list - */ - IPage getUserVosPage(Page page, @Param("query") UserDTO userDTO, DataScope dataScope); + /** + * 分页查询用户信息(含角色) + * + * @param page 分页 + * @param userDTO 查询参数 + * @param dataScope + * @return list + */ + IPage getUserVosPage(Page page, @Param("query") UserDTO userDTO, DataScope dataScope); - /** - * 通过ID查询用户信息 - * @param id 用户ID - * @return userVo - */ - UserVO getUserVoById(Long id); + /** + * 通过ID查询用户信息 + * + * @param id 用户ID + * @return userVo + */ + UserVO getUserVoById(Long id); - /** - * 查询用户列表 - * @param userDTO 查询条件 - * @param dataScope 数据权限声明 - * @return - */ - List selectVoListByScope(@Param("query") UserDTO userDTO, @Param("ids") Long[] ids, DataScope dataScope); + /** + * 查询用户列表 + * + * @param userDTO 查询条件 + * @param dataScope 数据权限声明 + * @return + */ + List selectVoListByScope(@Param("query") UserDTO userDTO, @Param("ids") Long[] ids, DataScope dataScope); + /** + * 用户在/非编人员统计 + */ + List staffingListByDept(@Param("dto") UserDTO dto, DataScope dataScope); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTotalService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTotalService.java new file mode 100644 index 000000000..1b94ef47d --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTotalService.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.admin.service; + +import com.bsd.pjcloud.admin.api.dto.UserDTO; +import com.bsd.pjcloud.admin.api.vo.total.UserStaffingTotalVo; +import com.bsd.pjcloud.common.data.datascope.DataScope; + +import java.util.List; + +public interface SysUserTotalService { + + /** + * 用户在/非编人员统计 + */ + List staffingTotal(UserDTO dto, DataScope dataScope); + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/total/SysUserTotalServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/total/SysUserTotalServiceImpl.java new file mode 100644 index 000000000..1f29dfada --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/total/SysUserTotalServiceImpl.java @@ -0,0 +1,93 @@ +package com.bsd.pjcloud.admin.service.impl.total; + + +import cn.hutool.core.collection.IterUtil; +import cn.hutool.core.collection.IterableIter; +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.admin.api.dto.DeptAllListDto; +import com.bsd.pjcloud.admin.api.dto.UserDTO; +import com.bsd.pjcloud.admin.api.entity.SysDept; +import com.bsd.pjcloud.admin.api.vo.total.UserStaffingTotalVo; +import com.bsd.pjcloud.admin.mapper.SysDeptMapper; +import com.bsd.pjcloud.admin.mapper.SysUserMapper; +import com.bsd.pjcloud.admin.service.SysDeptService; +import com.bsd.pjcloud.admin.service.SysUserTotalService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.parameters.P; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + + +@Slf4j +@Service +@RequiredArgsConstructor +public class SysUserTotalServiceImpl implements SysUserTotalService { + + private final SysUserMapper sysUserMapper; + private final SysDeptMapper sysDeptMapper; + + private final SysDeptService sysDeptService; + + /** + * 用户在/非编人员统计 + */ + @Override + public List staffingTotal(UserDTO dto, DataScope dataScope) { + // 查询部门 + DeptAllListDto deptDto = new DeptAllListDto(); + deptDto.setIsInclude(dto.getIsInclude()); + if (ObjectUtil.isNotEmpty(dto.getDeptId())) { + deptDto.setDeptId(dto.getDeptId()); + } + if (ObjectUtil.isNotEmpty(dto.getDeptIds())) { + deptDto.setDeptId(null); + deptDto.setDeptIds(dto.getDeptIds()); + } + List deptList = sysDeptMapper.allList(deptDto); + if (ObjectUtil.isEmpty(deptList)) return null; + List disposeDeptList = deptList.stream().map(item -> { + UserStaffingTotalVo entity = new UserStaffingTotalVo(); + entity.setDeptId(item.getDeptId()); + entity.setDeptName(item.getName()); + return entity; + }).toList(); + + dto.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); + List list = sysUserMapper.staffingListByDept(dto, dataScope); + // 查询部门名字 + disposeStaffingTotal(list); + Map sqlMap = IterUtil.toMap(list, UserStaffingTotalVo::getDeptId); + + for (UserStaffingTotalVo vo : disposeDeptList) { + UserStaffingTotalVo targetMap = sqlMap.get(vo.getDeptId()); + if (ObjectUtil.isEmpty(targetMap)) continue; + vo.setDeptTotalPerson(targetMap.getDeptTotalPerson()); + vo.setStaffingPerson(targetMap.getStaffingPerson()); + vo.setNoneStaffingPerson(targetMap.getNoneStaffingPerson()); + vo.setTotalPerson(targetMap.getTotalPerson()); + } + + return disposeDeptList; + } + + private void disposeStaffingTotal(List list) { + if (ObjectUtil.isEmpty(list)) return; + List dpetIdList = list.stream().map(UserStaffingTotalVo::getDeptId).distinct().filter(ObjectUtil::isNotEmpty).toList(); + if (ObjectUtil.isNotEmpty(dpetIdList)) { + Map deptMaps = sysDeptService.getDeptListByDeptIds(dpetIdList); + if (ObjectUtil.isNotEmpty(deptMaps)) { + for (UserStaffingTotalVo v : list) { + SysDept sysDept = deptMaps.get(v.getDeptId()); + if (ObjectUtil.isEmpty(sysDept)) continue; + v.setDeptName(sysDept.getName()); + } + } + } + } + +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml index eaebeb9e8..cb1463caf 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -318,4 +318,36 @@ ORDER BY u.create_time DESC + + + From b5760313462b557a3e6302da3bbe77402a8c11ba Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Sat, 29 Nov 2025 18:50:50 +0800 Subject: [PATCH 06/46] 11 --- .../bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java | 5 +++++ .../admin/service/impl/total/SysUserTotalServiceImpl.java | 1 + .../src/main/resources/mapper/SysUserMapper.xml | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java index e9fa29b1c..af06a5aba 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java @@ -37,4 +37,9 @@ public class UserStaffingTotalVo { */ private Long totalPerson = 0L; + /** + * 未填写人数 + */ + private Long fillInPerson = 0L; + } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/total/SysUserTotalServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/total/SysUserTotalServiceImpl.java index 1f29dfada..716d980b8 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/total/SysUserTotalServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/total/SysUserTotalServiceImpl.java @@ -70,6 +70,7 @@ public class SysUserTotalServiceImpl implements SysUserTotalService { vo.setStaffingPerson(targetMap.getStaffingPerson()); vo.setNoneStaffingPerson(targetMap.getNoneStaffingPerson()); vo.setTotalPerson(targetMap.getTotalPerson()); + vo.setFillInPerson(targetMap.getFillInPerson()); } return disposeDeptList; diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml index cb1463caf..def99ddc4 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -324,7 +324,8 @@ count(0) as deptTotalPerson, sum(if(a.staffing_type = '1', 1, 0)) as staffingPerson, sum(if(a.staffing_type = '2', 1, 0)) as noneStaffingPerson, - sum(if(a.staffing_type is not null, 1, 0)) as totalPerson + sum(if(a.staffing_type is not null, 1, 0)) as totalPerson, + sum(if(a.staffing_type is null, 1, 0)) as fillInPerson from sys_user a a.del_flag = '0' From bc92b16b8522d53182abd6c1eabfb53cc5d8ee1a Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Sun, 7 Dec 2025 16:47:31 +0800 Subject: [PATCH 07/46] =?UTF-8?q?feat:=E5=9C=A8=E7=BC=96=EF=BC=8C=E9=9D=9E?= =?UTF-8?q?=E5=9C=A8=E7=BC=96=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/constant/UserStaffingTypeEnum.java | 5 +++ .../pjcloud/admin/api/vo/UserExcelFaceVo.java | 7 ++++ .../bsd/pjcloud/admin/api/vo/UserExcelVO.java | 2 + .../service/impl/SysUserServiceImpl.java | 38 +++++++++++++----- .../src/main/resources/file/user.xlsx | Bin 8923 -> 9169 bytes 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java index e6d63f96a..91fd95cef 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java @@ -23,4 +23,9 @@ public enum UserStaffingTypeEnum { return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().orElse(null); } + public static UserStaffingTypeEnum valueOfByDescription(String description) { + if (ObjectUtil.isEmpty(description)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(description, v.getDescription())).findFirst().orElse(null); + } + } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java index 56b9695fa..582f6d08f 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelFaceVo.java @@ -48,4 +48,11 @@ public class UserExcelFaceVo { */ @ExcelProperty("用户性别") private String sex; + + /** + * 编制 + */ + @ExcelProperty("编制") + private String staffingType; + } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java index 5482af766..f3d5b49b7 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserExcelVO.java @@ -98,6 +98,8 @@ public class UserExcelVO implements Serializable { @ExcelProperty("编制") private String staffingType; + private String staffingTypeParse; + /** * 锁定标记 */ diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index f59a91e46..e8ef7b1f0 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -49,32 +49,23 @@ import com.bsd.pjcloud.admin.service.*; import com.bsd.pjcloud.admin.utils.excel.ExcelTool; import com.bsd.pjcloud.admin.utils.flow.FlowUtil; import com.bsd.pjcloud.admin.utils.flow.dto.UserApplyFlowDto; -import com.bsd.pjcloud.admin.utils.flow.dto.UserFaceApplyFlowDto; import com.bsd.pjcloud.common.audit.annotation.Audit; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.CommonConstants; import com.bsd.pjcloud.common.core.constant.CommonRoleConstant; -import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.exception.ErrorCodes; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.MsgUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.resolver.ParamResolver; -import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.flow.task.dto.TaskDto; -import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; -import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; -import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; -import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; -import com.bsd.pjcloud.wallet.api.vo.MchManageVo; -import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import cn.hutool.extra.spring.SpringUtil; import lombok.AllArgsConstructor; @@ -85,7 +76,6 @@ import org.springframework.beans.BeanUtils; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Caching; import org.springframework.context.annotation.Lazy; import org.springframework.mock.web.MockMultipartFile; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @@ -533,6 +523,18 @@ public class SysUserServiceImpl extends ServiceImpl impl List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); List postCollList = postList.stream().filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))).collect(Collectors.toList()); + // 判断输入的编制是否合法 + if (ObjectUtil.isEmpty(excel.getStaffingType())) { + errorMsg.add(MsgUtils.getMessage("编制不存在", excel.getStaffingType())); + } else { + UserStaffingTypeEnum staffingTypeEnum = UserStaffingTypeEnum.valueOfByDescription(excel.getStaffingType()); + if (ObjectUtil.isEmpty(staffingTypeEnum)) { + errorMsg.add(MsgUtils.getMessage("编制选择错误,请选择`在编`和`非在编`", excel.getStaffingType())); + } else { + excel.setStaffingTypeParse(staffingTypeEnum.getType()); + } + } + if (postCollList.size() != postNameList.size()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); } @@ -627,7 +629,21 @@ public class SysUserServiceImpl extends ServiceImpl impl } } + // 判断输入的编制是否合法 + String staffingType = null; + if (ObjectUtil.isEmpty(v.getStaffingType())) { + errorMsg.add("请选择编制"); + } else { + UserStaffingTypeEnum staffingTypeEnum = UserStaffingTypeEnum.valueOfByDescription(v.getStaffingType()); + if (ObjectUtil.isEmpty(staffingTypeEnum)) { + errorMsg.add("编制选择错误,请选择<在编>和<非在编>"); + } else { + staffingType = staffingTypeEnum.getType(); + } + } + if (CollUtil.isEmpty(errorMsg)) { + v.setStaffingType(staffingType); insertExcelUser(v, deptId, roleIds, face); } else { errorMessageList.add(new ErrorMessage(v.getLineNum(), errorMsg)); @@ -655,6 +671,7 @@ public class SysUserServiceImpl extends ServiceImpl impl userDTO.setName(excel.getName()); userDTO.setEmail(excel.getEmail()); userDTO.setLockFlag(excel.getLockFlag()); + userDTO.setStaffingType(excel.getStaffingTypeParse()); // 批量导入初始密码为手机号 userDTO.setPasswordModifyTime(LocalDateTime.now()); userDTO.setPassword(userDTO.getPhone()); @@ -678,6 +695,7 @@ public class SysUserServiceImpl extends ServiceImpl impl userDTO.setNickname(excel.getName().replaceAll("\\s+", "")); userDTO.setPhone(excel.getMobile().replaceAll("\\s+", "")); userDTO.setDeptId(deptId); + userDTO.setStaffingType(excel.getStaffingType()); // 批量导入初始密码为手机号 userDTO.setPasswordModifyTime(LocalDateTime.now()); userDTO.setPassword(userDTO.getPhone().replaceAll("\\s+", "")); diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx index bb557ba597388091dc88d146ce3385f819b936df..d86950f6a50ddf3fb7430b00bd9647b39b56eef6 100644 GIT binary patch delta 5504 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 eS@dL>6C05JpR�LH`>=JFJY27aPI!*YZD);koMo From e5f652d9af991c239aa59b017b6afb7e604233bb Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 9 Dec 2025 09:47:06 +0800 Subject: [PATCH 08/46] =?UTF-8?q?=E9=9D=9E=E5=9C=A8=E7=BC=96=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=9C=A8=E7=BC=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/constant/UserStaffingTypeEnum.java | 2 +- .../service/impl/SysUserServiceImpl.java | 4 ++-- .../src/main/resources/file/user.xlsx | Bin 9169 -> 9183 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java index 91fd95cef..08bd0f0d5 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java @@ -13,7 +13,7 @@ import java.util.Arrays; @Getter public enum UserStaffingTypeEnum { STAFFING("1", "在编"), - NONE_STAFFING("2", "非在编"), + NONE_STAFFING("2", "非编"), ; private final String type; private final String description; diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index e8ef7b1f0..6b3cc21f2 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -529,7 +529,7 @@ public class SysUserServiceImpl extends ServiceImpl impl } else { UserStaffingTypeEnum staffingTypeEnum = UserStaffingTypeEnum.valueOfByDescription(excel.getStaffingType()); if (ObjectUtil.isEmpty(staffingTypeEnum)) { - errorMsg.add(MsgUtils.getMessage("编制选择错误,请选择`在编`和`非在编`", excel.getStaffingType())); + errorMsg.add(MsgUtils.getMessage("编制选择错误,请选择<在编>和<非编>", excel.getStaffingType())); } else { excel.setStaffingTypeParse(staffingTypeEnum.getType()); } @@ -636,7 +636,7 @@ public class SysUserServiceImpl extends ServiceImpl impl } else { UserStaffingTypeEnum staffingTypeEnum = UserStaffingTypeEnum.valueOfByDescription(v.getStaffingType()); if (ObjectUtil.isEmpty(staffingTypeEnum)) { - errorMsg.add("编制选择错误,请选择<在编>和<非在编>"); + errorMsg.add("编制选择错误,请选择<在编>和<非编>"); } else { staffingType = staffingTypeEnum.getType(); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx index d86950f6a50ddf3fb7430b00bd9647b39b56eef6..af27f00d183920a87d2686ea083831865be1c8e3 100644 GIT binary patch delta 1714 zcmV;j22J_VN8d-VkpTp9eN_UJl>r}rO-{ow5QX3MIyc{6e{UWw9s18s^*rYH(Rv!W3bZhMBGuXj_2s97!6&REn0?DuS_LOAyq51kNFy zIIpyz);;wCE6QHz0&pCLr&xfcoLY(-ps#u&+9EmYk?K{KEr2r&B?yq#;3$ajkJo}0 z=Ff&!*>j4*u9e$q8+V`0Sts`Hl_`2-UDrW9Xk)ni5q_H9-nXmzg=}uc0A&ehglV9* z(%FUEb_w3>?k2%|<>rJXHFoM)u01b+U#_#w*XQQrJ;A>f$7|zvP~e^mM7sDp<#BLz zolj5}hjHXbu^+~HbVj0>gyC~D_@KWD*cHTf{QtyZOC06lh@1?_Fy15X09l*+@Ka>p zP)h>@lN=!$vm^tQ0SWXXI?KQU000w{!2}_H-EPw`6uw8|9V`oR#p0y@ElH=XrEG{v z6F=kHO`OK66KA&5Y%jtUaLq&TItcL=94Ad_mR+n;YWw)}cYgdG`=@uQKs%;1msx;4 z$HjlES!@-t@suR`)4GrJ1J-P?7x~-fpde$R3xICUW?pKwHt`&+{ObcNaQhec&Ndi27#f|NQ zEH4<}BnDy|ITK47N&yV;k5X>cjZsSPU<8qu_3=JT!>TrWzAAlEAFM*MHJkfNmI(9& z43>WYqt2;Sy*C3k@L_k)thoXKMuT-XcYU&hgu*@Iyo>PK2wTPn9KAMT*+ul*h&Nrt zpp95{5yLj(Z5J_WBQCm#aT{@e*+op+2vFO@Y^MhVfuc8JsBa;HySSl(!)V(bg|f)( zbwjD!Tgcq!@K_114MtQ5S)L1;ZL7P{i7YR(yf9ZxYq|lL4FZgBl#;4ttOa`U!kfY8 z4kp9#2wd4Gtq|0kzq~D^dHws_&p*GuzWV$92Mo2zCkKpA+L1v*Z375HG>0gzsM>Hy zNkBtE<2a+~wC@g^-v}dBOZ$->XhVBqJj7@%4YYZ)O5n9+pi9^3V-!ningz5*y|=22 zw*3yz`TQS~(HtSOwFhVie~xrn$G`yq0Luda01p5F0C;RKcW-iQVsCG2E_iKhjZ@KX zn=ll8pR|9l{7wucbO8mbP=Z#esj4*1wx`L1ORx$yvYnA>+P}|0Xg775c)GsF=N|hW zU$3sub%nlzR7~&?J2M+2;F-u7KZf{epIS?dl%_nVmEaKKAE5AcfAs#{sulA2n-I^) z2yhkRQtKulL}ew^RLw*K-0T!W)>NBR9*Jrs&|H-Ox~_<8+gGHfjN?HekW(~7QLqdW zk)3MbdJvINQEjfTO4cYGtqNAbVdx0arn#rJx%auksG>@5a;6~<@!X`Mg;&7CNS>Pb z#45Av&utfz=%vXAe`%7g+XI7Ez2aSpTE=tHegt+bwXx81UAwC#fAIUJOOxQS9ozLg2AuVs(tSiH$wK@y_Li|d_g!m| zI;pjAeA|lStA*ty>D>F^BsUu`{WV&C?i7nRzSk_1LWx4pW-?Ke!SXk+=PXHI4OE|` z8H#8%s0AIGUeFh?7=TObe;p9)lCG6Y_5X;EW+*F|NKOwEi8uG#{dOYvZnOXTDV<7Q zZ{uV=oxk4g)?fCU&*Kr~pN10i=4QCYmnY*tjD7=9O9KRxPa+z#7!k$}0VAd>`geN_UJ>mbJg-;=W;HUb76lj|Wy0n?K*B0&uZ5dZ*qY%gjBNYJ~lP4oy3G^a5%fJEv027mrBRvMf I9{>OV0Ka4?jsO4v delta 1677 zcmV;826Fk|N6|;HkpT_@EYR�RRAD0ssIJ0Fx0R6Mub@-%7(U6vpob-=XBbP14~e zq3!Sw1Hs|IisD^J&bDHkmL%Hk5xnyed=Ot}?_t_*wL|eT=ljm@eCLp8x+!w+4YbKh z6(brD9?wq1j_xVwq)pxm4==T^qf-L;n)$jfcA`}*8{yhr%A;&^TR z4hqt9fmj#+pgfMQuG1MxLK0G+hCT^XLKzJiA zctAV=k~a78r%1j5vjzjQ0SS43Wc9QH000G(!2}_HOK#gR5ZxE(9S9=msu8957rT;! z#E$C}2oUs>u4##~2ved$QkHX(uG+49h+d~CdW#Mv%eAU3;)O-dJihro(!bcH0&SVn zTxJ3G92X;&g)-vVI>4VkE>6!e(uQUc6*6N1eq%k!sUT;rJ0vOP8Lk;7>Ny-Tj(N!DGAvS-nVLi~ zK@H@u6Q1jaZ5KU@FH*FGTAO^1Qk>VG1E1ILn7Tw63v}L5sPUd%uI^UJTggu$GEY*m*tZ2bz&fY zm7!CShEf0n{G*gxF=Ld{9ehF4WqrH{%dl$2p0BEw)Ca4SY>TG8k|hH90E6Z4!&m3j zirkw38^o~QOKYw`fYD&xPFIBz3BT>p1$d_WL?XnG@tdI}ND;+_f)UwgYzD2vRF8(Q6VA@i8S z+a$O)7*Qc)c_nDJsb-@SS>9xMVQ!h$bPX_@1Q@TClB#9g3-rXBEKfYQe?AxuA(VZ= z3PHW;tA|3GH^09A`2F+C>p$PV*Q?sVCpwWNuH41{kfRfs5Vj5_n%3NYizC7{yYWW&>BQ_AM%-y@7`ZeEJu& zpa+Qu1$R&HUcQqq4;+76Z<{a_exJ1eVELUGNaz9zRG|c|Qd3oFnr%;$2Zvx4Y-Bql z)3pCS1EJm2Y2xWz{GIPyy}CZv75WZRF~LLZ%xsK+XCi0(7~-dWYArERn(~}hfb5#Q9x+1P^ zUy+(Jjt7Q7PT>$m!7@lhcB+BvfkZ+@wJBeftWh{x6|928&=I0db5Cni_qoETqDpUa zrXdgU+?b+;SBHm@JT>u&Rp!;7+b$;2OOp@M7+tpq2CaJacP45X&qezY*s;_hcHM<* zcd_ITeBZQ*>m`5UeMPu!x)y)DtnNq6Fty(Y}fA)aMpK9 z_Y$2X3-Qm`TgLX>cdbS0q}IamZ7Yti7M7Q!bMJ$b+-$t`*EsTX$5_0Xd(AQ_lqmEp z6Ezt|{$_j5lJwC)^+}qeh*kqz(0S8~_r+NZj!Wx*B?v=yN!Q9H`hUPjbCeZK1gD3I zz?=K+emfC+x7mOFluiY&w{fzbj$iL~>o5Dw=P?EO=Rk?sxjC+J^JM&o(Qi;o0|b*@ zA{w(M5ylPy9Fy%IKmmo5E+8`jsgq(LlLP`R(Cw4?AjbjGlffZ20{9%0`5{ID$CE%J zK@Iv4004MwFLQKxY-MwkVId%st|ATrl#{(8HUYbn^dcq&cTewLzLOs#6#);EH6vaL Xd4FW}v;qJC1(Td3JqENN00000?9LQ7 From 8e18dda8c80ef13ac1bb7b25b9b588f30ceddca7 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 17 Dec 2025 14:32:33 +0800 Subject: [PATCH 09/46] =?UTF-8?q?feat:=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/1003pjcloudx_view.sql | 43 ++++++ .../wallet/api/dto/WalletTransactionDto.java | 7 + .../api/dto/mch/WalletMchDeptViewDto.java | 13 ++ .../mch/view/WalletMchDeptViewEntity.java | 48 ++++++ .../wallet/api/vo/WalletCzTotalVo.java | 55 +++++++ .../wallet/api/vo/WalletTypeCountVo.java | 10 ++ .../api/vo/mch/WalletMchDeptViewVo.java | 8 + .../WalletTransactionController.java | 38 ++++- .../mapper/WalletTransactionMapper.java | 2 + .../mapper/mch/view/MchDeptViewMapper.java | 17 +++ .../service/WalletTransactionService.java | 16 ++ .../impl/WalletTransactionServiceImpl.java | 141 ++++++++++++++++++ .../src/main/resources/file/钱包充值统计.xlsx | Bin 0 -> 9961 bytes .../mapper/WalletTransactionMapper.xml | 27 +++- .../resources/mapper/mch/MchManageMapper.xml | 3 + .../mapper/mch/view/MchDeptViewMapper.xml | 55 +++++++ 16 files changed, 481 insertions(+), 2 deletions(-) create mode 100644 db/1003pjcloudx_view.sql create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/WalletMchDeptViewDto.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/view/WalletMchDeptViewEntity.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletCzTotalVo.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/WalletMchDeptViewVo.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/钱包充值统计.xlsx create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml diff --git a/db/1003pjcloudx_view.sql b/db/1003pjcloudx_view.sql new file mode 100644 index 000000000..c9448c588 --- /dev/null +++ b/db/1003pjcloudx_view.sql @@ -0,0 +1,43 @@ +CREATE OR REPLACE VIEW pjcloudx_wallet.v_mch_dept_tree AS +WITH RECURSIVE + root AS (SELECT m.dept_id AS root_dept_id, + m.id AS mch_id, + m.name AS mch_name + FROM pjcloudx_wallet.mch_manage AS m + JOIN pjcloudx.sys_dept AS d + ON d.dept_id = m.dept_id + AND d.del_flag = '0' + WHERE m.del_flag = '0' + AND m.types = '1'), + r (dept_id, parent_id, dept_name, root_dept_id, mch_id, mch_name, level) AS (SELECT d.dept_id, + d.parent_id, + d.name, + root.root_dept_id, + root.mch_id, + root.mch_name, + 0 + FROM pjcloudx.sys_dept AS d + JOIN root + ON root.root_dept_id = d.dept_id + WHERE d.del_flag = '0' + UNION ALL + SELECT c.dept_id, + c.parent_id, + c.name, + r.root_dept_id, + r.mch_id, + r.mch_name, + r.level + 1 + FROM pjcloudx.sys_dept AS c + JOIN r + ON c.parent_id = r.dept_id + WHERE c.del_flag = '0') +SELECT root_dept_id AS mchDeptId, + mch_id AS mchId, + mch_name AS mchName, + dept_id AS deptId, + parent_id AS parentId, + dept_name AS deptName, + level AS level +FROM r +ORDER BY mchDeptId, level, deptId; \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionDto.java index 76c8a076d..f6398a928 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionDto.java @@ -23,6 +23,11 @@ public class WalletTransactionDto extends WalletTransactionEntity implements Bas private Integer type; + /** + * 商户相关 + */ + private Long mchId; + /** * 用户id */ @@ -41,6 +46,8 @@ public class WalletTransactionDto extends WalletTransactionEntity implements Bas */ private Boolean isFindOrder = false; + private List totalDpetIds; + /** * 部门ids */ diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/WalletMchDeptViewDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/WalletMchDeptViewDto.java new file mode 100644 index 000000000..1f79560db --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/WalletMchDeptViewDto.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.wallet.api.dto.mch; + +import com.bsd.pjcloud.wallet.api.entity.mch.view.WalletMchDeptViewEntity; +import lombok.Data; + +import java.util.List; + +@Data +public class WalletMchDeptViewDto extends WalletMchDeptViewEntity { + + private List mchIdList; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/view/WalletMchDeptViewEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/view/WalletMchDeptViewEntity.java new file mode 100644 index 000000000..3bc3ba566 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/view/WalletMchDeptViewEntity.java @@ -0,0 +1,48 @@ +package com.bsd.pjcloud.wallet.api.entity.mch.view; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 商户部门视图 + */ +@Data +@Schema(description = "商户部门视图") +public class WalletMchDeptViewEntity { + + /** + * 商户部门id + */ + private Long mchDeptId; + + /** + * 商户id + */ + private Long mchId; + + /** + * 商户名 + */ + private String mchName; + + /** + * 上级部门id + */ + private Long parentId; + + /** + * 部门id + */ + private Long deptId; + + /** + * 部门名 + */ + private String deptName; + + /** + * 层级 + */ + private Long level; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletCzTotalVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletCzTotalVo.java new file mode 100644 index 000000000..319a64956 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletCzTotalVo.java @@ -0,0 +1,55 @@ +package com.bsd.pjcloud.wallet.api.vo; + +import lombok.Data; + +@Data +public class WalletCzTotalVo { + + /** + * 商户id + */ + private Long mchId; + + /** + * 商户名 + */ + private String mchName; + + /** + * 部门id + */ + private Long deptId; + + /** + * 部门名 + */ + private String deptName; + + /** + * 充值金额 + */ + private Long price = 0L; + + private String priceStr; + + /** + * 充值人数 + */ + private Long personCount = 0L; + + private String personCountStr; + + /** + * 充值次数 + */ + private Long timeCount = 0L; + + private String timeCountStr; + + /** + * 导出相关 + */ + private Long lineNumber; + + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletTypeCountVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletTypeCountVo.java index c1cba5230..5bbb52ebd 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletTypeCountVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletTypeCountVo.java @@ -5,6 +5,11 @@ import lombok.Data; @Data public class WalletTypeCountVo { + /** + * 部门id + */ + private Long deptId; + /** * 充值次数 */ @@ -15,4 +20,9 @@ public class WalletTypeCountVo { */ private Long priceTotal; + /** + * 充值人数 + */ + private Long personTotal; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/WalletMchDeptViewVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/WalletMchDeptViewVo.java new file mode 100644 index 000000000..3660267ae --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/WalletMchDeptViewVo.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.wallet.api.vo.mch; + +import com.bsd.pjcloud.wallet.api.entity.mch.view.WalletMchDeptViewEntity; +import lombok.Data; + +@Data +public class WalletMchDeptViewVo extends WalletMchDeptViewEntity { +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java index 21d6c8edc..0b7e97d2c 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; -import com.bsd.pjcloud.common.data.datascope.DataScopeFuncEnum; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.common.security.service.PjcloudUser; @@ -15,6 +14,7 @@ import com.bsd.pjcloud.wallet.api.dto.WalletBalanceTransactionDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionSumAndCountDto; import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; +import com.bsd.pjcloud.wallet.api.vo.WalletCzTotalVo; import com.bsd.pjcloud.wallet.api.vo.WalletTransactionSumAndCountVo; import com.bsd.pjcloud.wallet.api.vo.WalletTypeTotalVo; import com.bsd.pjcloud.wallet.api.vo.transaction.WalletTransactionVo; @@ -101,6 +101,42 @@ public class WalletTransactionController { return R.ok(walletTransactionService.scopePageList(page, dto, dataScope)); } + @Operation(summary = "后台充值统计", description = "后台充值统计") + @PostMapping("/page-cz-total") + public R> listCzTotal(@RequestBody WalletTransactionDto dto) { + dto.setBizTypes(WalletBizEnum.getTopUpCodes()); + dto.setType(WalletTransactionDto.TYPE_INCOME); + if (ObjectUtil.isNotEmpty(dto.getPrice())) { + dto.setPrice(dto.getPrice() * 100); + } + + DataScope dataScope = new DataScope(); + return R.ok(walletTransactionService.pageCzTotalList(dto, dataScope)); + } + + @Operation(summary = "后台充值统计(导出)", description = "后台充值统计(导出)") + @PostMapping("/export-cz-total") + public void exportCzTotal(HttpServletResponse response, @RequestBody WalletTransactionDto dto) { + dto.setBizTypes(WalletBizEnum.getTopUpCodes()); + dto.setType(WalletTransactionDto.TYPE_INCOME); + if (ObjectUtil.isNotEmpty(dto.getPrice())) { + dto.setPrice(dto.getPrice() * 100); + } + walletTransactionService.exportCzTotal(response, dto, null); + } + + @Operation(summary = "后台充值统计", description = "后台充值统计") + @PostMapping("/page-cz-dept-total") + public R> listDeptCzTotal(@RequestBody WalletTransactionDto dto) { + dto.setBizTypes(WalletBizEnum.getTopUpCodes()); + dto.setType(WalletTransactionDto.TYPE_INCOME); + if (ObjectUtil.isNotEmpty(dto.getPrice())) { + dto.setPrice(dto.getPrice() * 100); + } + DataScope dataScope = new DataScope(); + return R.ok(walletTransactionService.listDeptCzTotal(dto, dataScope)); + } + @Operation(summary = "后台记账扣款记录分页", description = "后台记账扣款记录分页") @PostMapping("/page-jz") public R pageJz(@ParameterObject Page page, @RequestBody WalletTransactionDto dto) { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java index d5e25f9eb..81453e7b8 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java @@ -71,6 +71,8 @@ public interface WalletTransactionMapper extends PjcloudBaseMapper walletTypetotalByDept(@Param("dto") WalletTransactionDto dto, @Param("dataScope") DataScope dataScope); + default List scopeList(WalletTransactionDto dto, DataScope dataScope) { List list = selectListByScope(commonWrapperQuery(dto), dataScope); return BeanUtils.toBean(list, WalletTransactionVo.class); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java new file mode 100644 index 000000000..4184bd696 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.wallet.mapper.mch.view; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.dto.mch.WalletMchDeptViewDto; +import com.bsd.pjcloud.wallet.api.entity.mch.view.WalletMchDeptViewEntity; +import com.bsd.pjcloud.wallet.api.vo.mch.WalletMchDeptViewVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface MchDeptViewMapper { + + List selectList(@Param("dto") WalletMchDeptViewDto dto); + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java index bfc27c7d1..939bc09b8 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java @@ -6,6 +6,7 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDto; import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; +import com.bsd.pjcloud.wallet.api.vo.WalletCzTotalVo; import com.bsd.pjcloud.wallet.api.vo.WalletTypeTotalVo; import com.bsd.pjcloud.wallet.api.vo.transaction.WalletTransactionVo; import jakarta.servlet.http.HttpServletResponse; @@ -16,6 +17,16 @@ public interface WalletTransactionService extends IService scopePageList(Page page, WalletTransactionDto dto, DataScope dataScope); + /** + * 后台充值统计 + */ + List pageCzTotalList(WalletTransactionDto dto, DataScope dataScope); + + /** + * 后台充值统计(按照部门) + */ + List listDeptCzTotal(WalletTransactionDto dto, DataScope dataScope); + /** * 记账列表 */ @@ -57,4 +68,9 @@ public interface WalletTransactionService extends IService list); + + /** + * 后台充值统计(导出) + */ + void exportCzTotal(HttpServletResponse response, WalletTransactionDto dto, DataScope dataScope); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java index 8cace247f..dc6c7014b 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java @@ -21,21 +21,30 @@ import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import com.bsd.pjcloud.wallet.api.constant.mch.WalletMchSupType; +import com.bsd.pjcloud.wallet.api.dto.MchManageDto; import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDto; import com.bsd.pjcloud.wallet.api.dto.WalletTypeDto; +import com.bsd.pjcloud.wallet.api.dto.mch.WalletMchDeptViewDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import com.bsd.pjcloud.wallet.api.vo.WalletCzTotalVo; import com.bsd.pjcloud.wallet.api.vo.WalletTypeCountVo; import com.bsd.pjcloud.wallet.api.vo.WalletTypeTotalVo; +import com.bsd.pjcloud.wallet.api.vo.mch.WalletMchDeptViewVo; import com.bsd.pjcloud.wallet.api.vo.transaction.WalletTransactionVo; import com.bsd.pjcloud.wallet.mapper.WalletManageMapper; import com.bsd.pjcloud.wallet.mapper.WalletTransactionMapper; import com.bsd.pjcloud.wallet.mapper.WalletTypeMapper; +import com.bsd.pjcloud.wallet.mapper.mch.view.MchDeptViewMapper; +import com.bsd.pjcloud.wallet.service.MchManageService; import com.bsd.pjcloud.wallet.service.WalletManageService; import com.bsd.pjcloud.wallet.service.WalletThirdZyService; import com.bsd.pjcloud.wallet.service.WalletTransactionService; @@ -74,6 +83,9 @@ public class WalletTransactionServiceImpl extends ServiceImpl pageCzTotalList(WalletTransactionDto dto, DataScope dataScope) { + List resultList = new ArrayList<>(); + // 查询食堂 + MchManageDto mchQueryDto = MchManageDto.builder().typesList(List.of(HardTypeEnum.SUPERMARKET.getType())).build(); + if (ObjectUtil.isNotEmpty(dto.getMchId())) { + mchQueryDto.setId(dto.getMchId()); + } + List list = mchManageService.list(mchQueryDto); + if (ObjectUtil.isEmpty(list)) return List.of(); + resultList = list.stream().map(item -> { + WalletCzTotalVo entity = new WalletCzTotalVo(); + entity.setMchId(item.getId()); + entity.setMchName(item.getName()); + entity.setDeptId(item.getDeptId()); + entity.setDeptName(item.getDeptName()); + return entity; + }).toList(); + // 查询食堂的充值情况 + WalletMchDeptViewDto query = new WalletMchDeptViewDto(); + query.setMchIdList(list.stream().map(MchManageVo::getId).toList()); + List mchDeptList = mchDeptViewMapper.selectList(query); + if (ObjectUtil.isEmpty(list)) return List.of(); + for (WalletCzTotalVo item : resultList) { + Long mchId = item.getMchId(); + List mchAllDeptIdList = mchDeptList.stream().filter(v -> ObjectUtil.equals(v.getMchId(), mchId)).map(WalletMchDeptViewVo::getDeptId).toList(); + if (ObjectUtil.isEmpty(mchAllDeptIdList)) continue; + + WalletTransactionDto totalQuery = BeanUtils.toBean(dto, WalletTransactionDto.class); + totalQuery.setTotalDpetIds(mchAllDeptIdList); + WalletTypeCountVo totalVo = baseMapper.walletTypetotal(totalQuery, null); + if (ObjectUtil.isEmpty(totalVo)) continue; + item.setPrice(totalVo.getPriceTotal()); + item.setPersonCount(totalVo.getPersonTotal()); + item.setTimeCount(totalVo.getTimeTotal()); + } + return resultList; + } + + /** + * 后台充值统计(按照部门) + */ + @Override + public List listDeptCzTotal(WalletTransactionDto dto, DataScope dataScope) { + List resultList = new ArrayList<>(); + // 查询食堂的充值情况 + WalletMchDeptViewDto query = new WalletMchDeptViewDto(); + query.setMchId(dto.getMchId()); + List mchDeptList = mchDeptViewMapper.selectList(query); + if (ObjectUtil.isEmpty(mchDeptList)) return List.of(); + resultList = mchDeptList.stream().map(item -> { + WalletCzTotalVo entity = new WalletCzTotalVo(); + entity.setMchId(item.getMchId()); + entity.setMchName(item.getMchName()); + entity.setDeptId(item.getDeptId()); + entity.setDeptName(item.getDeptName()); + return entity; + }).toList(); + // 查询部门的充值情况 + WalletTransactionDto totalQuery = BeanUtils.toBean(dto, WalletTransactionDto.class); + totalQuery.setTotalDpetIds(resultList.stream().map(WalletCzTotalVo::getDeptId).toList()); + List deptTotalList = baseMapper.walletTypetotalByDept(totalQuery, null); + + for (WalletCzTotalVo item : resultList) { + Long deptId = item.getDeptId(); + WalletTypeCountVo targetTotal = deptTotalList.stream().filter(v -> ObjectUtil.equals(v.getDeptId(), deptId)).findFirst().orElse(null); + if (ObjectUtil.isEmpty(targetTotal)) { + continue; + } + item.setPrice(targetTotal.getPriceTotal()); + item.setPersonCount(targetTotal.getPersonTotal()); + item.setTimeCount(targetTotal.getTimeTotal()); + } + return resultList; + } + /** * 记账列表 */ @@ -261,6 +352,56 @@ public class WalletTransactionServiceImpl extends ServiceImpl list = pageCzTotalList(dto, dataScope); + + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + Map map = new HashMap(); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + map.put("timeSpan", " 到 "); + map.put("startTime", LocalDateTimeUtil.format(dto.getCreateTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); + map.put("endTime", LocalDateTimeUtil.format(dto.getCreateTimeList()[1], DatePattern.NORM_DATETIME_PATTERN)); + } + if (ObjectUtil.isNotEmpty(list)) { + BigDecimal priceTotal = BigDecimal.ZERO; + BigDecimal personCountTotal = BigDecimal.ZERO; + BigDecimal timeCountTotal = BigDecimal.ZERO; + Long lineNumber = 1L; + for (WalletCzTotalVo v : list) { + v.setLineNumber(lineNumber); + lineNumber++; + if (ObjectUtil.isNotEmpty(v.getPrice())) { + priceTotal = priceTotal.add(BigDecimal.valueOf(v.getPrice())); + v.setPriceStr(BigDecimal.valueOf(v.getPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + } + if (ObjectUtil.isNotEmpty(v.getPersonCount())) { + v.setPersonCountStr(v.getPersonCount().toString()); + personCountTotal = personCountTotal.add(BigDecimal.valueOf(v.getPersonCount())); + } + if (ObjectUtil.isNotEmpty(v.getTimeCount())) { + v.setTimeCountStr(v.getTimeCount().toString()); + timeCountTotal = timeCountTotal.add(BigDecimal.valueOf(v.getTimeCount())); + } + } + map.put("priceTotal", priceTotal.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + map.put("personCountTotal", personCountTotal.toString()); + map.put("timeCountTotal", timeCountTotal.toString()); + } + excelWriter.fill(map, writeSheet); + excelWriter.fill(list, fillConfig, writeSheet); + } catch (IOException e) { + e.printStackTrace(); + log.error("|{}|后台充值统计(导出),dto:|{}|,fileName:|{}|,error:|{}|", TAG, JSON.toJSONString(dto), fileName, e.getMessage()); + } + } private void disposeList(List list, WalletTransactionDto dto) { if (ObjectUtil.isNotEmpty(list)) { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/钱包充值统计.xlsx b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/钱包充值统计.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0f6a7eaf2403c8ca70059dfea19c4043bae0032c GIT binary patch literal 9961 zcma)ibyyus@;2^n3GM`U3vLOn!5xC@;a~?zu!B1UcXua1g1bX-C%6W8Lg0gB_vYU0 z{`UF$kC}O9s=8+0o~rJydX;3MVUQr6TA;$3$kX}X4e{~9#Qv=k&>rB(qVy<+^LPW{ zr&uG;Tm>s61Oz7(1O&$4#f$&|W{|B-T6DV%G#k#VE8ho+>diW-2f28Ww1X9yYg$;q`Vesweju@0{hpPS0s zs=sX3Opl15MWmIdv$iHH&_QrwzPtjhmO)1nKn3H{Y&eDQn1#W940s*jP%H05zfTzK zaL!;>BE!I2wU-a+XOnCih{BDK4+d_uAX{3ce!TuVK3*KbqRU**42Asun{HWL7bvfR z9&h7pb$9*Vzh;$R7cCmZ>%l6OIL%K`;SpVvM|3g&j_zA~py?C5;W45Lovb(#S5k}Q zr$P>?bxK;&^pJZYGEz7`vs#z-1epBswibh^vkow59nKB#3gZE)m4=q1ciTxU1vO=* zzRy_eO4S0SaB?7UDqawV@%#GctJPwVFu1luB^QQ%VtG- zK&70c)7?XjY3HK@5X1AIxmE*kyQYpTdG3*Le#Aqc)!n~sqfn&B`B%YPW%V_2kU5azOKec%k$MdcHAiz99D0y?_h)( z%k3A6jf#@>97Npcc{kw_OXQhFa4W3yk?d9INN9)g7|fPBSUlBy8)i2RGDr=M?CI{y zKqd>B>%It{H1k}%v{yNUC7VQ>(y4M{G2jhP>7EaA7VPhANQ9E@*9eXWrH1Rq3%drAKYKE@;X*#7|E+0n_~_6h#HXg%3S_ydk$AH@6Lr9_tN z@XtrkEQvHJDY-IG%h!v=exOQ2J84Z}D*&yA>ys>ZcAlljR_JeH5P_?j)nVH(p?s8d z>zn6sS9Tq+^T{g9m2EjJsF46Tc%=jTC3nj^%Fkzz2|?g$*jauaX7XB37L&J>qzoBO z^L;%xW8X3lKc|OkpGhNal8IWN-I%1suU`8@n=hZP+=tk33D3xYh{@^@gnfKK`94y zL`_JUme@WlHCrBCvKj~bC_vsyy}SPmW&7AeFz{Kp7gG1Ltc5`SuQh26Id6n(b&TF$ zV}6JNkgW1{C?~I8^WcN{rf=dl;h&)W@4*H75n7PV&#>~}1<-y8xY`4)9W6{vo&F3# znE?leLyu#m2@e7B{6A!Ws<1r`R-D>`-8vb@I|IuH$P;}7plvph?v3=%Z+5&Y*(4IXqrAWWV=BQ^m%CbbeUDFm4CBzy> zt>dTNIq5B80P2rJa&4xV?w0QoY5>zGTE`?~gx&Os?n0_OQo326%KH4>oLvY-4Mzl= z_28ZJp!L&Lb#Z9Z0}R#SZB44o0>(Bw(%NE?5<*oCaSz6@VYS4L)^E%t*bXtgU?y*k z6;KxL!9)!{I2B0Lmq<2wo^@>%&qEmNp*3Ikg!6VFoeE?TdW7D8BI50aF-lnlE}M8b zC2UDYUct-gmcuIDMV!7}7?WBo+CN=QWB+YLr* zWZRG{u|tr9EV>#y?d_ORG;}nDWbk; zZcR3v)VAwK_9`menl$XuUd@+wV^;|Em@cRV~4!h?F!Q+_OjNRdYh*u!zhaXqvnS%K1Fz{px?MpVqz zCE|6k{72AWyNhtF45i!@ExQ=n z#%gngLO)q3lcZA2BZyuFrCppr!d8n}{Q)jjq}r=m9bv)X?YeQR@m;by*)jc>q^Lv=qFhfU&KV{IekP7fCi?QZoc3qoRwcvm<>$FM=lb z`;EKRnzKORbYXX=`(yZ=K}-RO-7Y-Oo8ba4&kN<_?-LaULidZ2&$#asj)d=T3P$fl zXtVQPv9y3r_iJ9TwA^jf+mm{%z!Ra`fHJ5wVR(+U0HM??DQIEVFG-GPVt0Cjc(G{V zmPn?E@%h^b9VOm1(75=y28ur%LskqQ^4DD&3&nPEoL%rbc=v{l(X1~+=xR7>VIGc- z2YUg9Y8>h@_%4Q*#EN3)M;QIer9J6&*j$DLvS{NheBUraUxdrEU4mRAFMieLK0)rP+OY=>`C`a=ylmaVVIs$BFo<&s*AbEbbz!CuGibF4E#44dhN!00sLK2IzMm1>$JBFzH7KNI}?HzWD ziEbY^R#pG!{1`1_EDAPsT4{pS^8RRP6nQSSW%~7dg)v^35{vgtytBP{$Y;}7j|o$(R=7I>86dWpv3rq5`0IW?z!OY}8rE3DHU1oANu8eW1K zI-oa$k}(d^C69r0UINOt>K-4D>q}F0FEoY-SN)rux6}l@9cPP=^4FGU*E&v2nTsz} zK1#jX1)AvVzrekmN(+JDEf6y`hw@ea;O(>D_iW2%&@Uw+Rnsq68_AY{Z(m>8Islb$ zruRT>fUw~z=Jl9qoY@2>Y)r3>Nr0^T(tve&q7MJoP~{FILlM(%BJSX-G22py%V6=V zAft==GWJxM`8H74Yu+nSF2Fi80BZI^DeOt&`rQG7#PdLriXCts1>RQO+>)n@%HLo7Z z3?E?I;I6U;YgY%HU+1wBi}+nW!2GfDMWH2;cwG6~J+7*rwt9~fg`ntx@c7~5nVMld zMCQmGVlS(qq8&^XR^ zRDS6B!}HSXD;%?WOX!RFB>k(yiz&%Zd@VaWt8Y)nXB5p%x%ta@Tj|nCi|4K^I9og_ z%+_Z_VFwQqfraMZAjVy^5*HYQ_PQ1U(NuJ(nOVgW!EW5`1;J`Oa%sjyCt94?kz|-&<*F5i73tN7M%&SH$SQ*RjU-_SQeQdT*5NQ&=(H zXVg9z-lRR3+JQn+&4MXYd81|-Z>ty!Pov4jU7Z$fHSd*ynzb}(xwh-MebmzUeMDa` zgAndLMp5Ak+qoGt4ER}g?%nfF#qWz+Vws#<)Mmc1&xNpID`KyX)YGCAzxsoq0=!F} zPixm>iWL`1`%TH!f>Tmt`rxeB2Pjp_s2Wtc$UhtPxh^qG8V;5zR#?r`CzjF=^cf{0tkgC4hVOnKA~V$7m6ztCd&|pHzSCz-<}H#we=d>q z33a<1UHO!K!;do}?NUU#K!1H2mUuI7M+nQk^kX#Z@w=I=Y~kY{UuY`oy|0J`waEo? z%0JfU7rq<}O7?4FYECzjV_;<4@ln+#1kF4RoGqjjm>4dOM)AmObcwO>1$rp z0%h&z?oM?eR(q0o9#^NxM?DZw3+wdkg&(3a$OXfk^PomHZ|d?v_VU3ya!Z+=9W#}b2Fm`h{`-N%wN&{$qHczG8n$;Z?GG56EzKWOlKXC~0C~vy8>d^6eh+ z+}20viE}DLwsbpnGy!{Hk$TD{`cO1m^N!pQnY9miAjTSs(kS~b51sa67#uuSFoE}uJXfp%J;XuT<+Y3?mJeH=Af`D z60LVLNqpi*6qUsa~W5d!v7;ATOKL_LFiP!e-_=jtz(a#!InLzauoX*TQFEZ?BRlt^d7KkGs z@p6%@xkBrQ&}TkD8JJAobU?X2%m1QSZNvYKL>&3mvW=~X#uCR;6`FzU{npbk>``M+bmCaciiD^)$$kB>9VMpgytG!7GD$z(Z+IVT#7b z!d$XYQI%bn1nQE7saooO6{l;Rh|&X^+sC7wwc^nslO!HlPP2fP2fy|h@3|vVxj3wP znNrw>mc?`Z*4b&!GRk_sw1|A}jm<%OU(d3!F>RzmWfp>Bhwp@BElV~o$<_IVz%jbE zgjOn!l(?yYr0CWdR*q8*EVIRC`WEhbbt1FZ_c9$reFoBr3$XQW@5e1Fc!$F7;=n&8 z*LU;RtT{>vN^5P+HY%uoK5&!PgU~e8vP{IkVL;@deBkN~3#?)FK74ryp}tP#<&St< z-QHM+x-_w4&7KwxZW~Z3CbIxF<9d6@l36#uH*US* zz+9qRL@P*H{M)<3B-1LiCZr@ziHSJ6>x9x@4^F$$b_-PxQttbF*$Twz9 ziP^`{gDR&)PdZx9rrfO*Z2Du%NQ0Bl*RC4iX7BGtF2nIXOwh^V?K)*Gmc=YJ& z0J4H`l`5Nm?*w~gp03X?!K$?nTYx^BAfGZBiyD}DM?VsyA8lS#&7`MB z)}57QKTi6HI`L2@E=q;w+r|PT^Fy&OR#`jLyLEJ{uVs2nj7fLNNM&DSh``=j!e4Fd zY#)fA-|iLfgUr5m>Qw9*E;E#bxDJ;37k_y(f~Nj5HRQ^^%>RvA6SWPKswq7~vBBDa z%-X~7T%q}AzGWV%eI#wZ+>CgoPtU`ZxpY{wJ%-W*kDEdzMmuG3ngQ6&F(os4VS(`h^bw|DY-}}{ca9|u zi`)>GcL6?um)`EU5YgGdD#H)T@NJTmRI0@|z~jAIV{MQ^N!;fU%P#U*j&k3&@)0%Z zVX_dL5cOLuj`Y;Y<9>|o>YYAL=VPgy6n%7;5YikUsP;BVGi@FaV^NG8G<@Wys*0%o z#Tki=Gxb!ACA-pD6`Z!%G+j}=P1h%KRL|%buuHsl=Sy8+Gg!s4e=Wv3Q?`V9#yCMn zR*7avBG1;1S2w5&67H5WBxc z{tbc5gV|UI8MuR7yfMS`e6d`_3jk#Owt9-uWDs|6@m(u8j`>9p@9RTHDAozT0?Oz+Qk``2CZyFEAt0|alWx_w_5!(1IT zfn2=qYckSX9`?OaP7%dlGfyGZncM&s?r%W%=e>}SGM`k@guL+M&Q7mJMf=t&vM?qS zl?gl(S!FoPoxbb;fcN1P5f%>~EqFy2?2dv;V5MYvUHK+#%fMBURKVcwRGAFk`Hl|t zQz7+Qz)e9$Dv_7N?eX>I_oH-)UFC$-@pVdk<)l!ryPNZ64B{#fB* zuZ!ii`YSxrJL*jFA8G*+i+Px1PA99)6Or$qDXmC521xAO$M%x?0Yeue-7G=$DdXJ! z*JNwCl`qBjwMrv83U4Hg2z~JqH7Sf{J+oOuJEIXJq@MF+AcVvaFrQtMNm}Hz^SRv{ zzUPsE*T#GM!LNu+xz>AQ**pt}1e2A8lH%q4`rvvXIbtLt&{kBns=K%TnHPw&^&#bE zi9Zxw7~RrMm$pL$v#;0UWC#znnxb?fwDqgb;=L;wnj!}qm6+TxsUY&;S(FkuD$&cG zD1Lh^6JZSC{{00@x)7o?h>=!|aY*>#+lIX>#QNC_bVcFYm5uETrP(z)q#hb0YV|#X z=wcOmLJ|g6Cu|t~VYAM4_#SmA?lK#0fqVkcl_$;{D8~->qT@Cz1fRH_xF}STc9rcI zw9$+)kP`x+39Zx; ziDC795~D8R^sxH9<#CO<#~41KMrx@A{Za&~kpr=t#pb-dG;_dxxFA@vEe}}DDwKcO zeOpJ@W%H|B`Co#^eYP<*GDgXM zatWqw<#E9HguIPg2F=0N?%xI!9@1r}OS6mmoM?pv2vaM9iM}FsLiZO1D9(akxSuhE zD3j{0BYK#sFt5sVVfCROBCR-KEk)u^lxA#vYlGa;R9}HSWF&bZ3ji^E0^Cii1GU=6 z@-{l!+o}0hqsrYhkzuzxtUn+Mu>~u5c8bqgt7CAlh0L%DADap(wbFn)MQ~!!5_V#{ z_PU_px68X?WGCy|N(nU~FL;Q-Mwdf=nyS3GiRN-y-D{EI?{;yAzE)=E`PbBHbo24^ z9E)*D^b5Pz#12s77C$gVjJ&ZQU87dD&is0i^%b#gJFN4i^K(Vip)9tV=Ka-#6x>_S zDXvxatDf)!AwDq_Ki<}Jwf+2cBlX88axx4?mg>2}k?9@ozMwVA$a_;(RuUgl_6E+H zm9DeM+)SEIf&a^{F~W4gzNK^oK7iH3#B*#5Z!s#Rt>e^?K98S9-}j zZI8bQ1h;V;Z=N*J7YX1&?CGBAS{nzjA4f6A1<>M>Q|ejE^t#VQTC*ci$@TW&%J)pP z(U;Xt?>X^L#g`wcPub<5Tl~3)X5qF8UqxmzSjH|h;#>}2f^LI3F>>q7|dE#1v3z3DBACq6d z-+?XHj+&BvL-^jR`vSWnL!@HNH3fI86W3`D7fl;=5-t>q(rV%u-lFav`TwpT!98xC z41lIKf0l(jcwL$v9-n=EOkyDaCBytASr#)Y)5VJMn7cT_*lLk?#l@U+VxjmZZ}QGN zQSRXj4R(yyK})l!GUMcD_{gN2t(32xCXIwkWcqCR5lz0%%Dy7@eJ(A^$DSa~C10u1 z<|$}5RX_(!!36E%9mbDl!{3GUN->g5FU*@xe@p!{@#A6##MvvRp!Y7<;(p zt6`~yrBU7>7P(3IicESLj2-#P<|7u zU&nKeHMAX+&LSbTX4wZF^tu2|t3896ow9H6ZtdW#VPwRr~t)=6L3Y-(wVEn@djWNW@NZ(T12%5J$c#2c^;qcdwiKr zX9y+g6P6;)cW~4CaMz6Tn!!4RT4Hi}s?^{@6H>uFZ>iLbG&bQh9XApDrUL}er2}0( zc6@8ass-QXTTDD%DorNS_?o3+_{H1jhz%dV&-X`^xz z3AC#+%F(B5oO`TO`HHFw*x}WcCI@4L#ZyGTX>r=~R! z@#mjL|BOISI=_sz|E2TOWB!-1Czt%yo{T-UzcF$CY41-i&Xe#jdoTX3_Ah46pAh}Y zHTkXW|M*M)W%S?7lRwq}WJ~;3hkDFs{#O5sJMq6h`iT?pt37?R9?Z{h^S>1SiPA3V z-{RAsFZyR7d$RKjB@D8^sr^S-`?DX=A4&4x{oFm~^Zr}P{Ldc#OacDx!SIpn^VGv% z3BmvWZ!djhK|HGdyZ-ynKjhB}@NbI~e^>im5B~F&|IAVU?g03hvVOGtci8^dOFxl1 yezm6&e*bHP|3UHi=bQgY@_5qyHEPBGq5GTip(G3Y(^)Ye*;DY3azhkPdjAh@;#S@O literal 0 HcmV?d00001 diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml index dd6ab9665..a5844eccc 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml @@ -47,6 +47,9 @@ and a.dept_id = #{dto.deptId} + + and a.price = #{dto.price} + and a.price > 0 @@ -68,6 +71,12 @@ and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} + + and a.dept_id IN + + #{v} + + @@ -224,7 +233,7 @@ + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml index a536907d5..d8304eb83 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml @@ -59,6 +59,9 @@ a.del_flag = 0 + + and a.id = #{dto.id} + and a.types = #{dto.types} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml new file mode 100644 index 000000000..709f63c6e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml @@ -0,0 +1,55 @@ + + + + + + + select a.mchDeptId, + a.mchId, + a.mchName, + a.deptId, + a.parentId, + a.deptName, + a.level + + + + + and a.mchDeptId = #{dto.mchDeptId} + + + and a.mchId = #{dto.mchId} + + + and a.mchId IN + + #{v} + + + + and a.mchName like concat('%',#{dto.mchName},'%') + + + and a.deptId = #{dto.deptId} + + + and a.parentId = #{dto.parentId} + + + and a.deptName like concat('%',#{dto.deptName},'%') + + + and a.level = #{dto.level} + + + + + + \ No newline at end of file From 2fe790aa36a4c07920b340acdb7ff70378075ab8 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 17 Dec 2025 15:04:50 +0800 Subject: [PATCH 10/46] 11 --- .../wallet/service/impl/WalletTransactionServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java index dc6c7014b..38c4eb5ea 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java @@ -201,7 +201,7 @@ public class WalletTransactionServiceImpl extends ServiceImpl pageCzTotalList(WalletTransactionDto dto, DataScope dataScope) { List resultList = new ArrayList<>(); // 查询食堂 - MchManageDto mchQueryDto = MchManageDto.builder().typesList(List.of(HardTypeEnum.SUPERMARKET.getType())).build(); + MchManageDto mchQueryDto = MchManageDto.builder().typesList(List.of(HardTypeEnum.CANTEEN.getType())).build(); if (ObjectUtil.isNotEmpty(dto.getMchId())) { mchQueryDto.setId(dto.getMchId()); } From 2268b09f7f34096422ff7d06119e33880a720f92 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 17 Dec 2025 15:09:24 +0800 Subject: [PATCH 11/46] =?UTF-8?q?feat:=E9=A3=9F=E5=A0=82=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/service/impl/WalletTransactionServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java index 38c4eb5ea..17202bd3a 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java @@ -17,6 +17,7 @@ import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.R; @@ -201,7 +202,7 @@ public class WalletTransactionServiceImpl extends ServiceImpl pageCzTotalList(WalletTransactionDto dto, DataScope dataScope) { List resultList = new ArrayList<>(); // 查询食堂 - MchManageDto mchQueryDto = MchManageDto.builder().typesList(List.of(HardTypeEnum.CANTEEN.getType())).build(); + MchManageDto mchQueryDto = MchManageDto.builder().typesList(List.of(MerchantTypeEnum.CANTEEN.getType())).build(); if (ObjectUtil.isNotEmpty(dto.getMchId())) { mchQueryDto.setId(dto.getMchId()); } From 2a6b9517d50eb111251c0d14ba942809dab3b8ff Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 17 Dec 2025 15:57:08 +0800 Subject: [PATCH 12/46] =?UTF-8?q?feat:=E6=90=9C=E7=B4=A2=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E6=95=B0=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pjcloud/wallet/api/dto/WalletTransactionDto.java | 6 ++++++ .../wallet/controller/WalletTransactionController.java | 10 +++++++++- .../main/resources/mapper/WalletTransactionMapper.xml | 6 ++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionDto.java index f6398a928..bfbfa9976 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionDto.java @@ -58,4 +58,10 @@ public class WalletTransactionDto extends WalletTransactionEntity implements Bas */ private Boolean isInclude; + + /** + * 金额区间 + */ + private List priceList; + } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java index 0b7e97d2c..5c874cd5f 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java @@ -109,7 +109,9 @@ public class WalletTransactionController { if (ObjectUtil.isNotEmpty(dto.getPrice())) { dto.setPrice(dto.getPrice() * 100); } - + if (ObjectUtil.isNotEmpty(dto.getPriceList())) { + dto.setPriceList(dto.getPriceList().stream().map(item -> item * 100).toList()); + } DataScope dataScope = new DataScope(); return R.ok(walletTransactionService.pageCzTotalList(dto, dataScope)); } @@ -122,6 +124,9 @@ public class WalletTransactionController { if (ObjectUtil.isNotEmpty(dto.getPrice())) { dto.setPrice(dto.getPrice() * 100); } + if (ObjectUtil.isNotEmpty(dto.getPriceList())) { + dto.setPriceList(dto.getPriceList().stream().map(item -> item * 100).toList()); + } walletTransactionService.exportCzTotal(response, dto, null); } @@ -133,6 +138,9 @@ public class WalletTransactionController { if (ObjectUtil.isNotEmpty(dto.getPrice())) { dto.setPrice(dto.getPrice() * 100); } + if (ObjectUtil.isNotEmpty(dto.getPriceList())) { + dto.setPriceList(dto.getPriceList().stream().map(item -> item * 100).toList()); + } DataScope dataScope = new DataScope(); return R.ok(walletTransactionService.listDeptCzTotal(dto, dataScope)); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml index a5844eccc..507660478 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml @@ -50,6 +50,12 @@ and a.price = #{dto.price} + + and a.price in + + #{v} + + and a.price > 0 From 45e41f955facc01d2805829a47dd97d82a4509ec Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 17 Dec 2025 18:12:39 +0800 Subject: [PATCH 13/46] 1 --- .../api/vo/WalletExportCzTotalPerson.java | 29 ++++++++++++ .../WalletTransactionController.java | 14 ++++++ .../mapper/WalletTransactionMapper.java | 3 ++ .../service/WalletTransactionService.java | 5 +++ .../impl/WalletTransactionServiceImpl.java | 42 ++++++++++++++++-- .../file/个人充值统计800、1600、2400.xlsx | Bin 0 -> 9951 bytes .../mapper/WalletTransactionMapper.xml | 16 +++++++ 7 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletExportCzTotalPerson.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人充值统计800、1600、2400.xlsx diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletExportCzTotalPerson.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletExportCzTotalPerson.java new file mode 100644 index 000000000..5b2ceb3aa --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletExportCzTotalPerson.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.wallet.api.vo; + +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +public class WalletExportCzTotalPerson { + + private Long lineNumber; + + private String mchName; + + private String deptName; + + private String name; + + private String phone; + + private Long price; + + private String priceStr; + + private LocalDateTime createTime; + + private String createTimeStr; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java index 5c874cd5f..3b37287be 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java @@ -130,6 +130,20 @@ public class WalletTransactionController { walletTransactionService.exportCzTotal(response, dto, null); } + @Operation(summary = "后台充值统计按照个人(导出)", description = "后台充值统计按照个人(导出)") + @PostMapping("/export-cz-total-person") + public void exportCzTotalPerson(HttpServletResponse response, @RequestBody WalletTransactionDto dto) { + dto.setBizTypes(WalletBizEnum.getTopUpCodes()); + dto.setType(WalletTransactionDto.TYPE_INCOME); + if (ObjectUtil.isNotEmpty(dto.getPrice())) { + dto.setPrice(dto.getPrice() * 100); + } + if (ObjectUtil.isNotEmpty(dto.getPriceList())) { + dto.setPriceList(dto.getPriceList().stream().map(item -> item * 100).toList()); + } + walletTransactionService.exportCzTotalPerson(response, dto, null); + } + @Operation(summary = "后台充值统计", description = "后台充值统计") @PostMapping("/page-cz-dept-total") public R> listDeptCzTotal(@RequestBody WalletTransactionDto dto) { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java index 81453e7b8..a2fe5e7a2 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java @@ -12,6 +12,7 @@ import com.bsd.pjcloud.wallet.api.dto.WalletTransactionSumAndCountDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; +import com.bsd.pjcloud.wallet.api.vo.WalletExportCzTotalPerson; import com.bsd.pjcloud.wallet.api.vo.WalletTransactionSumAndCountVo; import com.bsd.pjcloud.wallet.api.vo.WalletTypeCountVo; import com.bsd.pjcloud.wallet.api.vo.WalletTypeTotalVo; @@ -94,4 +95,6 @@ public interface WalletTransactionMapper extends PjcloudBaseMapper sumAndCount(@Param("dto") WalletTransactionSumAndCountDto dto); + + List exportCzTotalPerson(); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java index 939bc09b8..99eeb0657 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java @@ -73,4 +73,9 @@ public interface WalletTransactionService extends IService list = baseMapper.exportCzTotalPerson(); + + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + Map map = new HashMap(); + Long lineNumber = 1L; + BigDecimal priceTotal = BigDecimal.ZERO; + if (ObjectUtil.isNotEmpty(list)) { + for (WalletExportCzTotalPerson v : list) { + v.setLineNumber(lineNumber); + lineNumber++; + if (ObjectUtil.isNotEmpty(v.getPrice())) { + priceTotal = priceTotal.add(BigDecimal.valueOf(v.getPrice())); + v.setPriceStr(BigDecimal.valueOf(v.getPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + } + if (ObjectUtil.isNotEmpty(v.getCreateTime())) { + v.setCreateTimeStr(LocalDateTimeUtil.format(v.getCreateTime(), DatePattern.NORM_DATETIME_PATTERN)); + } + } + map.put("priceTotal", priceTotal.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + } + excelWriter.fill(map, writeSheet); + excelWriter.fill(new ArrayList<>(list), fillConfig, writeSheet); + } catch (IOException e) { + e.printStackTrace(); + log.error("|{}|后台充值统计(导出),dto:|{}|,fileName:|{}|,error:|{}|", TAG, JSON.toJSONString(dto), fileName, e.getMessage()); + } + } + private void disposeList(List list, WalletTransactionDto dto) { if (ObjectUtil.isNotEmpty(list)) { // 用户 diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人充值统计800、1600、2400.xlsx b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人充值统计800、1600、2400.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9a169a9d63f5f4d50bac4df8c2cae70575047022 GIT binary patch literal 9951 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 literal 0 HcmV?d00001 diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml index 507660478..8fba8ca13 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml @@ -265,4 +265,20 @@ group by a.dept_id + + \ No newline at end of file From 186ee48a5ea561822c43a22cbd957d27f83ec578 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 18 Dec 2025 09:55:45 +0800 Subject: [PATCH 14/46] 11 --- .../file/个人充值统计800、1600、2400.xlsx | Bin 9951 -> 9952 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人充值统计800、1600、2400.xlsx b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人充值统计800、1600、2400.xlsx index 9a169a9d63f5f4d50bac4df8c2cae70575047022..c909ca48ec7134e743ece6cbc5d84545f6465a0f 100644 GIT binary patch delta 1354 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 A$p8QV From 5b2463cba007da0f7ddee0224daac941552f0e84 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 18 Dec 2025 10:11:18 +0800 Subject: [PATCH 15/46] 11 --- .../src/main/resources/mapper/WalletTransactionMapper.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml index 8fba8ca13..1778351a6 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletTransactionMapper.xml @@ -278,6 +278,7 @@ inner join pjcloudx.sys_user u on u.user_id = t.user_id where t.del_flag = '0' and t.biz_type in ('1', '2', '3') + and t.price in (80000, 160000, 240000) and t.dept_id not in (1875013738914156546, 1910218102049226753, 1910218128624336898, 1942046316044144642) order by v.mchId, v.deptId From 5dc6a1ebbd349b45caf9e99b3229436bdb40c862 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 23 Dec 2025 11:23:50 +0800 Subject: [PATCH 16/46] =?UTF-8?q?feat:=E5=85=8D=E5=AF=86=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pjcloud-app-server-biz/pom.xml | 9 +- .../pjcloud/app/config/MiniAlipayConf.java | 40 +++ .../AppSocialDetailsController.java | 150 +++++------ .../app/controller/AppUserController.java | 240 +++++++----------- .../app/handler/MiniAlipayLoginHandler.java | 138 ++++++++++ ...ndler.java => MiniWechatLoginHandler.java} | 7 +- .../src/main/resources/application.yml | 8 + .../core/constant/SecurityConstants.java | 10 + .../core/constant/enums/UserTypeEnum.java | 27 +- .../hard/api/constant/HardAuthTypeEnum.java | 1 + .../api/constant/order/HardOrderTypeEnum.java | 1 + .../pjcloud/hard/api/dto/HardAuthAppDto.java | 6 + .../hard/api/dto/HardGetAuthAppDto.java | 6 + .../hard/api/entity/HardDoorFlowEntity.java | 6 + .../entity/manager/HardDoorCabinetEntity.java | 12 + .../order/HardAppCreateThirdDoorOrderVo.java | 14 + .../pjcloud/hard/config/MiniAlipayConf.java | 50 ++++ .../hard/controller/HardAuthController.java | 15 +- .../pjcloud/hard/service/HardAuthService.java | 7 + .../hard/service/HardDoorFlowService.java | 3 +- .../hard/service/HardOrderService.java | 3 +- .../hard/service/MiniAlipayService.java | 17 ++ .../service/impl/HardAuthServiceImpl.java | 46 +++- .../service/impl/HardDoorFlowServiceImpl.java | 29 ++- .../impl/ali/MiniAlipayServiceImpl.java | 116 +++++++++ .../manager/HardDoorCabinetServiceImpl.java | 9 + .../impl/order/HardOrderServiceImpl.java | 33 ++- .../src/main/resources/application.yml | 12 +- .../api/constant/visitor/VisitorBizEnum.java | 27 ++ .../service/impl/WalletManageServiceImpl.java | 3 + pom.xml | 12 +- 31 files changed, 776 insertions(+), 281 deletions(-) create mode 100644 pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniAlipayConf.java create mode 100644 pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java rename pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/{MiniAppLoginHandler.java => MiniWechatLoginHandler.java} (96%) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardAppCreateThirdDoorOrderVo.java create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/MiniAlipayConf.java create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java create mode 100644 pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/visitor/VisitorBizEnum.java diff --git a/pjcloud-app-server/pjcloud-app-server-biz/pom.xml b/pjcloud-app-server/pjcloud-app-server-biz/pom.xml index 3a441ffb0..bbf75ad80 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/pom.xml +++ b/pjcloud-app-server/pjcloud-app-server-biz/pom.xml @@ -104,12 +104,17 @@ com.bsd pjcloud-common-swagger - + com.bsd pjcloud-common-seata - + + + com.alipay.sdk + alipay-sdk-java + 4.40.251.ALL + diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniAlipayConf.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniAlipayConf.java new file mode 100644 index 000000000..370072464 --- /dev/null +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniAlipayConf.java @@ -0,0 +1,40 @@ +package com.bsd.pjcloud.app.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 支付宝支付配置 + */ +@Component +@ConfigurationProperties(prefix = "mini-ali-pay") +@Data +public class MiniAlipayConf { + + /** + * 应用ID + */ + private String appId; + + /** + * 私钥 + */ + private String privateKey; + + /** + * 公钥 + */ + private String publicKey; + + /** + * 支付宝公钥 + */ + private String alipayPublicKey; + + /** + * 回调地址 + */ + private String callbackUrl; + +} diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppSocialDetailsController.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppSocialDetailsController.java index 7cdc79950..dcd17e4e7 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppSocialDetailsController.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppSocialDetailsController.java @@ -28,6 +28,8 @@ import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.HasPermission; import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -45,95 +47,79 @@ import java.util.List; @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class AppSocialDetailsController { - private final AppSocialDetailsService appSocialDetailsService; + private final AppSocialDetailsService appSocialDetailsService; - /** - * 社交登录账户简单分页查询 - * @param page 分页对象 - * @param appSocialDetails 社交登录 - * @return - */ - @GetMapping("/page") - public R getSocialDetailsPage(Page page, AppSocialDetails appSocialDetails) { - return R.ok(appSocialDetailsService.page(page, Wrappers.query(appSocialDetails))); - } + /** + * 社交登录账户简单分页查询 + */ + @GetMapping("/page") + public R getSocialDetailsPage(Page page, AppSocialDetails appSocialDetails) { + return R.ok(appSocialDetailsService.page(page, Wrappers.query(appSocialDetails))); + } - /** - * 信息 - * @param id id - * @return R - */ - @GetMapping("/{id}") - public R getinfo(@PathVariable("id") Long id) { - return R.ok(appSocialDetailsService.getById(id)); - } + /** + * 信息 + */ + @GetMapping("/{id}") + public R getinfo(@PathVariable("id") Long id) { + return R.ok(appSocialDetailsService.getById(id)); + } - /** - * 保存 - * @param appSocialDetails - * @return R - */ - @SysLog("保存三方信息") - @PostMapping - @HasPermission("app_social_details_add") - public R save(@Valid @RequestBody AppSocialDetails appSocialDetails) { - return R.ok(appSocialDetailsService.save(appSocialDetails)); - } + /** + * 保存 + */ + @SysLog("保存三方信息") + @PostMapping + @HasPermission("app_social_details_add") + public R save(@Valid @RequestBody AppSocialDetails appSocialDetails) { + return R.ok(appSocialDetailsService.save(appSocialDetails)); + } - /** - * 修改 - * @param appSocialDetails - * @return R - */ - @SysLog("修改三方信息") - @PutMapping - @HasPermission("app_social_details_edit") - public R updateById(@Validated({ ValidGroup.Update.class }) @RequestBody AppSocialDetails appSocialDetails) { - appSocialDetailsService.updateById(appSocialDetails); - return R.ok(Boolean.TRUE); - } + /** + * 修改 + */ + @SysLog("修改三方信息") + @PutMapping + @HasPermission("app_social_details_edit") + public R updateById(@Validated({ValidGroup.Update.class}) @RequestBody AppSocialDetails appSocialDetails) { + appSocialDetailsService.updateById(appSocialDetails); + return R.ok(Boolean.TRUE); + } - /** - * 删除 - * @param ids - * @return R - */ - @SysLog("删除三方信息") - @DeleteMapping - @HasPermission("app_social_details_del") - public R removeById(@RequestBody Long[] ids) { - return R.ok(appSocialDetailsService.removeBatchByIds(CollUtil.toList(ids))); - } + /** + * 删除 + */ + @SysLog("删除三方信息") + @DeleteMapping + @HasPermission("app_social_details_del") + public R removeById(@RequestBody Long[] ids) { + return R.ok(appSocialDetailsService.removeBatchByIds(CollUtil.toList(ids))); + } - /** - * 通过社交账号、手机号查询用户、角色信息 - * @param inStr appid@code - * @return - */ - @Inner - @GetMapping("/info/{inStr}") - public R getUserInfo(@PathVariable String inStr) { - return R.ok(appSocialDetailsService.getUserInfo(inStr)); - } + /** + * 通过社交账号、手机号查询用户、角色信息 + */ + @Inner + @GetMapping("/info/{inStr}") + public R getUserInfo(@PathVariable String inStr) { + return R.ok(appSocialDetailsService.getUserInfo(inStr)); + } - /** - * 绑定社交账号 - * @param state 类型 - * @param code code - * @return - */ - @PostMapping("/bind") - public R bindSocial(String state, String code) { - return R.ok(appSocialDetailsService.bindSocial(state, code)); - } + /** + * 绑定社交账号 + */ + @PostMapping("/bind") + public R bindSocial(String state, String code) { + return R.ok(appSocialDetailsService.bindSocial(state, code)); + } - /** - * 导出 - */ - @GetMapping("/export") - @ResponseExcel - public List export(AppSocialDetails appSocialDetails) { - return appSocialDetailsService.list(Wrappers.query(appSocialDetails)); - } + /** + * 导出 + */ + @GetMapping("/export") + @ResponseExcel + public List export(AppSocialDetails appSocialDetails) { + return appSocialDetailsService.list(Wrappers.query(appSocialDetails)); + } } diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserController.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserController.java index ef5e1426d..9815cb72c 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserController.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserController.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.app.api.dto.AppUserDTO; +import com.bsd.pjcloud.app.api.dto.AppUserInfo; import com.bsd.pjcloud.app.api.entity.AppUser; import com.bsd.pjcloud.app.api.feign.RemoteAppUserService; import com.bsd.pjcloud.app.api.vo.AppUserExcelVO; @@ -61,155 +62,100 @@ import java.util.List; @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class AppUserController { - private final AppUserService appUserService; - - - @Inner - @GetMapping("/info/{username}") - public R info(@PathVariable String username) { - AppUser user = appUserService.getOne(Wrappers.query() - .lambda() - .eq(AppUser::getUsername, username) - .or() - .eq(AppUser::getPhone, username)); - if (user == null) { - return R.failed(MsgUtils.getMessage(ErrorCodes.APP_USER_USERINFO_EMPTY, username)); - } - return R.ok(appUserService.findUserInfo(user)); - } - - /** - * 获取当前用户全部信息 - * @return 用户信息 - */ - @GetMapping(value = { "/info" }) - public R info() { - String username = SecurityUtils.getUser().getUsername(); - AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getUsername, username)); - if (user == null) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_QUERY_ERROR)); - } - return R.ok(appUserService.findUserInfo(user)); - } - - /** - * 分页查询 - * @param page 分页对象 - * @param appUserDTO app用户表 - * @return - */ - @Operation(summary = "分页查询", description = "分页查询") - @GetMapping("/page") - public R getAppUserPage(Page page, AppUserDTO appUserDTO) { - return R.ok(appUserService.getUsersWithRolePage(page, appUserDTO)); - } - - /** - * 通过id查询app用户表 - * @param userId id - * @return R - */ - @Operation(summary = "通过id查询", description = "通过id查询") - @GetMapping("/details/{userId}") - public R getById(@PathVariable("userId") Long userId) { - return R.ok(appUserService.selectUserVoById(userId)); - } - - /** - * @return R - */ - @Operation(summary = "通过userName查询", description = "通过userName查询") - @GetMapping("/details") - public R getByUserName(AppUser user) { - AppUser one = appUserService.getOne(Wrappers.query(user), false); - return R.ok(one == null ? null : CommonConstants.SUCCESS); - } - - /** - * 新增app用户表 - * @param appUser app用户表 - * @return R - */ -// @Operation(summary = "新增app用户表", description = "新增app用户表") -// @SysLog("新增app用户表") -// @PostMapping -// @HasPermission("app_appuser_add") -// public R save(@RequestBody AppUserDTO appUser) { -// appUserService.saveUser(appUser); -// return R.ok(); -// } - - /** - * 修改app用户表 - * @param appUser app用户表 - * @return R - */ - @Operation(summary = "修改app用户表", description = "修改app用户表") - @SysLog("修改app用户表") - @PutMapping - @HasPermission("app_appuser_edit") - public R updateById(@RequestBody AppUserDTO appUser) { - return R.ok(appUserService.updateUser(appUser)); - } - - /** - * 通过id删除app用户表 - * @param ids userIds - * @return R - */ - @Operation(summary = "通过ids删除app用户表", description = "通过ids删除app用户表") - @SysLog("通过id删除app用户表") - @DeleteMapping - @HasPermission("app_appuser_del") - public R removeById(@RequestBody Long[] ids) { - return R.ok(appUserService.deleteAppUserByIds(ids)); - } - - /** - * 导出excel 表格 -// * @param appUser 查询条件 - * @return excel 文件流 - */ -// @ResponseExcel -// @GetMapping("/export") -// @HasPermission("app_appuser_export") -// public List export(AppUserDTO appUser) { -// return appUserService.listUser(appUser); -// } - - @SysLog("修改个人信息") - @PutMapping("/edit") - public R updateUserInfo(@Valid @RequestBody AppUserDTO userDto) { - if (UserTypeEnum.TOC.getStatus().equals(SecurityUtils.getUser().getUserType())) { - userDto.setUserId(SecurityUtils.getUser().getId()); - // TOC 以手机号为key - userDto.setUsername(SecurityUtils.getUser().getUsername()); - } - return appUserService.updateUserInfo(userDto); - } - - /** - * 导入用户 - * @param excelVOList 用户列表 - * @param bindingResult 错误信息列表 - * @return R - */ -// @PostMapping("/import") -// @HasPermission("app_appuser_export") -// public R importUser(@RequestExcel List excelVOList, BindingResult bindingResult) { -// return appUserService.importUser(excelVOList, bindingResult); -// } - -// @Operation(summary = "注册app用户表", description = "注册app用户表") -// @SysLog("注册app用户表") -// @Inner(value = false) -// @PostMapping("/register") -// public R register(@RequestBody AppUserDTO appUser) { -// return appUserService.registerAppUser(appUser); -// } - + private final AppUserService appUserService; + + /* ************************************* start app start ************************************* */ + + /** + * 获取当前用户全部信息 + */ + @GetMapping(value = {"/info"}) + public R info() { + Long userId = SecurityUtils.getUser().getId(); + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getUserId, userId)); + if (user == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_QUERY_ERROR)); + } + return R.ok(appUserService.findUserInfo(user)); + } + + /* ************************************* end app end ************************************* */ + + @Inner + @GetMapping("/info/{username}") + public R info(@PathVariable String username) { + AppUser user = appUserService.getOne(Wrappers.query() + .lambda() + .eq(AppUser::getUsername, username) + .or() + .eq(AppUser::getPhone, username)); + if (user == null) { + return R.failed(MsgUtils.getMessage(ErrorCodes.APP_USER_USERINFO_EMPTY, username)); + } + return R.ok(appUserService.findUserInfo(user)); + } + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + public R getAppUserPage(Page page, AppUserDTO appUserDTO) { + return R.ok(appUserService.getUsersWithRolePage(page, appUserDTO)); + } + + /** + * 通过id查询app用户表 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/details/{userId}") + public R getById(@PathVariable("userId") Long userId) { + return R.ok(appUserService.selectUserVoById(userId)); + } + + /** + * @return R + */ + @Operation(summary = "通过userName查询", description = "通过userName查询") + @GetMapping("/details") + public R getByUserName(AppUser user) { + AppUser one = appUserService.getOne(Wrappers.query(user), false); + return R.ok(one == null ? null : CommonConstants.SUCCESS); + } + + /** + * 修改app用户表 + */ + @Operation(summary = "修改app用户表", description = "修改app用户表") + @SysLog("修改app用户表") + @PutMapping + @HasPermission("app_appuser_edit") + public R updateById(@RequestBody AppUserDTO appUser) { + return R.ok(appUserService.updateUser(appUser)); + } + + /** + * 通过id删除app用户表 + */ + @Operation(summary = "通过ids删除app用户表", description = "通过ids删除app用户表") + @SysLog("通过id删除app用户表") + @DeleteMapping + @HasPermission("app_appuser_del") + public R removeById(@RequestBody Long[] ids) { + return R.ok(appUserService.deleteAppUserByIds(ids)); + } + @SysLog("修改个人信息") + @PutMapping("/edit") + public R updateUserInfo(@Valid @RequestBody AppUserDTO userDto) { + if (UserTypeEnum.TOC.getStatus().equals(SecurityUtils.getUser().getUserType())) { + userDto.setUserId(SecurityUtils.getUser().getId()); + // TOC 以手机号为key + userDto.setUsername(SecurityUtils.getUser().getUsername()); + } + return appUserService.updateUserInfo(userDto); + } } diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java new file mode 100644 index 000000000..92b3591ca --- /dev/null +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java @@ -0,0 +1,138 @@ +package com.bsd.pjcloud.app.handler; + +import cn.hutool.core.util.ObjectUtil; +import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConfig; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipaySystemOauthTokenRequest; +import com.alipay.api.response.AlipaySystemOauthTokenResponse; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsd.pjcloud.app.api.dto.AppUserInfo; +import com.bsd.pjcloud.app.api.entity.AppUser; +import com.bsd.pjcloud.app.config.MiniAlipayConf; +import com.bsd.pjcloud.app.mapper.AppSocialDetailsMapper; +import com.bsd.pjcloud.app.service.AppUserService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 支付宝小程序 + */ +@Slf4j +@Component("MINI_ALIPAY") +@AllArgsConstructor +public class MiniAlipayLoginHandler extends AbstractLoginHandler { + + private final MiniAlipayConf miniAlipayConf; + + private final AppUserService appUserService; + + private final AppSocialDetailsMapper appSocialDetailsMapper; + + static private AlipayClient alipayClient = null; + + public AlipayClient getAlipay() { + if (ObjectUtil.isNotEmpty(miniAlipayConf)) return getAlipayClient(); + return getAlipayClient(); + } + + private synchronized AlipayClient getAlipayClient() { + if (alipayClient == null) { + try { + alipayClient = new DefaultAlipayClient(getAlipayConfig()); + } catch (Exception e) { + e.printStackTrace(); + log.error("初始化支付宝客户端失败error:{}", e.getMessage()); + } + } + return alipayClient; + } + + private AlipayConfig getAlipayConfig() { + AlipayConfig alipayConfig = new AlipayConfig(); + alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); + alipayConfig.setAppId(miniAlipayConf.getAppId()); + alipayConfig.setPrivateKey(miniAlipayConf.getPrivateKey()); + alipayConfig.setFormat("json"); + alipayConfig.setAlipayPublicKey(miniAlipayConf.getAlipayPublicKey()); + alipayConfig.setCharset("UTF-8"); + alipayConfig.setSignType("RSA2"); + return alipayConfig; + } + + /** + * 获取支付宝openId + */ + public AlipaySystemOauthTokenResponse getOpenId(String code, String refreshToken) { + AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); + // 设置刷新令牌 + if (ObjectUtil.isNotEmpty(refreshToken)) { + request.setRefreshToken(refreshToken); + request.setGrantType("refresh_token"); + } + // 设置授权码 + if (ObjectUtil.isNotEmpty(code)) { + request.setCode(code); + request.setGrantType("authorization_code"); + } + try { + AlipaySystemOauthTokenResponse response = getAlipay().execute(request); + if (!response.isSuccess()) { + log.error("|获取支付宝openId|错误error:{}", response.getSubMsg()); + } + return response; + } catch (Exception e) { + e.printStackTrace(); + log.error("|获取支付宝openId|意外的错误error:{}", e.getMessage()); + return null; + } + } + + /** + * 通过用户传入获取唯一标识 + */ + @Override + public String identify(String loginStr) { + AlipaySystemOauthTokenResponse res = getOpenId(loginStr, null); + if (ObjectUtil.isEmpty(res) || ObjectUtil.isEmpty(res.getOpenId())) { + return null; + } + return res.getOpenId(); + } + + /** + * 获取用户信息 + */ + @Override + public AppUserInfo info(String openId) { + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getWxOpenid, openId)); + if (ObjectUtil.isEmpty(user)) { + log.info("支付宝小程序openId:{},创建新的用户", openId); + String name = "支付宝游客-" + openId; + AppUser appUser = new AppUser(); + appUser.setWxOpenid(openId); + appUser.setUsername(name); + appUser.setName(name); + appUser.setCreateBy(openId); + appUser.setUpdateBy(openId); + appUserService.saveOrUpdate(appUser); + AppUserInfo appUserDTO = new AppUserInfo(); + appUserDTO.setAppUser(appUser); + return appUserDTO; + } + return appUserService.findUserInfo(user); + } + + /** + * 绑定逻辑 + */ + @Override + public Boolean bind(AppUser user, String identify) { + user.setWxOpenid(identify); + appUserService.updateById(user); + return true; + } + + +} diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAppLoginHandler.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java similarity index 96% rename from pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAppLoginHandler.java rename to pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java index e3e7c242d..e94fdfd24 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAppLoginHandler.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java @@ -36,15 +36,12 @@ import org.springframework.stereotype.Component; import java.util.Objects; /** - * @author pjcloud - * @date 2019年11月02日 - *

* 微信小程序 */ @Slf4j -@Component("APP-MINI") +@Component("MINI_WECHAT") @AllArgsConstructor -public class MiniAppLoginHandler extends AbstractLoginHandler { +public class MiniWechatLoginHandler extends AbstractLoginHandler { private final AppUserService appUserService; diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml b/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml index db8f394a9..645bbb4f6 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml @@ -16,3 +16,11 @@ spring: import: - optional:nacos:application-@profiles.active@.yml - optional:nacos:${spring.application.name}-@profiles.active@.yml + +mini-ali-pay: + app-id: 2021005197658445 + private-key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCTYHY0AW2cjbHoOinD8f4CKMKasDmbRw4CEMasG5IzckmeuTqut3GmxxRRls62zlXRVOCDYgnGhzEhD/nMYx0TMBX2mYo+fH9XUMtZMKY+p2rPTXTlPnGfbQ4edUYofR0tq1ug+wHOD5/jxuwO1zPfB7t8dX3gNa4M43fTPK2mPDeo/UiRB45DPjUWvbMX59ltYYMgmAW0TAbXmRAGKFxrmX3HddJK0jSwEpTcHaRV3C6FrYV48vWHEliviVBUsLRIpwv3T3FYZm0a19LcGQtybeThXaaCYrj7Lwoffk8v8DL2g28IAeiFtjjkWbPFKKMCsSe/LVkvdQTuhncuDayTAgMBAAECggEAJvreiMbP7RZ1Nc0cet0op/2L60otEmrqw5UYVzE7rCvQWRD4+nk+sDP7pdDTf/p3LFTcxSNLHp1nWy1UjsCwUgDn7j+SFxDqxXdzMXXyoqO5VndQMcogV2CK2Xd/RPpCm2+1XpDFW3E6gw58JTi6WYU8C6Ev1/uau4H2kYJ9E3h2W0P0PyY+Q9QNHEpG2hLQdiWLHz3xzmSNSDXiknEg/Whew7IMVKNgxg5VVEBTerwCH5Grvn56CKx6acb6JlU+VFsmW3J1tMYLgxVhJWVVAK6NltmxE5apIxTkG3wEOMuuBCZHQ1Lm0rrGKJh8WmYRs6ho5wSjHYG3hyKRm/0TEQKBgQDcDDPyOWw/o9ZqB3N7qxUi63V7wU7X8QL/CmQO4tu/ng/4Drm8QESjk+ib3O3pCC7xwcte/U1Otw3AmSSj1CWvT8a0yLJM9GVOJwZFVyzy6yVFPyn6l4ndRdargyFokM2lgVTgEHo4WSMbLQsA8/KTB3anqo6bYLjqjsBgY49fpQKBgQCrdLMh5ayJOUK9UeBHXr0c/OLDzwoSUVMyNLfX3pIBC21meFxigNMiy+UKpslM2QMH1yyfwsUKv/i7y1kRFj9Go7pYU0HxglfHecllqXPunWJYuSm38x8WWAG/oqcLPGSlJjHYhU6IAkDuHHaW5DKLxr0x2DkZ/c4TcyYal9Ol1wKBgD4Lls4S0On02W1WIoLZT4FkIOE/NWsAAxdEp8fmwY17FQedp1NkT7ZL60efeNm/O/Vg7mYfSCAMz2ziAYnMNMAE34N0H4pBUxtBN6xvkzX/hafL0ptdBTuGCKydsdrZEZM8L2FqY/vlbleoULT5FAnPDe7i0YkQMbO5gpbrG68dAoGAFv+tc7OSREn5CNotwoUTywqlBG0GRdTA2zA1JPDHFvrIbwFgKxpqt/UvwREEWZmWjXuwkbGXqsx7ef1Z8i/QxxH5UhXA97trOOe+OzPSyEQ2R/52eSVUmzOs8F7KF3i/a2PHNesT0Ky0tvv8cFsl6Jf9Eu2VI0ZnWTaN+u04x7sCgYEAlhpr3RSJk2EnLPR3BxKboTxSGsK/2U4xz/WqX96B+lQ5h7NSMJC35vZJ5dm2vHtLcucHaK49YNsJdq+nzhhwxDz+Dd/5rcIp7AcdHqDsVLHYIN7JWxa9QiC3gvrnWsij1DShydOLpGMYveFz0LyRIUDW4CTs55oDFsIR4HdwtM0= + public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk2B2NAFtnI2x6Dopw/H+AijCmrA5m0cOAhDGrBuSM3JJnrk6rrdxpscUUZbOts5V0VTgg2IJxocxIQ/5zGMdEzAV9pmKPnx/V1DLWTCmPqdqz0105T5xn20OHnVGKH0dLatboPsBzg+f48bsDtcz3we7fHV94DWuDON30zytpjw3qP1IkQeOQz41Fr2zF+fZbWGDIJgFtEwG15kQBihca5l9x3XSStI0sBKU3B2kVdwuha2FePL1hxJYr4lQVLC0SKcL909xWGZtGtfS3BkLcm3k4V2mgmK4+y8KH35PL/Ay9oNvCAHohbY45FmzxSijArEnvy1ZL3UE7oZ3Lg2skwIDAQAB + alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnCB+N172m5gxf1Rolfx5LErSiVwQCh0XQdDrVy6aTuVF5EtdqahSHtADyEPsBWudMBhzCfqpoZvfnvH7a+PED6uZ3DoXt7ETh8TmNM5yc+WTnD8pSphQvuHDJ3zMks489KNxiX6sXag71k9H1MXklJGPOUaljHqy/QlRn2ZLT7pFgaFH9LEcVoQBPIOurUn95078h848RFD30jZFW3fakxUGAGVVZaHH62z5OEWOmcA+CwxsEDMa1XMt02RGXgAAq4WOj+BqOGiFmhM8rnrUMchTyvx4umOzGvbF2Y9irN3aBZ5lfg+bzYcJpIOMzlM/V00LnEWzCblJzXNyH4hJQIDAQAB + callback-url: https://rj4jv5rwqs.by.takin.cc/hard/hard-ali-pay/callback + # callback-url: https://stgl.pj.gov.cn/api/hard/hard-ali-pay/callback diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/SecurityConstants.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/SecurityConstants.java index 82e90bf5c..dcf350489 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/SecurityConstants.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/SecurityConstants.java @@ -250,6 +250,16 @@ public interface SecurityConstants { */ String APP = "mobile"; + /** + * 游客登录(微信,小程序) + */ + String VISITOR = "visitor"; + + /** + * 游客登录(微信,小程序) openId + */ + String VISITOR_OPEN_ID = "openId"; + /** * 用户信息 */ diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/enums/UserTypeEnum.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/enums/UserTypeEnum.java index c1974af7c..9eafdd097 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/enums/UserTypeEnum.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/enums/UserTypeEnum.java @@ -1,22 +1,31 @@ package com.bsd.pjcloud.common.core.constant.enums; +import cn.hutool.core.util.ObjectUtil; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; + @Getter @AllArgsConstructor public enum UserTypeEnum { - TOB("0", "面向后台应用"), TOC("1", "面向小程序"); + TOB("0", "面向后台应用"), + TOC("1", "面向小程序"); - /** - * 类型 - */ - private final String status; + /** + * 类型 + */ + private final String status; - /** - * 描述 - */ - private final String description; + /** + * 描述 + */ + private final String description; + + public static UserTypeEnum valueOfByStatus(String status) { + if (ObjectUtil.isEmpty(status)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(status, v.getStatus())).findFirst().orElse(null); + } } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardAuthTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardAuthTypeEnum.java index 3b2ac1d89..f975002e4 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardAuthTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardAuthTypeEnum.java @@ -15,6 +15,7 @@ import java.util.Arrays; public enum HardAuthTypeEnum { HARD_DDOR_AUTH("10", "智能柜授权"), + HARD_DDOR_TOC_AUTH("20", "TOC用户智能柜授权"), ; private final String type; private final String description; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java index 88b7c7009..4f1e1fd25 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java @@ -20,6 +20,7 @@ public enum HardOrderTypeEnum { ZY("5", "正元公务餐"), LB("6", "宁波银行(美好生活)"), FARMER("7", "共富商城(助农)"), + TOC_VISITOR("8", "toc访客购买(不记名用户)"), ; private final String type; private final String description; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAuthAppDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAuthAppDto.java index 4274a461a..dba66ef4e 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAuthAppDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAuthAppDto.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.hard.api.dto; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -12,6 +13,11 @@ public class HardAuthAppDto { */ private Long userId; + /** + * 用户类型 + */ + private UserTypeEnum userType; + /** * 授权id */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardGetAuthAppDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardGetAuthAppDto.java index 151512293..91b650d2b 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardGetAuthAppDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardGetAuthAppDto.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.hard.api.dto; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -12,6 +13,11 @@ public class HardGetAuthAppDto { */ private Long userId; + /** + * 用户类型 + */ + private UserTypeEnum userType; + /** * 智能柜设备id */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java index 8e10716c4..c1b02c357 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java @@ -37,6 +37,12 @@ public class HardDoorFlowEntity extends Model { @Schema(description = "用户编号") private Long userId; + /** + * 用户类型 + */ + @Schema(description = "用户类型") + private String userType; + /** * 业务类型 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorCabinetEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorCabinetEntity.java index 560449077..087d074f4 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorCabinetEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorCabinetEntity.java @@ -78,6 +78,18 @@ public class HardDoorCabinetEntity extends Model { @Schema(description = "url二维码") private String urlQrCode; + /** + * 支付宝小程序二维码 + */ + @Schema(description = "支付宝小程序二维码") + private String urlAlipayQrCode; + + /** + * 微信小程序二维码 + */ + @Schema(description = "微信小程序二维码") + private String urlWechatQrCode; + /** * 创建人 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardAppCreateThirdDoorOrderVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardAppCreateThirdDoorOrderVo.java new file mode 100644 index 000000000..bb0826540 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardAppCreateThirdDoorOrderVo.java @@ -0,0 +1,14 @@ +package com.bsd.pjcloud.hard.api.vo.order; + +import lombok.Data; + +@Data +public class HardAppCreateThirdDoorOrderVo { + + private Long authId; + + /** + * 支付宝订单号 + */ + private String alipayOrderStr; +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/MiniAlipayConf.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/MiniAlipayConf.java new file mode 100644 index 000000000..09aa1ae32 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/MiniAlipayConf.java @@ -0,0 +1,50 @@ +package com.bsd.pjcloud.hard.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 支付宝支付配置 + */ +@Component +@ConfigurationProperties(prefix = "mini-ali-pay") +@Data +public class MiniAlipayConf { + + /** + * 应用ID + */ + private String appId; + + /** + * 商户号 + */ + private String merchantId; + + /** + * 商户账号 + */ + private String merchantAccount; + + /** + * 冻结金额 + */ + private String freezeAmount; + + /** + * 私钥 + */ + private String privateKey; + + /** + * 公钥 + */ + private String publicKey; + + /** + * 支付宝公钥 + */ + private String alipayPublicKey; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java index 05b7fbe0b..be8b91392 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; @@ -14,6 +15,7 @@ import com.bsd.pjcloud.hard.api.dto.*; import com.bsd.pjcloud.hard.api.entity.HardAuthEntity; import com.bsd.pjcloud.hard.api.vo.HardAuthVo; import com.bsd.pjcloud.hard.api.vo.HardGetAuthAppVo; +import com.bsd.pjcloud.hard.api.vo.order.HardAppCreateThirdDoorOrderVo; import com.bsd.pjcloud.hard.service.HardAuthService; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; @@ -48,17 +50,28 @@ public class HardAuthController { public R appGetAuthHardDoor(@Valid @RequestBody HardGetAuthAppDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setUserId(user.getId()); + dto.setUserType(UserTypeEnum.valueOfByStatus(user.getUserType())); return R.ok(hardAuthService.appGetAuthHardDoor(dto)); } @Operation(summary = "app智能柜授权", description = "app智能柜授权") @PostMapping("/app/auth-hard-door") - public R appAuthHardDoor(@Valid @RequestBody HardAuthAppDto dto) { + public R appAuthHardDoor(@Valid @RequestBody HardAuthAppDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setUserId(user.getId()); + dto.setUserType(UserTypeEnum.valueOfByStatus(user.getUserType())); return R.ok(hardAuthService.appAuthHardDoor(dto)); } + @Operation(summary = "app创建第三方免密支付", description = "app创建第三方免密支付") + @PostMapping("/app/auth-create-third-door-order") + public R appCreateThirdDoorOrder(@Valid @RequestBody HardAuthAppDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setUserId(user.getId()); + dto.setUserType(UserTypeEnum.valueOfByStatus(user.getUserType())); + return R.ok(hardAuthService.appCreateThirdDoorOrder(dto)); + } + /* ************************************* end app end ************************************* */ @Operation(summary = "流程错误手动处理", description = "流程错误手动处理") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java index bd5b661e9..e1ec1aaa3 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.hard.api.dto.HardGetAuthAppDto; import com.bsd.pjcloud.hard.api.entity.HardAuthEntity; import com.bsd.pjcloud.hard.api.vo.HardAuthVo; import com.bsd.pjcloud.hard.api.vo.HardGetAuthAppVo; +import com.bsd.pjcloud.hard.api.vo.order.HardAppCreateThirdDoorOrderVo; import jakarta.validation.Valid; public interface HardAuthService extends IService { @@ -26,6 +27,11 @@ public interface HardAuthService extends IService { */ Long appAuthHardDoor(HardAuthAppDto dto); + /** + * app创建第三方免密支付 + */ + HardAppCreateThirdDoorOrderVo appCreateThirdDoorOrder(@Valid HardAuthAppDto dto); + /** * 判断当前用户信誉 */ @@ -35,4 +41,5 @@ public interface HardAuthService extends IService { * 流程错误手动处理 */ void errorChange(HardAuthErrorChangeDto dto, Long userId); + } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java index 001fff8b7..c8458ae6d 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.hard.api.dto.HardDoorFlowDto; import com.bsd.pjcloud.hard.api.dto.HardDoorFlowOpenDto; @@ -40,7 +41,7 @@ public interface HardDoorFlowService extends IService { /** * 购买开门 */ - void openDoorPay(HardDoorFlowOpenDto dto, HardDoorManagerVo hardDoorDetail); + void openDoorPay(HardDoorFlowOpenDto dto, HardDoorManagerVo hardDoorDetail, UserTypeEnum userType); /** * 上架开门 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java index e80c4836f..63985dbd6 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.service.PjcloudUser; @@ -90,7 +91,7 @@ public interface HardOrderService extends IService { /** * 创建智能柜订单 */ - Long createHardDoorOrder(Long userId, Long hardId); + Long createHardDoorOrder(Long userId, UserTypeEnum userType, Long hardId); /** * 结算智能柜订单 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java new file mode 100644 index 000000000..aca1dcea4 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.hard.service; + + +import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse; + +public interface MiniAlipayService { + + /** + * 获取智能柜小程序二维码 + */ + String getDoorMiniQrCode(String hardDoorId, String cabinetNo); + + /** + * 支付宝冻结金额 + */ + AlipayFundAuthOrderAppFreezeResponse freezeAmount(Long authId); +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java index c53ad4724..3ab15098e 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java @@ -1,12 +1,14 @@ package com.bsd.pjcloud.hard.service.impl; import cn.hutool.core.util.ObjectUtil; +import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.admin.api.vo.UserVO; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.R; @@ -23,12 +25,11 @@ import com.bsd.pjcloud.hard.api.utils.HardUtil; import com.bsd.pjcloud.hard.api.vo.HardAuthVo; import com.bsd.pjcloud.hard.api.vo.HardGetAuthAppVo; import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo; +import com.bsd.pjcloud.hard.api.vo.order.HardAppCreateThirdDoorOrderVo; import com.bsd.pjcloud.hard.mapper.HardAuthMapper; import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; -import com.bsd.pjcloud.hard.service.HardAuthService; -import com.bsd.pjcloud.hard.service.HardDoorFlowService; -import com.bsd.pjcloud.hard.service.HardDoorManagerService; -import com.bsd.pjcloud.hard.service.HardOrderService; +import com.bsd.pjcloud.hard.service.*; +import com.bsd.pjcloud.hard.service.impl.ali.MiniAlipayServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -51,6 +52,7 @@ public class HardAuthServiceImpl extends ServiceImpl spuList = hardSpuJoinService.getSpuList(hardDoorDetail.getId(), dto.getCabinetNo()); if (ObjectUtil.isEmpty(spuList) || spuList.isEmpty()) throw new RuntimeException("货柜商品信息为空,请上架"); - getSelf().openDoor(dto, hardDoorDetail); + getSelf().openDoor(dto, hardDoorDetail, userType); } /** @@ -223,7 +226,7 @@ public class HardDoorFlowServiceImpl extends ServiceImpl ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java index b9d39667c..4beac8317 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java @@ -545,6 +545,9 @@ public class WalletManageServiceImpl extends ServiceImpl= 100 * 100) { return null; } diff --git a/pom.xml b/pom.xml index 32f11c842..19e0d7d7f 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,9 @@ ~ this software without specific prior written permission. ~ Author: pjcloud ~ - --> + --> + 4.0.0 com.bsd @@ -116,16 +118,16 @@ pjcloud-common pjcloud-flow pjcloud-visual - + pjcloud-app-server pjcloud-thirdparty pjcloud-canteen pjcloud-integrated pjcloud-wallet pjcloud-supermarket pjcloud-hardware - pjcloud-mqtt - pjcloud-pass - + pjcloud-mqtt + pjcloud-pass + From 5d52c1cd68779372b929bd111556534cc0be256a Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 23 Dec 2025 16:27:11 +0800 Subject: [PATCH 17/46] 11 --- .../pjcloud/app/handler/MiniAlipayLoginHandler.java | 4 +--- .../hard/controller/order/HardOrderController.java | 11 +++++++++++ .../hard/service/impl/order/HardOrderServiceImpl.java | 8 +++++++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java index 92b3591ca..47376063b 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java @@ -117,9 +117,7 @@ public class MiniAlipayLoginHandler extends AbstractLoginHandler { appUser.setCreateBy(openId); appUser.setUpdateBy(openId); appUserService.saveOrUpdate(appUser); - AppUserInfo appUserDTO = new AppUserInfo(); - appUserDTO.setAppUser(appUser); - return appUserDTO; + return appUserService.findUserInfo(user); } return appUserService.findUserInfo(user); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java index bd47a76ce..fb39b1b5b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java @@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.canteen.constant.OrderTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.R; @@ -125,6 +126,16 @@ public class HardOrderController { return R.ok(hardwareOrderService.pagejoin(page, dto)); } + @Operation(summary = "app查询toc自提柜订单", description = "app查询toc自提柜订单") + @GetMapping("/app/toc-door-page-join") + public R appTocDoorPageJoin(@ParameterObject Page page, @ParameterObject HardOrderDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setUserId(user.getId()); + dto.setIsFindCarList(true); + dto.setOrderTypeCodes(List.of(HardOrderTypeEnum.TOC_VISITOR.getType())); + return R.ok(hardwareOrderService.pagejoin(page, dto)); + } + @Operation(summary = "app查询食堂订单列表", description = "app查询订单列表") @GetMapping("/app/caneen-page-join") public R appCaneenPageJoin(@ParameterObject Page page, @ParameterObject HardOrderDto dto) { diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index d63b3396b..391f2f192 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -874,6 +874,12 @@ public class HardOrderServiceImpl extends ServiceImpl Date: Tue, 23 Dec 2025 20:29:48 +0800 Subject: [PATCH 18/46] =?UTF-8?q?feat:=E6=94=AF=E4=BB=98=E5=AE=9D=E5=85=8D?= =?UTF-8?q?=E5=AF=86=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pjcloud/hard/config/MiniAlipayConf.java | 5 ++++ .../hard/service/MiniAlipayService.java | 6 ++++ .../service/impl/HardAuthServiceImpl.java | 5 ++-- .../impl/ali/MiniAlipayServiceImpl.java | 28 +++++++++++++++++++ .../src/main/resources/application.yml | 1 + 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/MiniAlipayConf.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/MiniAlipayConf.java index 09aa1ae32..15c4285d6 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/MiniAlipayConf.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/MiniAlipayConf.java @@ -32,6 +32,11 @@ public class MiniAlipayConf { */ private String freezeAmount; + /** + * 芝麻服务id + */ + private String zmServiceId; + /** * 私钥 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java index aca1dcea4..aab540611 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service; import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse; +import com.alipay.api.response.ZhimaCreditPayafteruseCreditagreementSignResponse; public interface MiniAlipayService { @@ -14,4 +15,9 @@ public interface MiniAlipayService { * 支付宝冻结金额 */ AlipayFundAuthOrderAppFreezeResponse freezeAmount(Long authId); + + /** + * 支付宝签约 + */ + ZhimaCreditPayafteruseCreditagreementSignResponse creditagreementSign(Long authId); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java index 3ab15098e..a09a63ea1 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service.impl; import cn.hutool.core.util.ObjectUtil; import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse; +import com.alipay.api.response.ZhimaCreditPayafteruseCreditagreementSignResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -140,11 +141,11 @@ public class HardAuthServiceImpl extends ServiceImpl Date: Thu, 25 Dec 2025 13:27:25 +0800 Subject: [PATCH 19/46] =?UTF-8?q?feat:=E5=85=8D=E5=AF=86=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/api/constant/AppUserTypeEnum.java | 27 +++ .../bsd/pjcloud/app/api/entity/AppUser.java | 210 +++++++++--------- .../app/api/feign/RemoteAppUserService.java | 39 ++-- .../app/controller/AppUserController.java | 15 ++ .../app/handler/MiniAlipayLoginHandler.java | 12 +- .../app/handler/MiniWechatLoginHandler.java | 6 +- .../hard/service/MiniAlipayService.java | 22 +- .../service/impl/HardAuthServiceImpl.java | 16 +- .../impl/ali/MiniAlipayServiceImpl.java | 166 ++++++++++---- 9 files changed, 329 insertions(+), 184 deletions(-) create mode 100644 pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/constant/AppUserTypeEnum.java diff --git a/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/constant/AppUserTypeEnum.java b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/constant/AppUserTypeEnum.java new file mode 100644 index 000000000..9474e33ea --- /dev/null +++ b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/constant/AppUserTypeEnum.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.app.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * app用户类型 + */ +@AllArgsConstructor +@Getter +public enum AppUserTypeEnum { + + MINI_WECHAT("10", "微信小程序用户"), + MINI_ALIPAY("20", "支付宝小程序用户"), + ; + private final String type; + private final String description; + + public static AppUserTypeEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/entity/AppUser.java b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/entity/AppUser.java index 886c08df4..f0a99a884 100644 --- a/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/entity/AppUser.java +++ b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/entity/AppUser.java @@ -40,122 +40,134 @@ import java.time.LocalDateTime; @Schema(description = "app用户表") public class AppUser extends Model { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** - * userId - */ - @TableId(type = IdType.ASSIGN_ID) - @Schema(description = "userId") - private Long userId; + /** + * userId + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "userId") + private Long userId; - /** - * 用户名 - */ - @Schema(description = "用户名") - private String username; + /** + * 用户类型 + */ + @Schema(description = "用户类型") + private String userType; - /** - * 密码 - */ - @Schema(description = "密码") - private String password; + /** + * 用户名 + */ + @Schema(description = "用户名") + private String username; - /** - * 随机盐 - */ - @JsonIgnore - @Schema(description = "随机盐") - private String salt; + /** + * 密码 + */ + @Schema(description = "密码") + private String password; - /** - * 手机号 - */ - @Schema(description = "手机号") - private String phone; + /** + * 随机盐 + */ + @JsonIgnore + @Schema(description = "随机盐") + private String salt; - /** - * 头像 - */ - @Schema(description = "头像") - private String avatar; + /** + * 手机号 + */ + @Schema(description = "手机号") + private String phone; - /** - * 昵称 - */ - @Schema(description = "拓展字段:昵称") - private String nickname; + /** + * 头像 + */ + @Schema(description = "头像") + private String avatar; - /** - * 姓名 - */ - @Schema(description = "拓展字段:姓名") - private String name; + /** + * 昵称 + */ + @Schema(description = "拓展字段:昵称") + private String nickname; - /** - * 邮箱 - */ - @Schema(description = "拓展字段:邮箱") - private String email; + /** + * 姓名 + */ + @Schema(description = "拓展字段:姓名") + private String name; - /** - * 创建人 - */ - @Schema(description = "创建人") - @TableField(fill = FieldFill.INSERT) - private String createBy; + /** + * 邮箱 + */ + @Schema(description = "拓展字段:邮箱") + private String email; - /** - * 修改人 - */ - @Schema(description = "修改人") - @TableField(fill = FieldFill.UPDATE) - private String updateBy; + /** + * 第三方登录扩展字段 + */ + @Schema(description = "第三方登录扩展字段") + private String loginExtJson; - /** - * 创建时间 - */ - @Schema(description = "创建时间") - @TableField(fill = FieldFill.INSERT) - private LocalDateTime createTime; + /** + * 创建人 + */ + @Schema(description = "创建人") + @TableField(fill = FieldFill.INSERT) + private String createBy; - /** - * 修改时间 - */ - @Schema(description = "修改时间") - @TableField(fill = FieldFill.UPDATE) - private LocalDateTime updateTime; + /** + * 修改人 + */ + @Schema(description = "修改人") + @TableField(fill = FieldFill.UPDATE) + private String updateBy; - /** - * 删除标记 - */ - @Schema(description = "删除标记,1:已删除,0:正常") - @TableField(fill = FieldFill.INSERT) - @TableLogic - private String delFlag; + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; - /** - * 所属租户 - */ - @Schema(description = "所属租户", hidden = true) - private Long tenantId; + /** + * 修改时间 + */ + @Schema(description = "修改时间") + @TableField(fill = FieldFill.UPDATE) + private LocalDateTime updateTime; - /** - * 最后一次密码修改时间 - */ - @Schema(description = "最后一次密码修改时间") - private LocalDateTime lastModifiedTime; + /** + * 删除标记 + */ + @Schema(description = "删除标记,1:已删除,0:正常") + @TableField(fill = FieldFill.INSERT) + @TableLogic + private String delFlag; - /** - * 锁定标记 - */ - @Schema(description = "锁定标记") - private String lockFlag; + /** + * 所属租户 + */ + @Schema(description = "所属租户", hidden = true) + private Long tenantId; - /** - * 微信小程序登录openId - */ - @Schema(description = "微信小程序登录openId") - private String wxOpenid; + /** + * 最后一次密码修改时间 + */ + @Schema(description = "最后一次密码修改时间") + private LocalDateTime lastModifiedTime; + + /** + * 锁定标记 + */ + @Schema(description = "锁定标记") + private String lockFlag; + + /** + * openId + */ + @Schema(description = "openId") + private String openid; } diff --git a/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/feign/RemoteAppUserService.java b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/feign/RemoteAppUserService.java index ebbe6a387..a760e3321 100644 --- a/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/feign/RemoteAppUserService.java +++ b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/feign/RemoteAppUserService.java @@ -27,32 +27,27 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -/** - * @author pjcloud - * @date 2018/6/22 - */ + @FeignClient(contextId = "remoteAppUserService", value = ServiceNameConstants.APP_SERVER) public interface RemoteAppUserService { - /** - * 通过用户名查询用户、角色信息 - * @param username 用户名 - * @param from 调用标志 - * @return R - */ - @NoToken - @GetMapping("/appuser/info/{username}") - R info(@PathVariable("username") String username); + /** + * 通过用户名查询用户、角色信息 + */ + @NoToken + @GetMapping("/appuser/info/{username}") + R info(@PathVariable("username") String username); - /** - * 通过社交账号或手机号查询用户、角色信息 - * @param inStr appid@code - * @param from 调用标志 - * @return - */ - @NoToken - @GetMapping("/appsocial/info/{inStr}") - R social(@PathVariable("inStr") String inStr); + @NoToken + @GetMapping("/appuser/infoByUserId/{userId}") + R infoByUserId(@PathVariable("userId") Long userId); + + /** + * 通过社交账号或手机号查询用户、角色信息 + */ + @NoToken + @GetMapping("/appsocial/info/{inStr}") + R social(@PathVariable("inStr") String inStr); } diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserController.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserController.java index 9815cb72c..7639860ef 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserController.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserController.java @@ -81,6 +81,8 @@ public class AppUserController { /* ************************************* end app end ************************************* */ + /* ************************************* start 远程调用 start ************************************* */ + @Inner @GetMapping("/info/{username}") public R info(@PathVariable String username) { @@ -95,6 +97,19 @@ public class AppUserController { return R.ok(appUserService.findUserInfo(user)); } + @Inner + @GetMapping("/infoByUserId/{userId}") + public R infoByUserId(@PathVariable Long userId) { + AppUser user = appUserService.getOne(Wrappers.query() + .lambda() + .eq(AppUser::getUserId, userId) + ); + if (user == null) return R.failed(); + return R.ok(appUserService.findUserInfo(user)); + } + + /* ************************************* end 远程调用 end ************************************* */ + /** * 分页查询 */ diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java index 47376063b..459e1b449 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java @@ -1,12 +1,14 @@ package com.bsd.pjcloud.app.handler; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import com.alipay.api.AlipayClient; import com.alipay.api.AlipayConfig; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipaySystemOauthTokenRequest; import com.alipay.api.response.AlipaySystemOauthTokenResponse; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsd.pjcloud.app.api.constant.AppUserTypeEnum; import com.bsd.pjcloud.app.api.dto.AppUserInfo; import com.bsd.pjcloud.app.api.entity.AppUser; import com.bsd.pjcloud.app.config.MiniAlipayConf; @@ -106,18 +108,22 @@ public class MiniAlipayLoginHandler extends AbstractLoginHandler { */ @Override public AppUserInfo info(String openId) { - AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getWxOpenid, openId)); + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getOpenid, openId)); if (ObjectUtil.isEmpty(user)) { log.info("支付宝小程序openId:{},创建新的用户", openId); String name = "支付宝游客-" + openId; AppUser appUser = new AppUser(); - appUser.setWxOpenid(openId); + appUser.setOpenid(openId); + appUser.setUserType(AppUserTypeEnum.MINI_ALIPAY.getType()); appUser.setUsername(name); appUser.setName(name); appUser.setCreateBy(openId); appUser.setUpdateBy(openId); appUserService.saveOrUpdate(appUser); return appUserService.findUserInfo(user); + } + if (ObjectUtil.isEmpty(user.getLoginExtJson())) { + } return appUserService.findUserInfo(user); } @@ -127,7 +133,7 @@ public class MiniAlipayLoginHandler extends AbstractLoginHandler { */ @Override public Boolean bind(AppUser user, String identify) { - user.setWxOpenid(identify); + user.setOpenid(identify); appUserService.updateById(user); return true; } diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java index e94fdfd24..d9d5e622d 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java @@ -82,13 +82,13 @@ public class MiniWechatLoginHandler extends AbstractLoginHandler { */ @Override public AppUserInfo info(String openId) { - AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getWxOpenid, openId)); + AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getOpenid, openId)); // 未注册用户自动注册 if (Objects.isNull(user)) { log.info("微信小程序未绑定:{},创建新的用户", openId); AppUser appUser = new AppUser(); - appUser.setWxOpenid(openId); + appUser.setOpenid(openId); appUser.setUsername(openId); appUser.setCreateBy(openId); appUser.setUpdateBy(openId); @@ -111,7 +111,7 @@ public class MiniWechatLoginHandler extends AbstractLoginHandler { */ @Override public Boolean bind(AppUser user, String identify) { - user.setWxOpenid(identify); + user.setOpenid(identify); appUserService.updateById(user); return true; } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java index aab540611..ffde0e38b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java @@ -1,8 +1,7 @@ package com.bsd.pjcloud.hard.service; -import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse; -import com.alipay.api.response.ZhimaCreditPayafteruseCreditagreementSignResponse; +import com.alipay.api.response.*; public interface MiniAlipayService { @@ -12,12 +11,23 @@ public interface MiniAlipayService { String getDoorMiniQrCode(String hardDoorId, String cabinetNo); /** - * 支付宝冻结金额 + * 创建支付宝免密订单 */ - AlipayFundAuthOrderAppFreezeResponse freezeAmount(Long authId); + AlipayTradeCreateResponse miCreateOrder(String openId, Long authId); /** - * 支付宝签约 + * 查询支付宝免密订单 */ - ZhimaCreditPayafteruseCreditagreementSignResponse creditagreementSign(Long authId); + ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, String authId); + + /** + * 支付宝免密扣款 + */ + AlipayTradeOrderPayResponse miQueryPay(String authId, String alipayTradeNo, int price); + + /** + * 支付宝免密(取消/退款) + */ + AlipayTradeRefundResponse miCancelOrRefund(String authId, String refundId, int price); + } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java index a09a63ea1..dcdc59ac2 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java @@ -1,14 +1,16 @@ package com.bsd.pjcloud.hard.service.impl; import cn.hutool.core.util.ObjectUtil; -import com.alipay.api.response.AlipayFundAuthOrderAppFreezeResponse; -import com.alipay.api.response.ZhimaCreditPayafteruseCreditagreementSignResponse; +import com.alipay.api.response.AlipayTradeCreateResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.admin.api.vo.UserVO; +import com.bsd.pjcloud.app.api.dto.AppUserInfo; +import com.bsd.pjcloud.app.api.entity.AppUser; +import com.bsd.pjcloud.app.api.feign.RemoteAppUserService; import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.CollectionUtils; @@ -30,7 +32,6 @@ import com.bsd.pjcloud.hard.api.vo.order.HardAppCreateThirdDoorOrderVo; import com.bsd.pjcloud.hard.mapper.HardAuthMapper; import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; import com.bsd.pjcloud.hard.service.*; -import com.bsd.pjcloud.hard.service.impl.ali.MiniAlipayServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -58,6 +59,7 @@ public class HardAuthServiceImpl extends ServiceImpl scopePageJoin(Page page, HardAuthDto dto, DataScope dataScope) { @@ -134,6 +136,10 @@ public class HardAuthServiceImpl extends ServiceImpl Date: Thu, 25 Dec 2025 13:55:28 +0800 Subject: [PATCH 20/46] =?UTF-8?q?feat:=E7=AC=AC=E4=B8=89=E6=96=B9=E5=85=8D?= =?UTF-8?q?=E5=AF=86=E6=94=AF=E4=BB=98=E8=AE=B0=E5=BD=95=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/800pjcloudx_hardware.sql | 30 +++- .../api/constant/HardThirdMiTypeEnum.java | 28 ++++ .../api/entity/HardThirdMiOrderEntity.java | 143 ++++++++++++++++++ .../HardThirdMiOrderController.java | 100 ++++++++++++ .../hard/mapper/HardThirdMiOrderMapper.java | 10 ++ .../hard/service/HardThirdMiOrderService.java | 8 + .../impl/HardThirdMiOrderServiceImpl.java | 15 ++ .../mapper/HardThirdMiOrderMapper.xml | 6 + 8 files changed, 339 insertions(+), 1 deletion(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java create mode 100755 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java create mode 100755 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java create mode 100755 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java create mode 100755 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java create mode 100755 pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardThirdMiOrderServiceImpl.java create mode 100755 pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardThirdMiOrderMapper.xml diff --git a/db/800pjcloudx_hardware.sql b/db/800pjcloudx_hardware.sql index cd04b8c58..d93d5c60c 100644 --- a/db/800pjcloudx_hardware.sql +++ b/db/800pjcloudx_hardware.sql @@ -571,4 +571,32 @@ CREATE TABLE hard_spu_repertory del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', tenant_id bigint DEFAULT NULL COMMENT '租户ID', PRIMARY KEY (id) -) ENGINE = InnoDB COMMENT ='硬件商品库存更新记录'; \ No newline at end of file +) ENGINE = InnoDB COMMENT ='硬件商品库存更新记录'; + +-- ---------------------------- +-- Table structure for hard_third_mi_order +-- ---------------------------- +DROP TABLE IF EXISTS hard_third_mi_order; +CREATE TABLE hard_third_mi_order +( + id bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + biz_type tinytext NOT NULL COMMENT '上架类型', + user_id bigint NOT NULL COMMENT '用户id', + auth_id bigint COMMENT '授权id', + flow_id bigint COMMENT '流程id', + order_id bigint COMMENT '订单id', + out_order_no varchar(128) COMMENT '外部订单号', + third_order_no varchar(128) COMMENT '第三方订单号', + create_order_time datetime DEFAULT NULL COMMENT '创建订单时间', + pay_order_time datetime DEFAULT NULL COMMENT '支付时间', + refund_order_time datetime DEFAULT NULL COMMENT '退款时间', + order_status tinyint COMMENT '订单状态', + org_json text COMMENT '原始json数据', + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (id) +) ENGINE = InnoDB COMMENT ='硬件商品免密订单'; \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java new file mode 100644 index 000000000..bebfaf775 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.hard.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方面密类型 + */ +@AllArgsConstructor +@Getter +public enum HardThirdMiTypeEnum { + + MI_WECHAT("10", "微信免密支付"), + MI_ALIPAY("20", "支付宝-芝麻先享"), + ; + + private final String type; + private final String description; + + public static HardThirdMiTypeEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java new file mode 100755 index 000000000..b49b90844 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java @@ -0,0 +1,143 @@ +package com.bsd.pjcloud.hard.api.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 硬件商品免密订单 + */ +@Data +@TenantTable +@TableName("hard_third_mi_order") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "硬件商品免密订单") +public class HardThirdMiOrderEntity extends Model { + + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "编号") + private Long id; + + /** + * 上架类型 + */ + @Schema(description = "上架类型") + private String bizType; + + /** + * 用户id + */ + @Schema(description = "用户id") + private Long userId; + + /** + * 授权id + */ + @Schema(description = "授权id") + private Long authId; + + /** + * 流程id + */ + @Schema(description = "流程id") + private Long flowId; + + /** + * 订单id + */ + @Schema(description = "订单id") + private Long orderId; + + /** + * 外部订单号 + */ + @Schema(description = "外部订单号") + private String outOrderNo; + + /** + * 第三方订单号 + */ + @Schema(description = "第三方订单号") + private String thirdOrderNo; + + /** + * 创建订单时间 + */ + @Schema(description = "创建订单时间") + private LocalDateTime createOrderTime; + + /** + * 支付时间 + */ + @Schema(description = "支付时间") + private LocalDateTime payOrderTime; + + /** + * 退款时间 + */ + @Schema(description = "退款时间") + private LocalDateTime refundOrderTime; + + /** + * 订单状态 + */ + @Schema(description = "订单状态") + private Integer orderStatus; + + /** + * 原始json数据 + */ + @Schema(description = "原始json数据") + private String orgJson; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java new file mode 100755 index 000000000..b0b703e50 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java @@ -0,0 +1,100 @@ +package com.bsd.pjcloud.hard.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import com.bsd.pjcloud.hard.service.HardThirdMiOrderService; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 硬件商品免密订单 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/hardThirdMiOrder") +@Tag(description = "hardThirdMiOrder", name = "硬件商品免密订单管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardThirdMiOrderController { + + private final HardThirdMiOrderService hardThirdMiOrderService; + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('thirdmi_hardThirdMiOrder_view')") + public R getHardThirdMiOrderPage(@ParameterObject Page page, @ParameterObject HardThirdMiOrderEntity hardThirdMiOrder) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(hardThirdMiOrderService.page(page, wrapper)); + } + + /** + * 通过id查询硬件商品免密订单 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('thirdmi_hardThirdMiOrder_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(hardThirdMiOrderService.getById(id)); + } + + /** + * 新增硬件商品免密订单 + */ + @Operation(summary = "新增硬件商品免密订单", description = "新增硬件商品免密订单") + @SysLog("新增硬件商品免密订单") + @PostMapping + @PreAuthorize("@pms.hasPermission('thirdmi_hardThirdMiOrder_add')") + public R save(@RequestBody HardThirdMiOrderEntity hardThirdMiOrder) { + return R.ok(hardThirdMiOrderService.save(hardThirdMiOrder)); + } + + /** + * 修改硬件商品免密订单 + */ + @Operation(summary = "修改硬件商品免密订单", description = "修改硬件商品免密订单") + @SysLog("修改硬件商品免密订单") + @PutMapping + @PreAuthorize("@pms.hasPermission('thirdmi_hardThirdMiOrder_edit')") + public R updateById(@RequestBody HardThirdMiOrderEntity hardThirdMiOrder) { + return R.ok(hardThirdMiOrderService.updateById(hardThirdMiOrder)); + } + + /** + * 通过id删除硬件商品免密订单 + */ + @Operation(summary = "通过id删除硬件商品免密订单", description = "通过id删除硬件商品免密订单") + @SysLog("通过id删除硬件商品免密订单") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('thirdmi_hardThirdMiOrder_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(hardThirdMiOrderService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('thirdmi_hardThirdMiOrder_export')") + public List export(HardThirdMiOrderEntity hardThirdMiOrder, Long[] ids) { + return hardThirdMiOrderService.list(Wrappers.lambdaQuery(hardThirdMiOrder).in(ArrayUtil.isNotEmpty(ids), HardThirdMiOrderEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java new file mode 100755 index 000000000..0494c6a3a --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java @@ -0,0 +1,10 @@ +package com.bsd.pjcloud.hard.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface HardThirdMiOrderMapper extends PjcloudBaseMapper { + +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java new file mode 100755 index 000000000..8dc7729b2 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.hard.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; + +public interface HardThirdMiOrderService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardThirdMiOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardThirdMiOrderServiceImpl.java new file mode 100755 index 000000000..3bcc86d89 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardThirdMiOrderServiceImpl.java @@ -0,0 +1,15 @@ +package com.bsd.pjcloud.hard.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import com.bsd.pjcloud.hard.mapper.HardThirdMiOrderMapper; +import com.bsd.pjcloud.hard.service.HardThirdMiOrderService; +import org.springframework.stereotype.Service; + +/** + * 硬件商品免密订单 + */ +@Service +public class HardThirdMiOrderServiceImpl extends ServiceImpl implements HardThirdMiOrderService { + +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardThirdMiOrderMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardThirdMiOrderMapper.xml new file mode 100755 index 000000000..30a495b6e --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardThirdMiOrderMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From 8990e31f78e85081fa2891bf19d6602e8fa3ea15 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 25 Dec 2025 16:06:52 +0800 Subject: [PATCH 21/46] =?UTF-8?q?feat:=E5=85=8D=E5=AF=86=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/constant/HardThirdMiStatusEnum.java | 29 +++++++++ .../api/entity/HardThirdMiOrderEntity.java | 28 ++++++++- .../hard/controller/HardAuthController.java | 2 +- .../HardThirdMiOrderController.java | 12 +++- .../hard/service/HardThirdMiOrderService.java | 5 ++ .../hard/service/MiniAlipayService.java | 7 ++- .../service/impl/HardAuthServiceImpl.java | 2 +- .../impl/HardThirdMiOrderServiceImpl.java | 62 +++++++++++++++++++ .../impl/ali/MiniAlipayServiceImpl.java | 28 +++++++-- 9 files changed, 162 insertions(+), 13 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java new file mode 100644 index 000000000..6bc48e680 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.hard.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方面密类型 + */ +@AllArgsConstructor +@Getter +public enum HardThirdMiStatusEnum { + + CREATE_ORDER("10", "创建订单"), + PAY("20", "支付订单"), + REFUND("30", "取消/退款"), + ; + + private final String type; + private final String description; + + public static HardThirdMiStatusEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java index b49b90844..6bdc1b901 100755 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java @@ -39,6 +39,12 @@ public class HardThirdMiOrderEntity extends Model { @Schema(description = "用户id") private Long userId; + /** + * 用户类型 + */ + @Schema(description = "用户类型") + private String userType; + /** * 授权id */ @@ -91,13 +97,31 @@ public class HardThirdMiOrderEntity extends Model { * 订单状态 */ @Schema(description = "订单状态") - private Integer orderStatus; + private String orderStatus; + + /** + * 押金 + */ + @Schema(description = "押金") + private int depositPrice; + + /** + * 订单金额 + */ + @Schema(description = "订单金额") + private int orderPrice; + + /** + * 支付金额 + */ + @Schema(description = "支付金额") + private int payPrice; /** * 原始json数据 */ @Schema(description = "原始json数据") - private String orgJson; + private String orgOrderJson; /** * 创建人 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java index be8b91392..00e924d7a 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java @@ -59,7 +59,7 @@ public class HardAuthController { public R appAuthHardDoor(@Valid @RequestBody HardAuthAppDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setUserId(user.getId()); - dto.setUserType(UserTypeEnum.valueOfByStatus(user.getUserType())); + dto.setUserType(UserTypeEnum.TOB); return R.ok(hardAuthService.appAuthHardDoor(dto)); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java index b0b703e50..81f547d4e 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java @@ -27,13 +27,23 @@ import java.util.Objects; */ @RestController @RequiredArgsConstructor -@RequestMapping("/hardThirdMiOrder") +@RequestMapping("/hard-third-mi-order") @Tag(description = "hardThirdMiOrder", name = "硬件商品免密订单管理") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class HardThirdMiOrderController { private final HardThirdMiOrderService hardThirdMiOrderService; + /** + * 刷新订单 + */ + @Operation(summary = "刷新订单", description = "刷新订单") + @GetMapping("/refresh") + public R refresh(@RequestParam("id") Long id) { + hardThirdMiOrderService.refresh(id); + return R.ok(); + } + /** * 分页查询 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java index 8dc7729b2..8ce921075 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java @@ -5,4 +5,9 @@ import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; public interface HardThirdMiOrderService extends IService { + /** + * 刷新订单 + */ + void refresh(Long id); + } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java index ffde0e38b..777d2a135 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service; import com.alipay.api.response.*; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; public interface MiniAlipayService { @@ -13,17 +14,17 @@ public interface MiniAlipayService { /** * 创建支付宝免密订单 */ - AlipayTradeCreateResponse miCreateOrder(String openId, Long authId); + AlipayTradeCreateResponse miCreateOrder(String openId, Long authId, Long userId, UserTypeEnum userType); /** * 查询支付宝免密订单 */ - ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, String authId); + ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, Long authId); /** * 支付宝免密扣款 */ - AlipayTradeOrderPayResponse miQueryPay(String authId, String alipayTradeNo, int price); + AlipayTradeOrderPayResponse miPay(String authId, String alipayTradeNo, int price); /** * 支付宝免密(取消/退款) diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java index dcdc59ac2..b7e5f289a 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java @@ -147,7 +147,7 @@ public class HardAuthServiceImpl extends ServiceImpl implements HardThirdMiOrderService { + private final MiniAlipayService miniAlipayService; + + /** + * 刷新订单 + */ + @Override + public void refresh(Long id) { + HardThirdMiOrderEntity order = baseMapper.selectById(id); + if (ObjectUtil.isEmpty(order)) { + throw new RuntimeException("订单不存在"); + } + // 微信免密支付 + if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_WECHAT.getType())) { + + return; + } + // 支付宝-芝麻先享 + if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_ALIPAY.getType())) { + ZhimaCreditPayafteruseCreditbizorderQueryResponse res = miniAlipayService.miQueryOrder(null, order.getAuthId()); + if (ObjectUtil.isEmpty(res)) { + throw new RuntimeException("支付宝-芝麻先享中,未查询到此订单"); + } + HardThirdMiOrderEntity updateObj = new HardThirdMiOrderEntity(); + updateObj.setId(order.getId()); + // 押金 + updateObj.setDepositPrice(new BigDecimal(res.getTotalAmount()).multiply(BigDecimal.valueOf(100)).intValue()); + // 扣款金额 + if (ObjectUtil.isNotEmpty(res.getTotalCreditPayAmount())) { + updateObj.setPayPrice(new BigDecimal(res.getTotalCreditPayAmount()).multiply(BigDecimal.valueOf(100)).intValue()); + } + // 订单状态 + if (ObjectUtil.isNotEmpty(res.getOrderStatus())) { + String orderStatus = res.getOrderStatus(); + switch (orderStatus) { + // 下单状态 + case "INIT": + updateObj.setOrderStatus(HardThirdMiStatusEnum.CREATE_ORDER.getType()); + break; + // 订单取消或者交易全额退款 + case "TRADE_CLOSED": + updateObj.setOrderStatus(HardThirdMiStatusEnum.REFUND.getType()); + break; + // 扣款成功状态 + case "TRADE_FINISHED": + updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY.getType()); + break; + } + } + baseMapper.updateById(updateObj); + return; + } + } + } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java index 5073b29de..141fe2f66 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java @@ -11,7 +11,12 @@ import com.alipay.api.DefaultAlipayClient; import com.alipay.api.domain.*; import com.alipay.api.request.*; import com.alipay.api.response.*; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; +import com.bsd.pjcloud.hard.api.constant.HardThirdMiStatusEnum; +import com.bsd.pjcloud.hard.api.constant.HardThirdMiTypeEnum; +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; import com.bsd.pjcloud.hard.config.MiniAlipayConf; +import com.bsd.pjcloud.hard.mapper.HardThirdMiOrderMapper; import com.bsd.pjcloud.hard.service.MiniAlipayService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -29,6 +34,8 @@ import java.time.LocalDateTime; @Slf4j public class MiniAlipayServiceImpl implements MiniAlipayService { + private final HardThirdMiOrderMapper hardThirdMiOrderMapper; + private final MiniAlipayConf conf; static private AlipayClient client = null; @@ -83,7 +90,14 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { * 创建支付宝免密订单 */ @Override - public AlipayTradeCreateResponse miCreateOrder(String openId, Long authId) { + public AlipayTradeCreateResponse miCreateOrder(String openId, Long authId, Long userId, UserTypeEnum userType) { + HardThirdMiOrderEntity thirdOrder = new HardThirdMiOrderEntity(); + thirdOrder.setBizType(HardThirdMiTypeEnum.MI_ALIPAY.getType()); + thirdOrder.setAuthId(authId); + thirdOrder.setUserId(userId); + thirdOrder.setUserType(userType.getStatus()); + thirdOrder.setCreateOrderTime(LocalDateTime.now()); + thirdOrder.setOrderStatus(HardThirdMiStatusEnum.CREATE_ORDER.getType()); AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); try { JSONObject bizContent = new JSONObject(); @@ -108,18 +122,21 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { extraParam.putOnce("creditTradeScene", "CREDIT_PAY"); bizContent.putOnce("extend_params", extraParam); request.setBizContent(bizContent.toString()); - // request.setNotifyUrl("https://www.notifyURL.com"); AlipayTradeCreateResponse response = getClient().execute(request); if (!response.isSuccess()) { log.error("|创建支付宝订单|失败,json|{}", response.getBody()); return null; } log.info("|创建支付宝订单|成功,json|{}", response.getBody()); + thirdOrder.setOutOrderNo(String.valueOf(authId)); + thirdOrder.setThirdOrderNo(response.getTradeNo()); return response; } catch (Exception e) { e.printStackTrace(); log.error("|创建支付宝订单|意外的错误", e); return null; + } finally { + hardThirdMiOrderMapper.insert(thirdOrder); } } @@ -127,15 +144,16 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { * 查询支付宝免密订单 */ @Override - public ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, String authId) { + public ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, Long authId) { ZhimaCreditPayafteruseCreditbizorderQueryRequest request = new ZhimaCreditPayafteruseCreditbizorderQueryRequest(); ZhimaCreditPayafteruseCreditbizorderQueryModel model = new ZhimaCreditPayafteruseCreditbizorderQueryModel(); if (ObjectUtil.isNotEmpty(alipayOrderNo)) { model.setCreditBizOrderId(alipayOrderNo); } if (ObjectUtil.isNotEmpty(authId)) { - model.setOutOrderNo(authId); + model.setOutOrderNo(String.valueOf(authId)); } + request.setBizModel(model); try { ZhimaCreditPayafteruseCreditbizorderQueryResponse response = getClient().execute(request); if (!response.isSuccess()) { @@ -155,7 +173,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { * 支付宝免密扣款 */ @Override - public AlipayTradeOrderPayResponse miQueryPay(String authId, String alipayTradeNo, int price) { + public AlipayTradeOrderPayResponse miPay(String authId, String alipayTradeNo, int price) { AlipayTradeOrderPayRequest request = new AlipayTradeOrderPayRequest(); JSONObject bizContent = new JSONObject(); // 商家外部协议号,自定义确保唯一 From d84b294966a24fd197750a14595281bd342aa463 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 29 Dec 2025 13:29:23 +0800 Subject: [PATCH 22/46] =?UTF-8?q?feat:=E6=B5=A6=E6=B1=9F=E5=85=8D=E5=AF=86?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hard/api/dto/HardAppThirdOpenDoorDto.java | 26 +++ .../hard/api/dto/HardThirdMiPayDto.java | 10 + .../api/entity/HardThirdMiOrderEntity.java | 6 + .../hard/controller/HardAuthController.java | 11 +- .../HardThirdMiOrderController.java | 12 + .../hard/mapper/HardThirdMiOrderMapper.java | 12 + .../pjcloud/hard/service/HardAuthService.java | 10 +- .../hard/service/HardThirdMiOrderService.java | 11 + .../hard/service/MiniAlipayService.java | 18 +- .../service/impl/HardAuthServiceImpl.java | 45 ++++ .../service/impl/HardDoorFlowServiceImpl.java | 31 +++ .../impl/HardThirdMiOrderServiceImpl.java | 39 +++- .../impl/ali/MiniAlipayServiceImpl.java | 205 ++++++++++++++++-- .../impl/order/HardOrderServiceImpl.java | 41 +++- 14 files changed, 444 insertions(+), 33 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAppThirdOpenDoorDto.java create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiPayDto.java diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAppThirdOpenDoorDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAppThirdOpenDoorDto.java new file mode 100644 index 000000000..988fb6ea8 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAppThirdOpenDoorDto.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.hard.api.dto; + +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class HardAppThirdOpenDoorDto { + + /** + * 用户id + */ + private Long userId; + + /** + * 用户类型 + */ + private UserTypeEnum userType; + + /** + * 授权id + */ + @NotNull(message = "授权id不能为空") + private Long authId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiPayDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiPayDto.java new file mode 100644 index 000000000..25c4d03af --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiPayDto.java @@ -0,0 +1,10 @@ +package com.bsd.pjcloud.hard.api.dto; + +import lombok.Data; + +@Data +public class HardThirdMiPayDto { + + private Long id; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java index 6bdc1b901..088f26f7c 100755 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java @@ -117,6 +117,12 @@ public class HardThirdMiOrderEntity extends Model { @Schema(description = "支付金额") private int payPrice; + /** + * 原始 sign json 数据 + */ + @Schema(description = "原始 sign json 数据") + private String orgSignJson; + /** * 原始json数据 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java index 00e924d7a..81c768e2f 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardAuthController.java @@ -68,10 +68,19 @@ public class HardAuthController { public R appCreateThirdDoorOrder(@Valid @RequestBody HardAuthAppDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setUserId(user.getId()); - dto.setUserType(UserTypeEnum.valueOfByStatus(user.getUserType())); + dto.setUserType(UserTypeEnum.TOC); return R.ok(hardAuthService.appCreateThirdDoorOrder(dto)); } + @Operation(summary = "app创建第三方免密开门", description = "app创建第三方免密开门") + @PostMapping("/app/third-door-open") + public R appThirdDoorOpen(@Valid @RequestBody HardAppThirdOpenDoorDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setUserId(user.getId()); + dto.setUserType(UserTypeEnum.TOC); + return R.ok(hardAuthService.appThirdDoorOpen(dto)); + } + /* ************************************* end app end ************************************* */ @Operation(summary = "流程错误手动处理", description = "流程错误手动处理") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java index 81f547d4e..8e71e9e24 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.hard.api.dto.HardThirdMiPayDto; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; import com.bsd.pjcloud.hard.service.HardThirdMiOrderService; import org.springframework.security.access.prepost.PreAuthorize; @@ -44,6 +45,17 @@ public class HardThirdMiOrderController { return R.ok(); } + /** + * 支付订单 + */ + @Operation(summary = "支付订单", description = "支付订单") + @PostMapping("/admin-pay") + public R adminPay(@RequestBody HardThirdMiPayDto dto) { + hardThirdMiOrderService.adminPay(dto); + return R.ok(); + } + + /** * 分页查询 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java index 0494c6a3a..4cc7c22ff 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.hard.mapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; import org.apache.ibatis.annotations.Mapper; @@ -7,4 +8,15 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface HardThirdMiOrderMapper extends PjcloudBaseMapper { + default HardThirdMiOrderEntity getByAuthId(Long authId) { + return selectOne(new LambdaQueryWrapper() + .eq(HardThirdMiOrderEntity::getAuthId, authId) + ); + } + + default HardThirdMiOrderEntity getByOrderId(Long orderId) { + return selectOne(new LambdaQueryWrapper() + .eq(HardThirdMiOrderEntity::getOrderId, orderId) + ); + } } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java index e1ec1aaa3..7d45df5f9 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java @@ -3,10 +3,7 @@ package com.bsd.pjcloud.hard.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.common.data.datascope.DataScope; -import com.bsd.pjcloud.hard.api.dto.HardAuthAppDto; -import com.bsd.pjcloud.hard.api.dto.HardAuthDto; -import com.bsd.pjcloud.hard.api.dto.HardAuthErrorChangeDto; -import com.bsd.pjcloud.hard.api.dto.HardGetAuthAppDto; +import com.bsd.pjcloud.hard.api.dto.*; import com.bsd.pjcloud.hard.api.entity.HardAuthEntity; import com.bsd.pjcloud.hard.api.vo.HardAuthVo; import com.bsd.pjcloud.hard.api.vo.HardGetAuthAppVo; @@ -32,6 +29,11 @@ public interface HardAuthService extends IService { */ HardAppCreateThirdDoorOrderVo appCreateThirdDoorOrder(@Valid HardAuthAppDto dto); + /** + * app创建第三方免密开门 + */ + Long appThirdDoorOpen(@Valid HardAppThirdOpenDoorDto dto); + /** * 判断当前用户信誉 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java index 8ce921075..b09b04179 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java @@ -1,7 +1,9 @@ package com.bsd.pjcloud.hard.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.hard.api.dto.HardThirdMiPayDto; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import jakarta.validation.constraints.NotNull; public interface HardThirdMiOrderService extends IService { @@ -10,4 +12,13 @@ public interface HardThirdMiOrderService extends IService() + .eq(HardThirdMiOrderEntity::getAuthId, authId) + ); + } } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java index 141fe2f66..7b6491e44 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.alipay.api.AlipayClient; import com.alipay.api.AlipayConfig; import com.alipay.api.DefaultAlipayClient; @@ -17,6 +18,7 @@ import com.bsd.pjcloud.hard.api.constant.HardThirdMiTypeEnum; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; import com.bsd.pjcloud.hard.config.MiniAlipayConf; import com.bsd.pjcloud.hard.mapper.HardThirdMiOrderMapper; +import com.bsd.pjcloud.hard.service.HardThirdMiOrderService; import com.bsd.pjcloud.hard.service.MiniAlipayService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -25,6 +27,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; +import java.util.List; /** * 支付宝小程序支付 @@ -86,6 +89,168 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { } } + /** + * 免密授权 + */ + @Override + public String miDynamicSign(Long userId, UserTypeEnum userType, Long authId) { + HardThirdMiOrderEntity thirdOrder = new HardThirdMiOrderEntity(); + thirdOrder.setBizType(HardThirdMiTypeEnum.MI_ALIPAY.getType()); + thirdOrder.setAuthId(authId); + thirdOrder.setUserId(userId); + thirdOrder.setUserType(userType.getStatus()); + thirdOrder.setCreateOrderTime(LocalDateTime.now()); + thirdOrder.setOrderStatus(HardThirdMiStatusEnum.CREATE_ORDER.getType()); + + ZhimaCreditPayafteruseCreditagreementSignRequest request = new ZhimaCreditPayafteruseCreditagreementSignRequest(); + ZhimaCreditPayafteruseCreditagreementSignModel model = new ZhimaCreditPayafteruseCreditagreementSignModel(); + // 设置芝麻信用服务ID + model.setZmServiceId(conf.getZmServiceId()); + // 设置芝麻外部类目 + model.setCategoryId("credit_pay_after_use"); + model.setOutAgreementNo(String.valueOf(authId)); + request.setBizModel(model); + try { + ZhimaCreditPayafteruseCreditagreementSignResponse response = getClient().sdkExecute(request); + if (!response.isSuccess()) { + log.error("|免密授权|失败,json|{}", response.getBody()); + return null; + } + return response.getBody(); + } catch (Exception e) { + e.printStackTrace(); + log.error("|免密授权|异常", e); + return null; + } finally { + hardThirdMiOrderMapper.insert(thirdOrder); + } + } + + /** + * 查询面密授权 + */ + @Override + public ZhimaCreditPayafteruseCreditagreementQueryResponse miDynamicQueySign(Long authId) { + HardThirdMiOrderEntity thirdMiOrder = hardThirdMiOrderMapper.getByAuthId(authId); + if (ObjectUtil.isEmpty(thirdMiOrder)) { + log.error("|查询面密授权|订单不存在,authId|{}", authId); + return null; + } + HardThirdMiOrderEntity updateObj = new HardThirdMiOrderEntity(); + updateObj.setId(thirdMiOrder.getId()); + + ZhimaCreditPayafteruseCreditagreementQueryRequest request = new ZhimaCreditPayafteruseCreditagreementQueryRequest(); + ZhimaCreditPayafteruseCreditagreementQueryModel model = new ZhimaCreditPayafteruseCreditagreementQueryModel(); + model.setOutAgreementNo(String.valueOf(authId)); + request.setBizModel(model); + try { + ZhimaCreditPayafteruseCreditagreementQueryResponse response = getClient().execute(request); + if (!response.isSuccess()) { + log.error("|查询面密授权|失败,json|{}", response.getBody()); + return null; + } + updateObj.setOrgSignJson(JSONUtil.toJsonStr(response)); + return response; + } catch (Exception e) { + e.printStackTrace(); + log.error("|查询面密授权|异常", e); + return null; + } finally { + if (ObjectUtil.isNotEmpty(updateObj.getOrgSignJson())) { + hardThirdMiOrderMapper.updateById(updateObj); + } + } + } + + /** + * 免密服务下单 + */ + @Override + public ZhimaCreditPayafteruseCreditbizorderOrderResponse miDynamicOrder(Long authId, Long orderId, Long flowId) { + HardThirdMiOrderEntity thirdMiOrder = hardThirdMiOrderMapper.getByAuthId(authId); + if (ObjectUtil.isEmpty(thirdMiOrder)) { + log.error("|免密服务下单|订单不存在,authId|{}", authId); + return null; + } + ZhimaCreditPayafteruseCreditagreementQueryResponse signObj = JSONUtil.toBean(thirdMiOrder.getOrgSignJson(), ZhimaCreditPayafteruseCreditagreementQueryResponse.class); + if (ObjectUtil.isEmpty(signObj)) { + log.error("|免密服务下单|signObj为空,授权错误,authId|{}", authId); + return null; + } + HardThirdMiOrderEntity updateObj = new HardThirdMiOrderEntity(); + updateObj.setId(thirdMiOrder.getId()); + updateObj.setOrderId(orderId); + updateObj.setFlowId(flowId); + updateObj.setOutOrderNo(String.valueOf(orderId)); + + ZhimaCreditPayafteruseCreditbizorderOrderRequest request = new ZhimaCreditPayafteruseCreditbizorderOrderRequest(); + ZhimaCreditPayafteruseCreditbizorderOrderModel model = new ZhimaCreditPayafteruseCreditbizorderOrderModel(); + // 设置商户外部订单号 + model.setOutOrderNo(String.valueOf(orderId)); + // 设置芝麻开通协议号 + model.setCreditAgreementId(signObj.getCreditAgreementId()); + // 设置芝麻外部类目 + model.setCategoryId("credit_pay_after_use"); + // 设置芝麻产品代码 + model.setProductCode("CREDIT_PAY_AFTER_USE"); + // 设置订单标题 + model.setSubject("浦江智能柜芝麻先享"); + // 设置订单描述 + model.setBody("浦江智能柜芝麻先享"); + request.setBizModel(model); + try { + ZhimaCreditPayafteruseCreditbizorderOrderResponse response = getClient().execute(request); + if (!response.isSuccess()) { + log.error("|免密服务下单|失败,json|{}", response.getBody()); + return null; + } + updateObj.setThirdOrderNo(response.getCreditBizOrderId()); + updateObj.setOrgOrderJson(JSONUtil.toJsonStr(response)); + + // 一般是芝麻信用评估不通过、未开通等 + if (List.of("ZHIMA_CHECK_NO_PASS", "ZHIMA_EVALUATE_NO_PASS", "CREDIT_AGREEMENT_INVALID").contains(response.getCode())) { + miDynamicCreate(authId, orderId); + } + + response.getCode(); + return response; + } catch (Exception e) { + e.printStackTrace(); + log.error("|免密服务下单|异常", e); + return null; + } finally { + hardThirdMiOrderMapper.updateById(updateObj); + } + } + + /** + * 创建免密服务订单(风险评估) + */ + private ZhimaCreditPayafteruseCreditbizorderCreateResponse miDynamicCreate(Long authId, Long orderId) { + ZhimaCreditPayafteruseCreditbizorderCreateRequest request = new ZhimaCreditPayafteruseCreditbizorderCreateRequest(); + ZhimaCreditPayafteruseCreditbizorderCreateModel model = new ZhimaCreditPayafteruseCreditbizorderCreateModel(); + // 设置商户外部订单号 + model.setOutOrderNo(String.valueOf(orderId)); + model.setZmServiceId(conf.getZmServiceId()); + model.setAmountType("RISK_AMOUNT"); + model.setCategoryId("credit_pay_after_use"); + model.setSubject("浦江智能柜芝麻先享"); + model.setBody("浦江智能柜芝麻先享"); + request.setBizModel(model); + try { + ZhimaCreditPayafteruseCreditbizorderCreateResponse response = getClient().sdkExecute(request); + if (!response.isSuccess()) { + log.error("|创建免密服务订单(风险评估)|失败,json|{}", response.getBody()); + return null; + } + return response; + } catch (Exception e) { + e.printStackTrace(); + log.error("|创建免密服务订单(风险评估)|异常", e); + return null; + } + } + /** * 创建支付宝免密订单 */ @@ -108,7 +273,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { // 设置订单附加信息 bizContent.putOnce("body", "浦江智能柜芝麻先享"); // 设置订单金额 - bizContent.putOnce("total_amount", 5); + bizContent.putOnce("total_amount", 0.01); // 固定 bizContent.putOnce("product_code", "JSAPI_PAY"); // 用户登录id @@ -173,30 +338,40 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { * 支付宝免密扣款 */ @Override - public AlipayTradeOrderPayResponse miPay(String authId, String alipayTradeNo, int price) { + public boolean miPay(HardThirdMiOrderEntity thirdOrder, int totalPrice) { + HardThirdMiOrderEntity updateObj = new HardThirdMiOrderEntity(); + updateObj.setId(thirdOrder.getId()); + updateObj.setPayOrderTime(LocalDateTime.now()); + updateObj.setOrderPrice(totalPrice); + updateObj.setPayPrice(totalPrice); + AlipayTradeOrderPayRequest request = new AlipayTradeOrderPayRequest(); - JSONObject bizContent = new JSONObject(); - // 商家外部协议号,自定义确保唯一 - bizContent.put("out_request_no", authId); - // 支付宝交易号 - bizContent.put("trade_no", alipayTradeNo); - // 信用服务订单本次扣款金额,目前只支持全额扣款(传入的是分四舍五入) - bizContent.put("fulfillment_amount", new BigDecimal(price).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); - // 固定值 - bizContent.put("order_pay_mode", "CREDIT_FULFILLMENT_ZM"); + AlipayTradeOrderPayModel model = new AlipayTradeOrderPayModel(); + model.setOutRequestNo(String.valueOf(thirdOrder.getOrderId())); + model.setTradeNo(thirdOrder.getOutOrderNo()); + model.setFulfillmentAmount(new BigDecimal(totalPrice).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).toString()); + model.setOrderPayMode("CREDIT_FULFILLMENT_ZM"); try { - request.setBizContent(bizContent.toString()); + request.setBizModel(model); AlipayTradeOrderPayResponse response = getClient().execute(request); if (!response.isSuccess()) { log.error("|支付宝免密扣款|失败,json|{}", response.getBody()); - return null; + return false; } log.info("|支付宝免密扣款|成功,json|{}", response.getBody()); - return response; + if (ObjectUtil.equals(response.getCode(), "10000")) { + updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY.getType()); + return true; + } + return false; } catch (Exception e) { e.printStackTrace(); log.error("|支付宝免密扣款|异常", e); - return null; + return false; + } finally { + if (ObjectUtil.isNotEmpty(updateObj.getOrderStatus())) { + hardThirdMiOrderMapper.updateById(updateObj); + } } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index 391f2f192..005de5e37 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -1,11 +1,10 @@ package com.bsd.pjcloud.hard.service.impl.order; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; +import com.alipay.api.response.AlipayTradeOrderPayResponse; import com.alipay.api.response.AlipayTradePayResponse; import com.baomidou.lock.annotation.Lock4j; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -19,7 +18,6 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.admin.api.vo.UserVO; import com.bsd.pjcloud.canteen.api.feign.RemoteOnlineCanteenSpuService; -import com.bsd.pjcloud.canteen.constant.OrderTypeEnum; import com.bsd.pjcloud.canteen.dto.CanteenSpuUpdateStockReqDTO; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.CommonConstants; @@ -33,6 +31,7 @@ import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.hard.api.constant.HardProductNatureEnum; +import com.bsd.pjcloud.hard.api.constant.HardThirdMiStatusEnum; import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; @@ -52,6 +51,7 @@ import com.bsd.pjcloud.hard.api.dto.spu.DeductionSpuStockDto; import com.bsd.pjcloud.hard.api.dto.wechat.WechantReverseDto; import com.bsd.pjcloud.hard.api.dto.wechat.WechatMicropayDto; import com.bsd.pjcloud.hard.api.entity.HardApptEntity; +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; @@ -62,21 +62,18 @@ import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.HardCreateHardQrCodeScanOrderVo; -import com.bsd.pjcloud.hard.api.vo.order.HardOrderPayTypeVo; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo; +import com.bsd.pjcloud.hard.mapper.HardThirdMiOrderMapper; import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.*; import com.bsd.pjcloud.supermarket.api.feign.RemoteMallProductService; import com.bsd.pjcloud.supermarket.api.feign.RemoteShopSkuService; -import com.bsd.pjcloud.supermarket.api.feign.RemoteShopSpuService; import com.bsd.pjcloud.supermarket.api.feign.RemoteSupermarketSpuService; import com.bsd.pjcloud.supermarket.dto.MallProductStockChangeDTO; import com.bsd.pjcloud.supermarket.dto.SkuStockChangeDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockReqDTO; -import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; -import com.bsd.pjcloud.supermarket.vo.app.ShopSpuDetailAppVo; import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum; @@ -89,7 +86,6 @@ import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto; import com.bsd.pjcloud.wallet.api.entity.WalletCodeUseEntity; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; -import com.bsd.pjcloud.wallet.api.entity.act.ActCancelItemEntity; import com.bsd.pjcloud.wallet.api.feign.*; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; @@ -99,7 +95,6 @@ import com.bsd.pjcloud.wallet.api.vo.act.ActCancelItemVo; import com.bsd.pjcloud.wallet.api.vo.mch.MchPickUpVo; import com.bsd.pjcloud.wallet.api.vo.mch.MchRuleJoinDtoVo; import jakarta.validation.Valid; -import lombok.Locked; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; @@ -141,6 +136,7 @@ public class HardOrderServiceImpl extends ServiceImpl pagejoin(Page page, HardOrderDto dto) { @@ -889,7 +886,7 @@ public class HardOrderServiceImpl extends ServiceImpl Date: Thu, 15 Jan 2026 09:26:44 +0800 Subject: [PATCH 23/46] =?UTF-8?q?feat:=E5=8F=91=E7=A5=A8=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E4=BA=BA=20feat:=E6=B7=BB=E5=8A=A0=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=9A=84=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pjcloud-app-server-biz/pom.xml | 6 + .../app/config/MinWechatConfiguration.java | 38 +++++++ .../pjcloud/app/config/MiniWechatConf.java | 18 +++ .../AppUserAutoLoginController.java | 17 +-- .../app/handler/MiniWechatLoginHandler.java | 55 +++++---- .../src/main/resources/application.yml | 4 + .../api/constant/HardThirdMiStatusEnum.java | 5 +- .../api/constant/HardThirdMiTypeEnum.java | 2 +- .../hard/api/dto/HardThirdMiOrderDto.java | 26 +++++ .../api/entity/HardThirdMiOrderEntity.java | 19 +++- .../hard/api/vo/HardThirdMiOrderVo.java | 30 +++++ .../HardThirdMiOrderController.java | 16 ++- .../hard/mapper/HardThirdMiOrderMapper.java | 7 ++ .../hard/service/HardThirdMiOrderService.java | 17 ++- .../hard/service/MiniAlipayService.java | 7 +- .../service/impl/HardAuthServiceImpl.java | 2 +- .../service/impl/HardDoorFlowServiceImpl.java | 1 + .../impl/HardThirdMiOrderServiceImpl.java | 105 +++++++++++++++++- .../impl/ali/MiniAlipayServiceImpl.java | 68 ++++++++++-- .../impl/order/HardOrderServiceImpl.java | 8 -- .../mapper/HardThirdMiOrderMapper.xml | 67 +++++++++++ .../admin/controller/RegisterController.java | 20 +++- .../pjcloud/admin/service/SysUserService.java | 5 + .../service/impl/SysUserServiceImpl.java | 65 +++++++++++ .../vo/recharge/WalletRechargeInvoiceVo.java | 5 + .../WalletRechargeInvoiceServiceImpl.java | 14 +++ 26 files changed, 550 insertions(+), 77 deletions(-) create mode 100644 pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MinWechatConfiguration.java create mode 100644 pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniWechatConf.java create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiOrderDto.java create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardThirdMiOrderVo.java diff --git a/pjcloud-app-server/pjcloud-app-server-biz/pom.xml b/pjcloud-app-server/pjcloud-app-server-biz/pom.xml index bbf75ad80..f08777c63 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/pom.xml +++ b/pjcloud-app-server/pjcloud-app-server-biz/pom.xml @@ -115,6 +115,12 @@ alipay-sdk-java 4.40.251.ALL + + + com.github.binarywang + wx-java-miniapp-spring-boot-starter + 4.7.0 + diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MinWechatConfiguration.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MinWechatConfiguration.java new file mode 100644 index 000000000..941c1b7dc --- /dev/null +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MinWechatConfiguration.java @@ -0,0 +1,38 @@ +package com.bsd.pjcloud.app.config; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Slf4j +@Configuration +@EnableConfigurationProperties(MiniWechatConf.class) +public class MinWechatConfiguration { + + private final MiniWechatConf properties; + + @Autowired + public MinWechatConfiguration(MiniWechatConf properties) { + this.properties = properties; + } + + + @Bean + public WxMaService wxMaService() { + + WxMaDefaultConfigImpl wxMaDefaultConfig = new WxMaDefaultConfigImpl(); + wxMaDefaultConfig.setAppid(properties.getAppId()); + wxMaDefaultConfig.setSecret(properties.getAppSecret()); + wxMaDefaultConfig.setMsgDataFormat("JSON"); + + WxMaService maService = new WxMaServiceImpl(); + maService.setWxMaConfig(wxMaDefaultConfig); + return maService; + } + +} diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniWechatConf.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniWechatConf.java new file mode 100644 index 000000000..d18af0b63 --- /dev/null +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniWechatConf.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.app.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 微信小程序配置 + */ +@Data +@ConfigurationProperties(prefix = "mini-wechat-pay") +public class MiniWechatConf { + /** + * 应用ID + */ + private String appId; + + private String appSecret; +} diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java index 04ee43189..589d0e7db 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java @@ -24,6 +24,7 @@ import com.bsd.pjcloud.admin.api.dto.UserTokenDTO; import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.feign.RemoteTokenService; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.app.api.dto.AppUserDTO; import com.bsd.pjcloud.app.service.AppUserService; import com.bsd.pjcloud.canteen.api.feign.RemoteCanteenSpuService; import com.bsd.pjcloud.canteen.api.feign.RemoteDailyMenuService; @@ -33,6 +34,7 @@ import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; import com.bsd.pjcloud.canteen.vo.app.CanteenOnlineSpuAppVO; import com.bsd.pjcloud.canteen.vo.app.DailyMenuAppVO; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdPartyAuthService; import com.bsd.pjcloud.thirdparty.dto.SHJNSSODTO; @@ -387,12 +389,13 @@ public class AppUserAutoLoginController { // return appUserService.importUser(excelVOList, bindingResult); // } // -// @Operation(summary = "注册app用户表", description = "注册app用户表") -// @SysLog("注册app用户表") -// @Inner(value = false) -// @PostMapping("/register") -// public R register(@RequestBody AppUserDTO appUser) { -// return appUserService.registerAppUser(appUser); -// } + +//@Operation(summary = "注册app用户表", description = "注册app用户表") +//@SysLog("注册app用户表") +//@Inner(value = false) +//@PostMapping("/register") +//public R register(@RequestBody AppUserDTO appUser) { +// return appUserService.registerAppUser(appUser); +//} } diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java index d9d5e622d..e095d7dd0 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java @@ -17,18 +17,15 @@ package com.bsd.pjcloud.app.handler; -import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsd.pjcloud.app.api.constant.AppUserTypeEnum; import com.bsd.pjcloud.app.api.dto.AppUserInfo; -import com.bsd.pjcloud.app.api.entity.AppSocialDetails; import com.bsd.pjcloud.app.api.entity.AppUser; import com.bsd.pjcloud.app.mapper.AppSocialDetailsMapper; import com.bsd.pjcloud.app.service.AppUserService; -import com.bsd.pjcloud.common.core.constant.SecurityConstants; -import com.bsd.pjcloud.common.core.constant.enums.LoginTypeEnum; -import com.bsd.pjcloud.common.core.exception.CheckedException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -47,6 +44,8 @@ public class MiniWechatLoginHandler extends AbstractLoginHandler { private final AppSocialDetailsMapper appSocialDetailsMapper; + private final WxMaService wxMaService; + /** * 小程序登录传入code *

@@ -57,20 +56,16 @@ public class MiniWechatLoginHandler extends AbstractLoginHandler { */ @Override public String identify(String code) { - AppSocialDetails condition = new AppSocialDetails(); - condition.setType(LoginTypeEnum.MINI_APP.getType()); - AppSocialDetails socialDetails = appSocialDetailsMapper.selectOne(new QueryWrapper<>(condition)); - - String url = String.format(SecurityConstants.MINI_APP_AUTHORIZATION_CODE_URL, socialDetails.getAppId(), - socialDetails.getAppSecret(), code); - String result = HttpUtil.get(url); - log.debug("微信小程序响应报文:{}", result); - - if (JSONUtil.parseObj(result).containsKey("openid")) { - return JSONUtil.parseObj(result).get("openid").toString(); - } else { - log.error("微信小程序登录失败:{}", result); - throw new CheckedException("微信小程序登录失败"); + try { + WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code); + if (ObjectUtil.isNotEmpty(session) && ObjectUtil.isNotEmpty(session.getOpenid())) { + return session.getOpenid(); + } + return null; + } catch (Exception e) { + e.printStackTrace(); + log.error("微信小程序登录失败:{}", e.getMessage()); + return null; } } @@ -83,22 +78,22 @@ public class MiniWechatLoginHandler extends AbstractLoginHandler { @Override public AppUserInfo info(String openId) { AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getOpenid, openId)); - - // 未注册用户自动注册 - if (Objects.isNull(user)) { - log.info("微信小程序未绑定:{},创建新的用户", openId); + if (ObjectUtil.isEmpty(user)) { + log.info("微信小程序openId:{},创建新的用户", openId); + String name = "微信游客-" + openId; AppUser appUser = new AppUser(); appUser.setOpenid(openId); - appUser.setUsername(openId); + appUser.setUserType(AppUserTypeEnum.MINI_ALIPAY.getType()); + appUser.setUsername(name); + appUser.setName(name); appUser.setCreateBy(openId); appUser.setUpdateBy(openId); appUserService.saveOrUpdate(appUser); - - AppUserInfo appUserDTO = new AppUserInfo(); - appUserDTO.setAppUser(appUser); - return appUserDTO; + return appUserService.findUserInfo(user); } + if (ObjectUtil.isEmpty(user.getLoginExtJson())) { + } return appUserService.findUserInfo(user); } diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml b/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml index 645bbb4f6..9a29f8834 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml @@ -24,3 +24,7 @@ mini-ali-pay: alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnCB+N172m5gxf1Rolfx5LErSiVwQCh0XQdDrVy6aTuVF5EtdqahSHtADyEPsBWudMBhzCfqpoZvfnvH7a+PED6uZ3DoXt7ETh8TmNM5yc+WTnD8pSphQvuHDJ3zMks489KNxiX6sXag71k9H1MXklJGPOUaljHqy/QlRn2ZLT7pFgaFH9LEcVoQBPIOurUn95078h848RFD30jZFW3fakxUGAGVVZaHH62z5OEWOmcA+CwxsEDMa1XMt02RGXgAAq4WOj+BqOGiFmhM8rnrUMchTyvx4umOzGvbF2Y9irN3aBZ5lfg+bzYcJpIOMzlM/V00LnEWzCblJzXNyH4hJQIDAQAB callback-url: https://rj4jv5rwqs.by.takin.cc/hard/hard-ali-pay/callback # callback-url: https://stgl.pj.gov.cn/api/hard/hard-ali-pay/callback + +mini-wechat-pay: + app-id: wx95481f43b14565e5 + app-secret: 0aee1289b5ae14c0c69b8f5e9a4e518e diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java index 6bc48e680..c0e050c3e 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java @@ -7,14 +7,15 @@ import lombok.Getter; import java.util.Arrays; /** - * 第三方面密类型 + * 第三方免密支付状态 */ @AllArgsConstructor @Getter public enum HardThirdMiStatusEnum { CREATE_ORDER("10", "创建订单"), - PAY("20", "支付订单"), + PAY_SUCCESS("20", "支付成功"), + PAY_ERROR("21", "支付失败"), REFUND("30", "取消/退款"), ; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java index bebfaf775..ee88facb8 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java @@ -7,7 +7,7 @@ import lombok.Getter; import java.util.Arrays; /** - * 第三方面密类型 + * 第三方免密类型 */ @AllArgsConstructor @Getter diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiOrderDto.java new file mode 100644 index 000000000..797f734d8 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiOrderDto.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.hard.api.dto; + +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class HardThirdMiOrderDto extends HardThirdMiOrderEntity { + + /** + * 创建订单时间 + */ + private LocalDateTime[] createOrderTimeList; + + /** + * 支付时间 + */ + private LocalDateTime[] payOrderTimeList; + + /** + * 退款时间 + */ + private LocalDateTime[] refundOrderTimeList; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java index 088f26f7c..fd358d074 100755 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java @@ -19,7 +19,6 @@ import java.time.LocalDateTime; @Schema(description = "硬件商品免密订单") public class HardThirdMiOrderEntity extends Model { - /** * 编号 */ @@ -63,6 +62,18 @@ public class HardThirdMiOrderEntity extends Model { @Schema(description = "订单id") private Long orderId; + /** + * 退款id + */ + @Schema(description = "退款id") + private Long refundId; + + /** + * 设备id + */ + @Schema(description = "设备id") + private Long hardId; + /** * 外部订单号 */ @@ -117,6 +128,12 @@ public class HardThirdMiOrderEntity extends Model { @Schema(description = "支付金额") private int payPrice; + /** + * 退款金额 + */ + @Schema(description = "退款金额") + private int refundPrice; + /** * 原始 sign json 数据 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardThirdMiOrderVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardThirdMiOrderVo.java new file mode 100644 index 000000000..40de0040d --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardThirdMiOrderVo.java @@ -0,0 +1,30 @@ +package com.bsd.pjcloud.hard.api.vo; + +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import com.bsd.pjcloud.hard.api.vo.base.BaseHardInterface; +import lombok.Data; + +import java.util.List; + +@Data +public class HardThirdMiOrderVo extends HardThirdMiOrderEntity implements BaseHardInterface { + + /** + * 用户相关 + */ + private String username; + + private String userMobile; + + private String userAvatar; + + /** + * 设备相关 + */ + private String hardName; + + private String hardType; + + private List hardTypeCodes; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java index 8e71e9e24..c2e0a6c59 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java @@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.hard.api.dto.HardThirdMiOrderDto; import com.bsd.pjcloud.hard.api.dto.HardThirdMiPayDto; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import com.bsd.pjcloud.hard.api.vo.HardThirdMiOrderVo; import com.bsd.pjcloud.hard.service.HardThirdMiOrderService; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; @@ -55,6 +57,15 @@ public class HardThirdMiOrderController { return R.ok(); } + /** + * 退款 + */ + @Operation(summary = "退款", description = "退款") + @GetMapping("/refund") + public R refund(@RequestParam("id") Long id) { + hardThirdMiOrderService.refund(id); + return R.ok(); + } /** * 分页查询 @@ -62,9 +73,8 @@ public class HardThirdMiOrderController { @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('thirdmi_hardThirdMiOrder_view')") - public R getHardThirdMiOrderPage(@ParameterObject Page page, @ParameterObject HardThirdMiOrderEntity hardThirdMiOrder) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - return R.ok(hardThirdMiOrderService.page(page, wrapper)); + public R> getHardThirdMiOrderPage(@ParameterObject Page page, @ParameterObject HardThirdMiOrderDto dto) { + return R.ok(hardThirdMiOrderService.scopePageJoin(page, dto, null)); } /** diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java index 4cc7c22ff..32ed228ac 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java @@ -1,9 +1,14 @@ package com.bsd.pjcloud.hard.mapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.hard.api.dto.HardThirdMiOrderDto; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import com.bsd.pjcloud.hard.api.vo.HardThirdMiOrderVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface HardThirdMiOrderMapper extends PjcloudBaseMapper { @@ -19,4 +24,6 @@ public interface HardThirdMiOrderMapper extends PjcloudBaseMapper scopePageJoin(Page page, @Param("dto") HardThirdMiOrderDto dto, DataScope dataScope); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java index b09b04179..0aaff8392 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java @@ -1,22 +1,35 @@ package com.bsd.pjcloud.hard.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.dto.HardThirdMiOrderDto; import com.bsd.pjcloud.hard.api.dto.HardThirdMiPayDto; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; -import jakarta.validation.constraints.NotNull; +import com.bsd.pjcloud.hard.api.vo.HardThirdMiOrderVo; public interface HardThirdMiOrderService extends IService { + /** + * 分页查询 + */ + Page scopePageJoin(Page page, HardThirdMiOrderDto dto, DataScope dataScope); + /** * 刷新订单 */ - void refresh(Long id); + HardThirdMiOrderEntity refresh(Long id); /** * 后台支付 */ void adminPay(HardThirdMiPayDto dto); + /** + * 退款 + */ + void refund(Long id); + /** * 根据授权id查询授权订单 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java index ca534d629..f3ed72c60 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java @@ -17,6 +17,11 @@ public interface MiniAlipayService { */ String miDynamicSign(Long userId, UserTypeEnum userType, Long authId); + /** + * 免密授权(需要押金) + */ + ZhimaCreditPayafteruseCreditbizorderCreateResponse miDynamicCreate(Long userId, UserTypeEnum userType, Long authId); + /** * 查询免密授权 */ @@ -45,6 +50,6 @@ public interface MiniAlipayService { /** * 支付宝免密(取消/退款) */ - AlipayTradeRefundResponse miCancelOrRefund(String authId, String refundId, int price); + AlipayTradeRefundResponse miCancelOrRefund(HardThirdMiOrderEntity thirdOrder); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java index 8d203a8b3..d3d6c8ebe 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service.impl; import cn.hutool.core.util.ObjectUtil; import com.alipay.api.response.AlipayTradeCreateResponse; +import com.alipay.api.response.ZhimaCreditPayafteruseCreditbizorderCreateResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -150,7 +151,6 @@ public class HardAuthServiceImpl extends ServiceImpl implements HardThirdMiOrderService { + private final HardManagerMapper hardManagerMapper; + private final MiniAlipayService miniAlipayService; + private final RemoteUserService userService; + + /** + * 分页查询 + */ + @Override + public Page scopePageJoin(Page page, HardThirdMiOrderDto dto, DataScope dataScope) { + Page pageList = baseMapper.scopePageJoin(page, dto, dataScope); + disposeList(pageList.getRecords()); + return pageList; + } + /** * 刷新订单 */ @Override - public void refresh(Long id) { + public HardThirdMiOrderEntity refresh(Long id) { HardThirdMiOrderEntity order = baseMapper.selectById(id); if (ObjectUtil.isEmpty(order)) { throw new RuntimeException("订单不存在"); @@ -37,7 +68,7 @@ public class HardThirdMiOrderServiceImpl extends ServiceImpl list) { + if (ObjectUtil.isEmpty(list)) return; + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + // 用户部门 + CompletableFuture userFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List userIds = list.stream().map(HardThirdMiOrderVo::getUserId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + List userList = userService.getUserDeptByIds(userIds).getData(); + if (ObjectUtil.isNotEmpty(userList)) { + Map map = CollectionUtils.convertMap(userList, UserVO::getUserId); + for (HardThirdMiOrderVo item : list) { + UserVO userVO = map.get(item.getUserId()); + if (ObjectUtil.isEmpty(userVO)) continue; + item.setUsername(userVO.getName()); + item.setUserMobile(userVO.getPhone()); + item.setUserAvatar(userVO.getAvatar()); + } + } + } + }); + // 设备 + CompletableFuture deviceFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List hardIds = list.stream().map(HardThirdMiOrderVo::getHardId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(hardIds)) { + HardManagerDto hardManagerDto = new HardManagerDto(); + hardManagerDto.setIds(hardIds); + List hardList = hardManagerMapper.list(hardManagerDto); + if (ObjectUtil.isNotEmpty(hardList)) { + HardUtil.convertHardList(list, CollectionUtils.convertMap(hardList, HardManagerEntity::getId)); + } + } + }); + CompletableFuture.allOf(userFuture, deviceFuture).join(); + } + } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java index 7b6491e44..d310d8218 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java @@ -126,6 +126,51 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { } } + /** + * 免密授权(需要押金) + */ + @Override + public ZhimaCreditPayafteruseCreditbizorderCreateResponse miDynamicCreate(Long userId, UserTypeEnum userType, Long authId) { + int depositPricePrice = 300; + + HardThirdMiOrderEntity thirdOrder = new HardThirdMiOrderEntity(); + thirdOrder.setBizType(HardThirdMiTypeEnum.MI_ALIPAY.getType()); + thirdOrder.setAuthId(authId); + thirdOrder.setUserId(userId); + thirdOrder.setDepositPrice(depositPricePrice); + thirdOrder.setUserType(userType.getStatus()); + thirdOrder.setCreateOrderTime(LocalDateTime.now()); + thirdOrder.setOrderStatus(HardThirdMiStatusEnum.CREATE_ORDER.getType()); + + ZhimaCreditPayafteruseCreditbizorderCreateRequest request = new ZhimaCreditPayafteruseCreditbizorderCreateRequest(); + ZhimaCreditPayafteruseCreditbizorderCreateModel model = new ZhimaCreditPayafteruseCreditbizorderCreateModel(); + model.setOutOrderNo(String.valueOf(authId)); + model.setAmountType("RISK_AMOUNT"); + model.setZmServiceId(conf.getZmServiceId()); + model.setCategoryId("credit_pay_after_use"); + model.setOrderAmount(new BigDecimal(depositPricePrice).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString()); + model.setProductCode("CREDIT_PAY_AFTER_USE"); + model.setSubject("浦江智能柜芝麻先享"); + model.setBody("浦江智能柜芝麻先享"); + request.setBizModel(model); + + System.out.println(JSONUtil.toJsonStr(model)); + try { + ZhimaCreditPayafteruseCreditbizorderCreateResponse response = getClient().sdkExecute(request); + if (!response.isSuccess()) { + log.error("|免密授权(需要押金)|失败,json|{}", response.getBody()); + return null; + } + return response; + } catch (Exception e) { + e.printStackTrace(); + log.error("|免密授权(需要押金)|异常", e); + return null; + } finally { + hardThirdMiOrderMapper.insert(thirdOrder); + } + } + /** * 查询面密授权 */ @@ -209,7 +254,6 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { // 一般是芝麻信用评估不通过、未开通等 if (List.of("ZHIMA_CHECK_NO_PASS", "ZHIMA_EVALUATE_NO_PASS", "CREDIT_AGREEMENT_INVALID").contains(response.getCode())) { - miDynamicCreate(authId, orderId); } response.getCode(); @@ -256,10 +300,13 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { */ @Override public AlipayTradeCreateResponse miCreateOrder(String openId, Long authId, Long userId, UserTypeEnum userType) { + int depositPricePrice = 10; + HardThirdMiOrderEntity thirdOrder = new HardThirdMiOrderEntity(); thirdOrder.setBizType(HardThirdMiTypeEnum.MI_ALIPAY.getType()); thirdOrder.setAuthId(authId); thirdOrder.setUserId(userId); + thirdOrder.setDepositPrice(depositPricePrice); thirdOrder.setUserType(userType.getStatus()); thirdOrder.setCreateOrderTime(LocalDateTime.now()); thirdOrder.setOrderStatus(HardThirdMiStatusEnum.CREATE_ORDER.getType()); @@ -273,7 +320,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { // 设置订单附加信息 bizContent.putOnce("body", "浦江智能柜芝麻先享"); // 设置订单金额 - bizContent.putOnce("total_amount", 0.01); + bizContent.putOnce("total_amount", new BigDecimal(depositPricePrice).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString()); // 固定 bizContent.putOnce("product_code", "JSAPI_PAY"); // 用户登录id @@ -344,11 +391,12 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { updateObj.setPayOrderTime(LocalDateTime.now()); updateObj.setOrderPrice(totalPrice); updateObj.setPayPrice(totalPrice); + updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY_ERROR.getType()); AlipayTradeOrderPayRequest request = new AlipayTradeOrderPayRequest(); AlipayTradeOrderPayModel model = new AlipayTradeOrderPayModel(); model.setOutRequestNo(String.valueOf(thirdOrder.getOrderId())); - model.setTradeNo(thirdOrder.getOutOrderNo()); + model.setTradeNo(thirdOrder.getThirdOrderNo()); model.setFulfillmentAmount(new BigDecimal(totalPrice).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).toString()); model.setOrderPayMode("CREDIT_FULFILLMENT_ZM"); try { @@ -360,7 +408,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { } log.info("|支付宝免密扣款|成功,json|{}", response.getBody()); if (ObjectUtil.equals(response.getCode(), "10000")) { - updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY.getType()); + updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY_SUCCESS.getType()); return true; } return false; @@ -369,9 +417,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { log.error("|支付宝免密扣款|异常", e); return false; } finally { - if (ObjectUtil.isNotEmpty(updateObj.getOrderStatus())) { - hardThirdMiOrderMapper.updateById(updateObj); - } + hardThirdMiOrderMapper.updateById(updateObj); } } @@ -379,15 +425,15 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { * 支付宝免密(取消/退款) */ @Override - public AlipayTradeRefundResponse miCancelOrRefund(String authId, String refundId, int price) { + public AlipayTradeRefundResponse miCancelOrRefund(HardThirdMiOrderEntity thirdOrder) { AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); JSONObject bizContent = new JSONObject(); // 订单总金额 - bizContent.putOnce("refund_amount", new BigDecimal(price).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); + bizContent.putOnce("refund_amount", new BigDecimal(thirdOrder.getRefundId()).divide(BigDecimal.valueOf(thirdOrder.getRefundPrice()), 2, RoundingMode.HALF_UP)); // 商家订单唯一号 - bizContent.putOnce("out_trade_no", authId); - bizContent.putOnce("out_request_no", refundId); + bizContent.putOnce("out_trade_no", String.valueOf(thirdOrder.getAuthId())); + bizContent.putOnce("out_request_no", String.valueOf(thirdOrder.getRefundId())); //扩展参数 JSONObject extendParam = new JSONObject(); extendParam.putOnce("is_fulfilled", "true"); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index 005de5e37..ffa2b0e86 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -976,14 +976,6 @@ public class HardOrderServiceImpl extends ServiceImpl + + select a.id, + a.biz_type, + a.user_id, + a.user_type, + a.auth_id, + a.flow_id, + a.order_id, + a.refund_id, + a.hard_id, + a.out_order_no, + a.third_order_no, + a.create_order_time, + a.pay_order_time, + a.refund_order_time, + a.order_status, + a.deposit_price, + a.order_price, + a.pay_price, + a.refund_price, + a.org_sign_json, + a.org_order_json, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.biz_type = #{dto.bizType} + + + and a.user_id = #{dto.userId} + + + and a.hard_id = #{dto.hardId} + + + and a.user_type = #{dto.userType} + + + and a.order_status = #{dto.orderStatus} + + + and a.create_order_time between #{dto.createOrderTimeList[0]} and #{dto.createOrderTimeList[1]} + + + and a.pay_order_time between #{dto.payOrderTimeList[0]} and #{dto.payOrderTimeList[1]} + + + and a.refund_order_time between #{dto.refundOrderTimeList[0]} and #{dto.refundOrderTimeList[1]} + + + + + \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java index 6a5c5a410..29f3e19b2 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java @@ -26,12 +26,12 @@ public class RegisterController { private final SysUserService userService; - /** - * 注册用户 - * - * @param userDto 用户信息 - * @return success/false - */ +// /** +// * 注册用户 +// * +// * @param userDto 用户信息 +// * @return success/false +// */ // @SysLog("注册用户") // @PostMapping("/user") // @ConditionalOnProperty(name = "register.user", matchIfMissing = true) @@ -39,6 +39,14 @@ public class RegisterController { // return userService.registerUser(userDto); // } + /** + * 注册普通用户 + */ + @SysLog("注册用户") + @PostMapping("/default-user") + public R registerDefaultUser(@RequestBody UserDTO userDto) { + return userService.registerDefaultUser(userDto); + } /** diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java index 16fd28f7d..ed989c10f 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java @@ -136,6 +136,11 @@ public interface SysUserService extends IService { */ R registerUser(UserDTO userDto); + /** + * 注册普通用户 + */ + R registerDefaultUser(UserDTO userDto); + /** * 锁定用户 * diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index 6b3cc21f2..6d72daab1 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -753,6 +753,71 @@ public class SysUserServiceImpl extends ServiceImpl impl return R.ok(true); } + /** + * 注册用户 赋予用户默认角色 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R registerDefaultUser(UserDTO userDto) { + userDto.setPhone(userDto.getUsername()); + // 判断用户名是否存在 + boolean usernameExists = this.exists(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); + if (usernameExists) { + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); + return R.failed(message); + } + // 判断手机号是否存在 + boolean phoneExists = this.exists(Wrappers.lambdaQuery().eq(SysUser::getPhone, userDto.getPhone())); + if (phoneExists) { + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, userDto.getPhone()); + return R.failed(message); + } + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + + sysUser.setLockFlag(UserStateEnum.NORMAL.getCode()); + sysUser.setCreateBy(userDto.getUsername()); + sysUser.setUpdateBy(userDto.getUsername()); + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + sysUser.setPasswordModifyTime(LocalDateTime.now()); + sysUser.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); + sysUser.setProcessTime(LocalDateTime.now()); + sysUser.setStaffingType(UserStaffingTypeEnum.NONE_STAFFING.getType()); + baseMapper.insert(sysUser); + + // 如果角色为空,赋默认角色 + if (CollUtil.isEmpty(userDto.getRole())) { + // 获取默认角色编码 + String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); + // 默认角色 + SysRole sysRole = sysRoleService.getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + userDto.setRole(Collections.singletonList(sysRole.getRoleId())); + } + + // 插入用户角色关系表 + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(sysUserRoleMapper::insert); + + // 创建用户默认钱包、保证线程header + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + CompletableFuture.runAsync(() -> { + try { + RequestContextHolder.setRequestAttributes(requestAttributes); + // 创建钱包 + remoteWalletService.createWallet(sysUser.getUserId()); + // 通知钱包 + remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); + } catch (Exception e) { + log.error("|{}|创建用户钱包失败error:|{}|", TAG, e.getMessage()); + } + }); + return R.ok(null); + } + /** * 锁定用户 * diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java index f57be8b94..84e9f053c 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java @@ -7,6 +7,11 @@ import lombok.Data; @Data public class WalletRechargeInvoiceVo extends WalletRechargeInvoiceEntity { + /** + * 申请人相关 + */ + private String applyUsername; + private String totalPriceCnStr; private Boolean isCheckUser; diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java index bae0b1833..250f56d1e 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java @@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysDept; +import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; import com.bsd.pjcloud.admin.api.feign.RemoteFileService; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; @@ -567,5 +568,18 @@ public class WalletRechargeInvoiceServiceImpl extends ServiceImpl applyUserIds = list.stream().map(WalletRechargeInvoiceVo::getApplyUserId).distinct().filter(ObjectUtil::isNotEmpty).toList(); + if (ObjectUtil.isNotEmpty(applyUserIds)) { + List userData = remoteUserService.getInnerUserById(applyUserIds).getData(); + if (ObjectUtil.isNotEmpty(userData)) { + Map userMap = CollectionUtils.convertMap(userData, SysUser::getUserId); + for (WalletRechargeInvoiceVo v : list) { + SysUser target = userMap.get(v.getApplyUserId()); + if (ObjectUtil.isEmpty(target)) continue; + v.setApplyUsername(target.getName()); + } + } + } } } \ No newline at end of file From e1527c5bd0ab5419a0b860b17657f1e5f1d6fd52 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 15 Jan 2026 14:11:31 +0800 Subject: [PATCH 24/46] =?UTF-8?q?feat:=E9=A3=9F=E5=A0=82=E8=8F=9C=E5=93=81?= =?UTF-8?q?=E8=B4=AD=E4=B9=B0=E7=BB=9F=E8=AE=A1(=E6=8C=89=E6=9C=88?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hard/api/dto/order/HardCarDto.java | 6 + .../vo/order/HardCanteenProductTotalVo.java | 3 + .../order/HardCanteenTotalController.java | 26 ++++- .../hard/mapper/order/HardCarMapper.java | 2 + .../hard/service/HardCanteenTotalService.java | 18 ++- .../order/HardCanteenTotalServiceImpl.java | 106 +++++++++++++++++- .../file/食堂菜品购买统计(按月).xlsx | Bin 0 -> 10004 bytes .../resources/mapper/order/HardCarMapper.xml | 92 ++++++++++++++- 8 files changed, 240 insertions(+), 13 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/食堂菜品购买统计(按月).xlsx diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java index e246c21de..ee90b9d10 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java @@ -11,6 +11,12 @@ public class HardCarDto extends HardCarEntity { private Long orderId; + /** + * 0 yyyy-MM-dd + * 1 yyyy-MM + */ + private String createTimeType = "0"; + private String createTimeStr; private LocalDate[] createTimeList; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java index 3543aa620..0e168fcf1 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java @@ -27,6 +27,9 @@ public class HardCanteenProductTotalVo { @Schema(description = "购买日期(年月日)") private LocalDateTime createTime; + @Schema(description = "购买日期自定义格式") + private String createTimeStr; + @Schema(description = "用餐时间段(早中晚)") private String hourType; diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java index 30a0826d9..a1fda9eff 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; @@ -21,6 +22,7 @@ import com.bsd.pjcloud.hard.service.HardCanteenTotalService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; @@ -82,7 +84,7 @@ public class HardCanteenTotalController { return R.ok(canteenTotalService.productLikeTop(dto)); } - /* ************************************* start app start ************************************* */ + /* ************************************* end app end ************************************* */ @Operation(summary = "根据部门 食堂菜品购买统计", description = "根据部门 食堂菜品购买统计") @PostMapping("/proudct-total-by-dept") public R> productTotalByDept(@ParameterObject Page page, @RequestBody HardOrderDto dto) { @@ -90,17 +92,37 @@ public class HardCanteenTotalController { return R.ok(canteenTotalService.productTotalByDept(page, dto, dataScope)); } - @Operation(summary = "食堂菜品购买统计", description = "食堂菜品购买统计") + @Operation(summary = "食堂菜品购买统计(按天统计)", description = "食堂菜品购买统计(按天统计)") @PostMapping("/proudct-total") public R> productTotal(@ParameterObject Page page, @RequestBody HardOrderDto dto) { DataScope dataScope = null; return R.ok(canteenTotalService.productTotal(page, dto, dataScope)); } + @Operation(summary = "食堂菜品购买统计(按月统计)", description = "食堂菜品购买统计(按月统计)") + @PostMapping("/proudct-total-by-month") + public R> productTotalByMonth(@ParameterObject Page page, @RequestBody HardOrderDto dto) { + DataScope dataScope = null; + return R.ok(canteenTotalService.productTotalByMonth(page, dto, dataScope)); + } + @Operation(summary = "菜品出售统计", description = "菜品出售统计") @PostMapping("/proudct-query") public R> proudctQuery(@ParameterObject Page page, @RequestBody HardCarDto dto) { return R.ok(canteenTotalService.proudctQuery(page, dto)); } + @Operation(summary = "食堂菜品购买统计导出(按天统计)", description = "食堂菜品购买统计导出(按天统计)") + @PostMapping("/proudct-total-export-by-day") + @SysLog("食堂菜品购买统计导出(按天统计)") + public void productTotalExportByDay(HttpServletResponse response, @RequestBody HardOrderDto dto) { + canteenTotalService.productTotalExportByDay(response, dto); + } + + @Operation(summary = "食堂菜品购买统计导出(按月统计)", description = "食堂菜品购买统计导出(按月统计)") + @PostMapping("/proudct-total-export-by-month") + @SysLog("食堂菜品购买统计导出(按月统计)") + public void productTotalExportByMonth(HttpServletResponse response, @RequestBody HardOrderDto dto) { + canteenTotalService.productTotalExportByMonth(response, dto); + } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java index 477c6b4fe..ed6021c03 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java @@ -34,6 +34,8 @@ public interface HardCarMapper extends PjcloudBaseMapper { Page productTotal(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope); + Page productTotalByMonth(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope); + Page proudctQuery(Page page, @Param("dto") HardCarDto dto); List listByDept(@Param("dto") HardOrderDto dto, DataScope dataScope); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java index 52a674546..db494d2ce 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java @@ -13,6 +13,7 @@ import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByCanteenVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByClassifyVo; import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductLikeTopVo; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @@ -40,10 +41,15 @@ public interface HardCanteenTotalService { List productTotalByDept(Page page, HardOrderDto dto, DataScope dataScope); /** - * 食堂菜品购买统计 + * 食堂菜品购买统计(按天统计) */ Page productTotal(Page page, HardOrderDto dto, DataScope dataScope); + /** + * 食堂菜品购买部门统计(按月统计) + */ + Page productTotalByMonth(Page page, HardOrderDto dto, DataScope dataScope); + /** * 菜品出售统计 */ @@ -53,4 +59,14 @@ public interface HardCanteenTotalService { * 食堂菜品购买部门统计 */ List listByDept(HardOrderDto dto, DataScope dataScope); + + /** + * 食堂菜品购买统计导出(按天统计) + */ + void productTotalExportByDay(HttpServletResponse response, HardOrderDto dto); + + /** + * 食堂菜品购买统计导出(按月统计) + */ + void productTotalExportByMonth(HttpServletResponse response, HardOrderDto dto); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java index 887988981..63d562968 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCanteenTotalServiceImpl.java @@ -1,9 +1,15 @@ package com.bsd.pjcloud.hard.service.impl.order; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.json.JSONUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.enums.WriteDirectionEnum; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; @@ -13,6 +19,7 @@ import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.constant.order.HardHourTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.total.DateRangeTypeEnum; import com.bsd.pjcloud.hard.api.dto.order.HardCarDto; @@ -30,20 +37,19 @@ import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.HardCanteenTotalService; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.TemporalAdjusters; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -168,7 +174,7 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { } /** - * 食堂菜品购买统计 + * 食堂菜品购买统计(按天统计) */ @Override public Page productTotal(Page page, HardOrderDto dto, DataScope dataScope) { @@ -183,6 +189,25 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { return pageList; } + /** + * 食堂菜品购买部门统计(按月统计) + */ + @Override + public Page productTotalByMonth(Page page, HardOrderDto dto, DataScope dataScope) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + Page pageList = hardCarMapper.productTotalByMonth(page, dto, dataScope); + if (ObjectUtil.isNotEmpty(pageList)) { + for (HardCanteenProductTotalVo v : pageList.getRecords()) { + if (ObjectUtil.isEmpty(v.getCreateTime()) && ObjectUtil.isNotEmpty(v.getCreateTimeStr())) { + v.setCreateTime(LocalDateTimeUtil.parse(v.getCreateTimeStr() + "-01", DatePattern.NORM_DATE_PATTERN)); + } + LocalDate localDate = v.getCreateTime().toLocalDate(); + v.setUniqueCode(localDate + "_" + v.getHourType()); + } + } + return pageList; + } + /** * 菜品出售统计 */ @@ -236,6 +261,75 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { return list; } + /** + * 食堂菜品购买统计导出(按天统计) + */ + @Override + public void productTotalExportByDay(HttpServletResponse response, HardOrderDto dto) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/设备交易金额汇总.xlsx")).build()) { + + } catch (Exception e) { + e.printStackTrace(); + log.error("|食堂菜品购买统计导出(按天统计)|导出数据异常error:{}", e.getMessage()); + } + } + + /** + * 食堂菜品购买统计导出(按月统计) + */ + @Override + public void productTotalExportByMonth(HttpServletResponse response, HardOrderDto dto) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/食堂菜品购买统计(按月).xlsx")).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build(); + + long currentPage = 1L; + long pageSize = 200L; + while (true) { + Page page = productTotalByMonth(new Page(currentPage, pageSize), dto, null); + if (ObjectUtil.isEmpty(page) || ObjectUtil.isEmpty(page.getRecords())) break; + // 填充数据 + List records = page.getRecords(); + // 月份 + List> mounthList = records.stream().map(v -> { + LocalDateTime createTime = v.getCreateTime(); + String createTimeStr = LocalDateTimeUtil.format(createTime, DatePattern.NORM_MONTH_PATTERN); + return Map.of("createTimeStr", createTimeStr); + }).toList(); + excelWriter.fill(mounthList, fillConfig, writeSheet); + // 早 + List morningList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.MORNING.getType())).toList(); + excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(morningList), fillConfig, writeSheet); + // 中 + List noonList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.NOONING.getType())).toList(); + excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(noonList), fillConfig, writeSheet); + // 晚 + List nightList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.NIGHT.getType())).toList(); + excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(nightList), fillConfig, writeSheet); + if (ObjectUtil.isEmpty(page.getPages()) || page.getCurrent() > page.getPages()) break; + currentPage++; + } + excelWriter.fill(new HashMap<>(), writeSheet); + } catch (Exception e) { + e.printStackTrace(); + log.error("|食堂菜品购买统计导出(按月统计)|导出数据异常error:{}", e.getMessage()); + } + } + + private List> productTotalExportByMonthToDefaulColExcelMap(List records) { + List> list = new LinkedList<>(); + if (ObjectUtil.isEmpty(records)) return list; + for (HardCanteenProductTotalVo i : records) { + LinkedHashMap map = new LinkedHashMap<>(); + map.put("totalPrice", BigDecimal.valueOf(i.getTotalPrice()).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP).toString()); + map.put("timeCount", String.valueOf(i.getTimeCount())); + list.add(map); + } + return list; + } + /** * 为HardCanteenProductTotalVo增加部门信息 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/食堂菜品购买统计(按月).xlsx b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/食堂菜品购买统计(按月).xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b7e321ff0ffc373821b6d4cf7446bdebb5bdafc9 GIT binary patch literal 10004 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 literal 0 HcmV?d00001 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml index 245a299b8..030735631 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml @@ -42,7 +42,21 @@ a.del_flag = '0' - and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr} + + + + + and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr} + + + and DATE_FORMAT(a.create_time, '%Y-%m') = #{dto.createTimeStr} + + + + + and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr} + + and o.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} @@ -129,7 +143,7 @@ from hard_car a inner join hard_parent_car p on a.parent_car_id = p.id and p.del_flag = '0' inner join hard_order o on o.parent_car_id = p.id and o.del_flag = '0' and o.hour_type is not null and - o.hour_type not in ('-1') + o.hour_type not in ('-1','null') @@ -186,7 +200,77 @@ group by DATE_FORMAT(a.create_time, '%Y-%m-%d'), o.hour_type - order by DATE_FORMAT(a.create_time, '%Y-%m-%d') desc, o.hour_type; + order by DATE_FORMAT(a.create_time, '%Y-%m-%d') desc, o.hour_type + + + From 71acd46cb78d98ce43d1020c415b140b41c44990 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 16 Jan 2026 10:30:01 +0800 Subject: [PATCH 27/46] =?UTF-8?q?feat:=E5=85=85=E5=80=BC/=E6=89=A3?= =?UTF-8?q?=E6=AC=BE=E7=94=B3=E8=AF=B7=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/constant/TaskCheckStatusEnum.java | 4 +- .../api/constant/WalletBizRechargeEnum.java | 2 +- .../WalletRechargeApplyController.java | 11 +- .../service/WalletRechargeApplyService.java | 7 + .../WalletRechargeApplyServiceImpl.java | 146 +++++++++++++++--- .../main/resources/file/充值或扣款申请.xlsx | Bin 0 -> 10174 bytes 6 files changed, 141 insertions(+), 29 deletions(-) create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/充值或扣款申请.xlsx diff --git a/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/constant/TaskCheckStatusEnum.java b/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/constant/TaskCheckStatusEnum.java index adf8c9e91..f7b811e8a 100644 --- a/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/constant/TaskCheckStatusEnum.java +++ b/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/constant/TaskCheckStatusEnum.java @@ -23,13 +23,13 @@ public enum TaskCheckStatusEnum { public static TaskCheckStatusEnum descOf(String description) { return Arrays.stream(TaskCheckStatusEnum.values()) .filter(v -> ObjectUtil.equal(v.getDesc(), description)) - .findFirst().get(); + .findFirst().orElse(null); } public static TaskCheckStatusEnum codeOf(String code) { return Arrays.stream(TaskCheckStatusEnum.values()) .filter(v -> ObjectUtil.equal(v.getCode(), code)) - .findFirst().get(); + .findFirst().orElse(null); } } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java index 907ac832d..7215ee316 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java @@ -26,7 +26,7 @@ public enum WalletBizRechargeEnum { public static WalletBizRechargeEnum valueOfByType(String code) { return Arrays.stream(WalletBizRechargeEnum.values()) .filter(v -> ObjectUtil.equal(v.getCode(), code)) - .findFirst().get(); + .findFirst().orElse(null); } public static WalletBizRechargeEnum descOf(String description) { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java index c25ae7d10..3cb568db6 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java @@ -12,6 +12,7 @@ import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeSaveTopupDto; @@ -22,6 +23,7 @@ import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeImportVo; import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo; import com.bsd.pjcloud.wallet.service.WalletRechargeApplyService; import com.bsd.pjcloud.wallet.service.WalletRechargeApplyComposeService; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -153,11 +155,14 @@ public class WalletRechargeApplyController { return walletRechargeApplyService.exportExcel(dto); } + /** + * 导出充值/扣款申请 + */ @ResponseExcel - @GetMapping("/export") + @PostMapping("/export") @PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_export')") - public List export(WalletRechargeApplyEntity walletRechargeApply, Long[] ids) { - return walletRechargeApplyService.list(Wrappers.lambdaQuery(walletRechargeApply).in(ArrayUtil.isNotEmpty(ids), WalletRechargeApplyEntity::getId, ids)); + public void export(HttpServletResponse response, @RequestBody WalletRechargeApplyDto dto) { + walletRechargeApplyService.export(response, dto); } @PostMapping("/read-excel") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java index 580910a24..8b641c875 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeSaveTopupDto; @@ -12,6 +13,7 @@ import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.validation.BindingResult; import java.util.ArrayList; @@ -65,4 +67,9 @@ public interface WalletRechargeApplyService extends IService exportExcel(WalletRechargeImportDto dto); + + /** + * 导出充值/扣款申请 + */ + void export(HttpServletResponse response, WalletRechargeApplyDto dto); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java index f0c4ba4d6..7df8a5440 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java @@ -2,10 +2,15 @@ package com.bsd.pjcloud.wallet.service.impl.recharge; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -32,6 +37,7 @@ import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.flow.task.dto.TaskParamDto; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletBizRechargeEnum; import com.bsd.pjcloud.wallet.api.constant.WalletRechargeInvoiceStatusEnum; @@ -61,6 +67,7 @@ import com.bsd.pjcloud.wallet.service.*; import com.bsd.pjcloud.wallet.utils.flow.FlowUtil; import com.bsd.pjcloud.wallet.utils.flow.dto.WalletRechargeApplyFlowDto; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -70,11 +77,14 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.CompletableFuture; /** * 充值/扣款申请 @@ -544,39 +554,128 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl map = new HashMap(); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + map.put("timeSpan", " 到 "); + map.put("startTime", LocalDateTimeUtil.format(dto.getCreateTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); + map.put("endTime", LocalDateTimeUtil.format(dto.getCreateTimeList()[1], DatePattern.NORM_DATETIME_PATTERN)); + } + + // 统计 + double sumTotalPrice = 0; + int lineNumber = 1; + + long currentPage = 1; + long pageSize = 1000; + while (true) { + Page page = scopePageList(new Page(currentPage, pageSize), dto, DataScope.of()); + List records = page.getRecords(); + if (ObjectUtil.isEmpty(records)) break; + // 处理excel start + List> excelList = new LinkedList<>(); + for (WalletRechargeApplyVo v : records) { + Map excelMap = new HashMap<>(); + excelMap.put("lineNumber", lineNumber); + excelMap.put("username", v.getUsername()); + excelMap.put("bizTypeStr", ""); + if (ObjectUtil.isNotEmpty(v.getBizType())) { + WalletBizRechargeEnum bizTypeEnum = WalletBizRechargeEnum.valueOfByType(v.getBizType()); + if (ObjectUtil.isNotEmpty(bizTypeEnum)) excelMap.put("bizTypeStr", bizTypeEnum.getDesc()); + } + excelMap.put("invoiceCode", v.getInvoiceCode()); + excelMap.put("walletTypeName", v.getWalletTypeName()); + excelMap.put("deptName", v.getDeptName()); + excelMap.put("totalPrice", 0); + if (ObjectUtil.isNotEmpty(v.getTotalPrice())) { + double totalPrice = new BigDecimal(v.getTotalPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + if (ObjectUtil.isNotEmpty(totalPrice)) { + excelMap.put("totalPrice", totalPrice); + // 累加 + sumTotalPrice += totalPrice; + } + } + excelMap.put("importTime", LocalDateTimeUtil.format(v.getImportTime(), DatePattern.NORM_MONTH_PATTERN)); + excelMap.put("processStatus", ""); + if (ObjectUtil.isNotEmpty(v.getProcessStatus())) { + TaskCheckStatusEnum processStatusEnum = TaskCheckStatusEnum.codeOf(v.getProcessStatus()); + if (ObjectUtil.isNotEmpty(processStatusEnum)) { + excelMap.put("processStatus", processStatusEnum.getCode()); + } + } + excelMap.put("remark", v.getRemark()); + excelMap.put("applyTime", LocalDateTimeUtil.format(v.getApplyTime(), DatePattern.NORM_DATETIME_PATTERN)); + excelMap.put("processTime", LocalDateTimeUtil.format(v.getProcessTime(), DatePattern.NORM_DATETIME_PATTERN)); + excelList.add(excelMap); + lineNumber++; + } + excelWriter.fill(excelList, fillConfig, writeSheet); + // 处理excel end + if (page.getTotal() < pageSize) break; + currentPage++; + } + map.put("totalPrice", sumTotalPrice); + excelWriter.fill(map, writeSheet); + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|导出充值/扣款申请异常,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage()); + } + } + private void disposeList(List list, WalletRechargeApplyDto dto) { if (ObjectUtil.isEmpty(list)) return; + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + PjcloudUser user = SecurityUtils.getUser(); // 用户 - List userIds = list.stream().map(WalletRechargeApplyVo::getUserId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - List userList = userService.getUserById(new ArrayList<>(userIds)).getData(); - if (ObjectUtil.isNotEmpty(userList)) { - DataUtil.convertUserList(list, CollectionUtils.convertMap(userList, SysUser::getUserId)); + CompletableFuture userFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List userIds = list.stream().map(WalletRechargeApplyVo::getUserId).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + List userList = userService.getUserById(new ArrayList<>(userIds)).getData(); + if (ObjectUtil.isNotEmpty(userList)) { + DataUtil.convertUserList(list, CollectionUtils.convertMap(userList, SysUser::getUserId)); + } } - } + }); // 部门 - List deptIds = list.stream().map(WalletRechargeApplyVo::getDeptId).distinct().toList(); - if (ObjectUtil.isNotEmpty(deptIds)) { - Map deptList = deptService.getDeptByDeptIds(deptIds).getData(); - if (ObjectUtil.isNotEmpty(deptList)) { - DataUtil.convertDeptList(list, deptList); + CompletableFuture deptFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List deptIds = list.stream().map(WalletRechargeApplyVo::getDeptId).distinct().toList(); + if (ObjectUtil.isNotEmpty(deptIds)) { + Map deptList = deptService.getDeptByDeptIds(deptIds).getData(); + if (ObjectUtil.isNotEmpty(deptList)) { + DataUtil.convertDeptList(list, deptList); + } } - } + }); // 饭卡类型 - List walletTypeIds = list.stream().map(WalletRechargeApplyVo::getWalletTypeId).distinct().toList(); - if (ObjectUtil.isNotEmpty(walletTypeIds)) { - WalletTypeDto walletTypeDto = new WalletTypeDto(); - walletTypeDto.setWalletTypeIds(walletTypeIds); - List walletTypeList = walletTypeMapper.list(walletTypeDto); - if (ObjectUtil.isNotEmpty(walletTypeList)) { - WalletDataUtil.convertWalletTypeList(list, CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId)); + CompletableFuture walletTypeFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List walletTypeIds = list.stream().map(WalletRechargeApplyVo::getWalletTypeId).distinct().toList(); + if (ObjectUtil.isNotEmpty(walletTypeIds)) { + WalletTypeDto walletTypeDto = new WalletTypeDto(); + walletTypeDto.setWalletTypeIds(walletTypeIds); + List walletTypeList = walletTypeMapper.list(walletTypeDto); + if (ObjectUtil.isNotEmpty(walletTypeList)) { + WalletDataUtil.convertWalletTypeList(list, CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId)); + } } - } + }); // 审批流程 - if (dto.getIsFindCheckUser()) { + CompletableFuture flowFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + if (!dto.getIsFindCheckUser()) return; List processInstanceIds = list.stream().map(WalletRechargeApplyVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList(); if (ObjectUtil.isNotEmpty(processInstanceIds)) { - List taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds); + List taskList = flowUtil.queryProcessInstanceList(String.valueOf(user.getId()), processInstanceIds); if (ObjectUtil.isNotEmpty(taskList)) { Map taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); CollectionUtils.convertList(list, v -> { @@ -588,7 +687,8 @@ public class WalletRechargeApplyServiceImpl extends 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 literal 0 HcmV?d00001 From 780279b936a5c85ca2e2dfbe6e23fc3d16096294 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 16 Jan 2026 10:55:36 +0800 Subject: [PATCH 28/46] =?UTF-8?q?fix:=E5=95=86=E6=88=B7=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/HardOrderTotalController.java | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java index 0a5a3a4f2..c317a079b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java @@ -249,9 +249,7 @@ public class HardOrderTotalController { if (ObjectUtil.isEmpty(mch)) throw new RuntimeException("商户不存在"); Long count = hardOrderMapper.count(dto, DataScope.of()); - if (count > 5000) throw new RuntimeException("导出数据超出5000条,请缩小查询范围"); - List list = hardOrderService.scopeList(dto, DataScope.of()); - List excelList = BeanUtils.toBean(list, HardMchOrderExcelVo.class); + if (count > 10 * 10000) throw new RuntimeException("导出数据超出100000条,请缩小查询范围"); try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/商户交易流水导出.xlsx")).build()) { WriteSheet writeSheet = EasyExcel.writerSheet().build(); @@ -263,12 +261,23 @@ public class HardOrderTotalController { map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[1], DatePattern.NORM_DATETIME_PATTERN)); } map.put("merchantName", mch.getName()); - if (ObjectUtil.isNotEmpty(excelList)) { - BigDecimal totalPriceSum = BigDecimal.ZERO; - BigDecimal extraPriceSum = BigDecimal.ZERO; - BigDecimal payPriceSum = BigDecimal.ZERO; - BigDecimal refundPriceSum = BigDecimal.ZERO; - Long lineNumber = 1L; + // 统计 + BigDecimal totalPriceSum = BigDecimal.ZERO; + BigDecimal extraPriceSum = BigDecimal.ZERO; + BigDecimal payPriceSum = BigDecimal.ZERO; + BigDecimal refundPriceSum = BigDecimal.ZERO; + // 列号 + Long lineNumber = 1L; + // 分页相关 + long currentPage = 1; + long pageSize = 1000; + + while (true) { + Page page = hardOrderService.scopePageList(new Page(currentPage, pageSize), dto, DataScope.of()); + List records = page.getRecords(); + if (ObjectUtil.isEmpty(records)) break; + List excelList = BeanUtils.toBean(records, HardMchOrderExcelVo.class); + // 处理excel start for (HardMchOrderExcelVo v : excelList) { v.setLineNumber(lineNumber); lineNumber++; @@ -295,13 +304,17 @@ public class HardOrderTotalController { } } } - map.put("totalPriceSum", totalPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); - map.put("extraPriceSum", extraPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); - map.put("payPriceSum", payPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); - map.put("refundPriceSum", refundPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + excelWriter.fill(excelList, fillConfig, writeSheet); + // 处理excel end + if (page.getTotal() < pageSize) break; + currentPage++; } + map.put("totalPriceSum", totalPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + map.put("extraPriceSum", extraPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + map.put("payPriceSum", payPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + map.put("refundPriceSum", refundPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + excelWriter.fill(map, writeSheet); - excelWriter.fill(excelList, fillConfig, writeSheet); } } From df99986af63abb4338e992c2ace7cf61fd3c4c5a Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 16 Jan 2026 15:58:05 +0800 Subject: [PATCH 29/46] =?UTF-8?q?feat:=E5=95=86=E6=88=B7=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E8=AE=B0=E5=BD=95(=E6=8C=89=E6=9C=88)=E8=A1=A8=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/order/HardSelectOrderMerchIdsDto.java | 17 +++ .../order/HardOrderTotalController.java | 20 +++ .../hard/mapper/order/HardOrderMapper.java | 7 ++ .../hard/service/HardOrderTotalService.java | 6 +- .../impl/order/HardOrderTotalServiceImpl.java | 114 ++++++++++++++++-- .../mapper/order/HardOrderMapper.xml | 78 ++++++++++++ 6 files changed, 233 insertions(+), 9 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardSelectOrderMerchIdsDto.java diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardSelectOrderMerchIdsDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardSelectOrderMerchIdsDto.java new file mode 100644 index 000000000..5e272a74d --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardSelectOrderMerchIdsDto.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.hard.api.dto.order; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class HardSelectOrderMerchIdsDto { + + private List merchIds; + + private List merchTypes; + + private LocalDateTime[] createTimeList; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java index c317a079b..f07ec66d7 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java @@ -23,6 +23,7 @@ import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.hard.api.dto.order.HardDeptTotalDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; +import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; import com.bsd.pjcloud.hard.api.vo.order.*; import com.bsd.pjcloud.hard.api.vo.order.excel.HardMchOrderExcelVo; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; @@ -142,6 +143,25 @@ public class HardOrderTotalController { return R.ok(hardOrderTotalService.listCs(dto)); } + @PostMapping("/page-list-cs-by-month") + @Operation(summary = "商户交易记录(按商户、月)查询") + public R> pageListCsByMonth(@ParameterObject Page page, @RequestBody HardOrderDto dto) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + // 查询商户和下面的子商户 + List mchDtoIds = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(dto.getMerchantId())) { + List mchList = mchService.getByParentId(dto.getMerchantId()).getData(); + if (ObjectUtil.isNotEmpty(mchList)) { + List mchIds = mchList.stream().map(MchManageVo::getId).toList(); + mchDtoIds.add(dto.getMerchantId()); + mchDtoIds.addAll(mchIds); + dto.setMerchantId(null); + dto.setMchIds(mchDtoIds); + } + } + return R.ok(hardOrderTotalService.pageListCsByMonth(page, dto)); + } + @PostMapping("/page-list-payType") @Operation(summary = "支付方式交易记录") public R> pageListPayType(@RequestBody HardOrderDto dto) { diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java index 2c6d75541..52f05e49b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderSumAndCountDto; +import com.bsd.pjcloud.hard.api.dto.order.HardSelectOrderMerchIdsDto; import com.bsd.pjcloud.hard.api.dto.panel.PanelProductDto; import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; @@ -108,6 +109,8 @@ public interface HardOrderMapper extends PjcloudBaseMapper { return selectListByScope(commonWrapper(dto), DataScope.of()); } + List selectOrderMerchIds(@Param("dto") HardSelectOrderMerchIdsDto dto); + Page scopePageList(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope); List scopeList(@Param("dto") HardOrderDto dto, DataScope dataScope); @@ -122,8 +125,12 @@ public interface HardOrderMapper extends PjcloudBaseMapper { List listRefundCs(@Param("dto") HardOrderDto refundDto, DataScope refundDataScope); + List listRefundCsByMonth(@Param("dto") HardOrderDto refundDto, DataScope refundDataScope); + List listCsByDay(@Param("dto") HardOrderDto totalDto); + Page pageCsByMonth(Page page, @Param("dto") HardOrderDto totalDto, DataScope totalDataScope); + HardOrderCsVo listCsTotal(@Param("dto") HardOrderDto totalDto); List listOrerPayType(@Param("dto") HardOrderDto dto); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderTotalService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderTotalService.java index fae9cbf87..977a1ab3a 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderTotalService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderTotalService.java @@ -21,6 +21,11 @@ public interface HardOrderTotalService { */ List listCs(HardOrderDto dto); + /** + * 商户交易记录(按商户、月)查询 + */ + Page pageListCsByMonth(Page page, HardOrderDto dto); + /** * 根据天查询每个商户的流水 */ @@ -50,5 +55,4 @@ public interface HardOrderTotalService { * 统计每天、每周、每月、每年的交易人数和次数 */ HardChartLatitudeVo chartLatitude(Long merchantId); - } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderTotalServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderTotalServiceImpl.java index 7359511f0..9c98464fd 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderTotalServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderTotalServiceImpl.java @@ -15,14 +15,10 @@ import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; -import com.bsd.pjcloud.hard.api.constant.refund.HardRefundStatusEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum; import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; import com.bsd.pjcloud.hard.api.dto.hard.CurrentUserHardTypeInfoDto; -import com.bsd.pjcloud.hard.api.dto.order.HardChartLatitudeVo; -import com.bsd.pjcloud.hard.api.dto.order.HardDeptTotalDto; -import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; -import com.bsd.pjcloud.hard.api.dto.order.HardOrderSumAndCountDto; +import com.bsd.pjcloud.hard.api.dto.order.*; import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; import com.bsd.pjcloud.hard.api.utils.HardUtil; import com.bsd.pjcloud.hard.api.vo.order.*; @@ -48,8 +44,6 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.temporal.TemporalAdjusters; -import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -169,7 +163,6 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { refundDto.setRefundStatusCodes(List.of(HardSaleStatusEnum.COMPLETE.getStatus())); DataScope refundDataScope = DataScope.of(); refundDataScope.setScopeDeptName("merchant_dept_id"); - List refundList = hardOrderMapper.listRefundCs(refundDto, refundDataScope); // 有退款没有流水的情况 if (ObjectUtil.isAllNotEmpty(totalList, refundList)) { @@ -233,6 +226,111 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { return totalList; } + /** + * 商户交易记录(按商户、月)查询 + */ + @Override + public Page pageListCsByMonth(Page page, HardOrderDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + if (ObjectUtil.isEmpty(dto.getMchTypeCodes())) { + CurrentUserHardTypeInfoDto hardTypeInfo = hardManagerService.getCurrentUserHardTypeInfo(user); + dto.setMchTypeCodes(hardTypeInfo.getHardTypeList()); + } else { + dto.setMchTypeCodes(dto.getMchTypeCodes()); + } +// // 查询总流水 +// if (ObjectUtil.isEmpty(dto.getMchIds())) { +// HardSelectOrderMerchIdsDto merchQuery = new HardSelectOrderMerchIdsDto(); +// if (ObjectUtil.isNotEmpty(dto.getMerchantId())) { +// merchQuery.setMerchIds(List.of(dto.getMerchantId())); +// } +// if (ObjectUtil.isNotEmpty(dto.getMchTypeCodes())) { +// merchQuery.setMerchTypes(dto.getMchTypeCodes()); +// } +// if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { +// merchQuery.setCreateTimeList(dto.getCreateTimeList()); +// } +// List mechIds = hardOrderMapper.selectOrderMerchIds(merchQuery); +// dto.setMchIds(mechIds); +// } + // 查询总流水 + HardOrderDto totalDto = BeanUtil.toBean(dto, HardOrderDto.class); + totalDto.setOrderStatusCodes(HardOrderStatusEnum.getPayPrice()); + DataScope totalDataScope = DataScope.of(); + totalDataScope.setScopeDeptName("merchant_dept_id"); + Page totalPage = hardOrderMapper.pageCsByMonth(page, totalDto, totalDataScope); + List totalList = totalPage.getRecords(); + // 扣款总流水 + HardOrderDto refundDto = BeanUtil.toBean(dto, HardOrderDto.class); + refundDto.setPayTimeList(null); + refundDto.setRefundTimeList(dto.getPayTimeList()); + refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); + refundDto.setRefundStatusCodes(List.of(HardSaleStatusEnum.COMPLETE.getStatus())); + DataScope refundDataScope = DataScope.of(); + refundDataScope.setScopeDeptName("merchant_dept_id"); + List refundList = hardOrderMapper.listRefundCsByMonth(refundDto, refundDataScope); + // 有退款没有流水的情况 + if (ObjectUtil.isAllNotEmpty(totalList, refundList)) { + for (HardOrderCsVo refund : refundList) { + HardOrderCsVo target = totalList.stream().filter(v -> ObjectUtil.equals(refund.getMerchantId(), v.getMerchantId()) && ObjectUtil.equals(refund.getDay(), v.getDay())).findFirst().orElse(null); + if (ObjectUtil.isEmpty(target)) { + HardOrderCsVo entity = BeanUtils.toBean(refund, HardOrderCsVo.class); + entity.setTotalPayPrice(BigDecimal.ZERO); + entity.setTotalPayCount(BigDecimal.ZERO); + totalList.add(entity); + } + } + } + for (HardOrderCsVo v : totalList) { + // 退款 + if (ObjectUtil.isNotEmpty(refundList)) { + refundList.stream().filter(i -> ObjectUtil.equals(i.getMerchantId(), v.getMerchantId()) && ObjectUtil.equals(i.getDay(), v.getDay())).findFirst().ifPresent(i -> { + v.setTotalRefundPrice(i.getTotalPayPrice()); + v.setTotalRefundCount(i.getTotalPayCount()); + }); + } + // 消费净金额 + if (ObjectUtil.isNotEmpty(v.getTotalPayPrice())) { + BigDecimal refundPrice = BigDecimal.ZERO; + if (ObjectUtil.isNotEmpty(v.getTotalRefundPrice())) { + refundPrice = v.getTotalRefundPrice(); + } + v.setTotalProfitPrice(v.getTotalPayPrice().subtract(refundPrice)); + } + // 消费净次数 + if (ObjectUtil.isNotEmpty(v.getTotalPayCount())) { + BigDecimal refundCount = BigDecimal.ZERO; + if (ObjectUtil.isNotEmpty(v.getTotalRefundCount())) { + refundCount = v.getTotalRefundCount(); + } + v.setTotalProfitCount(v.getTotalPayCount().subtract(refundCount)); + } + } + // 聚合一下数据 + if (ObjectUtil.isNotEmpty(totalList)) { + // 商户 + List mchIds = totalList.stream().map(HardOrderCsVo::getMerchantId).distinct().toList(); + if (ObjectUtil.isNotEmpty(mchIds)) { + List mchList = remoteMchService.getByIds(mchIds).getData(); + if (ObjectUtil.isNotEmpty(mchList)) { + WalletDataUtil.convertMchList(totalList, CollectionUtils.convertMap(mchList, MchManageVo::getId)); + } + } + // 商户部门 + List mchDeptIds = totalList.stream().map(HardOrderCsVo::getMerchantDeptId).distinct().toList(); + if (ObjectUtil.isNotEmpty(mchDeptIds)) { + Map deptMap = remoteDeptService.getDeptByDeptIds(mchDeptIds).getData(); + if (ObjectUtil.isNotEmpty(deptMap)) { + for (HardOrderCsVo v : totalList) { + if (ObjectUtil.isEmpty(v.getMerchantDeptId())) continue; + v.setMerchantDeptName(deptMap.get(v.getMerchantDeptId()).getName()); + } + } + } + } + return totalPage; + } + @Override public List listCsByDay(Page page, HardOrderDto dto, PjcloudUser user) { // 查询总流水 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml index 150d45bb3..b44b6d5a9 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml @@ -223,6 +223,39 @@ order by a.create_time desc, a.user_id desc + + @@ -367,6 +400,37 @@ ELSE 5 END + + + + @@ -414,6 +427,9 @@ and r.audit_time between #{dto.refundTimeList[0]} and #{dto.refundTimeList[1]} + + and DATE_FORMAT(r.audit_time, '%Y') = #{dto.auditTimeYearStr} + and r.status in From 39976c1368679bd70a36353da33870ee1f56f27d Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Tue, 27 Jan 2026 20:19:18 +0800 Subject: [PATCH 31/46] =?UTF-8?q?feat:=E4=BC=98=E6=83=A0=E5=88=B8=E6=B4=BB?= =?UTF-8?q?=E5=8A=A8=E8=A1=A8=EF=BC=8C=E9=A2=86=E5=8F=96=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/810pjcloudx_wallet_act.sql | 74 ++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/db/810pjcloudx_wallet_act.sql b/db/810pjcloudx_wallet_act.sql index f5a234a9b..fd86effd1 100644 --- a/db/810pjcloudx_wallet_act.sql +++ b/db/810pjcloudx_wallet_act.sql @@ -41,4 +41,76 @@ CREATE TABLE act_cancel_item del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', tenant_id bigint DEFAULT NULL COMMENT '租户ID', PRIMARY KEY (id) -) ENGINE = InnoDB COMMENT ='核销活动项'; \ No newline at end of file +) ENGINE = InnoDB COMMENT ='核销活动项'; + +DROP TABLE IF EXISTS act_coupon; +CREATE TABLE act_coupon +( + id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '优惠券ID', + name VARCHAR(128) NOT NULL COMMENT '优惠券名称', + type VARCHAR(64) NOT NULL COMMENT '优惠券类型 (1:满减券 2:折扣券 3:立减券 4:兑换券)', + face_value INT DEFAULT 0 COMMENT '面额/折扣 (满减/立减单位:分, 折扣单位:百分比)', + min_point INT DEFAULT 0 COMMENT '使用门槛 (满多少分可用, 0表示无门槛)', + total_count INT NOT NULL DEFAULT 0 COMMENT '发行总量 (-1表示不限量)', + surplus_count INT NOT NULL DEFAULT 0 COMMENT '剩余数量', + limit_count INT DEFAULT 1 COMMENT '每人限领数量', + limit_type VARCHAR(32) DEFAULT NULL COMMENT '限领类型 (once:活动期间一次 day:每天 week:每周 month:每月 year:每年)', + valid_type VARCHAR(32) NOT NULL COMMENT '有效期类型 (1:固定日期 2:领取后生效)', + valid_start_time DATETIME DEFAULT NULL COMMENT '有效期开始时间', + valid_end_time DATETIME DEFAULT NULL COMMENT '有效期结束时间', + valid_days INT DEFAULT 0 COMMENT '领取后有效天数', + use_scope_type VARCHAR(32) DEFAULT 0 COMMENT '适用范围 (0:全场通用 1:指定商户 2:指定分类 3:指定商品)', + scope_id VARCHAR(2048) DEFAULT NULL COMMENT '适用范围ID集合 (商户ID/分类ID/商品ID, 逗号分隔)', + status VARCHAR(32) DEFAULT 0 COMMENT '状态 (0:草稿 1:进行中 2:已结束 3:已作废)', + description VARCHAR(512) DEFAULT NULL COMMENT '使用说明', + + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '创建时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', + PRIMARY KEY (id), + KEY idx_status (status), + KEY idx_valid_end_time (valid_end_time) +) ENGINE = InnoDB COMMENT ='优惠券活动'; + +DROP TABLE IF EXISTS act_coupon_record; +CREATE TABLE act_coupon_record +( + id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '领取记录ID', + coupon_id BIGINT(20) NOT NULL COMMENT '优惠券ID', + user_id BIGINT(20) NOT NULL COMMENT '用户ID', + user_name VARCHAR(64) DEFAULT NULL COMMENT '用户名称', + coupon_code VARCHAR(64) NOT NULL COMMENT '券码(唯一标识)', + status VARCHAR(32) NOT NULL DEFAULT '0' COMMENT '使用状态 (0:未使用 1:已使用 2:已过期 3:已作废)', + + -- 冗余优惠券快照信息,防止优惠券修改后数据不一致 + coupon_name VARCHAR(128) NOT NULL COMMENT '优惠券名称', + coupon_type VARCHAR(64) NOT NULL COMMENT '优惠券类型', + face_value INT DEFAULT 0 COMMENT '面额/折扣', + min_point INT DEFAULT 0 COMMENT '使用门槛', + + -- 有效期 + start_time DATETIME NOT NULL COMMENT '有效开始时间', + end_time DATETIME NOT NULL COMMENT '有效结束时间', + + -- 使用信息 + use_time DATETIME DEFAULT NULL COMMENT '使用时间', + order_id VARCHAR(64) DEFAULT NULL COMMENT '关联订单号', + use_amount INT DEFAULT 0 COMMENT '抵扣金额(分)', + + create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + create_time datetime DEFAULT NULL COMMENT '领取时间', + update_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + update_time datetime DEFAULT NULL COMMENT '修改时间', + del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + tenant_id bigint DEFAULT NULL COMMENT '租户ID', + + PRIMARY KEY (id), + UNIQUE KEY uk_coupon_code (coupon_code), + KEY idx_user_id (user_id), + KEY idx_coupon_id (coupon_id), + KEY idx_end_time (end_time), + KEY idx_status (status) +) ENGINE = InnoDB COMMENT ='优惠券领取记录表'; \ No newline at end of file From 62150787d0d22c7a9d95bd3a11c00d73b4efcf09 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 28 Jan 2026 11:32:07 +0800 Subject: [PATCH 32/46] =?UTF-8?q?feat:=E4=BC=98=E6=83=A0=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/act/ActCouponLimitTypeEnum.java | 37 ++++ .../api/constant/act/ActCouponStatusEnum.java | 36 ++++ .../api/constant/act/ActCouponTypeEnum.java | 34 ++++ .../act/ActCouponUseScopeTypeEnum.java | 33 ++++ .../constant/act/ActCouponValidTypeEnum.java | 32 ++++ .../wallet/api/dto/act/ActCouponDto.java | 8 + .../api/entity/act/ActCouponEntity.java | 167 ++++++++++++++++++ .../wallet/api/vo/act/ActCouponVo.java | 10 ++ .../controller/act/ActCouponController.java | 101 +++++++++++ .../wallet/mapper/act/ActCouponMapper.java | 10 ++ .../wallet/service/ActCouponService.java | 8 + .../impl/act/ActCouponServiceImpl.java | 15 ++ .../resources/mapper/act/ActCouponMapper.xml | 42 +++++ 13 files changed, 533 insertions(+) create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponLimitTypeEnum.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponStatusEnum.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponTypeEnum.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponUseScopeTypeEnum.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponValidTypeEnum.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponDto.java create mode 100755 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponVo.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponLimitTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponLimitTypeEnum.java new file mode 100644 index 000000000..a2762160c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponLimitTypeEnum.java @@ -0,0 +1,37 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券限领类型 + */ +@Getter +@AllArgsConstructor +public enum ActCouponLimitTypeEnum { + + ONCE("1", "活动期间一次"), + EVERY_DAY("2", "每天"), + EVERY_WEEK("3", "每周"), + EVERY_MONTH("4", "每月"), + EVERY_YEAR("5", "每年"), + ; + private final String code; + private final String desc; + + public static ActCouponLimitTypeEnum valueOfByType(String code) { + return Arrays.stream(ActCouponLimitTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponLimitTypeEnum descOf(String description) { + return Arrays.stream(ActCouponLimitTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponStatusEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponStatusEnum.java new file mode 100644 index 000000000..94972d212 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponStatusEnum.java @@ -0,0 +1,36 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券状态 + */ +@Getter +@AllArgsConstructor +public enum ActCouponStatusEnum { + CAOGAO("1", "草稿"), + JINXINGZHONG("2", "进行中"), + YIJIESHU("3", "已结束"), + YIZUOFEI("4", "已作废"), + ; + + private final String code; + private final String desc; + + public static ActCouponStatusEnum valueOfByType(String code) { + return Arrays.stream(ActCouponStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponStatusEnum descOf(String description) { + return Arrays.stream(ActCouponStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponTypeEnum.java new file mode 100644 index 000000000..c060b1a9d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponTypeEnum.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券类型 + */ +@Getter +@AllArgsConstructor +public enum ActCouponTypeEnum { + MANJIAN_QUAN("1", "满减券"), + ZHEKOU_QUAN("2", "折扣券"), + LIJIAN_QUAN("3", "立减券"), + DUIHUAN_QUAN("4", "兑换券"), + ; + private final String code; + private final String desc; + + public static ActCouponTypeEnum valueOfByType(String code) { + return Arrays.stream(ActCouponTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponTypeEnum descOf(String description) { + return Arrays.stream(ActCouponTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponUseScopeTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponUseScopeTypeEnum.java new file mode 100644 index 000000000..8a4f092db --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponUseScopeTypeEnum.java @@ -0,0 +1,33 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券适用范围 + */ +@Getter +@AllArgsConstructor +public enum ActCouponUseScopeTypeEnum { + ALL_USE("1", "全场通用"), + SPECIFIED_MERCHANT("2", "指定商户"), + SPECIFIED_CATEGORY("3", "指定商户分类"), + ; + private final String code; + private final String desc; + + public static ActCouponUseScopeTypeEnum valueOfByType(String code) { + return Arrays.stream(ActCouponUseScopeTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponUseScopeTypeEnum descOf(String description) { + return Arrays.stream(ActCouponUseScopeTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponValidTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponValidTypeEnum.java new file mode 100644 index 000000000..905a5d949 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponValidTypeEnum.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券有效期类型 + */ +@Getter +@AllArgsConstructor +public enum ActCouponValidTypeEnum { + FIXED_DATE("1", "固定日期"), + AFTER_RECEIVE("2", "领取后生效"), + ; + private final String code; + private final String desc; + + public static ActCouponValidTypeEnum valueOfByType(String code) { + return Arrays.stream(ActCouponValidTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponValidTypeEnum descOf(String description) { + return Arrays.stream(ActCouponValidTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponDto.java new file mode 100644 index 000000000..94437c022 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponDto.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import lombok.Data; + +@Data +public class ActCouponDto extends ActCouponEntity { +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java new file mode 100755 index 000000000..46b8e7bb5 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java @@ -0,0 +1,167 @@ +package com.bsd.pjcloud.wallet.api.entity.act; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 优惠券活动 + */ +@Data +@TenantTable +@TableName("act_coupon") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "优惠券活动") +public class ActCouponEntity extends Model { + + + /** + * 优惠券ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "优惠券ID") + private Long id; + + /** + * 优惠券名称 + */ + @Schema(description = "优惠券名称") + private String name; + + /** + * 优惠券类型 (1:满减券 2:折扣券 3:立减券 4:兑换券) + */ + @Schema(description = "优惠券类型 (1:满减券 2:折扣券 3:立减券 4:兑换券)") + private String type; + + /** + * 面额/折扣 (满减/立减单位:分, 折扣单位:百分比) + */ + @Schema(description = "面额/折扣(满减/立减单位:分,折扣单位:百分比)") + private Integer faceValue; + + /** + * 使用门槛 (满多少分可用, 0表示无门槛) + */ + @Schema(description = "使用门槛(满多少分可用,null表示无门槛)") + private Integer minPoint; + + /** + * 发行总量 (-1表示不限量) + */ + @Schema(description = "发行总量(null表示不限量)") + private Integer totalCount; + + /** + * 剩余数量 + */ + @Schema(description = "剩余数量") + private Integer surplusCount; + + /** + * 每人限领数量 + */ + @Schema(description = "每人限领数量") + private Integer limitCount; + + /** + * 限领类型 (once:活动期间一次 day:每天 week:每周 month:每月 year:每年) + */ + @Schema(description = "限领类型 (once:活动期间一次 day:每天 week:每周 month:每月 year:每年)") + private String limitType; + + /** + * 有效期类型 (1:固定日期 2:领取后生效) + */ + @Schema(description = "有效期类型 (1:固定日期 2:领取后生效)") + private String validType; + + /** + * 有效期开始时间 + */ + @Schema(description = "有效期开始时间") + private LocalDateTime validStartTime; + + /** + * 有效期结束时间 + */ + @Schema(description = "有效期结束时间") + private LocalDateTime validEndTime; + + /** + * 领取后有效天数 + */ + @Schema(description = "领取后有效天数") + private Integer validDays; + + /** + * 适用范围 (1:全场通用 2:指定商户 3:指定分类 4:指定商品) + */ + @Schema(description = "适用范围 (0:全场通用 1:指定商户 2:指定分类 3:指定商品)") + private String useScopeType; + + /** + * 适用范围ID集合 (商户ID/分类ID/商品ID, 逗号分隔) + */ + @Schema(description = "适用范围ID集合 (商户ID/分类ID/商品ID, 逗号分隔)") + private String scopeId; + + /** + * 状态(1:草稿2:进行中3:已结束4:已作废) + */ + @Schema(description = "状态(1:草稿2:进行中3:已结束4:已作废)") + private String status; + + /** + * 使用说明 + */ + @Schema(description = "使用说明") + private String description; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponVo.java new file mode 100644 index 000000000..315a596d6 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponVo.java @@ -0,0 +1,10 @@ +package com.bsd.pjcloud.wallet.api.vo.act; + +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import lombok.Data; + +@Data +public class ActCouponVo extends ActCouponEntity { + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java new file mode 100755 index 000000000..fa04a321d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java @@ -0,0 +1,101 @@ +package com.bsd.pjcloud.wallet.controller.act; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.service.ActCouponService; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; + +/** + * 优惠券活动 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/act-coupon") +@Tag(description = "act-coupon", name = "优惠券活动管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ActCouponController { + + private final ActCouponService actCouponService; + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_view')") + public R getActCouponPage(@ParameterObject Page page, @ParameterObject ActCouponDto dto) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(actCouponService.page(page, wrapper)); + } + + /** + * 通过id查询优惠券活动 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(actCouponService.getById(id)); + } + + /** + * 新增优惠券活动 + */ + @Operation(summary = "新增优惠券活动", description = "新增优惠券活动") + @SysLog("新增优惠券活动") + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_add')") + public R save(@RequestBody ActCouponEntity actCoupon) { + return R.ok(actCouponService.save(actCoupon)); + } + + /** + * 修改优惠券活动 + */ + @Operation(summary = "修改优惠券活动", description = "修改优惠券活动") + @SysLog("修改优惠券活动") + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_edit')") + public R updateById(@RequestBody ActCouponEntity actCoupon) { + return R.ok(actCouponService.updateById(actCoupon)); + } + + /** + * 通过id删除优惠券活动 + */ + @Operation(summary = "通过id删除优惠券活动", description = "通过id删除优惠券活动") + @SysLog("通过id删除优惠券活动") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(actCouponService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_export')") + public List export(ActCouponEntity actCoupon, Long[] ids) { + return actCouponService.list(Wrappers.lambdaQuery(actCoupon).in(ArrayUtil.isNotEmpty(ids), ActCouponEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java new file mode 100755 index 000000000..a0f5088fb --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java @@ -0,0 +1,10 @@ +package com.bsd.pjcloud.wallet.mapper.act; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ActCouponMapper extends PjcloudBaseMapper { + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java new file mode 100755 index 000000000..ba6ecf782 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; + +public interface ActCouponService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java new file mode 100755 index 000000000..18e51e810 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java @@ -0,0 +1,15 @@ +package com.bsd.pjcloud.wallet.service.impl.act; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponMapper; +import com.bsd.pjcloud.wallet.service.ActCouponService; +import org.springframework.stereotype.Service; + +/** + * 优惠券活动 + */ +@Service +public class ActCouponServiceImpl extends ServiceImpl implements ActCouponService { + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml new file mode 100755 index 000000000..9d0f3e9d1 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml @@ -0,0 +1,42 @@ + + + + + + + select a.id, + a.name, + a.type, + a.face_value, + a.min_point, + a.total_count, + a.surplus_count, + a.limit_count, + a.limit_type, + a.valid_type, + a.valid_start_time, + a.valid_end_time, + a.valid_days, + a.use_scope_type, + a.scope_id, + a.status, + a.description, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.name LIKE CONCAT('%',#{dto.name},'%') + + + and a.type = #{dto.type} + + + + \ No newline at end of file From 53512b7f9c7922cc868a93017f8fff89cead8a64 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 28 Jan 2026 12:16:14 +0800 Subject: [PATCH 33/46] =?UTF-8?q?feat:=E7=94=9F=E6=88=90=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=88=B8=E9=A2=86=E5=8F=96=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/dto/act/ActCouponRecordDto.java | 8 + .../api/entity/act/ActCouponRecordEntity.java | 154 ++++++++++++++++++ .../wallet/api/vo/act/ActCouponRecordVo.java | 9 + .../act/ActCouponRecordController.java | 101 ++++++++++++ .../mapper/act/ActCouponRecordMapper.java | 11 ++ .../service/ActCouponRecordService.java | 8 + .../impl/act/ActCouponRecordServiceImpl.java | 15 ++ .../resources/mapper/act/ActCouponMapper.xml | 2 +- .../mapper/act/ActCouponRecordMapper.xml | 10 ++ 9 files changed, 317 insertions(+), 1 deletion(-) create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java create mode 100755 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java create mode 100755 pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java new file mode 100644 index 000000000..6cf7e718f --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import lombok.Data; + +@Data +public class ActCouponRecordDto extends ActCouponRecordEntity { +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java new file mode 100755 index 000000000..3d7702871 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java @@ -0,0 +1,154 @@ +package com.bsd.pjcloud.wallet.api.entity.act; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 优惠券领取记录表 + */ +@Data +@TenantTable +@TableName("act_coupon_record") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "优惠券领取记录表") +public class ActCouponRecordEntity extends Model { + + /** + * 领取记录ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "领取记录ID") + private Long id; + + /** + * 优惠券ID + */ + @Schema(description = "优惠券ID") + private Long couponId; + + /** + * 用户ID + */ + @Schema(description = "用户ID") + private Long userId; + + /** + * 用户名称 + */ + @Schema(description = "用户名称") + private String userName; + + /** + * 券码(唯一标识) + */ + @Schema(description = "券码(唯一标识)") + private String couponCode; + + /** + * 使用状态 (0:未使用 1:已使用 2:已过期 3:已作废) + */ + @Schema(description = "使用状态 (0:未使用 1:已使用 2:已过期 3:已作废)") + private String status; + + /** + * 优惠券名称 + */ + @Schema(description = "优惠券名称") + private String couponName; + + /** + * 优惠券类型 + */ + @Schema(description = "优惠券类型") + private String couponType; + + /** + * 面额/折扣 + */ + @Schema(description = "面额/折扣") + private Integer faceValue; + + /** + * 使用门槛 + */ + @Schema(description = "使用门槛") + private Integer minPoint; + + /** + * 有效开始时间 + */ + @Schema(description = "有效开始时间") + private LocalDateTime startTime; + + /** + * 有效结束时间 + */ + @Schema(description = "有效结束时间") + private LocalDateTime endTime; + + /** + * 使用时间 + */ + @Schema(description = "使用时间") + private LocalDateTime useTime; + + /** + * 关联订单号 + */ + @Schema(description = "关联订单号") + private String orderId; + + /** + * 抵扣金额(分) + */ + @Schema(description = "抵扣金额(分)") + private Integer useAmount; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 领取时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "领取时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java new file mode 100644 index 000000000..bdc3d348f --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.wallet.api.vo.act; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import lombok.Data; + +@Data +public class ActCouponRecordVo extends ActCouponRecordEntity { + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java new file mode 100755 index 000000000..97ec5998a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java @@ -0,0 +1,101 @@ +package com.bsd.pjcloud.wallet.controller.act; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.service.ActCouponRecordService; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 优惠券领取记录表 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/actCouponRecord" ) +@Tag(description = "actCouponRecord" , name = "优惠券领取记录表管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ActCouponRecordController { + + private final ActCouponRecordService actCouponRecordService; + + /** + * 分页查询 + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')" ) + public R getActCouponRecordPage(@ParameterObject Page page, @ParameterObject ActCouponRecordDto dto) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(actCouponRecordService.page(page, wrapper)); + } + + + /** + * 通过id查询优惠券领取记录表 + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(actCouponRecordService.getById(id)); + } + + /** + * 新增优惠券领取记录表 + */ + @Operation(summary = "新增优惠券领取记录表" , description = "新增优惠券领取记录表" ) + @SysLog("新增优惠券领取记录表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_add')" ) + public R save(@RequestBody ActCouponRecordEntity actCouponRecord) { + return R.ok(actCouponRecordService.save(actCouponRecord)); + } + + /** + * 修改优惠券领取记录表 + */ + @Operation(summary = "修改优惠券领取记录表" , description = "修改优惠券领取记录表" ) + @SysLog("修改优惠券领取记录表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_edit')" ) + public R updateById(@RequestBody ActCouponRecordEntity actCouponRecord) { + return R.ok(actCouponRecordService.updateById(actCouponRecord)); + } + + /** + * 通过id删除优惠券领取记录表 + */ + @Operation(summary = "通过id删除优惠券领取记录表" , description = "通过id删除优惠券领取记录表" ) + @SysLog("通过id删除优惠券领取记录表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(actCouponRecordService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_export')" ) + public List export(ActCouponRecordEntity actCouponRecord,Long[] ids) { + return actCouponRecordService.list(Wrappers.lambdaQuery(actCouponRecord).in(ArrayUtil.isNotEmpty(ids), ActCouponRecordEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java new file mode 100755 index 000000000..4e9712549 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.wallet.mapper.act; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ActCouponRecordMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java new file mode 100755 index 000000000..104d2feb4 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; + +public interface ActCouponRecordService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java new file mode 100755 index 000000000..7ca130a9c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java @@ -0,0 +1,15 @@ +package com.bsd.pjcloud.wallet.service.impl.act; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponRecordMapper; +import com.bsd.pjcloud.wallet.service.ActCouponRecordService; +import org.springframework.stereotype.Service; + +/** + * 优惠券领取记录表 + */ +@Service +public class ActCouponRecordServiceImpl extends ServiceImpl implements ActCouponRecordService { + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml index 9d0f3e9d1..7568de12f 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml @@ -1,7 +1,7 @@ - + select a.id, diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml new file mode 100755 index 000000000..ce1ac9513 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From 86e8f08242ab9f139516d861bd7d6d62e2a68604 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 28 Jan 2026 20:07:21 +0800 Subject: [PATCH 34/46] =?UTF-8?q?feat:=E7=94=A8=E6=88=B7=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../act/ActCouponRecordStatusEnum.java | 34 +++ .../wallet/api/constant/act/ActTypeEnum.java | 41 +++ .../api/constant/act/ActUserReceiveEnum.java | 40 +++ .../api/dto/act/ActCouponReceiveDto.java | 20 ++ .../api/entity/act/ActCouponEntity.java | 12 + .../api/entity/act/ActCouponRecordEntity.java | 4 +- .../wallet/api/vo/act/ActSimpleNotfiyVo.java | 14 + .../controller/act/ActComController.java | 53 ++++ .../controller/act/ActCouponController.java | 17 +- .../act/ActCouponRecordController.java | 61 +++-- .../wallet/mapper/act/ActCouponMapper.java | 6 + .../mapper/mch/view/MchDeptViewMapper.java | 2 + .../wallet/service/ActCancelItemService.java | 6 + .../pjcloud/wallet/service/ActComService.java | 23 ++ .../service/ActCouponLifecycleService.java | 35 +++ .../service/ActCouponRecordService.java | 11 + .../wallet/service/ActCouponService.java | 30 +++ .../impl/act/ActCancelItemServiceImpl.java | 30 ++- .../service/impl/act/ActComServiceImpl.java | 101 +++++++ .../impl/act/ActCouponRecordServiceImpl.java | 87 ++++++ .../impl/act/ActCouponServiceImpl.java | 76 ++++++ .../act/impl/ActCouponLifecycleService.java | 27 ++ .../act/service/ActCouponComUtilService.java | 252 ++++++++++++++++++ .../resources/mapper/act/ActCouponMapper.xml | 13 +- .../mapper/mch/view/MchDeptViewMapper.xml | 2 + 25 files changed, 964 insertions(+), 33 deletions(-) create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponRecordStatusEnum.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTypeEnum.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActUserReceiveEnum.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponReceiveDto.java create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActSimpleNotfiyVo.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActComController.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponLifecycleService.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActComServiceImpl.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/impl/ActCouponLifecycleService.java create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/service/ActCouponComUtilService.java diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponRecordStatusEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponRecordStatusEnum.java new file mode 100644 index 000000000..103fbf359 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponRecordStatusEnum.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 优惠券使用状态 + */ +@Getter +@AllArgsConstructor +public enum ActCouponRecordStatusEnum { + UNUSED("1", "未使用"), + USED("2", "已使用"), + EXPIRED("3", "已过期"), + INVALID("4", "已作废"), + ; + private final String code; + private final String desc; + + public static ActCouponRecordStatusEnum valueOfByType(String code) { + return Arrays.stream(ActCouponRecordStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActCouponRecordStatusEnum descOf(String description) { + return Arrays.stream(ActCouponRecordStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTypeEnum.java new file mode 100644 index 000000000..475b5a03d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActTypeEnum.java @@ -0,0 +1,41 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.List; + +/** + * 核销活动状体啊 + */ +@Getter +@AllArgsConstructor +public enum ActTypeEnum { + + CANCEL_ACT("1", "核销活动", 1), + COUPON_ACT("2", "优惠券活动", 2), + ; + + private final String code; + private final String desc; + private final int priority; + + public static ActTypeEnum valueOfByType(String code) { + return Arrays.stream(ActTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().get(); + } + + public static ActTypeEnum descOf(String description) { + return Arrays.stream(ActTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } + + public static List sortList(){ + return Arrays.asList(ActTypeEnum.values()).stream().sorted((o1, o2) -> o2.priority - o1.priority).toList(); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActUserReceiveEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActUserReceiveEnum.java new file mode 100644 index 000000000..68429e89d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActUserReceiveEnum.java @@ -0,0 +1,40 @@ +package com.bsd.pjcloud.wallet.api.constant.act; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户活动状态 + */ +@Getter +@AllArgsConstructor +public enum ActUserReceiveEnum { + + ACT_EXPIRED("1", "活动不在进行中"), + ACT_NOT_EXIST("2", "活动不存在"), + ACT_NOT_STARTED("3", "活动未开启"), + USER_LIMIT_REACHED("4", "用户参加活动已达上限"), + USER_CANNOT_PARTICIPATE("5", "用户不能参加此活动"), + OTHER_ERROR("6", "其他错误"), + USER_CAN_JOIN_ACT("99", "用户可以参加活动"), + ; + + private final String code; + private final String desc; + + public static ActUserReceiveEnum valueOfByType(String code) { + return Arrays.stream(ActUserReceiveEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static ActUserReceiveEnum descOf(String description) { + return Arrays.stream(ActUserReceiveEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponReceiveDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponReceiveDto.java new file mode 100644 index 000000000..be0bcea7e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponReceiveDto.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class ActCouponReceiveDto { + + /** + * 领取优惠券的用户id + */ + private Long receiveUserId; + + /** + * 优惠券id + */ + @NotNull(message = "优惠券id不能为空") + private Long couponId; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java index 46b8e7bb5..14761bc2e 100755 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java @@ -27,6 +27,18 @@ public class ActCouponEntity extends Model { @Schema(description = "优惠券ID") private Long id; + /** + * 优惠券活动唯一code + */ + @Schema(description = "优惠券活动唯一code") + private String uniqueCode; + + /** + * 绑定的通知id + */ + @Schema(description = "绑定的通知id") + private Long bindNotifyId; + /** * 优惠券名称 */ diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java index 3d7702871..7c1b22c68 100755 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponRecordEntity.java @@ -51,9 +51,9 @@ public class ActCouponRecordEntity extends Model { private String couponCode; /** - * 使用状态 (0:未使用 1:已使用 2:已过期 3:已作废) + * 使用状态(1:未使用2:已使用3:已过期4:已作废) */ - @Schema(description = "使用状态 (0:未使用 1:已使用 2:已过期 3:已作废)") + @Schema(description = "使用状态(1:未使用2:已使用3:已过期4:已作废)") private String status; /** diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActSimpleNotfiyVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActSimpleNotfiyVo.java new file mode 100644 index 000000000..44c4fc6da --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActSimpleNotfiyVo.java @@ -0,0 +1,14 @@ +package com.bsd.pjcloud.wallet.api.vo.act; + +import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum; +import lombok.Data; + +@Data +public class ActSimpleNotfiyVo { + + private ActTypeEnum actType; + + private Long actId; + + private T detail; +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActComController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActComController.java new file mode 100644 index 000000000..9f9fed629 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActComController.java @@ -0,0 +1,53 @@ +package com.bsd.pjcloud.wallet.controller.act; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum; +import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo; +import com.bsd.pjcloud.wallet.service.ActComService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 活动公用方法 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/act/com") +@Tag(description = "act-com", name = "活动公用方法") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ActComController { + + private final ActComService actComService; + + @Operation(summary = "根据公告id查询对应的活动", description = "根据公告id查询对应的活动") + @GetMapping("/app/get-act-by-notify-id") + public R getActByNotifyId(@RequestParam Long notifyId) { + return R.ok(actComService.getActByNotifyId(notifyId)); + } + + @Operation(summary = "获取活动详情", description = "获取活动详情") + @GetMapping("/app/get-act-detail") + public R getActDetail(@RequestParam ActTypeEnum actType, @RequestParam Long actId) { + return R.ok(actComService.getActDetail(actType, actId)); + } + + @Operation(summary = "判断用户是否可以参加活动", description = "判断用户是否可以参加活动") + @GetMapping("/app/is-eligible-for-act") + public R isEligibleForAct(@RequestParam ActTypeEnum actType, @RequestParam Long actId) { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(actComService.isEligibleForAct(actType, actId, user.getId())); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java index fa04a321d..6f0ee90a5 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java @@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; import com.bsd.pjcloud.wallet.service.ActCouponService; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; @@ -41,9 +43,8 @@ public class ActCouponController { @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('wallet_actCoupon_view')") - public R getActCouponPage(@ParameterObject Page page, @ParameterObject ActCouponDto dto) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - return R.ok(actCouponService.page(page, wrapper)); + public R> getActCouponPage(@ParameterObject Page page, @ParameterObject ActCouponDto dto) { + return R.ok(actCouponService.pageJoin(page, dto)); } /** @@ -63,8 +64,8 @@ public class ActCouponController { @SysLog("新增优惠券活动") @PostMapping @PreAuthorize("@pms.hasPermission('wallet_actCoupon_add')") - public R save(@RequestBody ActCouponEntity actCoupon) { - return R.ok(actCouponService.save(actCoupon)); + public R save(@RequestBody ActCouponEntity actCoupon) { + return R.ok(actCouponService.create(actCoupon)); } /** @@ -75,7 +76,8 @@ public class ActCouponController { @PutMapping @PreAuthorize("@pms.hasPermission('wallet_actCoupon_edit')") public R updateById(@RequestBody ActCouponEntity actCoupon) { - return R.ok(actCouponService.updateById(actCoupon)); + actCouponService.modify(actCoupon); + return R.ok(); } /** @@ -86,7 +88,8 @@ public class ActCouponController { @DeleteMapping @PreAuthorize("@pms.hasPermission('wallet_actCoupon_del')") public R removeById(@RequestBody Long[] ids) { - return R.ok(actCouponService.removeBatchByIds(CollUtil.toList(ids))); + actCouponService.delByIds(CollUtil.toList(ids)); + return R.ok(); } /** diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java index 97ec5998a..34cf84e0e 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java @@ -6,10 +6,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto; import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; import com.bsd.pjcloud.wallet.service.ActCouponRecordService; +import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -27,19 +32,33 @@ import java.util.List; */ @RestController @RequiredArgsConstructor -@RequestMapping("/actCouponRecord" ) -@Tag(description = "actCouponRecord" , name = "优惠券领取记录表管理" ) +@RequestMapping("/act-coupon-record") +@Tag(description = "act-coupon-record", name = "优惠券领取记录表管理") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class ActCouponRecordController { - private final ActCouponRecordService actCouponRecordService; + private final ActCouponRecordService actCouponRecordService; + + /* ************************************* start app start ************************************* */ + + @Operation(summary = "领取优惠券", description = "领取优惠券") + @PostMapping("/app/receive") + @Idempotent(expireTime = 2, key = "'/act/receive/app/receive/' + #dto.getReceiveUserId()", info = "正在领取中,请勿重复操作") + public R appReceive(@Valid @RequestBody ActCouponReceiveDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setReceiveUserId(user.getId()); + return R.ok(actCouponRecordService.appReceive(dto)); + } + + + /* ************************************* end app end ************************************* */ /** * 分页查询 */ - @Operation(summary = "分页查询" , description = "分页查询" ) - @GetMapping("/page" ) - @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')" ) + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')") public R getActCouponRecordPage(@ParameterObject Page page, @ParameterObject ActCouponRecordDto dto) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); return R.ok(actCouponRecordService.page(page, wrapper)); @@ -49,20 +68,20 @@ public class ActCouponRecordController { /** * 通过id查询优惠券领取记录表 */ - @Operation(summary = "通过id查询" , description = "通过id查询" ) - @GetMapping("/{id}" ) - @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')" ) - public R getById(@PathVariable("id" ) Long id) { + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')") + public R getById(@PathVariable("id") Long id) { return R.ok(actCouponRecordService.getById(id)); } /** * 新增优惠券领取记录表 */ - @Operation(summary = "新增优惠券领取记录表" , description = "新增优惠券领取记录表" ) - @SysLog("新增优惠券领取记录表" ) + @Operation(summary = "新增优惠券领取记录表", description = "新增优惠券领取记录表") + @SysLog("新增优惠券领取记录表") @PostMapping - @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_add')" ) + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_add')") public R save(@RequestBody ActCouponRecordEntity actCouponRecord) { return R.ok(actCouponRecordService.save(actCouponRecord)); } @@ -70,10 +89,10 @@ public class ActCouponRecordController { /** * 修改优惠券领取记录表 */ - @Operation(summary = "修改优惠券领取记录表" , description = "修改优惠券领取记录表" ) - @SysLog("修改优惠券领取记录表" ) + @Operation(summary = "修改优惠券领取记录表", description = "修改优惠券领取记录表") + @SysLog("修改优惠券领取记录表") @PutMapping - @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_edit')" ) + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_edit')") public R updateById(@RequestBody ActCouponRecordEntity actCouponRecord) { return R.ok(actCouponRecordService.updateById(actCouponRecord)); } @@ -81,10 +100,10 @@ public class ActCouponRecordController { /** * 通过id删除优惠券领取记录表 */ - @Operation(summary = "通过id删除优惠券领取记录表" , description = "通过id删除优惠券领取记录表" ) - @SysLog("通过id删除优惠券领取记录表" ) + @Operation(summary = "通过id删除优惠券领取记录表", description = "通过id删除优惠券领取记录表") + @SysLog("通过id删除优惠券领取记录表") @DeleteMapping - @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_del')" ) + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_del')") public R removeById(@RequestBody Long[] ids) { return R.ok(actCouponRecordService.removeBatchByIds(CollUtil.toList(ids))); } @@ -94,8 +113,8 @@ public class ActCouponRecordController { */ @ResponseExcel @GetMapping("/export") - @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_export')" ) - public List export(ActCouponRecordEntity actCouponRecord,Long[] ids) { + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_export')") + public List export(ActCouponRecordEntity actCouponRecord, Long[] ids) { return actCouponRecordService.list(Wrappers.lambdaQuery(actCouponRecord).in(ArrayUtil.isNotEmpty(ids), ActCouponRecordEntity::getId, ids)); } } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java index a0f5088fb..a37075e4a 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java @@ -1,10 +1,16 @@ package com.bsd.pjcloud.wallet.mapper.act; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface ActCouponMapper extends PjcloudBaseMapper { + Page pageJoin(Page page, @Param("dto") ActCouponDto dto); + } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java index 4184bd696..cda0073fc 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java @@ -14,4 +14,6 @@ public interface MchDeptViewMapper { List selectList(@Param("dto") WalletMchDeptViewDto dto); + WalletMchDeptViewVo selectByUserId(@Param("userId") Long userId); + } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelItemService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelItemService.java index 5acc3833a..4d94ac456 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelItemService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelItemService.java @@ -3,6 +3,7 @@ package com.bsd.pjcloud.wallet.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCancelItemEntity; import com.bsd.pjcloud.wallet.api.vo.act.ActCancelItemVo; @@ -22,6 +23,11 @@ public interface ActCancelItemService extends IService { */ ActCancelItemVo appFindUnique(Long actId, PjcloudUser user); + /** + * 判断用户是否可以参加活动 + */ + ActUserReceiveEnum isEligibleForAct(Long actId, Long userId); + /** * app查询本店优惠券列表 */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java new file mode 100644 index 000000000..f30298bd8 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java @@ -0,0 +1,23 @@ +package com.bsd.pjcloud.wallet.service; + + +import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum; +import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo; + +public interface ActComService { + + /** + * 根据公告id查询对应的活动 + */ + ActSimpleNotfiyVo getActByNotifyId(Long notifyId); + + /** + * 获取活动详情 + */ + ActSimpleNotfiyVo getActDetail(ActTypeEnum actType, Long actId); + + /** + * 判断用户是否可以参加活动 + */ + String isEligibleForAct(ActTypeEnum actType, Long actId, Long userId); +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponLifecycleService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponLifecycleService.java new file mode 100644 index 000000000..cb8575eb1 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponLifecycleService.java @@ -0,0 +1,35 @@ +package com.bsd.pjcloud.wallet.service; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; + +public interface ActCouponLifecycleService { + + /** + * 领取优惠券前的校验 + * @param couponId 优惠券ID + * @param userId 用户ID + * @return 优惠券实体 + */ + ActCouponEntity preReceive(Long couponId, Long userId); + + /** + * 领取优惠券后的处理 + * @param record 优惠券记录实体 + */ + void afterReceive(ActCouponRecordEntity record); + + /** + * 核销前的校验 + * @param record 优惠券记录实体 + * @return 优惠券实体 + */ + ActCouponRecordEntity preCancel(ActCouponRecordEntity record); + + /** + * 核销后的处理 + * @param record 优惠券记录实体 + */ + void afterCancel(ActCouponRecordEntity record); +} + diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java index 104d2feb4..3405e88f2 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java @@ -1,8 +1,19 @@ package com.bsd.pjcloud.wallet.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; public interface ActCouponRecordService extends IService { + /** + * 领取优惠券 + */ + Long appReceive(ActCouponReceiveDto dto); + + /** + * 判断用户是否可以参加活动 + */ + ActUserReceiveEnum isEligibleForAct(Long actId, Long userId); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java index ba6ecf782..bc87f4434 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java @@ -1,8 +1,38 @@ package com.bsd.pjcloud.wallet.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; + +import java.util.ArrayList; public interface ActCouponService extends IService { + /** + * 分页查询 + */ + Page pageJoin(Page page, ActCouponDto dto); + + /** + * 新增优惠券 + */ + Long create(ActCouponEntity actCoupon); + + /** + * 修改优惠券 + */ + void modify(ActCouponEntity actCoupon); + + /** + * 删除优惠券 + */ + void delByIds(ArrayList list); + + /** + * 根据公告id查询核销活动 + */ + ActCouponEntity getDetailByNoticeId(Long notifyId); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelItemServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelItemServiceImpl.java index 44f69e7b5..7e3fe72da 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelItemServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelItemServiceImpl.java @@ -16,6 +16,7 @@ import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.constant.act.ActCancelStatusEnum; import com.bsd.pjcloud.wallet.api.constant.act.ActStatusEnum; +import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; @@ -152,10 +153,10 @@ public class ActCancelItemServiceImpl extends ServiceImpl() + .eq(ActCancelItemEntity::getActId, actId) + .eq(ActCancelItemEntity::getReceiverUserId, userId) + ); + if (ObjectUtil.isEmpty(detail)) { + return ActUserReceiveEnum.USER_LIMIT_REACHED; + } + if (ObjectUtil.isNotEmpty(detail.getExpireTime())) { + if (detail.getExpireTime().isBefore(LocalDateTime.now())) { + return ActUserReceiveEnum.ACT_EXPIRED; + } + } + return ActUserReceiveEnum.USER_CAN_JOIN_ACT; + } + /** * app查询本店优惠券列表 */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActComServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActComServiceImpl.java new file mode 100644 index 000000000..303abcd5f --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActComServiceImpl.java @@ -0,0 +1,101 @@ +package com.bsd.pjcloud.wallet.service.impl.act; + +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum; +import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo; +import com.bsd.pjcloud.wallet.service.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 活动公用方法 + */ +@Service +@Slf4j +@RequiredArgsConstructor +public class ActComServiceImpl implements ActComService { + + private final ActCancelService actCancelService; + private final ActCancelItemService actCancelItemService; + + private final ActCouponService actCouponService; + private final ActCouponRecordService actCouponRecordService; + + /** + * 根据公告id查询对应的活动 + */ + @Override + public ActSimpleNotfiyVo getActByNotifyId(Long notifyId) { + ActSimpleNotfiyVo result = new ActSimpleNotfiyVo<>(); + List actEnumList = ActTypeEnum.sortList(); + for (ActTypeEnum act : actEnumList) { + if (ObjectUtil.equals(act, ActTypeEnum.CANCEL_ACT)) { + ActCancelEntity detail = actCancelService.getDetailByNoticeId(notifyId); + if (ObjectUtil.isNotEmpty(detail)) { + result.setActId(detail.getId()); + result.setActType(act); + result.setDetail(detail); + return result; + } + } + if (ObjectUtil.equals(act, ActTypeEnum.COUPON_ACT)) { + ActCouponEntity detail = actCouponService.getDetailByNoticeId(notifyId); + if (ObjectUtil.isNotEmpty(detail)) { + result.setActId(detail.getId()); + result.setActType(act); + result.setDetail(detail); + return result; + } + } + } + return null; + } + + /** + * 获取活动详情 + */ + @Override + public ActSimpleNotfiyVo getActDetail(ActTypeEnum actType, Long actId) { + ActSimpleNotfiyVo result = new ActSimpleNotfiyVo<>(); + result.setActId(actId); + if (ObjectUtil.equals(actType, ActTypeEnum.CANCEL_ACT)) { + ActCancelEntity detail = actCancelService.getById(actId); + if (ObjectUtil.isNotEmpty(detail)) { + result.setActType(actType); + result.setDetail(detail); + return result; + } + } + if (ObjectUtil.equals(actType, ActTypeEnum.COUPON_ACT)) { + ActCouponEntity detail = actCouponService.getById(actId); + if (ObjectUtil.isNotEmpty(detail)) { + result.setActType(actType); + result.setDetail(detail); + return result; + } + } + return null; + } + + /** + * 判断用户是否可以参加活动 + */ + @Override + public String isEligibleForAct(ActTypeEnum actType, Long actId, Long userId) { + ActUserReceiveEnum status = ActUserReceiveEnum.USER_CANNOT_PARTICIPATE; + // 核销活动目前只能参加一次 + if (ObjectUtil.equals(actType, ActTypeEnum.CANCEL_ACT)) { + status = actCancelItemService.isEligibleForAct(actId, userId); + } + if (ObjectUtil.equals(actType, ActTypeEnum.COUPON_ACT)) { + status = actCouponRecordService.isEligibleForAct(actId, userId); + } + return status.getCode(); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java index 7ca130a9c..7201a9a70 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java @@ -1,15 +1,102 @@ package com.bsd.pjcloud.wallet.service.impl.act; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.core.exception.ServiceException; +import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponMapper; import com.bsd.pjcloud.wallet.mapper.act.ActCouponRecordMapper; import com.bsd.pjcloud.wallet.service.ActCouponRecordService; +import com.bsd.pjcloud.wallet.service.MchManageService; +import com.bsd.pjcloud.wallet.utils.act.service.ActCouponComUtilService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + /** * 优惠券领取记录表 */ +@Slf4j +@RequiredArgsConstructor @Service public class ActCouponRecordServiceImpl extends ServiceImpl implements ActCouponRecordService { + private final ActCouponMapper actCouponMapper; + + private final MchManageService mchManageService; + private final ActCouponComUtilService actCouponComUtilService; + + private final RemoteUserService remoteUserService; + + /** + * 领取优惠券 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Long appReceive(ActCouponReceiveDto dto) { + // 1. 获取当前用户 + UserInfo userInfo = remoteUserService.getByUserId(dto.getReceiveUserId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + throw new ServiceException("用户不存在"); + } + SysUser sysUser = userInfo.getSysUser(); + // 2. 预处理 + ActCouponEntity actCouponEntity = actCouponComUtilService.preReceive(dto.getCouponId(), dto.getReceiveUserId()); + if (ObjectUtil.isEmpty(actCouponEntity)) { + return null; + } + // 3. 特殊优惠券判断 + ActUserReceiveEnum specialCouponStatus = specialCoupon(actCouponEntity, sysUser); + if (ObjectUtil.isNotEmpty(specialCouponStatus) && ObjectUtil.notEqual(specialCouponStatus, ActUserReceiveEnum.USER_CAN_JOIN_ACT)) { + throw new ServiceException(specialCouponStatus.getDesc()); + } + // 4. 执行领取逻辑 + ActCouponRecordEntity record = actCouponComUtilService.doReceive(actCouponEntity, sysUser); + // 5. 优惠券领取成功后,执行生命周期方法 + actCouponComUtilService.afterReceive(record); + return record.getId(); + } + + public ActUserReceiveEnum specialCoupon(ActCouponEntity actCouponEntity, SysUser sysUser) { + // 食堂生日券 + if (ObjectUtil.equals(actCouponEntity.getUniqueCode(), "1qRgFo")) { + // 判断是否为食堂用户 + MchManageVo userMch = mchManageService.getFirstMchByDeptId(sysUser.getDeptId(), List.of(MerchantTypeEnum.CANTEEN)); + if (ObjectUtil.isEmpty(userMch)) { + return ActUserReceiveEnum.USER_CANNOT_PARTICIPATE; + } + // 判断用户最近一年充值是否为500,1500,800,2400 + + return ActUserReceiveEnum.USER_CAN_JOIN_ACT; + } + return null; + } + + /** + * 判断用户是否可以参加活动 + */ + @Override + public ActUserReceiveEnum isEligibleForAct(Long actId, Long userId) { + ActUserReceiveEnum userReceiveEnum = actCouponComUtilService.isEligibleForAct(actId, userId); + if (ObjectUtil.equals(userReceiveEnum, ActUserReceiveEnum.USER_CAN_JOIN_ACT)) { + UserInfo userInfo = remoteUserService.getByUserId(userId).getData(); + ActCouponEntity actCouponEntity = actCouponMapper.selectById(actId); + if (ObjectUtil.isNotEmpty(userInfo) && ObjectUtil.isNotEmpty(actCouponEntity)) { + userReceiveEnum = specialCoupon(actCouponEntity, userInfo.getSysUser()); + } + } + return userReceiveEnum; + } } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java index 18e51e810..00e0ebbc9 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java @@ -1,15 +1,91 @@ package com.bsd.pjcloud.wallet.service.impl.act; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; import com.bsd.pjcloud.wallet.mapper.act.ActCouponMapper; import com.bsd.pjcloud.wallet.service.ActCouponService; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + /** * 优惠券活动 */ @Service public class ActCouponServiceImpl extends ServiceImpl implements ActCouponService { + @Override + public Page pageJoin(Page page, ActCouponDto dto) { + return baseMapper.pageJoin(page, dto); + } + + /** + * 新增优惠券 + */ + @Override + public Long create(ActCouponEntity actCoupon) { + actCoupon.setUniqueCode(generateUniqueCode()); + baseMapper.insert(actCoupon); + return actCoupon.getId(); + } + + /** + * 修改优惠券 + */ + @Override + public void modify(ActCouponEntity actCoupon) { + // 是否存在 + ActCouponEntity exist = baseMapper.selectById(actCoupon.getId()); + if (ObjectUtil.isEmpty(exist)) { + throw new RuntimeException("优惠券不存在"); + } + if (ObjectUtil.isEmpty(exist.getUniqueCode())) { + actCoupon.setUniqueCode(generateUniqueCode()); + } + baseMapper.updateById(actCoupon); + } + + /** + * 删除优惠券 + */ + @Override + public void delByIds(ArrayList list) { + List couponList = baseMapper.selectByIds(list); + if (ObjectUtil.isEmpty(couponList)) return; + for (ActCouponEntity coupon : couponList) { + // 如果有人领取了优惠券,则不能删除 + } + baseMapper.deleteByIds(list); + } + + /** + * 根据公告id查询核销活动 + */ + @Override + public ActCouponEntity getDetailByNoticeId(Long notifyId) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(ActCouponEntity::getBindNotifyId, notifyId) + ); + } + + /** + * 生成唯一code + */ + private String generateUniqueCode() { + String string = RandomUtil.randomString(6); + while (true) { + Long isExist = baseMapper.selectCount(new LambdaQueryWrapper().eq(ActCouponEntity::getUniqueCode, string)); + if (isExist == null || isExist == 0) { + return string; + } + } + } + } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/impl/ActCouponLifecycleService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/impl/ActCouponLifecycleService.java new file mode 100644 index 000000000..ec5b96b88 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/impl/ActCouponLifecycleService.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.wallet.utils.act.impl; + +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; + +/** + * 优惠券生命周期 + */ +public interface ActCouponLifecycleService { + + /** + * 领取优惠券前的校验 + * + * @param couponId 优惠券ID + * @param userId 用户ID + * @return 优惠券实体 + */ + ActCouponEntity preReceive(Long couponId, Long userId); + + /** + * 领取优惠券后的处理 + * + * @param record 优惠券记录实体 + */ + void afterReceive(ActCouponRecordEntity record); + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/service/ActCouponComUtilService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/service/ActCouponComUtilService.java new file mode 100644 index 000000000..faa05c3d7 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/service/ActCouponComUtilService.java @@ -0,0 +1,252 @@ +package com.bsd.pjcloud.wallet.utils.act.service; + +import cn.hutool.core.lang.UUID; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.wallet.api.constant.act.*; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponMapper; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponRecordMapper; +import com.bsd.pjcloud.wallet.service.ActCouponLifecycleService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.temporal.TemporalAdjusters; + +/** + * @author liusiyang_dxm + * @since 2026/1/28 + */ +@Service +@AllArgsConstructor +public class ActCouponComUtilService implements ActCouponLifecycleService { + + private final ActCouponMapper actCouponMapper; + private final ActCouponRecordMapper actCouponRecordMapper; + + /** + * 领取优惠券前的校验 + */ + @Override + public ActCouponEntity preReceive(Long couponId, Long userId) { + ActCouponEntity coupon = actCouponMapper.selectById(couponId); + if (ObjectUtil.isEmpty(coupon)) { + throw new RuntimeException("此优惠券活动不存在"); + } + + assertStatus(coupon); + assertReceiveWindow(coupon); + assertLimit(coupon, userId); + + return coupon; + } + + /** + * 领取优惠券 + */ + public ActCouponRecordEntity doReceive(ActCouponEntity coupon, SysUser sysUser) { + ActCouponRecordEntity record = new ActCouponRecordEntity(); + record.setCouponId(coupon.getId()); + record.setUserId(sysUser.getUserId()); + record.setUserName(sysUser.getName()); + record.setCouponCode(UUID.fastUUID().toString()); + record.setStatus(ActCouponRecordStatusEnum.UNUSED.getCode()); + // 优惠券冗余字段(不更新) + record.setCouponName(coupon.getName()); + record.setCouponType(coupon.getType()); + record.setFaceValue(coupon.getFaceValue()); + record.setMinPoint(coupon.getMinPoint()); + // 这个时间要根据`优惠券过期类型来设置` + // 1-固定日期 + if (ObjectUtil.equals(ActCouponValidTypeEnum.FIXED_DATE.getCode(), coupon.getValidType())) { + record.setStartTime(coupon.getValidStartTime()); + record.setEndTime(coupon.getValidEndTime()); + } + // 2-领取后生效 + if (ObjectUtil.equals(ActCouponValidTypeEnum.AFTER_RECEIVE.getCode(), coupon.getValidType())) { + Integer validDays = coupon.getValidDays(); + record.setStartTime(LocalDateTime.now()); + record.setEndTime(record.getStartTime().plusDays(validDays)); + } + actCouponRecordMapper.insert(record); + return record; + } + + /** + * 领取优惠券后的处理 + */ + @Override + public void afterReceive(ActCouponRecordEntity record) { + + } + + /** + * 核销前的校验 + */ + @Override + public ActCouponRecordEntity preCancel(ActCouponRecordEntity record) { + ActCouponRecordEntity couponRecord = actCouponRecordMapper.selectById(record.getCouponId()); + if (ObjectUtil.isEmpty(couponRecord)) { + throw new RuntimeException("优惠券不存在"); + } + // 基本校验:状态是否可用 + if (ObjectUtil.notEqual(ActCouponRecordStatusEnum.UNUSED.getCode(), couponRecord.getStatus())) { + throw new RuntimeException("优惠券不可用"); + } + // 校验有效期 + LocalDateTime now = LocalDateTime.now(); + if (ObjectUtil.isNotEmpty(couponRecord.getStartTime()) && now.isBefore(couponRecord.getStartTime())) { + throw new RuntimeException("优惠券尚未生效"); + } + if (ObjectUtil.isNotEmpty(couponRecord.getEndTime()) && now.isAfter(couponRecord.getEndTime())) { + throw new RuntimeException("优惠券已过期"); + } + return couponRecord; + } + + public void doCancel(Long couponRecordId, Long orderId, int carTotalPrice) { + ActCouponRecordEntity couponRecord = actCouponRecordMapper.selectById(couponRecordId); + if (ObjectUtil.isEmpty(couponRecord)) { + throw new RuntimeException("此优惠券不存在"); + } + ActCouponRecordEntity updateObj = new ActCouponRecordEntity(); + updateObj.setId(couponRecordId); + updateObj.setStatus(ActCouponRecordStatusEnum.USED.getCode()); + updateObj.setUseTime(LocalDateTime.now()); + updateObj.setOrderId(String.valueOf(orderId)); + updateObj.setUseAmount(carTotalPrice); + actCouponRecordMapper.updateById(updateObj); + } + + /** + * 核销后的处理 + */ + @Override + public void afterCancel(ActCouponRecordEntity record) { + + } + + /** + * 查询用户是否可以参加活动 + */ + public ActUserReceiveEnum isEligibleForAct(Long couponId, Long userId) { + ActCouponEntity coupon = actCouponMapper.selectById(couponId); + if (ObjectUtil.isEmpty(coupon)) { + return ActUserReceiveEnum.ACT_NOT_EXIST; + } + try { + assertStatus(coupon); + } catch (Exception e) { + return ActUserReceiveEnum.ACT_NOT_STARTED; + } + try { + assertReceiveWindow(coupon); + } catch (Exception e) { + return ActUserReceiveEnum.ACT_EXPIRED; + } + try { + assertLimit(coupon, userId); + } catch (Exception e) { + return ActUserReceiveEnum.USER_LIMIT_REACHED; + } + return ActUserReceiveEnum.USER_CAN_JOIN_ACT; + } + + + /** + * 校验优惠券活动状态为进行中 + */ + private void assertStatus(ActCouponEntity coupon) { + if (!ObjectUtil.equals(ActCouponStatusEnum.JINXINGZHONG.getCode(), coupon.getStatus())) { + throw new RuntimeException("此优惠券不在进行中"); + } + } + + /** + * 校验领取时间窗(固定日期型需在有效期内) + */ + private void assertReceiveWindow(ActCouponEntity coupon) { + if (ObjectUtil.equals(ActCouponValidTypeEnum.FIXED_DATE.getCode(), coupon.getValidType())) { + LocalDateTime now = LocalDateTime.now(); + if (ObjectUtil.isNotEmpty(coupon.getValidStartTime()) && now.isBefore(coupon.getValidStartTime())) { + throw new RuntimeException("此优惠券活动尚未开始"); + } + if (ObjectUtil.isNotEmpty(coupon.getValidEndTime()) && now.isAfter(coupon.getValidEndTime())) { + throw new RuntimeException("此优惠券活动已结束"); + } + } + } + + /** + * 校验用户在限领规则下是否超过可领取次数 + */ + private void assertLimit(ActCouponEntity coupon, Long userId) { + if (ObjectUtil.isEmpty(coupon.getLimitCount()) || coupon.getLimitCount() <= 0) { + return; + } + + LocalDateTime start = buildLimitStartTime(coupon.getLimitType()); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ActCouponRecordEntity::getCouponId, coupon.getId()).eq(ActCouponRecordEntity::getUserId, userId); + if (ObjectUtil.isNotEmpty(start)) { + wrapper.ge(ActCouponRecordEntity::getCreateTime, start); + } + Long cnt = actCouponRecordMapper.selectCount(wrapper); + if (cnt != null && cnt >= coupon.getLimitCount()) { + throw new RuntimeException(buildLimitExceededMessage(coupon.getLimitType())); + } + } + + /** + * 构造限领类型的统计起始时间(一次型不限制返回 null) + */ + private LocalDateTime buildLimitStartTime(String limitType) { + if (ObjectUtil.equals(ActCouponLimitTypeEnum.ONCE.getCode(), limitType)) { + return null; + } + LocalDate today = LocalDate.now(); + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_DAY.getCode(), limitType)) { + return LocalDateTime.of(today, LocalTime.MIN); + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_WEEK.getCode(), limitType)) { + LocalDate monday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); + return LocalDateTime.of(monday, LocalTime.MIN); + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_MONTH.getCode(), limitType)) { + LocalDate firstDay = today.with(TemporalAdjusters.firstDayOfMonth()); + return LocalDateTime.of(firstDay, LocalTime.MIN); + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_YEAR.getCode(), limitType)) { + LocalDate firstDay = today.with(TemporalAdjusters.firstDayOfYear()); + return LocalDateTime.of(firstDay, LocalTime.MIN); + } + return null; + } + + private String buildLimitExceededMessage(String limitType) { + if (ObjectUtil.equals(ActCouponLimitTypeEnum.ONCE.getCode(), limitType)) { + return "活动期间已达领取上限"; + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_DAY.getCode(), limitType)) { + return "今日已达领取上限"; + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_WEEK.getCode(), limitType)) { + return "本周已达领取上限"; + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_MONTH.getCode(), limitType)) { + return "本月已达领取上限"; + } + if (ObjectUtil.equals(ActCouponLimitTypeEnum.EVERY_YEAR.getCode(), limitType)) { + return "本年已达领取上限"; + } + return "已达到领取上限"; + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml index 7568de12f..8410d4523 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml @@ -2,9 +2,10 @@ - select a.id, + a.unique_code, + a.bind_notify_id, a.name, a.type, a.face_value, @@ -37,6 +38,16 @@ and a.type = #{dto.type} + + and a.status = #{dto.status} + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml index 709f63c6e..e1a143647 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml @@ -52,4 +52,6 @@ order by a.mchDeptId, a.level + \ No newline at end of file From cce4230f0d5643c45cd7d9acae5d725cf28c5d6b Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 28 Jan 2026 20:16:14 +0800 Subject: [PATCH 35/46] =?UTF-8?q?feat:=E7=94=A8=E6=88=B7=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/WalletTransactionMapper.java | 1 + .../impl/act/ActCouponRecordServiceImpl.java | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java index a2fe5e7a2..69076ad4c 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java @@ -37,6 +37,7 @@ public interface WalletTransactionMapper extends PjcloudBaseMapper implements ActCouponRecordService { private final ActCouponMapper actCouponMapper; + private final WalletTransactionMapper walletTransactionMapper; private final MchManageService mchManageService; private final ActCouponComUtilService actCouponComUtilService; @@ -78,7 +84,19 @@ public class ActCouponRecordServiceImpl extends ServiceImpl walletList = walletTransactionMapper.scopeList(dto, null); + if (ObjectUtil.isEmpty(walletList)) { + return ActUserReceiveEnum.USER_CANNOT_PARTICIPATE; + } return ActUserReceiveEnum.USER_CAN_JOIN_ACT; } return null; From 1344217733efa6ce61e008177ea0ef9da1f3cc31 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 29 Jan 2026 11:40:08 +0800 Subject: [PATCH 36/46] =?UTF-8?q?feat:h5=E9=A2=86=E5=8F=96=E9=A3=9F?= =?UTF-8?q?=E5=A0=82=E4=BC=98=E6=83=A0=E5=88=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/api/dto/act/ActCancelItemDto.java | 7 ++ .../api/dto/act/ActCouponRecordDto.java | 13 ++++ .../wallet/api/vo/act/ActUserTotalVo.java | 23 +++++++ .../act/ActCancelItemController.java | 14 ++++ .../controller/act/ActComController.java | 9 +++ .../act/ActCouponRecordController.java | 41 +++++------- .../mapper/act/ActCancelItemMapper.java | 1 + .../mapper/act/ActCouponRecordMapper.java | 8 +++ .../wallet/service/ActCancelItemService.java | 5 ++ .../pjcloud/wallet/service/ActComService.java | 6 ++ .../service/ActCouponRecordService.java | 14 ++++ .../impl/act/ActCancelItemServiceImpl.java | 15 ++++- .../service/impl/act/ActComServiceImpl.java | 17 +++++ .../impl/act/ActCouponRecordServiceImpl.java | 29 ++++++++- .../mapper/act/ActCancelItemMapper.xml | 14 ++++ .../mapper/act/ActCouponRecordMapper.xml | 65 +++++++++++++++++++ 16 files changed, 255 insertions(+), 26 deletions(-) create mode 100644 pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActUserTotalVo.java diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCancelItemDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCancelItemDto.java index 5a3f46453..e92ff0284 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCancelItemDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCancelItemDto.java @@ -11,8 +11,15 @@ public class ActCancelItemDto extends ActCancelItemEntity { private List actIdList; + private List actStatusList; + private List mchIdList; private LocalDateTime[] cancelTimeList; + /** + * 是否查询未过期的核销项 + */ + private Boolean isFindNoExpire = false; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java index 6cf7e718f..acd9e4e21 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java @@ -3,6 +3,19 @@ package com.bsd.pjcloud.wallet.api.dto.act; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; import lombok.Data; +import java.time.LocalDateTime; +import java.util.List; + @Data public class ActCouponRecordDto extends ActCouponRecordEntity { + + /** + * 是否查询未过期的核销项 + */ + private Boolean isFindNoExpire = false; + + private List statusCodeList; + + private LocalDateTime[] createTimeList; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActUserTotalVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActUserTotalVo.java new file mode 100644 index 000000000..8c5458a6d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActUserTotalVo.java @@ -0,0 +1,23 @@ +package com.bsd.pjcloud.wallet.api.vo.act; + +import lombok.Data; + +@Data +public class ActUserTotalVo { + + /** + * 所有活动总数 + */ + private Long allCount; + + /** + * 核销活动总数 + */ + private Long cancelCount; + + /** + * 优惠券活动总数 + */ + private Long couponCount; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCancelItemController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCancelItemController.java index 856dd547b..2cb94957b 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCancelItemController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCancelItemController.java @@ -9,6 +9,7 @@ import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.wallet.api.constant.act.ActCancelStatusEnum; import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCancelItemEntity; import com.bsd.pjcloud.wallet.api.vo.act.ActCancelItemVo; @@ -22,6 +23,8 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 核销活动项 */ @@ -52,6 +55,17 @@ public class ActCancelItemController { /* ************************************* start app start ************************************* */ + @Operation(summary = "用户领取核销券列表", description = "用户领取核销券列表") + @GetMapping("/app/user-list") + public R> userList(@ParameterObject Page page) { + PjcloudUser user = SecurityUtils.getUser(); + ActCancelItemDto dto = new ActCancelItemDto(); + dto.setReceiverUserId(user.getId()); + dto.setActStatusList(List.of(ActCancelStatusEnum.CANCEL_AWAIT.getCode())); + dto.setIsFindNoExpire(true); + return R.ok(actCancelItemService.pageList(page, dto)); + } + @Operation(summary = "app领取优惠券", description = "app领取优惠券") @PostMapping("/app/get") @Idempotent(expireTime = 2, key = "'/act/cancel/app/get/' + #dto.getReceiverUserId()", info = "正在领取中,请勿重复操作") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActComController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActComController.java index 9f9fed629..284239d70 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActComController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActComController.java @@ -8,6 +8,7 @@ import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum; import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; import com.bsd.pjcloud.wallet.api.vo.act.ActCouponVo; import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActUserTotalVo; import com.bsd.pjcloud.wallet.service.ActComService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -50,4 +51,12 @@ public class ActComController { return R.ok(actComService.isEligibleForAct(actType, actId, user.getId())); } + @Operation(summary = "用户参加活动的数量统计", description = "用户参加活动的数量统计") + @GetMapping("/app/user-total") + public R userTotal() { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(actComService.userTotal(user.getId())); + } + + } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java index 34cf84e0e..371eef0f5 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java @@ -10,9 +10,14 @@ import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.wallet.api.constant.act.ActCancelStatusEnum; +import com.bsd.pjcloud.wallet.api.constant.act.ActCouponRecordStatusEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto; import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto; import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCancelItemVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo; import com.bsd.pjcloud.wallet.service.ActCouponRecordService; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; @@ -50,6 +55,16 @@ public class ActCouponRecordController { return R.ok(actCouponRecordService.appReceive(dto)); } + @Operation(summary = "用户领取核销券列表", description = "用户领取核销券列表") + @GetMapping("/app/user-list") + public R> userList(@ParameterObject Page page) { + PjcloudUser user = SecurityUtils.getUser(); + ActCouponRecordDto dto = new ActCouponRecordDto(); + dto.setUserId(user.getId()); + dto.setStatusCodeList(List.of(ActCouponRecordStatusEnum.UNUSED.getCode())); + dto.setIsFindNoExpire(true); + return R.ok(actCouponRecordService.pageList(page, dto)); + } /* ************************************* end app end ************************************* */ @@ -59,9 +74,8 @@ public class ActCouponRecordController { @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')") - public R getActCouponRecordPage(@ParameterObject Page page, @ParameterObject ActCouponRecordDto dto) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - return R.ok(actCouponRecordService.page(page, wrapper)); + public R> getActCouponRecordPage(@ParameterObject Page page, @ParameterObject ActCouponRecordDto dto) { + return R.ok(actCouponRecordService.pageList(page, dto)); } @@ -75,27 +89,6 @@ public class ActCouponRecordController { return R.ok(actCouponRecordService.getById(id)); } - /** - * 新增优惠券领取记录表 - */ - @Operation(summary = "新增优惠券领取记录表", description = "新增优惠券领取记录表") - @SysLog("新增优惠券领取记录表") - @PostMapping - @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_add')") - public R save(@RequestBody ActCouponRecordEntity actCouponRecord) { - return R.ok(actCouponRecordService.save(actCouponRecord)); - } - - /** - * 修改优惠券领取记录表 - */ - @Operation(summary = "修改优惠券领取记录表", description = "修改优惠券领取记录表") - @SysLog("修改优惠券领取记录表") - @PutMapping - @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_edit')") - public R updateById(@RequestBody ActCouponRecordEntity actCouponRecord) { - return R.ok(actCouponRecordService.updateById(actCouponRecord)); - } /** * 通过id删除优惠券领取记录表 diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCancelItemMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCancelItemMapper.java index 305a480f0..eeb4d9cc1 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCancelItemMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCancelItemMapper.java @@ -15,4 +15,5 @@ public interface ActCancelItemMapper extends PjcloudBaseMapper count(@Param("dto") ActCancelItemDto dto); + Long userTotal(@Param("userId") Long userId, @Param("statusCodeList") List statusCodeList); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java index 4e9712549..137c34918 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java @@ -1,11 +1,19 @@ package com.bsd.pjcloud.wallet.mapper.act; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; @Mapper public interface ActCouponRecordMapper extends PjcloudBaseMapper { + Page pageList(Page page, @Param("dto") ActCouponRecordDto dto); + Long userTotal(@Param("userId") Long userId, @Param("statusCodeList") List statusCodeList); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelItemService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelItemService.java index 4d94ac456..7c8aecc21 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelItemService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCancelItemService.java @@ -42,4 +42,9 @@ public interface ActCancelItemService extends IService { * 查询详情 */ ActCancelItemVo getDetail(Long cancelId); + + /** + * 用户参加活动的数量统计 + */ + Long userTotal(Long userId); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java index f30298bd8..6c83a0cc9 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java @@ -3,6 +3,7 @@ package com.bsd.pjcloud.wallet.service; import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum; import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActUserTotalVo; public interface ActComService { @@ -20,4 +21,9 @@ public interface ActComService { * 判断用户是否可以参加活动 */ String isEligibleForAct(ActTypeEnum actType, Long actId, Long userId); + + /** + * 用户参加活动的数量统计 + */ + ActUserTotalVo userTotal(Long userId); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java index 3405e88f2..e94cd2943 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java @@ -1,12 +1,20 @@ package com.bsd.pjcloud.wallet.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo; public interface ActCouponRecordService extends IService { + /** + * 分页查询 + */ + Page pageList(Page page, ActCouponRecordDto dto); + /** * 领取优惠券 */ @@ -16,4 +24,10 @@ public interface ActCouponRecordService extends IService * 判断用户是否可以参加活动 */ ActUserReceiveEnum isEligibleForAct(Long actId, Long userId); + + /** + * 用户参加活动的数量统计 + */ + Long userTotal(Long userId); + } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelItemServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelItemServiceImpl.java index 7e3fe72da..033bd0568 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelItemServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCancelItemServiceImpl.java @@ -1,6 +1,8 @@ package com.bsd.pjcloud.wallet.service.impl.act; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -15,6 +17,7 @@ import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.constant.act.ActCancelStatusEnum; +import com.bsd.pjcloud.wallet.api.constant.act.ActCouponRecordStatusEnum; import com.bsd.pjcloud.wallet.api.constant.act.ActStatusEnum; import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto; @@ -67,6 +70,8 @@ public class ActCancelItemServiceImpl extends ServiceImpl() .eq(ObjectUtil.isNotEmpty(userId), ActCancelItemEntity::getReceiverUserId, userId) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActComServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActComServiceImpl.java index 303abcd5f..879315a6f 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActComServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActComServiceImpl.java @@ -6,6 +6,7 @@ import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActUserTotalVo; import com.bsd.pjcloud.wallet.service.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -98,4 +99,20 @@ public class ActComServiceImpl implements ActComService { } return status.getCode(); } + + /** + * 用户参加活动的数量统计 + */ + @Override + public ActUserTotalVo userTotal(Long userId) { + ActUserTotalVo result = new ActUserTotalVo(); + // 查询用户参加核销活动的总数 + Long cancelCount = actCancelItemService.userTotal(userId); + // 查询用户参加优惠券活动的总数 + Long couponCount = actCouponRecordService.userTotal(userId); + result.setCancelCount(cancelCount); + result.setCouponCount(couponCount); + result.setAllCount(cancelCount + couponCount); + return result; + } } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java index 412a4fd2e..65e425105 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java @@ -1,6 +1,7 @@ package com.bsd.pjcloud.wallet.service.impl.act; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysUser; @@ -8,12 +9,15 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.exception.ServiceException; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; +import com.bsd.pjcloud.wallet.api.constant.act.ActCouponRecordStatusEnum; import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; import com.bsd.pjcloud.wallet.api.dto.WalletTransactionDto; import com.bsd.pjcloud.wallet.api.dto.act.ActCouponReceiveDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActCouponRecordDto; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponEntity; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo; import com.bsd.pjcloud.wallet.api.vo.transaction.WalletTransactionVo; import com.bsd.pjcloud.wallet.mapper.WalletTransactionMapper; import com.bsd.pjcloud.wallet.mapper.act.ActCouponMapper; @@ -46,6 +50,14 @@ public class ActCouponRecordServiceImpl extends ServiceImpl pageList(Page page, ActCouponRecordDto dto) { + return baseMapper.pageList(page, dto); + } + /** * 领取优惠券 */ @@ -76,6 +88,9 @@ public class ActCouponRecordServiceImpl extends ServiceImpl + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml index ce1ac9513..bfd05b5cf 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml @@ -3,8 +3,73 @@ + select a.id, + a.coupon_id, + a.user_id, + a.user_name, + a.coupon_code, + a.status, + a.coupon_name, + a.coupon_type, + a.face_value, + a.min_point, + a.start_time, + a.end_time, + a.use_time, + a.order_id, + a.use_amount, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + a.del_flag = '0' + + and a.coupon_id = #{dto.couponId} + + + and a.user_id = #{dto.userId} + + + and a.status = #{dto.status} + + + and a.end_time >= now() + + + and a.status IN + + #{v} + + + + and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} + + + + + \ No newline at end of file From 5c98efcbc5168f70a5d1a1b060a97e6eb0b74af2 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 29 Jan 2026 16:03:00 +0800 Subject: [PATCH 37/46] =?UTF-8?q?feat:app=E7=89=88=E6=9C=AC=E7=AE=A1?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/1002pjcloudx_integrated.sql | 31 ++--- .../constant/appmodule/AppPlatformEnum.java | 33 +++++ .../appmodule/AppVersionStatusEnum.java | 33 +++++ .../appmodule/AppVersionController.java | 94 +++++++++++++ .../dto/appmodule/AppVersionDto.java | 8 ++ .../entity/app/AppVersionEntity.java | 124 ++++++++++++++++++ .../mapper/appmodule/AppVersionMapper.java | 16 +++ .../integrated/service/AppVersionService.java | 15 +++ .../impl/appmodule/AppVersionServiceImpl.java | 26 ++++ .../integrated/vo/appmodule/AppVersionVo.java | 8 ++ .../mapper/appmodule/AppVersionMapper.xml | 45 +++++++ .../api/constant/act/ActCancelStatusEnum.java | 4 +- 12 files changed, 420 insertions(+), 17 deletions(-) create mode 100644 pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/constant/appmodule/AppPlatformEnum.java create mode 100644 pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/constant/appmodule/AppVersionStatusEnum.java create mode 100755 pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/appmodule/AppVersionController.java create mode 100644 pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/dto/appmodule/AppVersionDto.java create mode 100755 pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/app/AppVersionEntity.java create mode 100755 pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/mapper/appmodule/AppVersionMapper.java create mode 100755 pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/AppVersionService.java create mode 100755 pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/appmodule/AppVersionServiceImpl.java create mode 100644 pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/vo/appmodule/AppVersionVo.java create mode 100755 pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/appmodule/AppVersionMapper.xml diff --git a/db/1002pjcloudx_integrated.sql b/db/1002pjcloudx_integrated.sql index 4cef6fdc2..941f36003 100644 --- a/db/1002pjcloudx_integrated.sql +++ b/db/1002pjcloudx_integrated.sql @@ -17,21 +17,22 @@ CREATE TABLE `hard_panel_setting` -- app版本控制表 CREATE TABLE `app_version` ( - `id` bigint NOT NULL COMMENT '主键ID', - `platform` varchar(32) NOT NULL COMMENT '平台类型(android、ios)', - `version_code` int NOT NULL COMMENT '内部版本号(用于比较大小)', - `version_name` varchar(32) NOT NULL COMMENT '展示版本号(字符串)', - `update_content` text COMMENT '更新内容/更新日志', - `download_url` varchar(512) NOT NULL COMMENT '安装包下载地址(wgt、apk)', - `is_force` varchar(32) NOT NULL COMMENT '是否强制更新', - `is_silent` varchar(32) NOT NULL COMMENT '是否静默更新(WGT用)', - `status` varchar(32) NOT NULL COMMENT '状态(已发布、未发布、已下架)', - `create_by` varchar(50) DEFAULT NULL COMMENT '创建者', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_by` varchar(50) DEFAULT NULL COMMENT '更新者', - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `del_flag` char(1) DEFAULT '0' COMMENT '是否删除(0=正常 1=删除)', - `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户编号', + `id` bigint NOT NULL COMMENT '主键ID', + `app_unique_code` varchar(32) DEFAULT NULL COMMENT 'app唯一编码', + `platform` varchar(32) NOT NULL COMMENT '平台类型(android、ios)', + `version_code` int NOT NULL COMMENT '内部版本号(用于比较大小)', + `version_name` varchar(32) NOT NULL COMMENT '展示版本号(字符串)', + `update_content` text COMMENT '更新内容/更新日志', + `download_url` varchar(512) NOT NULL COMMENT '安装包下载地址(wgt、apk)', + `is_force` varchar(32) NOT NULL COMMENT '是否强制更新', + `is_silent` varchar(32) NOT NULL COMMENT '是否静默更新(WGT用)', + `status` varchar(32) NOT NULL COMMENT '状态(已发布、未发布、已下架)', + `create_by` varchar(50) DEFAULT NULL COMMENT '创建者', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(50) DEFAULT NULL COMMENT '更新者', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) DEFAULT '0' COMMENT '是否删除(0=正常 1=删除)', + `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户编号', PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='app版本控制表'; \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/constant/appmodule/AppPlatformEnum.java b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/constant/appmodule/AppPlatformEnum.java new file mode 100644 index 000000000..30b6fa81c --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/constant/appmodule/AppPlatformEnum.java @@ -0,0 +1,33 @@ +package com.bsd.pjcloud.integrated.constant.appmodule; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * App平台 + */ +@Getter +@AllArgsConstructor +public enum AppPlatformEnum { + + ANDROID("1", "android"), + IOS("2", "ios"), + ; + private final String code; + private final String desc; + + public static AppPlatformEnum valueOfByType(String code) { + return Arrays.stream(AppPlatformEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static AppPlatformEnum descOf(String description) { + return Arrays.stream(AppPlatformEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/constant/appmodule/AppVersionStatusEnum.java b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/constant/appmodule/AppVersionStatusEnum.java new file mode 100644 index 000000000..2ccb67db8 --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-api/src/main/java/com/bsd/pjcloud/integrated/constant/appmodule/AppVersionStatusEnum.java @@ -0,0 +1,33 @@ +package com.bsd.pjcloud.integrated.constant.appmodule; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * App版本状态 + */ +@Getter +@AllArgsConstructor +public enum AppVersionStatusEnum { + PUBLISHED("1", "已发布"), + UNPUBLISHED("2", "未发布"), + OFF_SHELF("3", "已下架"), + ; + private final String code; + private final String desc; + + public static AppVersionStatusEnum valueOfByType(String code) { + return Arrays.stream(AppVersionStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().orElse(null); + } + + public static AppVersionStatusEnum descOf(String description) { + return Arrays.stream(AppVersionStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().orElse(null); + } +} diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/appmodule/AppVersionController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/appmodule/AppVersionController.java new file mode 100755 index 000000000..2c88b93d2 --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/appmodule/AppVersionController.java @@ -0,0 +1,94 @@ +package com.bsd.pjcloud.integrated.controller.appmodule; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.integrated.dto.appmodule.AppVersionDto; +import com.bsd.pjcloud.integrated.entity.app.AppVersionEntity; +import com.bsd.pjcloud.integrated.service.AppVersionService; +import com.bsd.pjcloud.integrated.vo.appmodule.AppVersionVo; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +/** + * app版本控制表 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/app-version") +@Tag(description = "app-version", name = "app版本控制表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppVersionController { + + private final AppVersionService appVersionService; + + /* ************************************* start 设备端 start ************************************* */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/ad/page") + public R> hardPage(@ParameterObject Page page, @ParameterObject AppVersionDto dto) { + return R.ok(appVersionService.pageList(page, dto)); + } + /* ************************************* end 设备端 end ************************************* */ + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('integrated_appVersion_view')") + public R> getAppVersionPage(@ParameterObject Page page, @ParameterObject AppVersionDto dto) { + return R.ok(appVersionService.pageList(page, dto)); + } + + /** + * 通过id查询app版本控制表 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('integrated_appVersion_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(appVersionService.getById(id)); + } + + /** + * 新增app版本控制表 + */ + @Operation(summary = "新增app版本控制表", description = "新增app版本控制表") + @SysLog("新增app版本控制表") + @PostMapping + @PreAuthorize("@pms.hasPermission('integrated_appVersion_add')") + public R save(@RequestBody AppVersionEntity appVersion) { + return R.ok(appVersionService.save(appVersion)); + } + + /** + * 修改app版本控制表 + */ + @Operation(summary = "修改app版本控制表", description = "修改app版本控制表") + @SysLog("修改app版本控制表") + @PutMapping + @PreAuthorize("@pms.hasPermission('integrated_appVersion_edit')") + public R updateById(@RequestBody AppVersionEntity appVersion) { + return R.ok(appVersionService.updateById(appVersion)); + } + + /** + * 通过id删除app版本控制表 + */ + @Operation(summary = "通过id删除app版本控制表", description = "通过id删除app版本控制表") + @SysLog("通过id删除app版本控制表") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('integrated_appVersion_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(appVersionService.removeBatchByIds(CollUtil.toList(ids))); + } +} \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/dto/appmodule/AppVersionDto.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/dto/appmodule/AppVersionDto.java new file mode 100644 index 000000000..97ecbaf6c --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/dto/appmodule/AppVersionDto.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.integrated.dto.appmodule; + +import com.bsd.pjcloud.integrated.entity.app.AppVersionEntity; +import lombok.Data; + +@Data +public class AppVersionDto extends AppVersionEntity { +} diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/app/AppVersionEntity.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/app/AppVersionEntity.java new file mode 100755 index 000000000..2c7a6bd15 --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/entity/app/AppVersionEntity.java @@ -0,0 +1,124 @@ +package com.bsd.pjcloud.integrated.entity.app; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * app版本控制表 + */ +@Data +@TenantTable +@TableName("app_version") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "app版本控制表") +public class AppVersionEntity extends Model { + + /** + * 主键ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键ID") + private Long id; + + /** + * app唯一编码 + */ + @Schema(description = "app唯一编码") + private String appUniqueCode; + + /** + * 平台类型(android、ios) + */ + @Schema(description = "平台类型(android、ios)") + private String platform; + + /** + * 内部版本号(用于比较大小) + */ + @Schema(description = "内部版本号(用于比较大小)") + private Integer versionCode; + + /** + * 展示版本号(字符串) + */ + @Schema(description = "展示版本号(字符串)") + private String versionName; + + /** + * 更新内容/更新日志 + */ + @Schema(description = "更新内容/更新日志") + private String updateContent; + + /** + * 安装包下载地址(wgt、apk) + */ + @Schema(description = "安装包下载地址(wgt、apk)") + private String downloadUrl; + + /** + * 是否强制更新 + */ + @Schema(description = "是否强制更新") + private String isForce; + + /** + * 是否静默更新(WGT用) + */ + @Schema(description = "是否静默更新(WGT用)") + private String isSilent; + + /** + * 状态(已发布、未发布、已下架) + */ + @Schema(description = "状态(已发布、未发布、已下架)") + private String status; + + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建者") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新者") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 是否删除(0=正常 1=删除) + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "是否删除(0=正常 1=删除)") + private String delFlag; + + /** + * 租户编号 + */ + @Schema(description = "租户编号") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/mapper/appmodule/AppVersionMapper.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/mapper/appmodule/AppVersionMapper.java new file mode 100755 index 000000000..d1fc5e67a --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/mapper/appmodule/AppVersionMapper.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.integrated.mapper.appmodule; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.integrated.dto.appmodule.AppVersionDto; +import com.bsd.pjcloud.integrated.entity.app.AppVersionEntity; +import com.bsd.pjcloud.integrated.vo.appmodule.AppVersionVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface AppVersionMapper extends PjcloudBaseMapper { + + Page pagList(Page page, @Param("dto") AppVersionDto dto); + +} \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/AppVersionService.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/AppVersionService.java new file mode 100755 index 000000000..7956df570 --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/AppVersionService.java @@ -0,0 +1,15 @@ +package com.bsd.pjcloud.integrated.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.integrated.dto.appmodule.AppVersionDto; +import com.bsd.pjcloud.integrated.entity.app.AppVersionEntity; +import com.bsd.pjcloud.integrated.vo.appmodule.AppVersionVo; + +public interface AppVersionService extends IService { + + /** + * 分页查询 + */ + Page pageList(Page page, AppVersionDto dto); +} \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/appmodule/AppVersionServiceImpl.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/appmodule/AppVersionServiceImpl.java new file mode 100755 index 000000000..2ef290ee8 --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/service/impl/appmodule/AppVersionServiceImpl.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.integrated.service.impl.appmodule; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.integrated.dto.appmodule.AppVersionDto; +import com.bsd.pjcloud.integrated.entity.app.AppVersionEntity; +import com.bsd.pjcloud.integrated.mapper.appmodule.AppVersionMapper; +import com.bsd.pjcloud.integrated.service.AppVersionService; +import com.bsd.pjcloud.integrated.vo.appmodule.AppVersionVo; +import org.springframework.stereotype.Service; + +/** + * app版本控制表 + */ +@Service +public class AppVersionServiceImpl extends ServiceImpl implements AppVersionService { + + /** + * 分页查询 + */ + @Override + public Page pageList(Page page, AppVersionDto dto) { + return baseMapper.pagList(page, dto); + } + +} \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/vo/appmodule/AppVersionVo.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/vo/appmodule/AppVersionVo.java new file mode 100644 index 000000000..96c0213cb --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/vo/appmodule/AppVersionVo.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.integrated.vo.appmodule; + +import com.bsd.pjcloud.integrated.entity.app.AppVersionEntity; +import lombok.Data; + +@Data +public class AppVersionVo extends AppVersionEntity { +} diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/appmodule/AppVersionMapper.xml b/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/appmodule/AppVersionMapper.xml new file mode 100755 index 000000000..1444d1f11 --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/appmodule/AppVersionMapper.xml @@ -0,0 +1,45 @@ + + + + + + select a.id, + a.app_unique_code, + a.platform, + a.version_code, + a.version_name, + a.update_content, + a.download_url, + a.is_force, + a.is_silent, + a.status, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.app_unique_code LIKE CONCAT('%',#{dto.appUniqueCode},'%') + + + and a.status = #{dto.status} + + + and a.platform = #{dto.platform} + + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCancelStatusEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCancelStatusEnum.java index a9cd679d3..68992a817 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCancelStatusEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCancelStatusEnum.java @@ -23,13 +23,13 @@ public enum ActCancelStatusEnum { public static ActCancelStatusEnum valueOfByType(String code) { return Arrays.stream(ActCancelStatusEnum.values()) .filter(v -> ObjectUtil.equal(v.getCode(), code)) - .findFirst().get(); + .findFirst().orElse(null); } public static ActCancelStatusEnum descOf(String description) { return Arrays.stream(ActCancelStatusEnum.values()) .filter(v -> ObjectUtil.equal(v.getDesc(), description)) - .findFirst().get(); + .findFirst().orElse(null); } } From 5ed7afd0fe96166cf82ba1cb338460a4cafc39f2 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 29 Jan 2026 20:05:53 +0800 Subject: [PATCH 38/46] =?UTF-8?q?feat=EF=BC=9A=E4=BC=98=E6=83=A0=E5=88=B8?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E9=A2=86=E5=8F=96=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/api/vo/act/ActCouponRecordVo.java | 15 ++++++++++++- .../impl/act/ActCouponRecordServiceImpl.java | 21 ++++++++++++++++++- .../resources/mapper/act/ActCouponMapper.xml | 1 + .../mapper/act/ActCouponRecordMapper.xml | 1 + 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java index bdc3d348f..a881e4f01 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java @@ -1,9 +1,22 @@ package com.bsd.pjcloud.wallet.api.vo.act; +import com.bsd.pjcloud.admin.api.vo.base.BaseUserDeptInterface; import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; import lombok.Data; @Data -public class ActCouponRecordVo extends ActCouponRecordEntity { +public class ActCouponRecordVo extends ActCouponRecordEntity implements BaseUserDeptInterface { + + private Long userId; + + private String username; + + private String userMobile; + + private String userAvatar; + + private Long userDeptId; + + private String userDeptName; } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java index 65e425105..aa96f09e7 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java @@ -6,8 +6,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.admin.api.utils.DataUtil; +import com.bsd.pjcloud.admin.api.vo.UserVO; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.exception.ServiceException; +import com.bsd.pjcloud.common.core.util.CollectionUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.hard.api.vo.HardAuthVo; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.act.ActCouponRecordStatusEnum; import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; @@ -31,6 +36,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; @@ -55,7 +61,9 @@ public class ActCouponRecordServiceImpl extends ServiceImpl pageList(Page page, ActCouponRecordDto dto) { - return baseMapper.pageList(page, dto); + Page pageList = baseMapper.pageList(page, dto); + disposePageList(pageList.getRecords()); + return pageList; } /** @@ -144,4 +152,15 @@ public class ActCouponRecordServiceImpl extends ServiceImpl list) { + // 用户 + List userIds = list.stream().map(ActCouponRecordVo::getUserId).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + R> userList = remoteUserService.getUserDeptByIds(new ArrayList<>(userIds)); + if (ObjectUtil.isNotEmpty(userList.getData())) { + DataUtil.convertUserDeptList(list, CollectionUtils.convertMap(userList.getData(), UserVO::getUserId)); + } + } + } + } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml index 8410d4523..efd7f5cd0 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml @@ -49,5 +49,6 @@ + order by a.create_time desc , a.id desc \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml index bfd05b5cf..863e03875 100755 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml @@ -57,6 +57,7 @@ + order by a.create_time desc , a.id desc