diff --git a/db/1002pjcloudx_integrated.sql b/db/1002pjcloudx_integrated.sql index 632a599de..941f36003 100644 --- a/db/1002pjcloudx_integrated.sql +++ b/db/1002pjcloudx_integrated.sql @@ -13,3 +13,26 @@ CREATE TABLE `hard_panel_setting` ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='大屏配置表'; + +-- app版本控制表 +CREATE TABLE `app_version` +( + `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/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/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/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 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/pom.xml b/pjcloud-app-server/pjcloud-app-server-biz/pom.xml index 3a441ffb0..f08777c63 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/pom.xml +++ b/pjcloud-app-server/pjcloud-app-server-biz/pom.xml @@ -104,12 +104,23 @@ com.bsd pjcloud-common-swagger - + com.bsd pjcloud-common-seata - + + + com.alipay.sdk + 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/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/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/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/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/controller/AppUserController.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserController.java index ef5e1426d..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 @@ -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,115 @@ 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 ************************************* */ + + /* ************************************* start 远程调用 start ************************************* */ + + @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)); + } + + @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 ************************************* */ + + /** + * 分页查询 + */ + @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..459e1b449 --- /dev/null +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniAlipayLoginHandler.java @@ -0,0 +1,142 @@ +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; +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::getOpenid, openId)); + if (ObjectUtil.isEmpty(user)) { + log.info("支付宝小程序openId:{},创建新的用户", openId); + String name = "支付宝游客-" + openId; + AppUser appUser = new AppUser(); + 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); + } + + /** + * 绑定逻辑 + */ + @Override + public Boolean bind(AppUser user, String 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/MiniAppLoginHandler.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java similarity index 57% 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..e095d7dd0 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 @@ -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; @@ -36,20 +33,19 @@ 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; private final AppSocialDetailsMapper appSocialDetailsMapper; + private final WxMaService wxMaService; + /** * 小程序登录传入code *

@@ -60,20 +56,16 @@ public class MiniAppLoginHandler 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; } } @@ -85,23 +77,23 @@ public class MiniAppLoginHandler extends AbstractLoginHandler { */ @Override public AppUserInfo info(String openId) { - AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getWxOpenid, openId)); - - // 未注册用户自动注册 - if (Objects.isNull(user)) { - log.info("微信小程序未绑定:{},创建新的用户", 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.setUsername(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); - - AppUserInfo appUserDTO = new AppUserInfo(); - appUserDTO.setAppUser(appUser); - return appUserDTO; + return appUserService.findUserInfo(user); } + if (ObjectUtil.isEmpty(user.getLoginExtJson())) { + } return appUserService.findUserInfo(user); } @@ -114,7 +106,7 @@ public class MiniAppLoginHandler 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/resources/application.yml b/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml index db8f394a9..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 @@ -16,3 +16,15 @@ 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 + +mini-wechat-pay: + app-id: wx95481f43b14565e5 + app-secret: 0aee1289b5ae14c0c69b8f5e9a4e518e 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-common/pjcloud-common-excel/pom.xml b/pjcloud-common/pjcloud-common-excel/pom.xml index 11eb9a759..35cd6c573 100644 --- a/pjcloud-common/pjcloud-common-excel/pom.xml +++ b/pjcloud-common/pjcloud-common-excel/pom.xml @@ -33,7 +33,7 @@ pjcloud excel 操作 - 4.0.2 + 4.0.3 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-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/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..c0e050c3e --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java @@ -0,0 +1,30 @@ +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_SUCCESS("20", "支付成功"), + PAY_ERROR("21", "支付失败"), + 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/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..ee88facb8 --- /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/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/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/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/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/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/dto/hard/HandCancelActCodeDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/hard/HandCancelActCodeDto.java new file mode 100644 index 000000000..05e8a1c0c --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/hard/HandCancelActCodeDto.java @@ -0,0 +1,22 @@ +package com.bsd.pjcloud.hard.api.dto.hard; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class HandCancelActCodeDto { + + @Schema(description = "用户id不能为空") + @NotNull(message = "核销活动子id不能为空") + private Long actItemId; + + @Schema(description = "用户id") + @NotNull(message = "用户id不能为空") + private Long userId; + + @Schema(description = "设备id") + @NotNull(message = "设备id不能为空") + private Long hardwareId; + +} 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..74baae84f 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,8 +11,16 @@ public class HardCarDto extends HardCarEntity { private Long orderId; + /** + * 0 yyyy-MM-dd + * 1 yyyy-MM + */ + private String createTimeType = "0"; + private String createTimeStr; + private String createTimeYearStr; + private LocalDate[] createTimeList; private List orderStatusCodes; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java index 660183834..25e791773 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java @@ -36,6 +36,12 @@ public class HardOrderDto extends HardOrderEntity implements BaseIsIncludeTreeIn private List orderStatusCodes; + private String createTimeYearStr; + + private String payTimeYearStr; + + private String auditTimeYearStr; + private LocalDateTime[] createTimeList; private LocalDateTime[] payTimeList; @@ -60,6 +66,12 @@ public class HardOrderDto extends HardOrderEntity implements BaseIsIncludeTreeIn */ private String afterSaleNo; + /** + * 0 yyyy-MM-dd + * 1 yyyy-MM + */ + private String createTimeType = "0"; + private String createTimeStr; /** 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..c0be63ff8 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardSelectOrderMerchIdsDto.java @@ -0,0 +1,19 @@ +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 String payTimeYearStr; + + private LocalDateTime[] createTimeList; + +} 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/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..fd358d074 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java @@ -0,0 +1,190 @@ +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; + + /** + * 用户类型 + */ + @Schema(description = "用户类型") + private String userType; + + /** + * 授权id + */ + @Schema(description = "授权id") + private Long authId; + + /** + * 流程id + */ + @Schema(description = "流程id") + private Long flowId; + + /** + * 订单id + */ + @Schema(description = "订单id") + private Long orderId; + + /** + * 退款id + */ + @Schema(description = "退款id") + private Long refundId; + + /** + * 设备id + */ + @Schema(description = "设备id") + private Long hardId; + + /** + * 外部订单号 + */ + @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 String orderStatus; + + /** + * 押金 + */ + @Schema(description = "押金") + private int depositPrice; + + /** + * 订单金额 + */ + @Schema(description = "订单金额") + private int orderPrice; + + /** + * 支付金额 + */ + @Schema(description = "支付金额") + private int payPrice; + + /** + * 退款金额 + */ + @Schema(description = "退款金额") + private int refundPrice; + + /** + * 原始 sign json 数据 + */ + @Schema(description = "原始 sign json 数据") + private String orgSignJson; + + /** + * 原始json数据 + */ + @Schema(description = "原始json数据") + private String orgOrderJson; + + /** + * 创建人 + */ + @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-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/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-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-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-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderCsVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderCsVo.java index 7f58a1192..5802e4793 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderCsVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderCsVo.java @@ -67,4 +67,16 @@ public class HardOrderCsVo implements BaseMchInterface, BaseHardInterface { @Schema(description = "列号") private Long lineNumber; + @Data + static public class Month { + + @Schema(description = "日期") + private String day; + + @Schema(description = "总盈利金额(元)") + private double totalProfitPrice; + + @Schema(description = "总盈利次数") + private long totalProfitCount; + } } 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..15c4285d6 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/MiniAlipayConf.java @@ -0,0 +1,55 @@ +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; + + /** + * 芝麻服务id + */ + private String zmServiceId; + + /** + * 私钥 + */ + 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..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 @@ -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,37 @@ 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.TOB); 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.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 new file mode 100755 index 000000000..c2e0a6c59 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java @@ -0,0 +1,132 @@ +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.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; +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("/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(); + } + + /** + * 支付订单 + */ + @Operation(summary = "支付订单", description = "支付订单") + @PostMapping("/admin-pay") + public R adminPay(@RequestBody HardThirdMiPayDto dto) { + hardThirdMiOrderService.adminPay(dto); + return R.ok(); + } + + /** + * 退款 + */ + @Operation(summary = "退款", description = "退款") + @GetMapping("/refund") + public R refund(@RequestParam("id") Long id) { + hardThirdMiOrderService.refund(id); + return R.ok(); + } + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('thirdmi_hardThirdMiOrder_view')") + public R> getHardThirdMiOrderPage(@ParameterObject Page page, @ParameterObject HardThirdMiOrderDto dto) { + return R.ok(hardThirdMiOrderService.scopePageJoin(page, dto, null)); + } + + /** + * 通过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/controller/hard/HardApiController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/hard/HardApiController.java index 687657edf..c323c3ace 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/hard/HardApiController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/hard/HardApiController.java @@ -9,10 +9,7 @@ import com.bsd.pjcloud.hard.api.constant.HardProductNatureEnum; import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.hard.api.dto.async.SyncOfflineReqVo; -import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto; -import com.bsd.pjcloud.hard.api.dto.hard.HardBindDto; -import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto; -import com.bsd.pjcloud.hard.api.dto.hard.HardDoneHardQrCodeScanOrderDto; +import com.bsd.pjcloud.hard.api.dto.hard.*; import com.bsd.pjcloud.hard.api.dto.order.HardChartLatitudeVo; import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; import com.bsd.pjcloud.hard.api.vo.HardInvoiceVo; @@ -121,7 +118,7 @@ public class HardApiController { @PostMapping("/cancel-code") @Operation(summary = "核销二维码") - @Idempotent(expireTime = 10, info = "正在核销中,请勿重复操作") + @Idempotent(expireTime = 10, key = "'/hard-api/ad/cancel-code' + #dto.getOrderId() ", info = "正在核销中,请勿重复操作") public R handCancelCode(@RequestBody HandCancelCodeDto dto) { if (!ObjectUtil.isAllNotEmpty(dto.getOrderId(), dto.getHardwareId())) { throw new RuntimeException("参数不正确"); @@ -129,6 +126,13 @@ public class HardApiController { return R.ok(hardwareOrderService.handCancelCode(dto)); } + @PostMapping("/cancel-act-code") + @Operation(summary = "核销二维码") + @Idempotent(expireTime = 10, key = "'/hard-api/ad/cancel-act-code' + #dto.getActItemId() ", info = "正在核销中,请勿重复操作") + public R handCancelActCode(@Validated @RequestBody HandCancelActCodeDto dto) { + return R.ok(hardwareOrderService.handCancelActCode(dto)); + } + @GetMapping("/generate-invoice") @Operation(summary = "生成发票") @Idempotent(expireTime = 10, info = "正在生成中,请勿重复操作") 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..5d43020c7 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,11 +22,14 @@ 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; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Map; @@ -82,7 +86,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 +94,48 @@ 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) { + if (ObjectUtil.isEmpty(dto.getCreateTimeList())) { + throw new RuntimeException("请选择创建时间(天)"); + } + // 导出最多只能导出一年 + long days = Math.abs(ChronoUnit.DAYS.between(dto.getCreateTimeList()[0].toLocalDate(), dto.getCreateTimeList()[1].toLocalDate())); + if (days > 366) { + throw new RuntimeException("最多只能导出一年的数据"); + } + canteenTotalService.productTotalExportByDay(response, dto); + } + + @Operation(summary = "食堂菜品购买统计导出(按月统计)", description = "食堂菜品购买统计导出(按月统计)") + @PostMapping("/proudct-total-export-by-month") + @SysLog("食堂菜品购买统计导出(按月统计)") + public void productTotalExportByMonth(HttpServletResponse response, @RequestBody HardOrderDto dto) { + if (ObjectUtil.isEmpty(dto.getCreateTimeYearStr())) { + throw new RuntimeException("请选择创建时间(年)"); + } + canteenTotalService.productTotalExportByMonth(response, dto); + } } 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..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) { @@ -274,6 +285,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/controller/order/HardOrderTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java index 0a5a3a4f2..91d163b71 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) { @@ -249,9 +269,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 > 5 * 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 +281,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 +324,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); } } @@ -390,6 +423,27 @@ public class HardOrderTotalController { } } + @Operation(summary = "商户交易记录导出(按月)", description = "商户交易记录导出(按月)") + @PostMapping("/export-cs-by-month") + @SysLog("商户交易记录导出(按月)") + @PreAuthorize("@pms.hasPermission('hard_hardTotal_export_cs')") + public void exportCsByMonth(HttpServletResponse response, @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); + } + } + hardOrderTotalService.exportCsByMonth(response, dto); + } + @Operation(summary = "支付方式交易记录", description = "支付方式交易记录") @PostMapping("/export-payType") @SysLog("支付方式交易记录") 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..32ed228ac --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java @@ -0,0 +1,29 @@ +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 { + + 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) + ); + } + + Page 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/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/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/HardAuthService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java index bd5b661e9..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,13 +3,11 @@ 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; +import com.bsd.pjcloud.hard.api.vo.order.HardAppCreateThirdDoorOrderVo; import jakarta.validation.Valid; public interface HardAuthService extends IService { @@ -26,6 +24,16 @@ public interface HardAuthService extends IService { */ Long appAuthHardDoor(HardAuthAppDto dto); + /** + * app创建第三方免密支付 + */ + HardAppCreateThirdDoorOrderVo appCreateThirdDoorOrder(@Valid HardAuthAppDto dto); + + /** + * app创建第三方免密开门 + */ + Long appThirdDoorOpen(@Valid HardAppThirdOpenDoorDto dto); + /** * 判断当前用户信誉 */ @@ -35,4 +43,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/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/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 b566ce736..aa9922f7f 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,11 +4,13 @@ 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; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; +import com.bsd.pjcloud.hard.api.dto.hard.HandCancelActCodeDto; import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto; import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto; import com.bsd.pjcloud.hard.api.dto.hard.HardDoneHardQrCodeScanOrderDto; @@ -38,6 +40,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); @@ -85,7 +92,7 @@ public interface HardOrderService extends IService { /** * 创建智能柜订单 */ - Long createHardDoorOrder(Long userId, Long hardId); + Long createHardDoorOrder(Long userId, UserTypeEnum userType, Long hardId); /** * 结算智能柜订单 @@ -136,6 +143,11 @@ public interface HardOrderService extends IService { */ Boolean handCancelCode(HandCancelCodeDto dto); + /** + * 核销活动二维码 + */ + Boolean handCancelActCode(HandCancelActCodeDto dto); + /** * 创建订单后发送mq消息 */ 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..c0653c1b1 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 @@ -6,6 +6,7 @@ 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.vo.order.*; +import jakarta.servlet.http.HttpServletResponse; import java.util.List; @@ -21,6 +22,11 @@ public interface HardOrderTotalService { */ List listCs(HardOrderDto dto); + /** + * 商户交易记录(按商户、月)查询 + */ + Page pageListCsByMonth(Page page, HardOrderDto dto); + /** * 根据天查询每个商户的流水 */ @@ -51,4 +57,8 @@ public interface HardOrderTotalService { */ HardChartLatitudeVo chartLatitude(Long merchantId); + /** + * 商户交易记录导出(按月) + */ + void exportCsByMonth(HttpServletResponse response, HardOrderDto 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 new file mode 100755 index 000000000..0aaff8392 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java @@ -0,0 +1,37 @@ +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 com.bsd.pjcloud.hard.api.vo.HardThirdMiOrderVo; + +public interface HardThirdMiOrderService extends IService { + + /** + * 分页查询 + */ + Page scopePageJoin(Page page, HardThirdMiOrderDto dto, DataScope dataScope); + + /** + * 刷新订单 + */ + HardThirdMiOrderEntity refresh(Long id); + + /** + * 后台支付 + */ + void adminPay(HardThirdMiPayDto dto); + + /** + * 退款 + */ + void refund(Long id); + + /** + * 根据授权id查询授权订单 + */ + HardThirdMiOrderEntity getByAuthId(Long authId); +} \ 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 new file mode 100644 index 000000000..f3ed72c60 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java @@ -0,0 +1,55 @@ +package com.bsd.pjcloud.hard.service; + + +import com.alipay.api.response.*; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; + +public interface MiniAlipayService { + + /** + * 获取智能柜小程序二维码 + */ + String getDoorMiniQrCode(String hardDoorId, String cabinetNo); + + /** + * 免密授权 + */ + String miDynamicSign(Long userId, UserTypeEnum userType, Long authId); + + /** + * 免密授权(需要押金) + */ + ZhimaCreditPayafteruseCreditbizorderCreateResponse miDynamicCreate(Long userId, UserTypeEnum userType, Long authId); + + /** + * 查询免密授权 + */ + ZhimaCreditPayafteruseCreditagreementQueryResponse miDynamicQueySign(Long authId); + + /** + * 免密服务下单 + */ + ZhimaCreditPayafteruseCreditbizorderOrderResponse miDynamicOrder(Long authId, Long orderId, Long flowId); + + /** + * 创建支付宝免密订单 + */ + AlipayTradeCreateResponse miCreateOrder(String openId, Long authId, Long userId, UserTypeEnum userType); + + /** + * 查询支付宝免密订单 + */ + ZhimaCreditPayafteruseCreditbizorderQueryResponse miQueryOrder(String alipayOrderNo, Long authId); + + /** + * 支付宝免密扣款 + */ + boolean miPay(HardThirdMiOrderEntity thirdOrder, int totalPrice); + + /** + * 支付宝免密(取消/退款) + */ + 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 c53ad4724..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 @@ -1,34 +1,40 @@ 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; 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; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.hard.api.constant.HardAuthTypeEnum; +import com.bsd.pjcloud.hard.api.constant.HardThirdMiTypeEnum; import com.bsd.pjcloud.hard.api.constant.flow.HardDoorFlowBizEnum; import com.bsd.pjcloud.hard.api.constant.HardDoorOpenTypeEnum; import com.bsd.pjcloud.hard.api.dto.*; import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; import com.bsd.pjcloud.hard.api.entity.HardAuthEntity; import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; 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 lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -51,10 +57,13 @@ public class HardAuthServiceImpl extends ServiceImpl scopePageJoin(Page page, HardAuthDto dto, DataScope dataScope) { @@ -73,11 +82,15 @@ 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,13 +234,14 @@ public class HardDoorFlowServiceImpl 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 HardThirdMiOrderEntity 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 null; + } + // 支付宝-芝麻先享 + 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_SUCCESS.getType()); + break; + } + } + baseMapper.updateById(updateObj); + return baseMapper.selectById(order.getId()); + } + return null; + } + + /** + * 后台支付 + */ + @Override + public void adminPay(HardThirdMiPayDto dto) { + HardThirdMiOrderEntity order = baseMapper.selectById(dto.getId()); + if (ObjectUtil.isEmpty(order)) { + throw new RuntimeException("订单不存在"); + } + // 微信免密支付 + if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_WECHAT.getType())) { + + refresh(dto.getId()); + return; + } + // 支付宝-芝麻先享 + if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_ALIPAY.getType())) { + if (ObjectUtil.isEmpty(order.getOrderId())) { + throw new RuntimeException("支付宝-芝麻先享,此订单未创建"); + } + miniAlipayService.miPay(order, 10); + refresh(dto.getId()); + return; + } + } + + /** + * 退款 + */ + @Override + public void refund(Long id) { + HardThirdMiOrderEntity order = baseMapper.selectById(id); + if (ObjectUtil.isEmpty(order) || ObjectUtil.isNotEmpty(order.getOrderId())) { + throw new RuntimeException("订单不存在"); + } + order = refresh(id); + // 微信免密支付 + if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_WECHAT.getType())) { + + return; + } + // 支付宝-芝麻先享 + if (ObjectUtil.equals(order.getBizType(), HardThirdMiTypeEnum.MI_ALIPAY.getType())) { + if (ObjectUtil.equals(order.getOrderStatus(), HardThirdMiStatusEnum.REFUND.getType())) { + throw new RuntimeException("支付宝-芝麻先享,此订单已退款"); + } + if (ObjectUtil.notEqual(order.getOrderStatus(), HardThirdMiStatusEnum.PAY_SUCCESS.getType())) { + throw new RuntimeException("支付宝-芝麻先享,此订单未支付"); + } + miniAlipayService.miCancelOrRefund(order); + } + } + + /** + * 根据授权id查询授权订单 + */ + @Override + public HardThirdMiOrderEntity getByAuthId(Long authId) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(HardThirdMiOrderEntity::getAuthId, authId) + ); + } + + private void disposeList(List 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 new file mode 100644 index 000000000..d310d8218 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java @@ -0,0 +1,457 @@ +package com.bsd.pjcloud.hard.service.impl.ali; + +import cn.hutool.core.date.DatePattern; +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; +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.HardThirdMiOrderService; +import com.bsd.pjcloud.hard.service.MiniAlipayService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 支付宝小程序支付 + */ +@Service +@AllArgsConstructor +@Slf4j +public class MiniAlipayServiceImpl implements MiniAlipayService { + + private final HardThirdMiOrderMapper hardThirdMiOrderMapper; + + private final MiniAlipayConf conf; + + static private AlipayClient client = null; + + private void initClient() { + AlipayConfig alipayConfig = new AlipayConfig(); + alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); + alipayConfig.setAppId(conf.getAppId()); + alipayConfig.setPrivateKey(conf.getPrivateKey()); + alipayConfig.setFormat("json"); + alipayConfig.setCharset("UTF-8"); + alipayConfig.setAlipayPublicKey(conf.getAlipayPublicKey()); + alipayConfig.setSignType("RSA2"); + try { + MiniAlipayServiceImpl.client = new DefaultAlipayClient(alipayConfig); + } catch (Exception e) { + log.error("初始化支付宝客户端异常", e); + } + } + + private AlipayClient getClient() { + if (ObjectUtil.isEmpty(MiniAlipayServiceImpl.client)) initClient(); + return MiniAlipayServiceImpl.client; + } + + /** + * 获取智能柜小程序二维码 + */ + @Override + public String getDoorMiniQrCode(String hardDoorId, String cabinetNo) { + AlipayOpenAppQrcodeCreateRequest request = new AlipayOpenAppQrcodeCreateRequest(); + AlipayOpenAppQrcodeCreateModel model = new AlipayOpenAppQrcodeCreateModel(); + model.setUrlParam("pages/tabbar/login"); + model.setQueryParam(String.format("action=scan&path=%s&hardDoorId=%s&cabinetNo=%s", "pages/tabbar/login", hardDoorId, cabinetNo)); + model.setDescribe("支付宝智能柜二维码"); + request.setBizModel(model); + try { + AlipayOpenAppQrcodeCreateResponse response = getClient().execute(request); + if (!response.isSuccess()) { + log.error("|获取小程序二维码|失败,json|{}", response.getBody()); + return null; + } + return response.getQrCodeUrlCircleBlue(); + } catch (Exception e) { + e.printStackTrace(); + log.error("|获取小程序二维码|异常", e); + return null; + } + } + + /** + * 免密授权 + */ + @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 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); + } + } + + /** + * 查询面密授权 + */ + @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())) { + } + + 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; + } + } + + /** + * 创建支付宝免密订单 + */ + @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()); + AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); + try { + JSONObject bizContent = new JSONObject(); + // 设置商户订单号 + bizContent.putOnce("out_trade_no", String.valueOf(authId)); + // 设置订单标题 + bizContent.putOnce("subject", "浦江智能柜芝麻先享"); + // 设置订单附加信息 + bizContent.putOnce("body", "浦江智能柜芝麻先享"); + // 设置订单金额 + bizContent.putOnce("total_amount", new BigDecimal(depositPricePrice).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString()); + // 固定 + bizContent.putOnce("product_code", "JSAPI_PAY"); + // 用户登录id + bizContent.putOnce("buyer_open_id", openId); + bizContent.putOnce("op_buyer_open_id", openId); + bizContent.putOnce("op_app_id", conf.getAppId()); + // 订单超时时间(1天) + bizContent.putOnce("time_expire", LocalDateTimeUtil.format(LocalDateTime.now().plusDays(1), DatePattern.NORM_DATETIME_FORMATTER)); + JSONObject extraParam = new JSONObject(); + extraParam.putOnce("zmServiceId", conf.getZmServiceId()); + extraParam.putOnce("creditTradeScene", "CREDIT_PAY"); + bizContent.putOnce("extend_params", extraParam); + request.setBizContent(bizContent.toString()); + 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); + } + } + + /** + * 查询支付宝免密订单 + */ + @Override + 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(String.valueOf(authId)); + } + request.setBizModel(model); + try { + ZhimaCreditPayafteruseCreditbizorderQueryResponse response = getClient().execute(request); + if (!response.isSuccess()) { + log.error("|查询支付宝免密订单|失败,json|{}", response.getBody()); + return null; + } + log.info("|查询支付宝免密订单|成功,json|{}", response.getBody()); + return response; + } catch (Exception e) { + e.printStackTrace(); + log.error("|查询支付宝免密订单|意外的错误", e); + } + return null; + } + + /** + * 支付宝免密扣款 + */ + @Override + 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); + updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY_ERROR.getType()); + + AlipayTradeOrderPayRequest request = new AlipayTradeOrderPayRequest(); + AlipayTradeOrderPayModel model = new AlipayTradeOrderPayModel(); + model.setOutRequestNo(String.valueOf(thirdOrder.getOrderId())); + model.setTradeNo(thirdOrder.getThirdOrderNo()); + model.setFulfillmentAmount(new BigDecimal(totalPrice).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).toString()); + model.setOrderPayMode("CREDIT_FULFILLMENT_ZM"); + try { + request.setBizModel(model); + AlipayTradeOrderPayResponse response = getClient().execute(request); + if (!response.isSuccess()) { + log.error("|支付宝免密扣款|失败,json|{}", response.getBody()); + return false; + } + log.info("|支付宝免密扣款|成功,json|{}", response.getBody()); + if (ObjectUtil.equals(response.getCode(), "10000")) { + updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY_SUCCESS.getType()); + return true; + } + return false; + } catch (Exception e) { + e.printStackTrace(); + log.error("|支付宝免密扣款|异常", e); + return false; + } finally { + hardThirdMiOrderMapper.updateById(updateObj); + } + } + + /** + * 支付宝免密(取消/退款) + */ + @Override + public AlipayTradeRefundResponse miCancelOrRefund(HardThirdMiOrderEntity thirdOrder) { + AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); + JSONObject bizContent = new JSONObject(); + + // 订单总金额 + bizContent.putOnce("refund_amount", new BigDecimal(thirdOrder.getRefundId()).divide(BigDecimal.valueOf(thirdOrder.getRefundPrice()), 2, RoundingMode.HALF_UP)); + // 商家订单唯一号 + 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"); + bizContent.putOnce("extend_params", extendParam); + try { + request.setBizContent(bizContent.toString()); + AlipayTradeRefundResponse response = getClient().execute(request); + if (!response.isSuccess()) { + log.error("|支付宝免密(取消/退款)|失败,json|{}", response.getBody()); + return null; + } + log.info("|支付宝免密(取消/退款)|成功,json|{}", response.getBody()); + return response; + } catch (Exception e) { + e.printStackTrace(); + log.error("|支付宝免密(取消/退款)|异常", e); + return null; + } + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorCabinetServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorCabinetServiceImpl.java index 6e8d677b1..d907e74bc 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorCabinetServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorCabinetServiceImpl.java @@ -16,6 +16,7 @@ import com.bsd.pjcloud.hard.api.vo.manager.HardDoorCabinetCodeVo; import com.bsd.pjcloud.hard.api.vo.manager.HardDoorCabinetVo; import com.bsd.pjcloud.hard.mapper.manager.HardDoorCabinetMapper; import com.bsd.pjcloud.hard.service.HardDoorCabinetService; +import com.bsd.pjcloud.hard.service.MiniAlipayService; import com.bsd.pjcloud.thirdparty.vo.door.DoorStatusVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -40,6 +41,8 @@ public class HardDoorCabinetServiceImpl extends ServiceImpl productTotal(Page page, HardOrderDto dto, DataScope dataScope) { @@ -183,6 +193,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 +265,236 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { return list; } + /** + * 食堂菜品购买统计导出(按天统计) + */ + @Override + public void productTotalExportByDay(HttpServletResponse response, HardOrderDto dto) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + // 查询食堂 + String mchName = "所有"; + if (ObjectUtil.isNotEmpty(dto.getMerchantId())) { + MchManageVo mch = remoteMchService.getById(dto.getMerchantId()).getData(); + if (ObjectUtil.isNotEmpty(mch)) { + mchName = mch.getName(); + } + } + // 标题 + // 格式-2025年县府一楼食堂就餐情况统计表 + String title = LocalDateTimeUtil.format(dto.getCreateTimeList()[0].toLocalDate(), DatePattern.CHINESE_DATE_PATTERN) + "至" + LocalDateTimeUtil.format(dto.getCreateTimeList()[1].toLocalDate(), DatePattern.CHINESE_DATE_PATTERN) + mchName + "就餐情况统计表"; + // 选择的天数 + List dateRangeList = getDateRangeList(dto.getCreateTimeList()[0].toLocalDate(), dto.getCreateTimeList()[1].toLocalDate()); + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/食堂菜品购买统计(按天).xlsx")).inMemory(true).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + Map map = new HashMap(); + + map.put("title", title); + + // 总金额 + double sumMorningPrice = 0; + long sumMorningTimeCount = 0; + double sumNoonPrice = 0; + long sumNoonTimeCount = 0; + double sumEveningPrice = 0; + long sumEveningTimeCount = 0; + + Page page = productTotal(new Page(1, 2000), dto, null); + List records = page.getRecords(); + // 开始处理excel + List> excelList = new LinkedList<>(); + for (LocalDate v : dateRangeList) { + Map excelMap = new HashMap(); + String timeStr = ""; + double morningPrice = 0; + long morningTimeCount = 0; + double noonPrice = 0; + long noonTimeCount = 0; + double eveningPrice = 0; + long eveningTimeCount = 0; + double colPrice = 0; + long colTimeCount = 0; + // 早 + HardCanteenProductTotalVo morning = records.stream().filter(item -> ObjectUtil.equals(item.getHourType(), HardHourTypeEnum.MORNING.getType()) && ObjectUtil.equals(item.getCreateTime().toLocalDate(), v)).findFirst().orElse(null); + // 中 + HardCanteenProductTotalVo noon = records.stream().filter(item -> ObjectUtil.equals(item.getHourType(), HardHourTypeEnum.NOONING.getType()) && ObjectUtil.equals(item.getCreateTime().toLocalDate(), v)).findFirst().orElse(null); + // 晚 + HardCanteenProductTotalVo evening = records.stream().filter(item -> ObjectUtil.equals(item.getHourType(), HardHourTypeEnum.NIGHT.getType()) && ObjectUtil.equals(item.getCreateTime().toLocalDate(), v)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(v)) { + timeStr = LocalDateTimeUtil.format(v, DatePattern.NORM_DATE_PATTERN); + } + if (ObjectUtil.isNotEmpty(morning)) { + if (ObjectUtil.isNotEmpty(morning.getTotalPrice())) { + morningPrice = BigDecimal.valueOf(morning.getTotalPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + } + if (ObjectUtil.isNotEmpty(morning.getTimeCount())) { + morningTimeCount = morning.getTimeCount(); + } + } + if (ObjectUtil.isNotEmpty(noon)) { + if (ObjectUtil.isNotEmpty(noon.getTotalPrice())) { + noonPrice = BigDecimal.valueOf(noon.getTotalPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + } + if (ObjectUtil.isNotEmpty(noon.getTimeCount())) { + noonTimeCount = noon.getTimeCount(); + } + } + if (ObjectUtil.isNotEmpty(evening)) { + if (ObjectUtil.isNotEmpty(evening.getTotalPrice())) { + eveningPrice = BigDecimal.valueOf(evening.getTotalPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + } + if (ObjectUtil.isNotEmpty(evening.getTimeCount())) { + eveningTimeCount = evening.getTimeCount(); + } + } + + sumMorningPrice += morningPrice; + sumMorningTimeCount += morningTimeCount; + sumNoonPrice += noonPrice; + sumNoonTimeCount += noonTimeCount; + sumEveningPrice += eveningPrice; + sumEveningTimeCount += eveningTimeCount; + colPrice = morningPrice + noonPrice + eveningPrice; + colTimeCount = morningTimeCount + noonTimeCount + eveningTimeCount; + + excelMap.put("timeStr", timeStr); + excelMap.put("morningPrice", morningPrice); + excelMap.put("morningTimeCount", morningTimeCount); + excelMap.put("noonPrice", noonPrice); + excelMap.put("noonTimeCount", noonTimeCount); + excelMap.put("eveningPrice", eveningPrice); + excelMap.put("eveningTimeCount", eveningTimeCount); + excelMap.put("colPrice", colPrice); + excelMap.put("colTimeCount", colTimeCount); + excelList.add(excelMap); + } + map.put("sumMorningPrice", sumMorningPrice); + map.put("sumMorningTimeCount", sumMorningTimeCount); + map.put("sumNoonPrice", sumNoonPrice); + map.put("sumNoonTimeCount", sumNoonTimeCount); + map.put("sumEveningPrice", sumEveningPrice); + map.put("sumEveningTimeCount", sumEveningTimeCount); + map.put("colPrice", sumMorningPrice + sumNoonPrice + sumEveningPrice); + map.put("colTimeCount", sumMorningTimeCount + sumNoonTimeCount + sumEveningTimeCount); + + excelWriter.fill(map, writeSheet); + excelWriter.fill(excelList, fillConfig, writeSheet); + + Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook(); + if (ObjectUtil.isNotEmpty(workbook)) { + // 计算公式 + workbook.getCreationHelper().createFormulaEvaluator().evaluateAll(); + } + excelWriter.finish(); + } catch (Exception e) { + e.printStackTrace(); + log.error("|食堂菜品购买统计导出(按天统计)|导出数据异常error:{}", e.getMessage()); + } + } + + /** + * 食堂菜品购买统计导出(按月统计) + */ + @Override + public void productTotalExportByMonth(HttpServletResponse response, HardOrderDto dto) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + String createTimeYearStr = dto.getCreateTimeYearStr(); + Integer createTimeYear = Integer.valueOf(createTimeYearStr); + + // 查询食堂 + String mchName = "所有"; + if (ObjectUtil.isNotEmpty(dto.getMerchantId())) { + MchManageVo mch = remoteMchService.getById(dto.getMerchantId()).getData(); + if (ObjectUtil.isNotEmpty(mch)) { + mchName = mch.getName(); + } + } + + // 标题 + // 格式-2025年县府一楼食堂就餐情况统计表 + String title = createTimeYear + "年" + mchName + "就餐情况统计表"; + + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/食堂菜品购买统计(按月).xlsx")).inMemory(true).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build(); + + Map map = new HashMap<>(); + map.put("title", title); + + Page page = productTotalByMonth(new Page(1L, 999L), dto, null); + List records = page.getRecords(); + // 填充数据 + // 早 + List morningList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.MORNING.getType())).toList(); + excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(morningList, createTimeYear, "morning"), fillConfig, writeSheet); + // 中 + List noonList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.NOONING.getType())).toList(); + excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(noonList, createTimeYear, "noon"), fillConfig, writeSheet); + // 晚 + List nightList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.NIGHT.getType())).toList(); + excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(nightList, createTimeYear, "night"), fillConfig, writeSheet); + + excelWriter.fill(map, writeSheet); + + Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook(); + if (ObjectUtil.isNotEmpty(workbook)) { + // 计算公式 + workbook.getCreationHelper().createFormulaEvaluator().evaluateAll(); + } + excelWriter.finish(); + } catch (Exception e) { + e.printStackTrace(); + log.error("|食堂菜品购买统计导出(按月统计)|导出数据异常error:{}", e.getMessage()); + } + } + + private List> productTotalExportByMonthToDefaulColExcelMap(List records, int year, String prefix) { + List> list = new LinkedList<>(); + if (ObjectUtil.isEmpty(records)) return list; + List sqlList = new LinkedList<>(); + + List monthlyRanges = new LinkedList<>(); + for (Month month : Month.values()) { + LocalDate localDate = LocalDate.of(year, month.getValue(), 1); + monthlyRanges.add(localDate); + } + + for (LocalDate i : monthlyRanges) { + HardCanteenProductTotalVo target = records.stream().filter(v -> ObjectUtil.equals(v.getCreateTime().toLocalDate(), i)).findFirst().orElse(null); + if (ObjectUtil.isEmpty(target)) { + HardCanteenProductTotalVo defaultVo = new HardCanteenProductTotalVo(); + defaultVo.setCreateTime(i.atStartOfDay()); + defaultVo.setCreateTimeStr(LocalDateTimeUtil.format(i, DatePattern.NORM_MONTH_PATTERN)); + sqlList.add(defaultVo); + } else { + sqlList.add(target); + } + } + + double sumTotalPrice = 0; + long sumTimeCount = 0; + + String mapKey = prefix + "Col"; + for (HardCanteenProductTotalVo i : sqlList) { + double totalPrice = 0; + if (ObjectUtil.isNotEmpty(i.getTotalPrice())) { + totalPrice = BigDecimal.valueOf(i.getTotalPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + } + list.add(Map.of(mapKey, totalPrice)); + sumTotalPrice += totalPrice; + + long timeCount = 0; + if (ObjectUtil.isNotEmpty(i.getTimeCount())) { + timeCount = i.getTimeCount(); + } + list.add(Map.of(mapKey, timeCount)); + sumTimeCount += timeCount; + } + list.add(Map.of(mapKey, sumTotalPrice)); + list.add(Map.of(mapKey, sumTimeCount)); + return list; + } + /** * 为HardCanteenProductTotalVo增加部门信息 */ @@ -367,4 +626,14 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService { } } } + + public List getDateRangeList(LocalDate startDate, LocalDate endDate) { + List dateList = new ArrayList<>(); + LocalDate currentDate = startDate; + while (!currentDate.isAfter(endDate)) { + dateList.add(currentDate); + currentDate = currentDate.plusDays(1); + } + return dateList; + } } 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..d1bf87a04 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; @@ -24,6 +23,7 @@ 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.constant.enums.UserTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.CollectionUtils; @@ -31,12 +31,15 @@ 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.HardHourTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.hard.api.dto.ali.AliMicropayDto; import com.bsd.pjcloud.hard.api.dto.ali.AliReverseDto; +import com.bsd.pjcloud.hard.api.dto.hard.HandCancelActCodeDto; import com.bsd.pjcloud.hard.api.dto.hard.HardDoneHardQrCodeScanOrderDto; import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto; @@ -50,6 +53,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,18 +66,16 @@ 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.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; @@ -83,20 +85,20 @@ import com.bsd.pjcloud.wallet.api.constant.mch.WalletMchRulePriceTypeEnum; import com.bsd.pjcloud.wallet.api.constant.mch.WalletMchSupType; import com.bsd.pjcloud.wallet.api.dto.WalletBalanceTransactionDto; import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActComCancelDto; 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; import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; import com.bsd.pjcloud.wallet.api.vo.act.ActCancelItemVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActComItemVo; 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; @@ -138,6 +140,7 @@ public class HardOrderServiceImpl extends ServiceImpl pagejoin(Page page, HardOrderDto dto) { @@ -188,6 +193,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) { @@ -856,10 +872,27 @@ public class HardOrderServiceImpl extends ServiceImpl reduceRes = walletTransactionService.reduceWalletBalance(reduceBuild); - if (reduceRes.getCode() != 0 || ObjectUtil.isEmpty(reduceRes.getData())) { - throw new RuntimeException("钱包扣款错误"); + int payPrice = order.getTotalPrice() + order.getExtraPrice(); + if (payPrice > 0) { + WalletBalanceTransactionDto reduceBuild = new WalletBalanceTransactionDto(); + reduceBuild.setWalletId(order.getWalletId()); + reduceBuild.setPrice(order.getPayPrice()); + reduceBuild.setBizId(String.valueOf(order.getId())); + reduceBuild.setBizType(WalletBizEnum.PAYMENT); + reduceBuild.setForce(true); + R reduceRes = walletTransactionService.reduceWalletBalance(reduceBuild); + if (reduceRes.getCode() != 0 || ObjectUtil.isEmpty(reduceRes.getData())) { + throw new RuntimeException("钱包扣款错误"); + } } } // 订单成功 @@ -1098,6 +1151,93 @@ public class HardOrderServiceImpl extends ServiceImpl 0; } + /** + * 核销活动二维码 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean handCancelActCode(HandCancelActCodeDto dto) { + // 1. 查看活动是否存在 + ActComItemVo detail = remoteComActService.remoteGetComAct(dto.getActItemId(), dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(detail)) { + throw new RuntimeException("活动不存在"); + } + // 2. 参加活动人员 + UserInfo userInfo = userService.getInnerByUserId(detail.getUserId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + throw new RuntimeException("参加活动用户不存在"); + } + SysUser sysUser = userInfo.getSysUser(); + // 3. 查询设备 + HardManagerVo hardDetail = hardManagerService.getByHardId(dto.getHardwareId()); + if (ObjectUtil.isEmpty(hardDetail)) { + throw new RuntimeException("设备不存在"); + } + // 4. 查询商户 + MchManageVo mch = remoteMchService.getById(hardDetail.getMerchantId()).getData(); + if (ObjectUtil.isEmpty(mch)) { + throw new RuntimeException("商户不存在"); + } + // 5. 是否已经核销过 + String errorMsg = remoteComActService.remoteIsCanCancel(dto.getActItemId(), dto.getUserId()).getData(); + if (ObjectUtil.isNotEmpty(errorMsg)) { + throw new RuntimeException(errorMsg); + } + // 6. 钱包(默认饭卡钱包) + WalletManageEntity wallet = remoteWalletService.getWallet(dto.getUserId(), WalletTypeEnum.EAT).getData(); + + // 7. 创建订单 + + // 是否需要支付 + boolean isPay = true; + // 门槛金额 + // 减免金额 + // 商品描述 + // 优惠金额 + int useAmountPrice = 0; + String orderDesc = "浦江活动商品 x *"; + // 总金额,额外金额,支付金额 + int totalPrice = 0, extraPrice = 0, payPrice = 0; + // 添加硬件订单 + HardOrderEntity orderObj = HardOrderEntity.builder() + .androidOrderCode(null) + .userId(sysUser.getUserId()) + .userDeptId(sysUser.getDeptId()) + .walletId(wallet.getId()) + .sysType(hardDetail.getType()) + .hourType("-1") + .parentCarId(null) + .hardId(dto.getHardwareId()) + .orderStatus(HardOrderStatusEnum.CREATE.getType()) + .merchantId(mch.getId()) + .merchantType(mch.getTypes()) + .merchantDeptId(mch.getDeptId()) + .deptId(hardDetail.getDeptId()) + .orderType(HardOrderTypeEnum.RESERVE.getType()) + .payType(HardPayTypeEnum.ACT_CANCEL.getType()) + .orderSourceTypeId(dto.getActItemId()) + .totalPrice(totalPrice) + .extraPrice(extraPrice) + .payPrice(totalPrice + extraPrice) + .isOfflineOrder(YesNoEnum.NO.getCode()) + .productDesc(orderDesc) + .build(); + baseMapper.insert(orderObj); + // 核销 + ActComCancelDto cancelDto = new ActComCancelDto(); + cancelDto.setActItemId(dto.getActItemId()); + cancelDto.setUserId(dto.getUserId()); + cancelDto.setOrderId(orderObj.getId()); + cancelDto.setUseAmountPrice(useAmountPrice); + Boolean isCancelSuccess = remoteComActService.remoteDoCancel(cancelDto).getData(); + if (!isCancelSuccess) { + throw new RuntimeException("核销失败"); + } + // 钱包扣款 + getSelf().fastReduceBalance(orderObj); + return true; + } + @Override // @GlobalTransactional @Transactional(rollbackFor = Exception.class) 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..caf10e3b3 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 @@ -2,7 +2,17 @@ package com.bsd.pjcloud.hard.service.impl.order; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.util.ObjectUtil; +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.dto.DeptAllListDto; import com.bsd.pjcloud.admin.api.entity.SysDept; @@ -13,16 +23,13 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.DataScopeFuncEnum; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; +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.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.*; @@ -37,21 +44,22 @@ import com.bsd.pjcloud.wallet.api.feign.RemoteWalletTransactionService; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.api.vo.WalletTransactionSumAndCountVo; +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.io.ByteArrayOutputStream; +import java.io.ByteArrayInputStream; + +import com.alibaba.excel.write.metadata.fill.FillWrapper; + import java.math.BigDecimal; -import java.time.DayOfWeek; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; +import java.math.RoundingMode; +import java.time.*; 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; @Validated @@ -169,7 +177,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)) { @@ -225,7 +232,10 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { if (ObjectUtil.isNotEmpty(deptMap)) { for (HardOrderCsVo v : totalList) { if (ObjectUtil.isEmpty(v.getMerchantDeptId())) continue; - v.setMerchantDeptName(deptMap.get(v.getMerchantDeptId()).getName()); + SysDept targetDept = deptMap.get(v.getMerchantDeptId()); + if (ObjectUtil.isNotEmpty(targetDept)) { + v.setMerchantDeptName(targetDept.getName()); + } } } } @@ -233,6 +243,105 @@ 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()); + } + // 查询总流水 + HardOrderDto totalDto = BeanUtil.toBean(dto, HardOrderDto.class); + totalDto.setOrderStatusCodes(HardOrderStatusEnum.getPayPrice()); + totalDto.setPayTimeYearStr(dto.getPayTimeYearStr()); + 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.setAuditTimeYearStr(dto.getPayTimeYearStr()); + refundDto.setPayTimeYearStr(null); + refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); + refundDto.setRefundStatusCodes(List.of(HardSaleStatusEnum.COMPLETE.getStatus())); + if (ObjectUtil.isNotEmpty(dto.getMchIds())) { + refundDto.setMchIds(dto.getMchIds()); + } + 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; + SysDept targetDept = deptMap.get(v.getMerchantDeptId()); + if (ObjectUtil.isNotEmpty(targetDept)) { + v.setMerchantDeptName(targetDept.getName()); + } + } + } + } + } + return totalPage; + } + @Override public List listCsByDay(Page page, HardOrderDto dto, PjcloudUser user) { // 查询总流水 @@ -675,4 +784,180 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { result.setAllTotal(totalList); return result; } + + /** + * 商户交易记录导出(按月) + */ + @Override + public void exportCsByMonth(HttpServletResponse response, HardOrderDto dto) { + // 查询所有有订单或者退款的店铺记录 + List mchIds = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(mchIds)) { + mchIds = new ArrayList<>(dto.getMchIds()); + } + // 查询总流水 + if (ObjectUtil.isEmpty(mchIds)) { + 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()); + } + if (ObjectUtil.isNotEmpty(dto.getPayTimeYearStr())) { + merchQuery.setPayTimeYearStr(dto.getPayTimeYearStr()); + } + mchIds = hardOrderMapper.selectOrderMerchIds(merchQuery); + } + List> chuckMchIds = ListUtil.split(mchIds, 5); + + List mchList = remoteMchService.getByIds(mchIds).getData(); + + Map map = new HashMap(); + + // 查询食堂 + String mchName = "所有"; + if (ObjectUtil.isNotEmpty(dto.getMerchantId())) { + MchManageVo mch = remoteMchService.getById(dto.getMerchantId()).getData(); + if (ObjectUtil.isNotEmpty(mch)) { + mchName = mch.getName(); + } + } + // 标题 + // 格式-2025年浦江大饭店合作商家流水情况统计表 + String title = dto.getPayTimeYearStr() + "年" + mchName + "合作商家流水情况统计表"; + map.put("title", title); + + // 年份 + int payTimeYearint = Integer.parseInt(dto.getPayTimeYearStr()); + + ByteArrayOutputStream tempExcel = new ByteArrayOutputStream(); + try { + ExcelWriter excelWriter = EasyExcel.write(tempExcel).withTemplate(ResourceUtil.getStream("file/商户交易金额汇总(按月).xlsx")).build(); + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + List> excelTempMapList = new ArrayList<>(); + for (int i = 0; i < mchIds.size(); i++) { + Long currentMchId = mchIds.get(i); + Map excelMap = new LinkedHashMap<>(); + for (int j = 0; j <= 26; j++) { + String key = String.format("col%d", j); + String value = ""; + if (j == 0) { + value = String.format("{col_%d.col}", currentMchId); + } + excelMap.put(key, value); + } + excelTempMapList.add(excelMap); + } + excelWriter.fill(Map.of("total", "{total.total}", "title", "{title}"), writeSheet); + excelWriter.fill(excelTempMapList, fillConfig, writeSheet); + excelWriter.finish(); + } catch (Exception e) { + e.printStackTrace(); + } + + // 导出tempExcel用于调试 + // FileUtil.writeBytes(tempExcel.toByteArray(), "/Users/dengzhangchen/Downloads/debug_hard_order_" + System.currentTimeMillis() + ".xlsx"); + + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(new ByteArrayInputStream(tempExcel.toByteArray())).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).forceNewRow(Boolean.TRUE).build(); + // 按月份总计 + List monthTotalList = new LinkedList<>(); + for (Month month : Month.values()) { + HardOrderCsVo.Month defaulMonthTotal = new HardOrderCsVo.Month(); + LocalDate monthDate = LocalDate.of(payTimeYearint, month.getValue(), 1); + String monthStr = LocalDateTimeUtil.format(monthDate, DatePattern.NORM_MONTH_PATTERN); + defaulMonthTotal.setDay(monthStr); + defaulMonthTotal.setTotalProfitPrice(0); + defaulMonthTotal.setTotalProfitCount(0); + monthTotalList.add(defaulMonthTotal); + } + for (List ids : chuckMchIds) { + dto.setMchIds(ids); + Page page = pageListCsByMonth(new Page(1L, 999L), dto); + List records = page.getRecords(); + if (ObjectUtil.isEmpty(records)) break; + for (Long id : ids) { + List> excelMapList = new LinkedList>(); + // 先查询商户名 + String currentMchName = "未知商户"; + MchManageVo mchDetail = mchList.stream().filter(m -> ObjectUtil.equals(m.getId(), id)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(mchDetail) && ObjectUtil.isNotEmpty(mchDetail.getName())) { + currentMchName = mchDetail.getName(); + } + excelMapList.add(Map.of("col", currentMchName)); + excelMapList.addAll(disposeCsByMonth(id, records, monthTotalList, payTimeYearint)); + excelWriter.fill(new FillWrapper("col_" + id, excelMapList), fillConfig, writeSheet); + } + } + // 统计 + double sumTotalPrice = 0; + long sumTimeCount = 0; + List> excelTotalMapList = new LinkedList>(); + for (HardOrderCsVo.Month total : monthTotalList) { + excelTotalMapList.add(Map.of("total", total.getTotalProfitPrice())); + excelTotalMapList.add(Map.of("total", total.getTotalProfitCount())); + sumTotalPrice += total.getTotalProfitPrice(); + sumTimeCount += total.getTotalProfitCount(); + } + excelTotalMapList.add(Map.of("total", sumTotalPrice)); + excelTotalMapList.add(Map.of("total", sumTimeCount)); + excelWriter.fill(new FillWrapper("total", excelTotalMapList), fillConfig, writeSheet); + excelWriter.fill(map, writeSheet); + } catch (Exception e) { + e.printStackTrace(); + log.error("|商户交易记录导出(按月)|以外的错误,error:{}", e.getMessage()); + } + } + + public List> disposeCsByMonth(Long mchId, List list, List monthTotalList, Integer yearStr) { + List monthlyRanges = new LinkedList<>(); + for (Month month : Month.values()) { + LocalDate localDate = LocalDate.of(yearStr, month.getValue(), 1); + monthlyRanges.add(localDate); + } + List> listMap = new LinkedList<>(); + List sqlList = new LinkedList<>(); + for (LocalDate i : monthlyRanges) { + String monthStr = LocalDateTimeUtil.format(i, DatePattern.NORM_MONTH_PATTERN); + HardOrderCsVo target = list.stream().filter(v -> ObjectUtil.equals(v.getDay(), monthStr) && ObjectUtil.equals(v.getMerchantId(), mchId)).findFirst().orElse(null); + if (ObjectUtil.isEmpty(target)) { + HardOrderCsVo defaultVo = new HardOrderCsVo(); + defaultVo.setTotalProfitPrice(BigDecimal.ZERO); + defaultVo.setTotalProfitCount(BigDecimal.ZERO); + sqlList.add(defaultVo); + } else { + sqlList.add(target); + } + } + double sumTotalPrice = 0; + long sumTimeCount = 0; + for (HardOrderCsVo v : sqlList) { + BigDecimal totalProfitPrice = Optional.of(v.getTotalProfitPrice()).orElse(BigDecimal.ZERO); + BigDecimal totalProfitCount = Optional.of(v.getTotalProfitCount()).orElse(BigDecimal.ZERO); + + totalProfitPrice = v.getTotalProfitPrice().divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP); + + listMap.add(Map.of("col", totalProfitPrice.toString())); + listMap.add(Map.of("col", totalProfitCount.intValue())); + + sumTotalPrice += totalProfitPrice.doubleValue(); + sumTimeCount += totalProfitCount.longValue(); + + HardOrderCsVo.Month month = monthTotalList.stream().filter(item -> ObjectUtil.equals(item.getDay(), v.getDay())).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(month)) { + month.setTotalProfitPrice(month.getTotalProfitPrice() + totalProfitPrice.doubleValue()); + month.setTotalProfitCount(month.getTotalProfitCount() + totalProfitCount.longValue()); + } + } + listMap.add(Map.of("col", sumTotalPrice)); + listMap.add(Map.of("col", sumTimeCount)); + + return listMap; + } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/application.yml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/application.yml index 57aba3f9b..dfd0a4f96 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/application.yml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/application.yml @@ -40,4 +40,15 @@ spring: # public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2thnpmLBNBxMQ1/LRLu5Ld3FT5D8iT4GZJZMjJqSNbkwbAPKnCgaEvPH3g/0Pn97OnrRqAcU4pZ97wVWQTBhsKS/G3MRrtSC3HmvDwTrCn3URResDeA7C7VS/ujtpCvUgzqmZELf2xFRN7V5Y8bUPooFNK2mViEkF1gsHpMs4OAkC3zAaCY9PyReGaYsNnWLwUSoBJ0fB+6cwgESbjewdxuDVq38kchZ+vovqA5hXMA9nsMEPIF/R3u5qoJ/v3Ii0YJv8odKKyinxAhX0FB97WVVufUFO2AF7cj3aUxgqbWZDOaa4fWwhlSqDp+0tORUclCcUQ/XRHp/KclTDoUjEQIDAQAB # 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 \ No newline at end of file +# # callback-url: https://stgl.pj.gov.cn/api/hard/hard-ali-pay/callback +mini-ali-pay: + app-id: 2021005197658445 + merchant-id: 2088570073831141 + merchant-account: 1472871899@qq.com + freeze-amount: 100 + zm-service-id: 2025122300000000000107601400 + 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-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 000000000..2e13ca8b3 Binary files /dev/null and b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/商户交易金额汇总(按月).xlsx differ 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 000000000..730038854 Binary files /dev/null and b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/食堂菜品购买统计(按天).xlsx differ 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 000000000..5abae2bac Binary files /dev/null and b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/食堂菜品购买统计(按月).xlsx differ 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..3678f7442 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardThirdMiOrderMapper.xml @@ -0,0 +1,73 @@ + + + + + + + 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-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..8c8a544e8 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,10 +42,24 @@ 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]} + + and DATE_FORMAT(a.create_time, '%Y') = #{dto.createTimeYearStr} @@ -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 + + + + select distinct (total.merchantId) + from (select a.merchant_id as merchantId, a.merchant_type as merchantType, a.create_time as createTime + from hard_order a + where a.del_flag = '0' + and a.merchant_id is not null + and a.merchant_type is not null + + and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} + + + and DATE_FORMAT(a.pay_time, '%Y') = #{dto.payTimeYearStr} + + union all + select o.merchant_id as merchantId, o.merchant_type as merchantType, a.create_time + from hard_after_sale a + left join hard_order o on o.id = a.order_id + where a.del_flag = '0' + and o.merchant_id is not null + and o.merchant_type is not null + + and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} + + + and DATE_FORMAT(a.refund_time, '%Y') = #{dto.payTimeYearStr} + + ) total + + + and total.merchantId in + + #{v} + + + + and total.merchantType in + + #{v} + + + + + @@ -367,6 +413,40 @@ ELSE 5 END + + + + + + from app_version a + + + + + + \ No newline at end of file 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..08bd0f0d5 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserStaffingTypeEnum.java @@ -0,0 +1,31 @@ +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); + } + + 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/constant/visitor/VisitorBizEnum.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/visitor/VisitorBizEnum.java new file mode 100644 index 000000000..deb55ea70 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/visitor/VisitorBizEnum.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.admin.api.constant.visitor; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 访客类型 + */ +@AllArgsConstructor +@Getter +public enum VisitorBizEnum { + + WECHAT("10", "微信小程序"), + ALIPAY("20", "支付宝小程序"), + ; + private final String type; + private final String description; + + public static VisitorBizEnum 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-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysAppUserModifyDto.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysAppUserModifyDto.java new file mode 100644 index 000000000..c104b9f98 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysAppUserModifyDto.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.admin.api.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDate; + +@Data +public class SysAppUserModifyDto { + + private Long userId; + + @NotNull(message = "生日不能为空") + private LocalDate birthday; + +} 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..822a31e0c 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 @@ -31,6 +31,7 @@ import org.javers.core.metamodel.annotation.DiffInclude; import org.javers.core.metamodel.annotation.PropertyName; import java.io.Serializable; +import java.time.LocalDate; import java.time.LocalDateTime; /** @@ -160,6 +161,12 @@ public class SysUser extends Model implements Serializable { @Schema(description = "头像地址") private String avatar; + /** + * 生日 + */ + @Schema(description = "生日") + private LocalDate birthday; + /** * 部门ID */ @@ -240,9 +247,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/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 157b7a794..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 @@ -92,6 +92,14 @@ public class UserExcelVO implements Serializable { @ExcelProperty("岗位名称") private String postNameList; + /** + * 编制 + */ + @ExcelProperty("编制") + private String staffingType; + + private String staffingTypeParse; + /** * 锁定标记 */ 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-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..af06a5aba --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/total/UserStaffingTotalVo.java @@ -0,0 +1,45 @@ +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; + + /** + * 未填写人数 + */ + private Long fillInPerson = 0L; + +} 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/controller/SysUserController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java index 8c37f4894..91034a5af 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 @@ -25,6 +25,7 @@ import cn.hutool.core.util.ObjectUtil; 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.admin.api.dto.SysAppUserModifyDto; import com.bsd.pjcloud.admin.api.dto.UserDTO; import com.bsd.pjcloud.admin.api.dto.UserDeptSimpleInfo; import com.bsd.pjcloud.admin.api.dto.UserInfo; @@ -46,6 +47,7 @@ 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 com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; @@ -66,6 +68,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -95,6 +98,7 @@ public class SysUserController { private final SysRoleService sysRoleService; private final SysUserRoleService sysUserRoleService; + /* ************************************* start 回调 start ************************************* */ @Inner(value = false) @@ -105,6 +109,16 @@ public class SysUserController { /* ************************************* end 回调 end ************************************* */ + /* ************************************* start app start ************************************* */ + @PostMapping("/app/modify") + public R appModify(@Validated @RequestBody SysAppUserModifyDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + + dto.setUserId(user.getId()); + return R.ok(userService.appModify(dto)); + } + /* ************************************* end app end ************************************* */ + /** * 获取指定用户全部信息 * @@ -133,16 +147,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 +433,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 +512,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 +559,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/SysUserService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java index 16fd28f7d..87b208c90 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 @@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.admin.api.dto.SysAppUserModifyDto; import com.bsd.pjcloud.admin.api.dto.UserDTO; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysUser; @@ -84,6 +85,11 @@ public interface SysUserService extends IService { */ Boolean updateUser(UserDTO userDto); + /** + * app更新用户 + */ + Boolean appModify(SysAppUserModifyDto dto); + /** * 通过ID查询用户信息 * @@ -136,6 +142,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/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/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index 2838ebdc3..344ca1614 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 @@ -19,6 +19,7 @@ package com.bsd.pjcloud.admin.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ArrayUtil; @@ -33,7 +34,9 @@ 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.SysAppUserModifyDto; import com.bsd.pjcloud.admin.api.dto.SysUserFaceDto; import com.bsd.pjcloud.admin.api.dto.UserDTO; import com.bsd.pjcloud.admin.api.dto.UserInfo; @@ -48,32 +51,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; @@ -84,7 +78,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; @@ -435,6 +428,12 @@ public class SysUserServiceImpl extends ServiceImpl impl return Boolean.TRUE; } + @Override + public Boolean appModify(SysAppUserModifyDto dto) { + SysUser updateObj = BeanUtil.toBean(dto, SysUser.class); + return baseMapper.updateById(updateObj) > 0; + } + /** * 查询上级部门的用户信息 * @@ -473,6 +472,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; @@ -526,6 +531,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())); } @@ -620,7 +637,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)); @@ -648,6 +679,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()); @@ -671,6 +703,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+", "")); @@ -728,6 +761,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-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..716d980b8 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/total/SysUserTotalServiceImpl.java @@ -0,0 +1,94 @@ +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()); + vo.setFillInPerson(targetMap.getFillInPerson()); + } + + 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/file/user.xlsx b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx index bb557ba59..af27f00d1 100644 Binary files a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx and b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/file/user.xlsx differ 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..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 @@ -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 @@ -311,4 +318,37 @@ ORDER BY u.create_time DESC + + + 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-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java index 9a05b57c4..2b6e76767 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletCodeBizEnum.java @@ -15,6 +15,7 @@ public enum WalletCodeBizEnum { SUPERMARKET_RESERVE("4", "超市线上预订"), USER_WALLET("5", "用户钱包二维码"), FARMER_RESERVE("6", "用户钱包二维码"), + ACT("6", "活动二维码"), ; private final String code; 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); } } 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/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/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..15072eb4e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActCouponValidTypeEnum.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 ActCouponValidTypeEnum { + FIXED_DATE("1", "固定日期"), + AFTER_RECEIVE("2", "领取后生效"), + AFTER_RECEIVE_CURRENT_MONTH("3", "领取后当月"), + ; + 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/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..8d70c522e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/act/ActUserReceiveEnum.java @@ -0,0 +1,44 @@ +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", "用户可以参加活动"), + + // 特殊 + PLEASE_RECEIVE_IN_BIRTH_MONTH("-100", "请在生日当月领取"), + PLEASE_FILL_BIRTH_DATE("-101", "请填写出生日期"), + ; + + 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/WalletTransactionDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTransactionDto.java index 76c8a076d..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 @@ -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 */ @@ -51,4 +58,10 @@ public class WalletTransactionDto extends WalletTransactionEntity implements Bas */ private Boolean isInclude; + + /** + * 金额区间 + */ + private List priceList; + } 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/ActComCancelDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActComCancelDto.java new file mode 100644 index 000000000..28dc0f568 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActComCancelDto.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.wallet.api.dto.act; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class ActComCancelDto { + + /** + * 活动子id + */ + @NotNull(message = "活动子id不能为空") + private Long actItemId; + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空") + private Long userId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 活动抵扣金额 + */ + private Integer useAmountPrice; + +} 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/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/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..acd9e4e21 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/act/ActCouponRecordDto.java @@ -0,0 +1,21 @@ +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/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/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/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..14761bc2e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/act/ActCouponEntity.java @@ -0,0 +1,179 @@ +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; + + /** + * 优惠券活动唯一code + */ + @Schema(description = "优惠券活动唯一code") + private String uniqueCode; + + /** + * 绑定的通知id + */ + @Schema(description = "绑定的通知id") + private Long bindNotifyId; + + /** + * 优惠券名称 + */ + @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/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..7c1b22c68 --- /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; + + /** + * 使用状态(1:未使用2:已使用3:已过期4:已作废) + */ + @Schema(description = "使用状态(1:未使用2:已使用3:已过期4:已作废)") + 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/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/feign/RemoteCodeUseService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteCodeUseService.java index 92c8f9cca..9db4b75b2 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteCodeUseService.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteCodeUseService.java @@ -45,12 +45,6 @@ public interface RemoteCodeUseService { /** * 生成二维码 - * - * @param id - * @param userId - * @param walletCodeBiz - * @param count - * @return */ @NoToken @GetMapping("/wallet-code-use/generate-code") diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteComActService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteComActService.java new file mode 100644 index 000000000..9905cd3d0 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteComActService.java @@ -0,0 +1,41 @@ +package com.bsd.pjcloud.wallet.api.feign; + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.wallet.api.dto.act.ActComCancelDto; +import com.bsd.pjcloud.wallet.api.vo.act.ActComItemVo; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient(contextId = "RemoteComActService", value = ServiceNameConstants.WALLET_SERVICE) +public interface RemoteComActService { + + /** + * 根据公告id查询对应的活动 + */ + @NoToken + @GetMapping("/act/com/remote/get-act") + R remoteGetComAct(@RequestParam Long actItemId, @RequestParam Long userId); + + /** + * 活动是否能够核销 + */ + @NoToken + @GetMapping("/act/com/remote/is-can-cancel") + R remoteIsCanCancel(@RequestParam Long actItemId, @RequestParam Long userId); + + /** + * 核销活动 + */ + @NoToken + @PostMapping("/act/com/remote/do-cancel") + R remoteDoCancel(@Validated @RequestBody ActComCancelDto body); + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletCodeUseVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletCodeUseVo.java index f3a2c34cc..d9ddb79fb 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletCodeUseVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletCodeUseVo.java @@ -7,6 +7,11 @@ import lombok.Data; @Data public class WalletCodeUseVo extends WalletCodeUseEntity implements BaseUserInterface { + /** + * 活动相关 + */ + private String actUniquecode; + /** * 用户相关 */ 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/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-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/act/ActComItemVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActComItemVo.java new file mode 100644 index 000000000..9b24dccf6 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActComItemVo.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.wallet.api.vo.act; + +import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum; +import lombok.Data; + +@Data +public class ActComItemVo { + + private String actType; + + private Long actItemId; + + private Long userId; + + private String username; + + private String userAvatar; + + private T detail; + +} 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..958d618fd --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/act/ActCouponRecordVo.java @@ -0,0 +1,30 @@ +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 implements BaseUserDeptInterface { + + /** + * 用户相关 + */ + private Long userId; + + private String username; + + private String userMobile; + + private String userAvatar; + + private Long userDeptId; + + private String userDeptName; + + /** + * 活动相关 + */ + private String actUniquecode; + +} 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-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-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-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-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-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-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index a4de33581..d05cc336d 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -8,4 +8,5 @@ com.bsd.pjcloud.wallet.api.feign.RemoteWalletRuleTransactionService com.bsd.pjcloud.wallet.api.feign.RemoteMchService com.bsd.pjcloud.wallet.api.feign.RemoteWalletSettingService com.bsd.pjcloud.wallet.api.feign.RemoteWalletThirdZyService -com.bsd.pjcloud.wallet.api.feign.RemoteWalletTransactionService \ No newline at end of file +com.bsd.pjcloud.wallet.api.feign.RemoteWalletTransactionService +com.bsd.pjcloud.wallet.api.feign.RemoteComActService \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletCodeUseController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletCodeUseController.java index c0ef1047b..d61004093 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletCodeUseController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletCodeUseController.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.wallet.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.common.security.service.PjcloudUser; @@ -9,6 +10,7 @@ import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum; import com.bsd.pjcloud.wallet.api.dto.WalletCodeUseDto; import com.bsd.pjcloud.wallet.api.entity.WalletCodeUseEntity; +import com.bsd.pjcloud.wallet.api.vo.WalletCodeUseVo; import com.bsd.pjcloud.wallet.service.WalletCodeUseService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -95,6 +97,17 @@ public class WalletCodeUseController { dto.setUserId(user.getId()); return R.ok(walletCodeUseService.pageJoin(page, dto)); } + + @Operation(summary = "查询二维码", description = "查询二维码") + @GetMapping("/app/user-code") + public R appUserCode(@RequestParam Long id) { + PjcloudUser user = SecurityUtils.getUser(); + WalletCodeUseEntity detail = walletCodeUseService.getOne(new LambdaQueryWrapper() + .eq(WalletCodeUseEntity::getBizId, id) + .eq(WalletCodeUseEntity::getUserId, user.getId()) + ); + return R.ok(detail); + } /* ************************************* end app end ************************************* */ /* ************************************* start android start ************************************* */ 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..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 @@ -14,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; @@ -100,6 +101,64 @@ 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); + } + 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)); + } + + @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); + } + if (ObjectUtil.isNotEmpty(dto.getPriceList())) { + dto.setPriceList(dto.getPriceList().stream().map(item -> item * 100).toList()); + } + 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) { + 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()); + } + 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) { @@ -191,7 +250,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 +263,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 +274,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 +287,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 +298,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 +310,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 +321,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 +334,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 +345,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 +358,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 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 new file mode 100644 index 000000000..0a5cc082d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActComController.java @@ -0,0 +1,92 @@ +package com.bsd.pjcloud.wallet.controller.act; + +import com.bsd.pjcloud.common.core.util.R; +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.ActTypeEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActComCancelDto; +import com.bsd.pjcloud.wallet.api.vo.act.ActComItemVo; +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; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 活动公用方法 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/act/com") +@Tag(description = "act-com", name = "活动公用方法") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ActComController { + + private final ActComService actComService; + + /* ************************************* start 远程调用 start ************************************* */ + @Operation(summary = "根据公告id查询对应的活动", description = "根据公告id查询对应的活动") + @GetMapping("/remote/get-act") + @Inner + public R remoteGetComAct(@RequestParam Long actItemId, @RequestParam Long userId) { + return R.ok(actComService.getComAct(actItemId, userId)); + } + + @Operation(summary = "活动是否能够核销", description = "活动是否能够核销") + @GetMapping("/remote/is-can-cancel") + @Inner + public R remoteIsCanCancel(@RequestParam Long actItemId, @RequestParam Long userId) { + return R.ok(actComService.actIsCanCancel(actItemId, userId)); + } + + @Operation(summary = "核销活动", description = "核销活动") + @PostMapping("/remote/do-cancel") + @Inner + public R remoteDoCancel(@Validated @RequestBody ActComCancelDto body) { + return R.ok(actComService.doCancel(body)); + } + /* ************************************* end 远程调用 end ************************************* */ + + + /* ************************************* start ad start ************************************* */ + @Operation(summary = "根据公告id查询对应的活动", description = "根据公告id查询对应的活动") + @GetMapping("/ad/get-act") + public R getComAct(@RequestParam Long actItemId, @RequestParam Long userId) { + return R.ok(actComService.getComAct(actItemId, userId)); + } + /* ************************************* end ad end ************************************* */ + + @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())); + } + + @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/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..6f0ee90a5 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponController.java @@ -0,0 +1,104 @@ +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.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; +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) { + return R.ok(actCouponService.pageJoin(page, dto)); + } + + /** + * 通过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.create(actCoupon)); + } + + /** + * 修改优惠券活动 + */ + @Operation(summary = "修改优惠券活动", description = "修改优惠券活动") + @SysLog("修改优惠券活动") + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_edit')") + public R updateById(@RequestBody ActCouponEntity actCoupon) { + actCouponService.modify(actCoupon); + return R.ok(); + } + + /** + * 通过id删除优惠券活动 + */ + @Operation(summary = "通过id删除优惠券活动", description = "通过id删除优惠券活动") + @SysLog("通过id删除优惠券活动") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_actCoupon_del')") + public R removeById(@RequestBody Long[] ids) { + actCouponService.delByIds(CollUtil.toList(ids)); + return R.ok(); + } + + /** + * 导出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/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..371eef0f5 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/act/ActCouponRecordController.java @@ -0,0 +1,113 @@ +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.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; +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("/act-coupon-record") +@Tag(description = "act-coupon-record", name = "优惠券领取记录表管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ActCouponRecordController { + + 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)); + } + + @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 ************************************* */ + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_actCouponRecord_view')") + public R> getActCouponRecordPage(@ParameterObject Page page, @ParameterObject ActCouponRecordDto dto) { + return R.ok(actCouponRecordService.pageList(page, dto)); + } + + + /** + * 通过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)); + } + + + /** + * 通过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/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/controller/recharge/WalletRechargeImportController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeImportController.java index 4f96418b2..4ae568f40 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeImportController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeImportController.java @@ -114,7 +114,7 @@ public class WalletRechargeImportController { @ResponseExcel @PostMapping("/export") - @PreAuthorize("@pms.hasPermission('wallet_walletRechargeImport_export')") + @PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_export')") public void export(HttpServletResponse response, @RequestBody WalletRechargeImportDto dto) throws IOException { DataScope dataScope = DataScope.of(); Long count = walletRechargeImportMapper.count(dto, dataScope); 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..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 @@ -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; @@ -36,6 +37,7 @@ 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); @@ -92,4 +96,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/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/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..a37075e4a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponMapper.java @@ -0,0 +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/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..137c34918 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/act/ActCouponRecordMapper.java @@ -0,0 +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/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..cda0073fc --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/view/MchDeptViewMapper.java @@ -0,0 +1,19 @@ +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); + + 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..6c6066779 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查询本店优惠券列表 */ @@ -32,8 +38,20 @@ public interface ActCancelItemService extends IService { */ Boolean cancel(ActCancelItemDto dto); + /** + * 活动是否能够核销 + */ + String actIsCanCancel(ActCancelItemDto detail); + /** * 查询详情 */ ActCancelItemVo getDetail(Long cancelId); + + ActCancelItemVo getDetail(Long actItemId, 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/ActComService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java new file mode 100644 index 000000000..8c986330a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActComService.java @@ -0,0 +1,48 @@ +package com.bsd.pjcloud.wallet.service; + + +import com.bsd.pjcloud.wallet.api.constant.act.ActTypeEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActComCancelDto; +import com.bsd.pjcloud.wallet.api.vo.act.ActComItemVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActSimpleNotfiyVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActUserTotalVo; + +public interface ActComService { + + /** + * 获取活动 + */ + ActComItemVo getComAct(Long actId, Long userId); + + /** + * 活动是否能够核销 + * + * @return 错误信息 + */ + String actIsCanCancel(Long actItemId, Long userId); + + /** + * 核销活动 + */ + Boolean doCancel(ActComCancelDto body); + + /** + * 根据公告id查询对应的活动 + */ + ActSimpleNotfiyVo getActByNotifyId(Long notifyId); + + /** + * 获取活动详情 + */ + ActSimpleNotfiyVo getActDetail(ActTypeEnum actType, Long actId); + + /** + * 判断用户是否可以参加活动 + */ + 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/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 new file mode 100755 index 000000000..dea669ffe --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponRecordService.java @@ -0,0 +1,52 @@ +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.ActCouponEntity; +import com.bsd.pjcloud.wallet.api.entity.act.ActCouponRecordEntity; +import com.bsd.pjcloud.wallet.api.vo.act.ActCouponRecordVo; + +import java.util.List; + +public interface ActCouponRecordService extends IService { + + /** + * 分页查询 + */ + Page pageList(Page page, ActCouponRecordDto dto); + + /** + * 查询详情 + */ + ActCouponRecordEntity getDetail(Long actItemId, Long userId); + + /** + * 领取优惠券 + */ + Long appReceive(ActCouponReceiveDto dto); + + /** + * 核销优惠券 + * + * @param useAmountPrice 优惠券抵消的金额 + */ + void cancel(ActCouponRecordEntity dto, Long orderId, Integer useAmountPrice); + + /** + * 活动是否能够核销 + */ + String actIsCanCancel(ActCouponRecordEntity detail); + + /** + * 判断用户是否可以参加活动 + */ + 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/ActCouponService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java new file mode 100755 index 000000000..1748266ce --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/ActCouponService.java @@ -0,0 +1,44 @@ +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; +import java.util.List; + +public interface ActCouponService extends IService { + + /** + * 分页查询 + */ + Page pageJoin(Page page, ActCouponDto dto); + + /** + * 根据actIdList查询活动 + */ + List getByIdList(List actIdList); + + /** + * 新增优惠券 + */ + 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/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/WalletTransactionService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java index bfc27c7d1..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 @@ -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,14 @@ public interface WalletTransactionService extends IService list); + + /** + * 后台充值统计(导出) + */ + void exportCzTotal(HttpServletResponse response, WalletTransactionDto dto, DataScope dataScope); + + /** + * 后台充值统计按照个人(导出) + */ + void exportCzTotalPerson(HttpServletResponse response, WalletTransactionDto dto, Object o); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java index 1206e5513..42eb4e586 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java @@ -104,6 +104,10 @@ public class WalletCodeUseServiceImpl extends ServiceImpl= 100 * 100) { return null; } 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..7369a6f21 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,25 +17,32 @@ 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; 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.WalletTypeCountVo; -import com.bsd.pjcloud.wallet.api.vo.WalletTypeTotalVo; +import com.bsd.pjcloud.wallet.api.vo.*; +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 +81,9 @@ public class WalletTransactionServiceImpl extends ServiceImpl pageCzTotalList(WalletTransactionDto dto, DataScope dataScope) { + List resultList = new ArrayList<>(); + // 查询食堂 + MchManageDto mchQueryDto = MchManageDto.builder().typesList(List.of(MerchantTypeEnum.CANTEEN.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 +350,93 @@ 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()); + } + } + + /** + * 后台充值统计按照个人(导出) + */ + @Override + public void exportCzTotalPerson(HttpServletResponse response, WalletTransactionDto dto, Object o) { + String fileName = "file/个人充值统计800、1600、2400.xlsx"; + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream(fileName)).build()) { + // 查询导出数据 + List 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/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..be5cc0dcd 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,7 +17,9 @@ 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; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; @@ -66,6 +70,8 @@ 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查询本店优惠券列表 */ @@ -268,6 +299,35 @@ public class ActCancelItemServiceImpl extends ServiceImpl() + .eq(ActCancelItemEntity::getId, cancelId) + .eq(ActCancelItemEntity::getReceiverUserId, userId) + ); + if (ObjectUtil.isEmpty(detail)) return null; + result = BeanUtils.toBean(detail, ActCancelItemVo.class); + // 查询活动 + ActCancelEntity actDetail = actCancelMapper.selectById(detail.getActId()); + if (ObjectUtil.isNotEmpty(actDetail)) { + result.setActiveCancelPrice(actDetail.getActiveCancelPrice()); + } + result.setActStartTime(actDetail.getStartTime()); + result.setActExpireTime(actDetail.getExpireTime()); + return result; + } + + /** + * 用户参加活动的数量统计 + */ + @Override + public Long userTotal(Long userId) { + return baseMapper.userTotal(userId, List.of(ActCancelStatusEnum.CANCEL_AWAIT.getCode())); + } + + // 判断用户是否已领取 private boolean existAct(Long userId, Long actId) { Long count = baseMapper.selectCount(new LambdaQueryWrapper() .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 new file mode 100644 index 000000000..60471484a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActComServiceImpl.java @@ -0,0 +1,204 @@ +package com.bsd.pjcloud.wallet.service.impl.act; + +import cn.hutool.core.util.ObjectUtil; +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.wallet.api.constant.act.ActTypeEnum; +import com.bsd.pjcloud.wallet.api.constant.act.ActUserReceiveEnum; +import com.bsd.pjcloud.wallet.api.dto.act.ActCancelItemDto; +import com.bsd.pjcloud.wallet.api.dto.act.ActComCancelDto; +import com.bsd.pjcloud.wallet.api.entity.act.ActCancelEntity; +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.act.ActCancelItemVo; +import com.bsd.pjcloud.wallet.api.vo.act.ActComItemVo; +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; +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; + + private final RemoteUserService remoteUserService; + + /** + * 获取活动 + */ + @Override + public ActComItemVo getComAct(Long actItemId, Long userId) { + ActComItemVo result = new ActComItemVo<>(); + List actEnumList = ActTypeEnum.sortList(); + for (ActTypeEnum act : actEnumList) { + if (ObjectUtil.equals(act, ActTypeEnum.CANCEL_ACT)) { + ActCancelItemVo detail = actCancelItemService.getDetail(actItemId, userId); + if (ObjectUtil.isNotEmpty(detail)) { + result.setActItemId(detail.getId()); + result.setActType(act.getCode()); + result.setDetail(detail); + break; + } + } + if (ObjectUtil.equals(act, ActTypeEnum.COUPON_ACT)) { + ActCouponRecordEntity detail = actCouponRecordService.getDetail(actItemId, userId); + if (ObjectUtil.isNotEmpty(detail)) { + result.setActItemId(detail.getId()); + result.setActType(act.getCode()); + result.setDetail(detail); + break; + } + } + } + if (ObjectUtil.isEmpty(result)) return null; + // 查询用户 + UserInfo userInfo = remoteUserService.getInnerByUserId(userId).getData(); + if (ObjectUtil.isNotEmpty(userInfo)) { + SysUser sysUser = userInfo.getSysUser(); + result.setUserId(sysUser.getUserId()); + result.setUsername(sysUser.getName()); + result.setUserAvatar(sysUser.getAvatar()); + return result; + } + return null; + } + + /** + * 活动是否能够核销 + * + * @return 错误信息 + */ + @Override + public String actIsCanCancel(Long actItemId, Long userId) { + ActComItemVo comAct = getComAct(actItemId, userId); + ActTypeEnum actType = ActTypeEnum.valueOfByType(comAct.getActType()); + switch (actType) { + case CANCEL_ACT: + return actCancelItemService.actIsCanCancel((ActCancelItemDto) comAct.getDetail()); + case COUPON_ACT: + return actCouponRecordService.actIsCanCancel((ActCouponRecordEntity) comAct.getDetail()); + } + return null; + } + + /** + * 核销活动 + */ + @Override + public Boolean doCancel(ActComCancelDto body) { + ActComItemVo comAct = getComAct(body.getActItemId(), body.getUserId()); + ActTypeEnum actType = ActTypeEnum.valueOfByType(comAct.getActType()); + switch (actType) { + case CANCEL_ACT: + actCancelItemService.cancel((ActCancelItemDto) comAct.getDetail()); + return true; + case COUPON_ACT: + actCouponRecordService.cancel((ActCouponRecordEntity) comAct.getDetail(), body.getOrderId(), body.getUseAmountPrice()); + return true; + } + return false; + } + + /** + * 根据公告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(); + } + + /** + * 用户参加活动的数量统计 + */ + @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 new file mode 100755 index 000000000..396da99cd --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponRecordServiceImpl.java @@ -0,0 +1,257 @@ +package com.bsd.pjcloud.wallet.service.impl.act; + +import cn.hutool.core.collection.IterUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSON; +import cn.hutool.json.JSONUtil; +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.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.wallet.api.constant.WalletBizEnum; +import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +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.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; +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; +import com.bsd.pjcloud.wallet.mapper.act.ActCouponRecordMapper; +import com.bsd.pjcloud.wallet.service.*; +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.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + +/** + * 优惠券领取记录表 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class ActCouponRecordServiceImpl extends ServiceImpl implements ActCouponRecordService { + + private static final String TAG = "优惠券活动"; + + private final ActCouponMapper actCouponMapper; + private final WalletTransactionMapper walletTransactionMapper; + + private final MchManageService mchManageService; + + private final ActCouponComUtilService actCouponComUtilService; + private final ActCouponService actCouponService; + private final WalletManageService walletManageService; + private final WalletCodeUseService walletCodeUseService; + + private final RemoteUserService remoteUserService; + + /** + * 分页查询 + */ + @Override + public Page pageList(Page page, ActCouponRecordDto dto) { + Page pageList = baseMapper.pageList(page, dto); + disposePageList(pageList.getRecords()); + return pageList; + } + + /** + * 查询详情 + */ + @Override + public ActCouponRecordEntity getDetail(Long actItemId, Long userId) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(ActCouponRecordEntity::getId, actItemId) + .eq(ActCouponRecordEntity::getUserId, userId) + .orderByDesc(ActCouponRecordEntity::getCreateTime) + .orderByDesc(ActCouponRecordEntity::getId) + .last("limit 1") + ); + } + + /** + * 领取优惠券 + */ + @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); + // 6. 生成核销二维码 + walletCodeUseService.generate(record.getId(), record.getUserId(), WalletCodeBizEnum.ACT, 1); + return record.getId(); + } + + /** + * 核销优惠券 + */ + @Override + public void cancel(ActCouponRecordEntity dto, Long orderId, Integer useAmountPrice) { + // 1. 获取当前用户 + UserInfo userInfo = remoteUserService.getInnerByUserId(dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + throw new ServiceException("用户不存在"); + } + SysUser sysUser = userInfo.getSysUser(); + ActCouponRecordEntity record = getDetail(dto.getId(), dto.getUserId()); + if (ObjectUtil.isEmpty(record)) { + throw new ServiceException("优惠券不存在"); + } + // 2. 预处理 + ActCouponRecordEntity actCouponEntity = actCouponComUtilService.preCancel(record); + if (ObjectUtil.isEmpty(actCouponEntity)) { + throw new ServiceException("优惠券不存在"); + } + // 3. 执行核销逻辑 + actCouponComUtilService.doCancel(actCouponEntity.getId(), orderId, useAmountPrice); + // 4. 优惠券核销成功后,执行生命周期方法 + actCouponComUtilService.afterCancel(actCouponEntity); + // 5. 核销短码 + walletCodeUseService.cancelCode(actCouponEntity.getId()); + } + + /** + * 活动是否能够核销 + */ + @Override + public String actIsCanCancel(ActCouponRecordEntity detail) { + return actCouponComUtilService.actIsCanCancel(detail); + } + + public ActUserReceiveEnum specialCoupon(ActCouponEntity actCouponEntity, SysUser sysUser) { + String uniqueCode = actCouponEntity.getUniqueCode(); + // 食堂生日券 + if (ObjectUtil.equals(uniqueCode, "1qRgFo")) { + // 判断是否为食堂用户 + MchManageVo userMch = mchManageService.getFirstMchByDeptId(sysUser.getDeptId(), List.of(MerchantTypeEnum.CANTEEN)); + if (ObjectUtil.isEmpty(userMch)) { + log.info("|{}|{}用户参加{}活动失败:不是食堂用户,用户属于食堂{}", TAG, sysUser.getName(), uniqueCode, JSONUtil.toJsonStr(userMch)); + return ActUserReceiveEnum.USER_CANNOT_PARTICIPATE; + } + // 判断用户最近一年充值是否为500,1500,800,2400 + WalletManageEntity userWallet = walletManageService.getWallet(sysUser.getUserId(), WalletTypeEnum.EAT); + + WalletTransactionDto dto = new WalletTransactionDto(); + dto.setWalletId(userWallet.getId()); + dto.setBizTypes(WalletBizEnum.getTopUpCodes()); + dto.setType(WalletTransactionDto.TYPE_INCOME); + dto.setUserId(sysUser.getUserId()); + dto.setPriceList(List.of(500 * 100, 1500 * 100, 800 * 100, 2400 * 100)); + dto.setCreateTimeList(new LocalDate[]{ + LocalDate.now().minusMonths(4), + LocalDate.now().plusDays(1) + }); + List walletList = walletTransactionMapper.scopeList(dto, null); + if (ObjectUtil.isEmpty(walletList)) { + log.info("|{}|{}用户参加{}活动失败:用户最近一年充值金额不足500,1500,800,2400", TAG, sysUser.getName(), uniqueCode); + return ActUserReceiveEnum.USER_CANNOT_PARTICIPATE; + } + // 要在生日当月领取 + LocalDate birthday = sysUser.getBirthday(); + if (ObjectUtil.isEmpty(birthday)) { + log.info("|{}|{}用户参加{}活动失败:请填写生日", TAG, sysUser.getName(), uniqueCode); + return ActUserReceiveEnum.PLEASE_FILL_BIRTH_DATE; + } + if (ObjectUtil.notEqual(LocalDate.now().getMonth().getValue(), birthday.getMonth().getValue())) { + log.info("|{}|{}用户参加{}活动成功:在生日当月领取", TAG, sysUser.getName(), uniqueCode); + return ActUserReceiveEnum.PLEASE_RECEIVE_IN_BIRTH_MONTH; + } + 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)) { + ActUserReceiveEnum specialCouponStatus = specialCoupon(actCouponEntity, userInfo.getSysUser()); + if (ObjectUtil.isNotEmpty(specialCouponStatus)) { + userReceiveEnum = specialCouponStatus; + } + } + } + return userReceiveEnum; + } + + /** + * 用户参加活动的数量统计 + */ + @Override + public Long userTotal(Long userId) { + return baseMapper.userTotal(userId, List.of(ActCouponRecordStatusEnum.UNUSED.getCode())); + } + + private void disposePageList(List 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)); + } + } + // 活动 + List actIdList = list.stream().map(ActCouponRecordVo::getCouponId).distinct().toList(); + if (ObjectUtil.isNotEmpty(actIdList)) { + List actList = actCouponService.getByIdList(actIdList); + if (ObjectUtil.isNotEmpty(actList)) { + Map actCouponMap = IterUtil.toMap(actList, ActCouponEntity::getId); + for (ActCouponRecordVo v : list) { + ActCouponEntity targetMap = actCouponMap.get(v.getCouponId()); + if (ObjectUtil.isEmpty(targetMap)) continue; + v.setActUniquecode(targetMap.getUniqueCode()); + } + } + } + } + +} \ 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..eff759618 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/act/ActCouponServiceImpl.java @@ -0,0 +1,101 @@ +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); + } + + /** + * 根据actIdList查询活动 + */ + @Override + public List getByIdList(List actIdList) { + return baseMapper.selectList(new LambdaQueryWrapper() + .in(ActCouponEntity::getId, actIdList) + ); + } + + /** + * 新增优惠券 + */ + @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/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 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 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..41795e88e --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/act/service/ActCouponComUtilService.java @@ -0,0 +1,267 @@ +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)); + } + // 3-领取的当月 + if (ObjectUtil.equals(ActCouponValidTypeEnum.AFTER_RECEIVE_CURRENT_MONTH.getCode(), coupon.getValidType())) { + record.setStartTime(LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atTime(LocalTime.MIN)); + record.setEndTime(LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).atTime(23, 59, 59)); + } + actCouponRecordMapper.insert(record); + return record; + } + + /** + * 领取优惠券后的处理 + */ + @Override + public void afterReceive(ActCouponRecordEntity record) { + + } + + /** + * 核销前的校验 + */ + @Override + public ActCouponRecordEntity preCancel(ActCouponRecordEntity record) { + ActCouponRecordEntity couponRecord = actCouponRecordMapper.selectById(record.getId()); + String error = actIsCanCancel(record); + if (ObjectUtil.isNotEmpty(error)) { + throw new RuntimeException(error); + } + return couponRecord; + } + + public void doCancel(Long couponRecordId, Long orderId, int useAmountPrice) { + 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(useAmountPrice); + actCouponRecordMapper.updateById(updateObj); + } + + /** + * 核销后的处理 + */ + @Override + public void afterCancel(ActCouponRecordEntity record) { + + } + + /** + * 活动是否能够核销 + */ + public String actIsCanCancel(ActCouponRecordEntity couponRecord) { + if (ObjectUtil.isEmpty(couponRecord)) { + return "优惠券不存在"; + } + // 基本校验:状态是否可用 + if (ObjectUtil.notEqual(ActCouponRecordStatusEnum.UNUSED.getCode(), couponRecord.getStatus())) { + return "优惠券不可用"; + } + // 校验有效期 + LocalDateTime now = LocalDateTime.now(); + if (ObjectUtil.isNotEmpty(couponRecord.getStartTime()) && now.isBefore(couponRecord.getStartTime())) { + return "优惠券尚未生效"; + } + if (ObjectUtil.isNotEmpty(couponRecord.getEndTime()) && now.isAfter(couponRecord.getEndTime())) { + return "优惠券已过期"; + } + return null; + } + + /** + * 查询用户是否可以参加活动 + */ + 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-hardware/pjcloud-hardware-biz/src/main/resources/file/支付方式交易汇总.xlsx b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人充值统计800、1600、2400.xlsx similarity index 68% rename from pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/支付方式交易汇总.xlsx rename to pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人充值统计800、1600、2400.xlsx index 95ad4b2bd..c909ca48e 100644 Binary files a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/支付方式交易汇总.xlsx and b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/个人充值统计800、1600、2400.xlsx differ 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 000000000..e60c10991 Binary files /dev/null and b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/充值或扣款申请.xlsx differ 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 000000000..0f6a7eaf2 Binary files /dev/null and b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/钱包充值统计.xlsx differ 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..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 @@ -47,6 +47,15 @@ and a.dept_id = #{dto.deptId} + + and a.price = #{dto.price} + + + and a.price in + + #{v} + + and a.price > 0 @@ -68,6 +77,12 @@ and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} + + and a.dept_id IN + + #{v} + + @@ -224,7 +239,7 @@ + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCancelItemMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCancelItemMapper.xml index 8c91d93d1..d3ba1c7b6 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCancelItemMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCancelItemMapper.xml @@ -62,4 +62,18 @@ group by a.act_id + + \ 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..efd7f5cd0 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponMapper.xml @@ -0,0 +1,54 @@ + + + + + + select a.id, + a.unique_code, + a.bind_notify_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} + + + and a.status = #{dto.status} + + + + + \ 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 new file mode 100755 index 000000000..863e03875 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/act/ActCouponRecordMapper.xml @@ -0,0 +1,76 @@ + + + + + + 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 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..e1a143647 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/view/MchDeptViewMapper.xml @@ -0,0 +1,57 @@ + + + + + + + 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 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 diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeImportMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeImportMapper.xml index 72b3155c4..92fbfbb38 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeImportMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeImportMapper.xml @@ -113,7 +113,7 @@