diff --git a/db/1schema.sql b/db/1schema.sql index 982376e44..c9fef6a74 100644 --- a/db/1schema.sql +++ b/db/1schema.sql @@ -33,6 +33,6 @@ create database `pjcloudx_thirdparty` default character set utf8mb4 collate utf8 create database `pjcloudx_canteen` default character set utf8mb4 collate utf8mb4_general_ci; create database `pjcloudx_erp` default character set utf8mb4 collate utf8mb4_general_ci; create database `pjcloudx_supermarket` default character set utf8mb4 collate utf8mb4_general_ci; -create database `pjcloudx_supermarket_erp` default character set utf8mb4 collate utf8mb4_general_ci; +create database `pjcloudx_integrated` default character set utf8mb4 collate utf8mb4_general_ci; create database `pjcloudx_wallet` default character set utf8mb4 collate utf8mb4_general_ci; create database `pjcloudx_hardware` default character set utf8mb4 collate utf8mb4_general_ci; diff --git a/db/800pjcloudx_hardware.sql b/db/800pjcloudx_hardware.sql index 416b038d5..e5f62a7c3 100644 --- a/db/800pjcloudx_hardware.sql +++ b/db/800pjcloudx_hardware.sql @@ -52,11 +52,13 @@ CREATE TABLE hard_door_manager power_status int DEFAULT NULL COMMENT '1:通电;2:断电', net_status int DEFAULT NULL COMMENT '在线状态。1:在线;2:离线', sale_status int DEFAULT NULL COMMENT '售卖状态。1:在售;2:停售', + sim_sn varchar(32) NOT NULL COMMENT 'sim 卡号。设备有上报会返回,若一次上报都没有,则返回 null', signal_intensity int DEFAULT NULL COMMENT 'sim 信号强度。大于-95 表示信号强度好;-95 到-105 表示信号强度中等;小于-105 表示信号差;', signal_ratio int DEFAULT NULL COMMENT '信噪比,体现信道传输质量的参数。大于 15 表示质量好;15 到 0 表示质量中等;小于等于 0 表示质量差;', - signal_time int DEFAULT NULL COMMENT 'sim 信号值更新时间。yyyy-MM-dd HH:mm:ss', - cabinet_list text DEFAULT NULL COMMENT '货柜列表JSON', + signal_time datetime DEFAULT NULL COMMENT 'sim 信号值更新时间。yyyy-MM-dd HH:mm:ss', restart_time datetime DEFAULT NULL COMMENT '上次重启时间', + system_volume int DEFAULT 0 COMMENT '系统音量', + media_volume 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 '修改人', @@ -68,6 +70,87 @@ CREATE TABLE hard_door_manager DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT ='柜子设备管理'; +-- ---------------------------- +-- Table structure for hard_door_cabinet +-- ---------------------------- +DROP TABLE IF EXISTS `hard_door_cabinet`; +CREATE TABLE hard_door_cabinet +( + id bigint NOT NULL COMMENT '编号', + hard_door_id bigint NOT NULL COMMENT '智能柜编号', + cabinet_no int NOT NULL COMMENT '货柜编号(1,2)', + is_lock_online varchar(16) NOT NULL COMMENT '锁在线1:在线;2:离线;', + lock_status int NOT NULL COMMENT '锁状态1:开锁;2:关锁;', + door_status int NOT NULL COMMENT '门状态1:门关;2:门开', + sale_status int NOT NULL COMMENT '货柜售卖状态1:在售;2:停售', + qr_code varchar(256) 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) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci COMMENT ='智能柜货柜'; + +-- ---------------------------- +-- Table structure for hard_door_flow +-- ---------------------------- +DROP TABLE IF EXISTS `hard_door_flow`; +CREATE TABLE hard_door_flow +( + id bigint NOT NULL COMMENT '编号', + user_id bigint NOT NULL COMMENT '用户编号', + biz_type varchar(32) NOT NULL COMMENT '业务类型', + hard_id bigint DEFAULT NULL COMMENT '硬件id', + hard_door_id bigint DEFAULT NULL COMMENT '智能柜id', + cabinet_no int DEFAULT NULL COMMENT '货柜编号', + order_id bigint DEFAULT NULL COMMENT '订单编号', + auth_id bigint DEFAULT NULL COMMENT '授权编号', + # 请求开门 + request_open_dto text DEFAULT NULL COMMENT '请求开门参数', + request_open_vo text DEFAULT NULL COMMENT '请求开门返回', + request_open_time datetime DEFAULT NULL COMMENT '请求开门时间', + # 请求开门回调 + is_open varchar(32) DEFAULT NULL COMMENT '是否开门', + open_callback_time datetime DEFAULT NULL COMMENT '开门回调时间', + open_callback_vo text DEFAULT NULL COMMENT '开门回调结果', + # 视频回调 + video_callback_vo text DEFAULT NULL COMMENT '视频回调结果', + video_callback_time datetime DEFAULT NULL COMMENT '视频回调时间', + # sku识别 + sku_submit_dto text DEFAULT NULL COMMENT 'sku识别提交参数', + sku_submit_vo text DEFAULT NULL COMMENT 'sku识别提交结果', + sku_submit_recog_id varchar(32) DEFAULT NULL COMMENT 'sku识别提交id(用于查询)', + sku_submit_time datetime DEFAULT NULL COMMENT 'sku识别提交时间', + # sku识别回调 + sku_callback_vo text DEFAULT NULL COMMENT 'sku识别回调结果', + sku_callback_time datetime DEFAULT NULL COMMENT 'sku识别回调时间', + # sku主动获取 + sku_driving_dto text DEFAULT NULL COMMENT 'sku识别主动获取参数', + sku_driving_vo text DEFAULT NULL COMMENT 'sku识别主动获取结果', + sku_driving_time datetime DEFAULT NULL COMMENT 'sku识别主动获取时间', + # 流程相关 + flow_status varchar(32) DEFAULT NULL COMMENT '流程状态', + error text DEFAULT NULL COMMENT '流程错误信息', + error_desc varchar(64) DEFAULT NULL COMMENT '流程错误描述(展示)', + # 购买成功 + pay_time datetime 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) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci COMMENT ='柜子订单流程'; + -- ---------------------------- -- Table structure for hard_group -- ---------------------------- @@ -266,6 +349,7 @@ CREATE TABLE hard_broadcast user_id bigint NOT NULL COMMENT '预定用户', hard_id bigint NOT NULL COMMENT '硬件id', topic varchar(128) NOT NULL COMMENT 'mq主题', + biz_type varchar(64) NOT NULL COMMENT '关联业务类型', biz_id varchar(64) NOT NULL COMMENT '关联业务编号', title varchar(64) NOT NULL COMMENT '预定标题', content varchar(128) NOT NULL COMMENT '广播内容', @@ -283,26 +367,53 @@ CREATE TABLE hard_broadcast PRIMARY KEY (id) ) ENGINE = InnoDB COMMENT ='设备广播'; + +DROP TABLE IF EXISTS hard_appt; +CREATE TABLE hard_appt +( + id bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + title varchar(64) NOT NULL COMMENT '标题', + start_time time DEFAULT NULL COMMENT '开始时间', + end_time time DEFAULT NULL COMMENT '结束时间', + hour_type varchar(32) NOT NULL COMMENT '唯一标识', + sort int DEFAULT 0 NOT NULL COMMENT '排序', + status varchar(32) NOT NULL COMMENT '状态', + remark varchar(256) 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) +) ENGINE = InnoDB COMMENT ='设备预约管理'; + -- ---------------------------- -- Table structure for hard_auth -- ---------------------------- DROP TABLE IF EXISTS hard_auth; CREATE TABLE hard_auth ( - id bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - auth_type varchar(32) DEFAULT NULL COMMENT '授权类型如微信小程序、支付宝、浙政钉', - user_id bigint NOT NULL COMMENT '预定用户', - hard_id bigint NOT NULL COMMENT '硬件id', - auth_status char(1) DEFAULT '0' COMMENT '是否授权', - auth_time datetime DEFAULT NULL COMMENT '授权时间', - is_done char(1) DEFAULT '0' COMMENT '是否完成', - is_done_time datetime 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', + id bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + auth_type varchar(32) DEFAULT NULL COMMENT '授权类型如微信小程序、支付宝、浙政钉', + user_id bigint NOT NULL COMMENT '预定用户', + hard_id bigint NOT NULL COMMENT '硬件id', + cabinet_no int DEFAULT NULL COMMENT '货柜编号', + auth_status char(1) DEFAULT '0' COMMENT '是否授权', + auth_time datetime DEFAULT NULL COMMENT '授权时间', + is_done char(1) DEFAULT '0' COMMENT '是否完成', + is_done_time datetime DEFAULT NULL COMMENT '完成时间', + is_manual_change varchar(32) DEFAULT NULL COMMENT '是否人工处理', + manual_change_user_id bigint DEFAULT NULL COMMENT '人工处理用户id', + manual_change_time datetime DEFAULT NULL COMMENT '人工处理时间', + manual_change_remark varchar(128) DEFAULT NULL COMMENT '人工处理备注', + manual_change_pic 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) ) ENGINE = InnoDB COMMENT ='硬件授权'; @@ -313,9 +424,10 @@ DROP TABLE IF EXISTS hard_spu; CREATE TABLE hard_spu ( id bigint NOT NULL AUTO_INCREMENT COMMENT '编号', - spu_category_id bigint NOT NULL COMMENT '商品分类id', + spu_category_id bigint DEFAULT NULL COMMENT '商品分类id', name varchar(64) NOT NULL COMMENT '商品名', - pic varchar(256) NOT NULL COMMENT '商品图片', + cover varchar(256) NOT NULL COMMENT '商品封面图片', + pic varchar(1024) NOT NULL COMMENT '商品图片用于识别', price int NOT NULL COMMENT '单价(分)', sales_count int DEFAULT 0 NOT NULL COMMENT '销量', repertory_count int DEFAULT 0 NOT NULL COMMENT '库存', @@ -325,13 +437,16 @@ CREATE TABLE hard_spu specs_taste varchar(128) DEFAULT NULL COMMENT '规格-口味', specs_capacity varchar(128) DEFAULT NULL COMMENT '规格-容量', specs_weight varchar(128) DEFAULT NULL COMMENT '规格-重量', - sku_type varchar(32) DEFAULT NULL COMMENT 'sku类型,0:标准库;1:私有库 ', + sku_type varchar(32) DEFAULT NULL COMMENT 'sku类型,0:标准库;1:私有库', + ks_sku_id varchar(32) DEFAULT NULL COMMENT '旷世skuid', + ks_res_sku_id varchar(32) DEFAULT NULL COMMENT '旷世返回的业务方sku_id', ks_barcode varchar(32) DEFAULT NULL COMMENT '69码', ks_has_sub_sku varchar(128) DEFAULT NULL COMMENT '是否为集合SKU', - ks_sub_sku text DEFAULT NULL COMMENT '集合SKU的子SKU信息', + ks_sub_sku_json text DEFAULT NULL COMMENT '集合SKU的子SKU信息JSON', ks_status char(1) DEFAULT NULL COMMENT '旷世审核状态', ks_status_title varchar(64) DEFAULT NULL COMMENT '旷世审核状态标题', ks_comments varchar(512) DEFAULT NULL COMMENT '旷世审核状态描述', + version int DEFAULT 0 NOT 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 '修改人', @@ -352,6 +467,9 @@ CREATE TABLE hard_spu_join cabinet_no varchar(32) DEFAULT NULL COMMENT '货柜编号', spu_id bigint DEFAULT NULL COMMENT '商品id', hard_door_number int DEFAULT NULL COMMENT '商品放置层数', + version bigint DEFAULT 0 COMMENT '乐观锁', + sales_count bigint DEFAULT 0 COMMENT '销量', + repertory_count bigint NOT NULL 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 '修改人', @@ -389,10 +507,12 @@ CREATE TABLE hard_spu_repertory ( id bigint NOT NULL AUTO_INCREMENT COMMENT '编号', user_id bigint NOT NULL COMMENT '用户id', - hard_id bigint NOT NULL COMMENT '设备id', + hard_door_id bigint NOT NULL COMMENT '智能柜编号', + cabinet_no int NOT NULL COMMENT '货柜编号(1,2)', spu_id bigint NOT NULL COMMENT '商品id', before_count int NOT NULL COMMENT '更新前的库存数量', count int DEFAULT 0 COMMENT '更新库存数量', + biz_id bigint DEFAULT NULL COMMENT '上架业务关联id', biz_type tinytext NOT NULL COMMENT '上架类型', create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', create_time datetime DEFAULT NULL COMMENT '创建时间', diff --git a/db/800pjcloudx_wallet.sql b/db/800pjcloudx_wallet.sql index e32f569cb..292582a18 100644 --- a/db/800pjcloudx_wallet.sql +++ b/db/800pjcloudx_wallet.sql @@ -1,5 +1,35 @@ create database `pjcloudx_wallet` default character set utf8mb4 collate utf8mb4_general_ci; +-- ---------------------------- +-- Table structure for sys_user_transaction +-- ---------------------------- +DROP TABLE IF EXISTS sys_user_transaction; +CREATE TABLE `sys_user_transaction` +( + id bigint NOT NULL COMMENT '编号', + user_id bigint NOT NULL COMMENT '用户id', + biz_id bigint DEFAULT NULL COMMENT '业务id', + biz_type varchar(32) NOT NULL COMMENT '业务类型', + # 岗位调动字段 + source_dept_id bigint DEFAULT NULL COMMENT '源部门id', + target_dept_id bigint DEFAULT NULL COMMENT '目标部门id', + # 离职字段 + is_wallet_transaction varchar(32) DEFAULT NULL COMMENT '是否离职自动转账', + wallet_transaction_time datetime DEFAULT NULL COMMENT '离职自动转账时间', + # 审批字读 + process_id varchar(256) DEFAULT NULL COMMENT '流程id', + process_status varchar(10) DEFAULT NULL COMMENT '审核状体', + process_time datetime 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) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci COMMENT ='人员调动表'; -- ---------------------------- -- Table structure for sys_user_face @@ -415,6 +445,7 @@ CREATE TABLE wallet_code_use status char(1) DEFAULT '0' NOT NULL COMMENT '是否使用', code varchar(1024) DEFAULT NULL COMMENT '二维码', code_content varchar(1024) DEFAULT NULL COMMENT '二维码内容', + short_code varchar(32) DEFAULT '' COMMENT '短码', use_time timestamp NULL COMMENT '使用时间', create_by varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', create_time datetime DEFAULT NULL COMMENT '创建时间', diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/CanteenDailyMenuCVDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/CanteenDailyMenuCVDTO.java new file mode 100644 index 000000000..e0972f257 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/CanteenDailyMenuCVDTO.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.canteen.dto; + + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; +import java.util.List; + +@Data +public class CanteenDailyMenuCVDTO { + + /** + * 原商户id + */ + @NotNull + private Long sourceMerchantId; + + + /** + * 目标商户id + */ + @NotNull + private List targetMerchantId; + + + + @Schema(description = "开始时间") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @NotNull + private LocalDate startTime; +} diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenDailyMenuController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenDailyMenuController.java index fe0e6deaf..65368d40b 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenDailyMenuController.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenDailyMenuController.java @@ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil; 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.canteen.dto.CanteenDailyMenuCVDTO; import com.bsd.pjcloud.canteen.dto.DailyMenuAll; import com.bsd.pjcloud.canteen.dto.app.DailyMenuDTO; import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; @@ -108,6 +109,14 @@ public class CanteenDailyMenuController { return R.ok(canteenDailyMenuService.updateById(canteenDailyMenu)); } + + @Operation(summary = "一键复制", description = "一键复制") + @SysLog("一键复制") + @PostMapping("/cv") + @PreAuthorize("@pms.hasPermission('canteen_canteenDailyMenu_add')") + public R cv(@RequestBody CanteenDailyMenuCVDTO creenDailyMenuCVDTO) { + return canteenDailyMenuService.cv(creenDailyMenuCVDTO); + } /** * 通过id删除每日菜谱 * @@ -214,4 +223,7 @@ public class CanteenDailyMenuController { } return R.ok(canteenDailyMenuService.selectTimeFood(time, merchantId, categoryId)); } + + + } \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSpuController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSpuController.java index 5f2f7033e..bc238cb9f 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSpuController.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSpuController.java @@ -54,11 +54,7 @@ public class CanteenSpuController { @GetMapping("/page") @PreAuthorize("@pms.hasPermission('canteen_canteenSpu_view')") public R getCanteenSpuPage(@ParameterObject Page page, @ParameterObject CanteenSpuEntity canteenSpu) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.like(StrUtil.isNotBlank(canteenSpu.getName()), CanteenSpuEntity::getName, canteenSpu.getName()); - wrapper.eq(Objects.nonNull(canteenSpu.getCategoryId()), CanteenSpuEntity::getCategoryId, canteenSpu.getCategoryId()); - wrapper.orderByAsc(CanteenSpuEntity::getSort); - return R.ok(canteenSpuService.pageScope(page, wrapper)); + return R.ok(canteenSpuService.pageScope(page, canteenSpu)); } diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenDailyMenuMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenDailyMenuMapper.java index 5cecab07f..dcc9b3c59 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenDailyMenuMapper.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenDailyMenuMapper.java @@ -1,7 +1,10 @@ package com.bsd.pjcloud.canteen.mapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.canteen.dto.app.DailyMenuDTO; import com.bsd.pjcloud.canteen.vo.ADCanteenDailyMenuListVO; import com.bsd.pjcloud.canteen.vo.DailyMenuVO; +import com.bsd.pjcloud.canteen.vo.app.DailyMenuAppVO; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.canteen.entity.CanteenDailyMenuEntity; @@ -27,4 +30,8 @@ public interface CanteenDailyMenuMapper extends PjcloudBaseMapper getCanteenMenuList(@Param("day") String day, @Param("hourType") Integer hourType, @Param("categoryId") Long categoryId, @Param("merchantId") Long merchantId,DataScope dataScope); + + + + Page selectTimeFoodPage(@Param("page")Page page, DailyMenuDTO dailyMenuDTO); } \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenDailyMenuService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenDailyMenuService.java index 492f360e3..90b7be021 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenDailyMenuService.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenDailyMenuService.java @@ -2,10 +2,12 @@ package com.bsd.pjcloud.canteen.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.dto.CanteenDailyMenuCVDTO; import com.bsd.pjcloud.canteen.dto.DailyMenuAll; import com.bsd.pjcloud.canteen.dto.app.DailyMenuDTO; import com.bsd.pjcloud.canteen.entity.CanteenDailyMenuEntity; import com.bsd.pjcloud.canteen.vo.ADCanteenDailyMenuListVO; +import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.security.service.PjcloudUser; import java.util.ArrayList; @@ -50,4 +52,12 @@ public interface CanteenDailyMenuService extends IService getCanteenMenuListScope(String day, Integer hourType, Long categoryId, Long merchantId); Page selectTimeFoodPage(Page page, DailyMenuDTO dailyMenuDTO); + + + /** + * 一键复制 + * @param creenDailyMenuCVDTO + * @return + */ + R cv(CanteenDailyMenuCVDTO creenDailyMenuCVDTO); } \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenSpuService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenSpuService.java index fdb3acefd..613151372 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenSpuService.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenSpuService.java @@ -38,10 +38,10 @@ public interface CanteenSpuService extends IService { /** * 分页查询 * @param page - * @param wrapper + * @param * @return */ - Object pageScope(Page page, LambdaQueryWrapper wrapper); + Object pageScope(Page page, CanteenSpuEntity canteenSpu); /** diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenDailyMenuServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenDailyMenuServiceImpl.java index 4a8a9c4ee..b631fb63a 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenDailyMenuServiceImpl.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenDailyMenuServiceImpl.java @@ -5,6 +5,7 @@ import com.alibaba.nacos.common.utils.CollectionUtils; 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.canteen.dto.CanteenDailyMenuCVDTO; import com.bsd.pjcloud.canteen.dto.DailyMenuAll; import com.bsd.pjcloud.canteen.dto.app.DailyMenuDTO; import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; @@ -99,30 +100,30 @@ public class CanteenDailyMenuServiceImpl extends ServiceImpl spuIds = Optional.ofNullable(canteenDailyMenu.getSpuIds()).orElse(Collections.emptyList()); - if (spuIds.isEmpty()) return; + List spuIds = Optional.ofNullable(canteenDailyMenu.getSpuIds()).orElse(Collections.emptyList()); + if (spuIds.isEmpty()) return; - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(CanteenDailyMenuEntity::getMerchantId, canteenDailyMenu.getMerchantId()) - .eq(CanteenDailyMenuEntity::getStartTime, canteenDailyMenu.getStartTime()) - .eq(CanteenDailyMenuEntity::getHourType, canteenDailyMenu.getHourType()) - .select(CanteenDailyMenuEntity::getSpuId); // 仅查询必要字段 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(CanteenDailyMenuEntity::getMerchantId, canteenDailyMenu.getMerchantId()) + .eq(CanteenDailyMenuEntity::getStartTime, canteenDailyMenu.getStartTime()) + .eq(CanteenDailyMenuEntity::getHourType, canteenDailyMenu.getHourType()) + .select(CanteenDailyMenuEntity::getSpuId); // 仅查询必要字段 - List existSpuIds = baseMapper.selectList(queryWrapper) - .stream() - .map(CanteenDailyMenuEntity::getSpuId) - .collect(Collectors.toList()); + List existSpuIds = baseMapper.selectList(queryWrapper) + .stream() + .map(CanteenDailyMenuEntity::getSpuId) + .collect(Collectors.toList()); - List insertList = spuIds.stream() - .filter(id -> !existSpuIds.contains(id)) - .map(id -> { - CanteenDailyMenuEntity entity = new CanteenDailyMenuEntity(); - BeanUtils.copyProperties(canteenDailyMenu, entity); - entity.setSpuId(id); - return entity; - }) - .collect(Collectors.toList()); - saveBatch(insertList); + List insertList = spuIds.stream() + .filter(id -> !existSpuIds.contains(id)) + .map(id -> { + CanteenDailyMenuEntity entity = new CanteenDailyMenuEntity(); + BeanUtils.copyProperties(canteenDailyMenu, entity); + entity.setSpuId(id); + return entity; + }) + .collect(Collectors.toList()); + saveBatch(insertList); // 发送mq消息 sendMqttMsg(canteenDailyMenu.getMerchantId()); @@ -143,60 +144,57 @@ public class CanteenDailyMenuServiceImpl extends ServiceImpl canteenDailyMenuEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); - canteenDailyMenuEntityLambdaQueryWrapper.eq(CanteenDailyMenuEntity::getMerchantId, dailyMenuDTO.getMerchantId()); - canteenDailyMenuEntityLambdaQueryWrapper.eq(CanteenDailyMenuEntity::getStartTime, dailyMenuDTO.getStartTime()); - canteenDailyMenuEntityLambdaQueryWrapper.eq(dailyMenuDTO.getHourType() != null, - CanteenDailyMenuEntity::getHourType, dailyMenuDTO.getHourType()); - - //查询 - LambdaQueryWrapper onlineFoodSpuDOLambdaQueryWrapper = new LambdaQueryWrapper<>(); - onlineFoodSpuDOLambdaQueryWrapper.eq(null != dailyMenuDTO.getCategoryId(), CanteenSpuEntity::getCategoryId, dailyMenuDTO.getCategoryId()); - onlineFoodSpuDOLambdaQueryWrapper.eq(CanteenSpuEntity::getIsShow, "1"); - List spuEntities = canteenSpuService.list(onlineFoodSpuDOLambdaQueryWrapper); - - if (CollectionUtils.isNotEmpty(spuEntities)){ - List spuIds = spuEntities.stream().map(CanteenSpuEntity::getId).collect(Collectors.toList()); - canteenDailyMenuEntityLambdaQueryWrapper.notIn(CanteenDailyMenuEntity::getSpuId, spuIds); - } - - Page pageData = baseMapper.selectPage(page, canteenDailyMenuEntityLambdaQueryWrapper); - List canteenDailyMenuEntities = pageData.getRecords(); - if (CollectionUtils.isNotEmpty(canteenDailyMenuEntities)) { - List spuIds = canteenDailyMenuEntities.stream().map(CanteenDailyMenuEntity::getSpuId).distinct().collect(Collectors.toList()); - LambdaQueryWrapper spuDOLambdaQueryWrapper = new LambdaQueryWrapper<>(); - onlineFoodSpuDOLambdaQueryWrapper.in(CanteenSpuEntity::getId, spuIds); - List list = canteenSpuService.list(spuDOLambdaQueryWrapper); - // 按 id 分组成 Map - Map spuEntityMap = list.stream() - .collect(Collectors.toMap(CanteenSpuEntity::getId, spu -> spu)); - // 构造新的 VO 列表 - List dailyMenuVOList = canteenDailyMenuEntities.stream() - .map(menu -> { - DailyMenuAppVO vo = new DailyMenuAppVO(); - BeanUtils.copyProperties(menu, vo); // 拷贝通用属性 - CanteenSpuEntity spuEntity = spuEntityMap.get(menu.getSpuId()); - if (spuEntity != null) { - vo.setSpuId(spuEntity.getId()); - vo.setStock(spuEntity.getStock()); - vo.setPrice(spuEntity.getPrice()); - vo.setPicUrl(spuEntity.getPicUrl()); - vo.setName(spuEntity.getName()); - vo.setSort(spuEntity.getSort()); - vo.setIsShow(spuEntity.getIsShow()); - // 其他需要的字段 - } - return vo; - }) - .collect(Collectors.toList()); - dailyMenuVOList.sort(Comparator.comparing(DailyMenuAppVO::getSort)); - pageData.setRecords(dailyMenuVOList); - return pageData; - } - - return null; + Page pageData = baseMapper.selectTimeFoodPage(page, dailyMenuDTO); + return pageData; } + @Override + @Transactional + public R cv(CanteenDailyMenuCVDTO creenDailyMenuCVDTO) { + LocalDate startTime = creenDailyMenuCVDTO.getStartTime(); + //取出复制源 + Long sourceMerchantId = creenDailyMenuCVDTO.getSourceMerchantId(); + LambdaQueryWrapper canteenDailyMenuEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + canteenDailyMenuEntityLambdaQueryWrapper + .eq(CanteenDailyMenuEntity::getMerchantId, sourceMerchantId); + canteenDailyMenuEntityLambdaQueryWrapper.eq(CanteenDailyMenuEntity::getStartTime, startTime); + List canteenDailyMenuEntities = baseMapper.selectList(canteenDailyMenuEntityLambdaQueryWrapper); + if (CollectionUtils.isEmpty(canteenDailyMenuEntities)) { + return R.failed("复制源数据为空"); + } + // 目标源处理 + List targetMerchantIds = creenDailyMenuCVDTO.getTargetMerchantId(); + for (Long targetMerchantId : targetMerchantIds) { + // 查询目标商户已存在的spuId + Set existKeys = baseMapper.selectList(new LambdaQueryWrapper() + .eq(CanteenDailyMenuEntity::getMerchantId, targetMerchantId) + .eq(CanteenDailyMenuEntity::getStartTime, startTime) + .select(CanteenDailyMenuEntity::getSpuId, CanteenDailyMenuEntity::getHourType)) + .stream() + .map(menu -> menu.getSpuId() + "_" + menu.getHourType()) // 生成唯一组合键 + .collect(Collectors.toSet()); + + + // 过滤需要新增的数据 + // 过滤需要新增的数据(同时校验spuId和hourType) + List newEntities = canteenDailyMenuEntities.stream() + .filter(menu -> !existKeys.contains(menu.getSpuId() + "_" + menu.getHourType())) // 关键修改点 + .map(menu -> { + CanteenDailyMenuEntity entity = new CanteenDailyMenuEntity(); + BeanUtils.copyProperties(menu, entity); + entity.setMerchantId(targetMerchantId); + entity.setId(null); + return entity; + }) + .collect(Collectors.toList()); + + if (!CollectionUtils.isEmpty(newEntities)) { + saveBatch(newEntities); // 使用批量插入 + sendMqttMsg(targetMerchantId); + } + } + return R.ok(); + } // 发送mq消息 private void sendMqttMsg(Long mchId) { if (ObjectUtil.isEmpty(mchId)) return; diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSpuServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSpuServiceImpl.java index 805ebbd44..55482a806 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSpuServiceImpl.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSpuServiceImpl.java @@ -95,8 +95,14 @@ public class CanteenSpuServiceImpl extends ServiceImpl wrapper) { - return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + public Object pageScope(Page page, CanteenSpuEntity canteenSpu) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.like(StrUtil.isNotBlank(canteenSpu.getName()), CanteenSpuEntity::getName, canteenSpu.getName()); + wrapper.eq(Objects.nonNull(canteenSpu.getCategoryId()), CanteenSpuEntity::getCategoryId, canteenSpu.getCategoryId()); + wrapper.orderByAsc(CanteenSpuEntity::getSort).orderByDesc(CanteenSpuEntity::getId); + + Page pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + return pageData; } @Override diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenDailyMenuMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenDailyMenuMapper.xml index 22db42b53..e456c331c 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenDailyMenuMapper.xml +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenDailyMenuMapper.xml @@ -54,15 +54,16 @@ + \ No newline at end of file diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java index e7277790c..56ab8e244 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CommonRoleConstant.java @@ -32,4 +32,7 @@ public interface CommonRoleConstant { // 商户角色 String MCH_USER = "MCH_USER"; + // 智能柜管理员 + String HARD_DOOR_ADMIN_USER = "HARD_DOOR_ADMIN"; + } diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/enums/MerchantTypeEnum.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/enums/MerchantTypeEnum.java index 81fb03f69..e65f74aad 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/enums/MerchantTypeEnum.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/enums/MerchantTypeEnum.java @@ -6,7 +6,8 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Getter public enum MerchantTypeEnum { - CANTEEN("1", "食堂"), + OTHER_CANTEEN("0", "其他食堂"), + CANTEEN("1", "自营食堂"), SUPERMARKET("2", "合作商家"), SELF_SUPERMARKET("3", "自营商家"), ; diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/DeviceFingerprintUtil.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/DeviceFingerprintUtil.java new file mode 100644 index 000000000..540aafb52 --- /dev/null +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/DeviceFingerprintUtil.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.common.core.util; + +import com.bsd.pjcloud.common.core.util.WebUtils; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.util.DigestUtils; + +public class DeviceFingerprintUtil { + public static String generate(HttpServletRequest request) { + String userAgent = request.getHeader("User-Agent"); +// String ip = WebUtils.getIP(request); + String accept = request.getHeader("Accept"); + System.out.println(userAgent); + System.out.println(accept); + System.out.println("******"); + System.out.println(DigestUtils.md5DigestAsHex((userAgent + accept).getBytes())); + return DigestUtils.md5DigestAsHex((userAgent + accept).getBytes()); + } +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/pom.xml b/pjcloud-hardware/pjcloud-hardware-api/pom.xml index e83d25029..f52a08999 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/pom.xml +++ b/pjcloud-hardware/pjcloud-hardware-api/pom.xml @@ -52,5 +52,11 @@ org.apache.commons commons-lang3 + + com.bsd + pjcloud-thirdparty-api + 5.7.0 + compile + 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 new file mode 100644 index 000000000..3b2ac1d89 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardAuthTypeEnum.java @@ -0,0 +1,27 @@ +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 HardAuthTypeEnum { + + HARD_DDOR_AUTH("10", "智能柜授权"), + ; + private final String type; + private final String description; + + public static HardAuthTypeEnum 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/HardBroadcastEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardBroadcastEnum.java new file mode 100644 index 000000000..208d2a45f --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardBroadcastEnum.java @@ -0,0 +1,24 @@ +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 HardBroadcastEnum { + OFFLINE_CANTEEN_RESERVE("1", "线下食堂订餐广播"), + ; + private final String type; + private final String description; + + public static HardBroadcastEnum 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/HardDoorOpenTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardDoorOpenTypeEnum.java new file mode 100644 index 000000000..cba8a33d4 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardDoorOpenTypeEnum.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.hard.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; +import java.util.List; + +/** + * 开门类型 + */ +@AllArgsConstructor +@Getter +public enum HardDoorOpenTypeEnum { + RECORD_VIDEO("1", "录制视频"), + NO_RECORD_VIDEO("4", "不录制视频"), + MAINTENANCE_UNLOCK("5", "检修开锁"), + MAINTENANCE_LOCK("6", "检修关锁");; + private final String type; + private final String description; + + public static List getMaintenanceListCodes() { + return List.of(MAINTENANCE_UNLOCK.getType(), MAINTENANCE_LOCK.getType()); + } + + public static HardDoorOpenTypeEnum 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/flow/HardDoorFlowBizEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/flow/HardDoorFlowBizEnum.java new file mode 100644 index 000000000..686ea367f --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/flow/HardDoorFlowBizEnum.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.hard.api.constant.flow; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 智能柜开门流程 + */ +@AllArgsConstructor +@Getter +public enum HardDoorFlowBizEnum { + PAY_OPEN("10", "购买开门"), + REPERTORY_OPEN("20", "上架开门"), + ACCESS_OPEN("30", "检修开门"), + ; + private final String type; + private final String description; + + public static HardDoorFlowBizEnum 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/flow/HardDoorFlowEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/flow/HardDoorFlowEnum.java new file mode 100644 index 000000000..4511e3cd2 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/flow/HardDoorFlowEnum.java @@ -0,0 +1,39 @@ +package com.bsd.pjcloud.hard.api.constant.flow; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 智能柜流程 + */ +@AllArgsConstructor +@Getter +public enum HardDoorFlowEnum { + FLOW_AUTH("10", "用户授权", "20"), + FLOW_APPLY_OPEN("20", "智能柜申请开门", "30"), + FLOW_CALLBACK_OPEN("30", "智能柜开门响应", "40"), + FLOW_CALLBACK_VIDEO("40", "智能柜视频回调", "50"), + FLOW_SUBMIT_RECOGNITION("50", "旷世提交识别", "60"), + FLOW_CALLBACK_RECOGNITION("60", "旷世识别响应", "70"), + FLOW_PAY_ORDER("70", "订单结算", null), + ; + private final String type; + private final String description; + private final String nextType; + + public static HardDoorFlowEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + + public static HardDoorFlowEnum getNextType(HardDoorFlowEnum type) { + if (ObjectUtil.isEmpty(type)) return null; + HardDoorFlowEnum currentFlow = valueOfByType(type.getType()); + if (ObjectUtil.isEmpty(currentFlow) || ObjectUtil.isEmpty(currentFlow.getNextType())) return null; + return valueOfByType(currentFlow.getNextType()); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderStatusEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderStatusEnum.java index 7f3596b26..f4a70ed82 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderStatusEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderStatusEnum.java @@ -19,6 +19,7 @@ public enum HardOrderStatusEnum { OFFLINE_PAY("6", "没有网络本地支付"), REFUND("10", "退款"), CANCEL("20", "已核销"), + UNFOLLOW("30", "已取消(智能柜)"), ; private final String type; private final String description; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java index 46b997263..e051ec26a 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardPayTypeEnum.java @@ -23,6 +23,7 @@ public enum HardPayTypeEnum { FOREIGN_TICKET_QR_CODE("6", "外来人员二维码支付"), RESERVE_QR_CODE("7", "线上订餐二维码支付"), CASH("8", "现金支付"), + HARD_DOOR_FREE_PAY("9", "智能柜免密支付"), ; 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/spu/HardSpuRepertoryTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/spu/HardSpuRepertoryTypeEnum.java index 0efb77ebf..ebd15f5c3 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/spu/HardSpuRepertoryTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/spu/HardSpuRepertoryTypeEnum.java @@ -13,7 +13,7 @@ import java.util.Arrays; @Getter public enum HardSpuRepertoryTypeEnum { HANDLER("10", "手动上架"), - AUTO("20", "自动上架"), + PERSION("20", "上架员上架"), ; 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/HardApptDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardApptDto.java new file mode 100644 index 000000000..1725de8c0 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardApptDto.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.hard.api.dto; + +import com.bsd.pjcloud.hard.api.entity.HardApptEntity; +import lombok.Data; + +@Data +public class HardApptDto extends HardApptEntity { +} 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 new file mode 100644 index 000000000..4274a461a --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAuthAppDto.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.hard.api.dto; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class HardAuthAppDto { + + /** + * 用户id + */ + private Long userId; + + /** + * 授权id + */ + @NotNull(message = "授权id不能为空") + private Long authId; + + /** + * 是否授权 + */ + @NotEmpty(message = "是否授权不能为空") + private String authStatus; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAuthErrorChangeDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAuthErrorChangeDto.java new file mode 100644 index 000000000..f69710708 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAuthErrorChangeDto.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.hard.api.dto; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class HardAuthErrorChangeDto { + + /** + * 流程id + */ + @NotNull(message = "流程id不能为空") + private Long flowId; + + /** + * 处理图片 + */ + private String image; + + /** + * 处理原因 + */ + @NotEmpty(message = "请输入处理原因") + private String remark; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardDoorFlowDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardDoorFlowDto.java new file mode 100644 index 000000000..37ec0c8fe --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardDoorFlowDto.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.hard.api.dto; + +import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; +import lombok.Data; + +import java.time.LocalDate; + +@Data +public class HardDoorFlowDto extends HardDoorFlowEntity { + + private LocalDate[] createTimeList; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardDoorFlowOpenDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardDoorFlowOpenDto.java new file mode 100644 index 000000000..5f54cfff6 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardDoorFlowOpenDto.java @@ -0,0 +1,48 @@ +package com.bsd.pjcloud.hard.api.dto; + +import com.bsd.pjcloud.hard.api.constant.flow.HardDoorFlowBizEnum; +import com.bsd.pjcloud.hard.api.constant.HardDoorOpenTypeEnum; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class HardDoorFlowOpenDto { + + /** + * 柜子id + */ + @NotNull(message = "hardDoorId不能为空") + private Long hardDoorId; + + /** + * 智能柜编号 + */ + @NotNull(message = "货柜编号不能为空") + private Integer cabinetNo; + + /** + * 智能柜子流程id + */ + private Long hardDoorFlowId; + + /** + * 流程类型 + */ + private HardDoorFlowBizEnum flowType; + + /** + * 开门操作类型 + */ + private HardDoorOpenTypeEnum openType; + + /** + * 开门用户id + */ + private Long userId; + + /** + * 授权id + */ + private Long authId; + +} 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 new file mode 100644 index 000000000..151512293 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardGetAuthAppDto.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.hard.api.dto; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class HardGetAuthAppDto { + + /** + * 用户id + */ + private Long userId; + + /** + * 智能柜设备id + */ + @NotNull(message = "智能柜设备id不能为空") + private Long doorHardId; + + /** + * 货柜编号 + */ + @NotNull(message = "货柜编号不能为空") + private Integer cabinetNo; +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/manager/HardDoorCabinetDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/manager/HardDoorCabinetDto.java new file mode 100644 index 000000000..ce6dc3a63 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/manager/HardDoorCabinetDto.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.hard.api.dto.manager; + +import com.bsd.pjcloud.hard.api.entity.manager.HardDoorCabinetEntity; +import lombok.Data; + +@Data +public class HardDoorCabinetDto extends HardDoorCabinetEntity { +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardAdminRefundDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardAdminRefundDto.java index 1e2d46b6f..754c80203 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardAdminRefundDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardAdminRefundDto.java @@ -22,7 +22,8 @@ public class HardAdminRefundDto { @Schema(description = "相关描述") private String applyDescription; - @Schema(description="补充凭证图片") + @Schema(description = "补充凭证图片") + @NotNull(message = "补充凭证图片不能为空") private String applyPicUrls; } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java index dbfaf821a..680926051 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/app/HardAppCreateOrderDto.java @@ -45,4 +45,7 @@ public class HardAppCreateOrderDto { // 饭卡id private Long walletId; + // 预约id + private Long apptId; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/DeductionSpuRepertoryDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/DeductionSpuRepertoryDto.java new file mode 100644 index 000000000..2512548ac --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/DeductionSpuRepertoryDto.java @@ -0,0 +1,37 @@ +package com.bsd.pjcloud.hard.api.dto.spu; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + + +@Data +public class DeductionSpuRepertoryDto { + + /** + * 流程id + */ + @NotNull(message = "流程id不能为空") + private Long flowId; + + /** + * 上架数量 + */ + @NotEmpty(message = "商品列表不能为空") + private List list; + + @Data + public static class Item { + + @NotNull(message = "商品id不能为空") + private Long hardSpuId; + + @NotNull(message = "增加库存不能为空") + private Integer plusCount; + + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/DeductionSpuStockDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/DeductionSpuStockDto.java new file mode 100644 index 000000000..691dca346 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/DeductionSpuStockDto.java @@ -0,0 +1,15 @@ +package com.bsd.pjcloud.hard.api.dto.spu; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +@Data +public class DeductionSpuStockDto { + + private Long hardSpuId; + + private Integer incrCount; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardPutawayDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardPutawayDto.java new file mode 100644 index 000000000..2565a3ebd --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardPutawayDto.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.hard.api.dto.spu; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class HardPutawayDto { + + /** + * 绑定id + */ + @NotNull(message = "绑定id不能为空") + private Long id; + + /** + * 商品id + */ + @NotNull(message = "商品id") + private Long hardSpuId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuDto.java index dc5fbface..d5940b6d3 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuDto.java @@ -1,18 +1,12 @@ package com.bsd.pjcloud.hard.api.dto.spu; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; -import lombok.NoArgsConstructor; import java.time.LocalDateTime; import java.util.List; @Data -@Builder -@AllArgsConstructor -@NoArgsConstructor public class HardSpuDto extends HardSpuEntity { private List spuIdList; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuJoinDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuJoinDto.java index a0224e31e..bd32dafdf 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuJoinDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuJoinDto.java @@ -5,4 +5,10 @@ import lombok.Data; @Data public class HardSpuJoinDto extends HardSpuJoinEntity { + + /** + * 是否有商品 + */ + private Boolean isSpu = false; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuRepertoryDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuRepertoryDto.java index 20a9290e5..94e3622fc 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuRepertoryDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/spu/HardSpuRepertoryDto.java @@ -13,4 +13,6 @@ public class HardSpuRepertoryDto extends HardSpuRepertoryEntity { private List userIds; + private Long cabinetId; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardApptEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardApptEntity.java new file mode 100644 index 000000000..3e36d4509 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardApptEntity.java @@ -0,0 +1,114 @@ +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; +import java.time.LocalTime; + +/** + * 设备预约管理 + */ +@Data +@TenantTable +@TableName("hard_appt") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "设备预约管理") +public class HardApptEntity extends Model { + + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "编号") + private Long id; + + /** + * 标题 + */ + @Schema(description = "标题") + private String title; + + /** + * 开始时间 + */ + @Schema(description = "开始时间") + private LocalTime startTime; + + /** + * 结束时间 + */ + @Schema(description = "结束时间") + private LocalTime endTime; + + /** + * 预约时间段 + */ + @Schema(description = "预约时间段") + private String hourType; + + /** + * 排序 + */ + @Schema(description = "排序") + private Integer sort; + + /** + * 状态 + */ + @Schema(description = "状态") + private String status; + + /** + * 备注 + */ + @Schema(description = "备注") + private String remark; + + /** + * 创建人 + */ + @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/HardAuthEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardAuthEntity.java index 22742289a..30d6454c1 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardAuthEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardAuthEntity.java @@ -3,8 +3,7 @@ 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 lombok.*; import com.bsd.pjcloud.common.core.util.TenantTable; import java.time.LocalDateTime; @@ -12,6 +11,9 @@ import java.time.LocalDateTime; /** * 硬件授权 */ +@Builder +@AllArgsConstructor +@NoArgsConstructor @Data @TenantTable @TableName("hard_auth") @@ -40,9 +42,15 @@ public class HardAuthEntity extends Model { private Long hardId; /** - * 是否授权 + * 货柜编号 */ - @Schema(description = "是否授权") + @Schema(description = "货柜编号") + private Integer cabinetNo; + + /** + * 授权类型 + */ + @Schema(description = "授权类型") private String authType; /** @@ -69,6 +77,36 @@ public class HardAuthEntity extends Model { @Schema(description = "完成时间") private LocalDateTime isDoneTime; + /** + * 是否人工处理 + */ + @Schema(description = "是否人工处理") + private String isManualChange; + + /** + * 人工处理用户id + */ + @Schema(description = "人工处理用户id") + private Long manualChangeUserId; + + /** + * 人工处理时间 + */ + @Schema(description = "人工处理时间") + private LocalDateTime manualChangeTime; + + /** + * 人工处理备注 + */ + @Schema(description = "人工处理备注") + private String manualChangeRemark; + + /** + * 人工处理图片 + */ + @Schema(description = "人工处理图片") + private String manualChangePic; + /** * 创建人 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardBroadcastEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardBroadcastEntity.java index 3ef0b6c53..2c92d122f 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardBroadcastEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardBroadcastEntity.java @@ -3,14 +3,17 @@ 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 lombok.*; import com.bsd.pjcloud.common.core.util.TenantTable; + import java.time.LocalDateTime; /** * 设备广播 */ +@Builder +@AllArgsConstructor +@NoArgsConstructor @Data @TenantTable @TableName("hard_broadcast") @@ -19,118 +22,124 @@ import java.time.LocalDateTime; public class HardBroadcastEntity extends Model { - /** - * 编号 - */ + /** + * 广播编号 + */ @TableId(type = IdType.ASSIGN_ID) - @Schema(description="编号") + @Schema(description = "广播编号") private Long id; - /** - * 预定用户 - */ - @Schema(description="预定用户") + /** + * 预定用户 + */ + @Schema(description = "预定用户") private Long userId; - /** - * 硬件id - */ - @Schema(description="硬件id") + /** + * 硬件id + */ + @Schema(description = "硬件id") private Long hardId; - /** - * mq主题 - */ - @Schema(description="mq主题") + /** + * mq主题 + */ + @Schema(description = "mq主题") private String topic; - /** - * 关联业务编号 - */ - @Schema(description="关联业务编号") + /** + * 业务类型 + */ + @Schema(description = "业务类型") + private String bizType; + + /** + * 关联业务编号 + */ + @Schema(description = "关联业务编号") private String bizId; - /** - * 预定标题 - */ - @Schema(description="预定标题") + /** + * 预定标题 + */ + @Schema(description = "预定标题") private String title; - /** - * 广播内容 - */ - @Schema(description="广播内容") + /** + * 广播内容 + */ + @Schema(description = "广播内容") private String content; - /** - * 当前广播次数 - */ - @Schema(description="当前广播次数") + /** + * 当前广播次数 + */ + @Schema(description = "当前广播次数") private Integer broadcastCount; - /** - * 最大广播次数 - */ - @Schema(description="最大广播次数") + /** + * 最大广播次数 + */ + @Schema(description = "最大广播次数") private Integer broadcastMaxCount; - /** - * 是否广播语音 - */ - @Schema(description="是否广播语音") + /** + * 是否广播语音 + */ + @Schema(description = "是否广播语音") private String isBroadcast; - /** - * 是否完成 - */ - @Schema(description="是否完成") + /** + * 是否完成 + */ + @Schema(description = "是否完成") private String isDone; - /** - * 完成时间 - */ - @Schema(description="完成时间") + /** + * 完成时间 + */ + @Schema(description = "完成时间") private LocalDateTime isDoneTime; - /** - * 创建人 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建人") + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") private String createBy; - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建时间") + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") private LocalDateTime createTime; - /** - * 修改人 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(description="修改人") + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") private String updateBy; - /** - * 修改时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(description="修改时间") + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") private LocalDateTime updateTime; - /** - * 删除标记 - */ + /** + * 删除标记 + */ @TableLogic - @TableField(fill = FieldFill.INSERT) - @Schema(description="删除标记") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") private String delFlag; - /** - * 租户ID - */ - @Schema(description="租户ID") + /** + * 租户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/HardDoorFlowEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java new file mode 100644 index 000000000..8e10716c4 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardDoorFlowEntity.java @@ -0,0 +1,244 @@ +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.*; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 智能柜流程 + * + * @author hard + * @date 2025-04-14 16:08:33 + */ +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +@TenantTable +@TableName("hard_door_flow") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "智能柜流程") +public class HardDoorFlowEntity extends Model { + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "编号") + private Long id; + + /** + * 用户编号 + */ + @Schema(description = "用户编号") + private Long userId; + + /** + * 业务类型 + */ + @Schema(description = "业务类型") + private String bizType; + + /** + * 硬件id + */ + @Schema(description = "硬件id") + private Long hardId; + + /** + * 智能柜id + */ + @Schema(description = "智能柜id") + private Long hardDoorId; + + /** + * 货柜编号 + */ + @Schema(description = "货柜编号") + private Integer cabinetNo; + + /** + * 订单编号 + */ + @Schema(description = "订单编号") + private Long orderId; + + /** + * 授权编号 + */ + @Schema(description = "授权编号") + private Long authId; + + /** + * 请求开门参数 + */ + @Schema(description = "请求开门参数") + private String requestOpenDto; + + /** + * 请求开门返回 + */ + @Schema(description = "请求开门返回") + private String requestOpenVo; + + /** + * 请求开门时间 + */ + @Schema(description = "请求开门时间") + private LocalDateTime requestOpenTime; + + /** + * 是否开门 + */ + @Schema(description = "是否开门") + private String isOpen; + + /** + * 开门回调时间 + */ + @Schema(description = "开门回调时间") + private LocalDateTime openCallbackTime; + + /** + * 开门回调结果 + */ + @Schema(description = "开门回调结果") + private String openCallbackVo; + + /** + * 视频回调结果 + */ + @Schema(description = "视频回调结果") + private String videoCallbackVo; + + /** + * 视频回调时间 + */ + @Schema(description = "视频回调时间") + private LocalDateTime videoCallbackTime; + + + /** + * sku识别提交参数 + */ + @Schema(description = "sku识别提交参数") + private String skuSubmitDto; + + /** + * sku识别提交结果 + */ + @Schema(description = "sku识别提交结果") + private String skuSubmitVo; + + /** + * sku识别提交id(用于查询) + */ + @Schema(description = "sku识别提交id(用于查询)") + private String skuSubmitRecogId; + + /** + * sku识别提交时间 + */ + @Schema(description = "sku识别提交时间") + private LocalDateTime skuSubmitTime; + + /** + * sku识别回调结果 + */ + @Schema(description = "sku识别回调结果") + private String skuCallbackVo; + + /** + * sku识别回调时间 + */ + @Schema(description = "sku识别回调时间") + private LocalDateTime skuCallbackTime; + + /** + * sku识别主动获取参数 + */ + @Schema(description = "sku识别主动获取参数") + private String skuDrivingDto; + + /** + * sku识别主动获取结果 + */ + @Schema(description = "sku识别主动获取结果") + private String skuDrivingVo; + + /** + * sku识别主动获取时间 + */ + @Schema(description = "sku识别主动获取时间") + private LocalDateTime skuDrivingTime; + + /** + * 支付时间 + */ + @Schema(description = "支付时间") + private LocalDateTime payTime; + + /** + * 流程状态 + */ + @Schema(description = "流程状态") + private String flowStatus; + + /** + * 流程错误信息 + */ + @Schema(description = "流程错误信息") + private String error; + + /** + * 流程错误描述(展示) + */ + @Schema(description = "流程错误描述(展示)") + private String errorDesc; + + /** + * 创建人 + */ + @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 new file mode 100644 index 000000000..a3a54b0e2 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorCabinetEntity.java @@ -0,0 +1,115 @@ +package com.bsd.pjcloud.hard.api.entity.manager; + +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; + +/** + * 智能柜货柜 + * + * @author dzc + * @date 2025-04-15 18:28:46 + */ +@Data +@TenantTable +@TableName("hard_door_cabinet") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "智能柜货柜") +public class HardDoorCabinetEntity extends Model { + + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="编号") + private Long id; + + /** + * 智能柜编号 + */ + @Schema(description="智能柜编号") + private Long hardDoorId; + + /** + * 货柜编号(1,2) + */ + @Schema(description="货柜编号(1,2)") + private Integer cabinetNo; + + /** + * 锁在线1:在线;2:离线; + */ + @Schema(description="锁在线1:在线;2:离线;") + private String isLockOnline; + + /** + * 锁状态1:开锁;2:关锁; + */ + @Schema(description="锁状态1:开锁;2:关锁;") + private Integer lockStatus; + + /** + * 门状态1:门关;2:门开 + */ + @Schema(description="门状态1:门关;2:门开") + private Integer doorStatus; + + /** + * 货柜售卖状态1:在售;2:停售 + */ + @Schema(description="货柜售卖状态1:在售;2:停售") + private Integer saleStatus; + + /** + * 二维码 + */ + @Schema(description="二维码") + private String qrCode; + + /** + * 创建人 + */ + @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/HardDoorManagerEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorManagerEntity.java index fe36eee33..5e21a10fb 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorManagerEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorManagerEntity.java @@ -7,6 +7,7 @@ import lombok.*; import com.bsd.pjcloud.common.core.util.TenantTable; import java.time.LocalDateTime; +import java.util.List; /** * 智能柜设置 @@ -89,6 +90,12 @@ public class HardDoorManagerEntity extends Model { @Schema(description = "售卖状态。1:在售;2:停售") private Integer saleStatus; + /** + * sim 卡号。设备有上报会返回,若一次上报都没有,则返回 null。 + */ + @Schema(description = "sim 卡号。设备有上报会返回,若一次上报都没有,则返回 null。") + private String simSn; + /** * sim 信号强度。大于-95 表示信号强度好;-95 到-105 表示信号强度中等;小于-105 表示信号差; */ @@ -105,13 +112,7 @@ public class HardDoorManagerEntity extends Model { * sim 信号值更新时间。yyyy-MM-dd HH:mm:ss */ @Schema(description = "sim 信号值更新时间。yyyy-MM-dd HH:mm:ss") - private Integer signalTime; - - /** - * 货柜列表JSON - */ - @Schema(description = "货柜列表JSON") - private String cabinetList; + private LocalDateTime signalTime; /** * 上次重启时间 @@ -119,6 +120,18 @@ public class HardDoorManagerEntity extends Model { @Schema(description = "上次重启时间") private LocalDateTime restartTime; + /** + * 系统音量 + */ + @Schema(description = "系统音量") + private Integer systemVolume; + + /** + * 媒体音量 + */ + @Schema(description = "媒体音量") + private Integer mediaVolume; + /** * 创建人 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java index 1dddd5400..a62211489 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java @@ -123,6 +123,12 @@ public class HardOrderEntity extends Model { @Schema(description = "用餐类型") private String hourType; + /** + * 预约时间段id + */ + @Schema(description = "预约时间段id") + private Long apptId; + /** * 订单设备类型 */ @@ -178,11 +184,17 @@ public class HardOrderEntity extends Model { private String refundStatus; /** - * 订单取消时间 + * 订单取消时间(退款订单) */ @Schema(description = "订单取消时间") private LocalDateTime applyCancelTime; + /** + * 订单取消时间(智能柜) + */ + @Schema(description = "订单取消时间(智能柜)") + private LocalDateTime unfollowTime; + /** * 设备上的唯一订单号 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuEntity.java index 0cb22e5b4..b13f3518d 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuEntity.java @@ -7,8 +7,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.*; import com.bsd.pjcloud.common.core.util.TenantTable; import java.time.LocalDateTime; @@ -16,6 +15,9 @@ import java.time.LocalDateTime; /** * 硬件商品 */ +@Builder +@AllArgsConstructor +@NoArgsConstructor @Data @TenantTable @TableName("hard_spu") @@ -46,9 +48,15 @@ public class HardSpuEntity extends Model { private String name; /** - * 商品图片 + * 商品封面图片 */ - @Schema(description = "商品图片") + @Schema(description = "商品封面图片") + private String cover; + + /** + * 商品图片用于识别 + */ + @Schema(description = "商品图片用于识别") private String pic; /** @@ -109,11 +117,24 @@ public class HardSpuEntity extends Model { /** * sku类型,0:标准库;1:私有库 + * * @see HardKsSkuTypeEnum */ @Schema(description = "sku类型,0:标准库;1:私有库") private String skuType; + /** + * 旷世skuid + */ + @Schema(description = "旷世skuid") + private String ksSkuId; + + /** + * 旷世返回的业务方sku_id + */ + @Schema(description = "旷世返回的业务方sku_id") + private String ksResSkuId; + /** * 69码 */ @@ -130,7 +151,7 @@ public class HardSpuEntity extends Model { * 是否为集合SKU */ @Schema(description = "是否为集合SKU") - private String ksSubSku; + private String ksSubSkuJson; /** * 旷世审核状态 @@ -144,6 +165,12 @@ public class HardSpuEntity extends Model { @Schema(description = "旷世审核状态标题") private String ksStatusTitle; + /** + * 乐观锁 + */ + @Version + private Integer version; + /** * 旷世审核状态描述 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuJoinEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuJoinEntity.java index efc49d8d2..98c411968 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuJoinEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuJoinEntity.java @@ -51,6 +51,25 @@ public class HardSpuJoinEntity extends Model { @Schema(description = "放置层数") private Integer hardDoorNumber; + /** + * 乐观锁 + */ + @Version + private Integer version; + + /** + * 销量 + */ + @Schema(description = "销量") + private Integer salesCount; + + /** + * 库存 + */ + @Schema(description = "库存") + private Integer repertoryCount; + + /** * 创建人 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuRepertoryEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuRepertoryEntity.java index 96512745f..3f4b199e1 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuRepertoryEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/spu/HardSpuRepertoryEntity.java @@ -37,10 +37,17 @@ public class HardSpuRepertoryEntity extends Model { private Long userId; /** - * 设备id + * 硬件柜子id */ - @Schema(description = "设备id") - private Long hardId; + @Schema(description = "硬件柜子id") + private Long hardDoorId; + + /** + * 柜门编号 + */ + @Schema(description = "柜门编号") + private Integer cabinetNo; + /** * 商品id @@ -63,6 +70,12 @@ public class HardSpuRepertoryEntity extends Model { @Schema(description = "更新库存数量") private Integer count; + /** + * 上架业务关联id + */ + @Schema(description = "上架业务关联id") + private Long bizId; + /** * 上架类型 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardDoorService.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardDoorService.java new file mode 100644 index 000000000..0f52acaf8 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardDoorService.java @@ -0,0 +1,45 @@ +package com.bsd.pjcloud.hard.api.feign; + + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.thirdparty.dto.door.DoorOpenCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.door.DoorStatusCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.door.DoorVideoCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + + +@FeignClient(contextId = "remoteHardDoorService", value = ServiceNameConstants.HARDWARE_SERVICE) +public interface RemoteHardDoorService { + + /** + * 处理柜子开门回调 + */ + @NoToken + @PostMapping("/hard-door-flow/dispose-locak-callback") + void disposeLocakCallback(@RequestBody DoorOpenCallbackDto dto); + + /** + * 处理柜子视频回调 + */ + @NoToken + @PostMapping("/hard-door-flow/dispose-video-callback") + void disposeVideoCallback(@RequestBody DoorVideoCallbackDto dto); + + /** + * 处理柜子视频回调 + */ + @NoToken + @PostMapping("/hard-door-flow/dispose-status-callback") + void disposeStatusCallback(@RequestBody DoorStatusCallbackDto dto); + + /** + * 处理旷世识别回调 + */ + @NoToken + @PostMapping("/hard-door-flow/dispose-recognition-callback") + void disposeRecognitionCallback(@RequestBody KsRecognitionCallbackDto dto); +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardApptVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardApptVo.java new file mode 100644 index 000000000..fa10aca6e --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardApptVo.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.hard.api.vo; + +import com.bsd.pjcloud.hard.api.entity.HardApptEntity; +import lombok.Data; + +@Data +public class HardApptVo extends HardApptEntity { +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardDoorFlowVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardDoorFlowVo.java new file mode 100644 index 000000000..ec71266bb --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardDoorFlowVo.java @@ -0,0 +1,39 @@ +package com.bsd.pjcloud.hard.api.vo; + +import com.bsd.pjcloud.admin.api.vo.base.BaseUserDeptInterface; +import com.bsd.pjcloud.hard.api.entity.HardAuthEntity; +import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; +import com.bsd.pjcloud.hard.api.vo.base.BaseHardInterface; +import lombok.Data; + +import java.util.List; + +@Data +public class HardDoorFlowVo extends HardDoorFlowEntity implements BaseHardInterface, BaseUserDeptInterface { + + /** + * 设备相关 + */ + private String hardName; + + private String hardType; + + private List hardTypeCodes; + + /** + * 用户相关 + */ + private String username; + + private String userMobile; + + private String userAvatar; + + private Long userDeptId; + + private String userDeptName; + + private HardAuthEntity hardAuth; + + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardGetAuthAppVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardGetAuthAppVo.java new file mode 100644 index 000000000..deb630cf2 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardGetAuthAppVo.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.hard.api.vo; + +import lombok.Data; + +@Data +public class HardGetAuthAppVo { + + /** + * 授权id + */ + private Long authId; + + /** + * 授权信息 + */ + private String authDesc; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorCabinetCodeVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorCabinetCodeVo.java new file mode 100644 index 000000000..b8a2343dc --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorCabinetCodeVo.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.hard.api.vo.manager; + +import lombok.Data; + +@Data +public class HardDoorCabinetCodeVo { + + /** + * 智能柜id + */ + private String hardDoorId; + + /** + * 货柜编号 + */ + private String cabinetNo; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorCabinetVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorCabinetVo.java new file mode 100644 index 000000000..e19d15035 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorCabinetVo.java @@ -0,0 +1,23 @@ +package com.bsd.pjcloud.hard.api.vo.manager; + +import com.bsd.pjcloud.hard.api.entity.manager.HardDoorCabinetEntity; +import com.bsd.pjcloud.hard.api.vo.base.BaseHardInterface; +import lombok.Data; + +import java.util.List; + +@Data +public class HardDoorCabinetVo extends HardDoorCabinetEntity implements BaseHardInterface { + + /** + * 设备相关 + */ + private Long hardId; + + private String hardName; + + private String hardType; + + private String deviceCode; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorManagerVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorManagerVo.java index 40565e1ae..756e33517 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorManagerVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardDoorManagerVo.java @@ -1,10 +1,14 @@ package com.bsd.pjcloud.hard.api.vo.manager; +import com.bsd.pjcloud.hard.api.entity.manager.HardDoorCabinetEntity; import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity; +import com.bsd.pjcloud.hard.api.vo.base.BaseHardInterface; import lombok.Data; +import java.util.List; + @Data -public class HardDoorManagerVo extends HardDoorManagerEntity { +public class HardDoorManagerVo extends HardDoorManagerEntity implements BaseHardInterface { /** * 硬件设备相关 */ @@ -12,4 +16,8 @@ public class HardDoorManagerVo extends HardDoorManagerEntity { private String hardType; + private List hardTypeCodes; + + private List cabinetList; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuRepertoryVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuRepertoryVo.java index 77b6be85c..cfbe2fcb9 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuRepertoryVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuRepertoryVo.java @@ -7,7 +7,7 @@ import com.bsd.pjcloud.wallet.api.vo.base.BaseMchInterface; import lombok.Data; @Data -public class HardSpuRepertoryVo extends HardSpuRepertoryEntity implements BaseMchInterface, BaseHardInterface, BaseUserInterface { +public class HardSpuRepertoryVo extends HardSpuRepertoryEntity implements BaseMchInterface, BaseUserInterface, BaseHardInterface { /** * 商品相关 @@ -34,13 +34,6 @@ public class HardSpuRepertoryVo extends HardSpuRepertoryEntity implements BaseMc private String logoPic; - /** - * 设备相关 - */ - private String hardName; - - private String hardType; - /** * 用户相关 */ @@ -50,5 +43,15 @@ public class HardSpuRepertoryVo extends HardSpuRepertoryEntity implements BaseMc private String userAvatar; + /** + * 设备相关 + */ + private Long hardId; + + private String hardName; + + private String hardType; + + private String deviceCode; } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index 66471f54e..910612a76 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -1,2 +1,3 @@ +com.bsd.pjcloud.hard.api.feign.RemoteHardDoorService com.bsd.pjcloud.hard.api.feign.RemoteHardOrderService com.bsd.pjcloud.hard.api.feign.RemoteHardThirdSelfZyService \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardApptController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardApptController.java new file mode 100644 index 000000000..20b43bbc2 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardApptController.java @@ -0,0 +1,101 @@ +package com.bsd.pjcloud.hard.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +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.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.hard.api.entity.HardApptEntity; +import com.bsd.pjcloud.hard.service.HardApptService; +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-appt") +@Tag(description = "hard-appt", name = "设备预约管理管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardApptController { + + private final HardApptService hardApptService; + + + /* ************************************* start app start ************************************* */ + + @Operation(summary = "app预约时间列表", description = "app预约时间列表") + @GetMapping("/app/list") + public R> appList() { + List list = hardApptService.list(new LambdaQueryWrapper() + .eq(HardApptEntity::getStatus, YesNoEnum.YES.getCode()) + .orderByDesc(HardApptEntity::getSort) + ); + return R.ok(list); + } + + /* ************************************* end app end ************************************* */ + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('hard_hardAppt_view')") + public R getHardApptPage(@ParameterObject Page page, @ParameterObject HardApptEntity dto) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(ObjectUtil.isNotEmpty(dto.getTitle()), HardApptEntity::getTitle, dto.getTitle()); + return R.ok(hardApptService.page(page, wrapper)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('hard_hardAppt_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(hardApptService.getById(id)); + } + + @Operation(summary = "新增设备预约管理", description = "新增设备预约管理") + @SysLog("新增设备预约管理") + @PostMapping + @PreAuthorize("@pms.hasPermission('hard_hardAppt_add')") + public R save(@RequestBody HardApptEntity hardAppt) { + return R.ok(hardApptService.create(hardAppt)); + } + + @Operation(summary = "修改设备预约管理", description = "修改设备预约管理") + @SysLog("修改设备预约管理") + @PutMapping + @PreAuthorize("@pms.hasPermission('hard_hardAppt_edit')") + public R updateById(@RequestBody HardApptEntity hardAppt) { + return R.ok(hardApptService.edit(hardAppt)); + } + + @Operation(summary = "通过id删除设备预约管理", description = "通过id删除设备预约管理") + @SysLog("通过id删除设备预约管理") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('hard_hardAppt_del')") + public R removeById(@RequestBody Long[] ids) { + hardApptService.delByIds(CollUtil.toList(ids)); + return R.ok(); + } + + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('hard_hardAppt_export')") + public List export(HardApptEntity hardAppt, Long[] ids) { + return hardApptService.list(Wrappers.lambdaQuery(hardAppt).in(ArrayUtil.isNotEmpty(ids), HardApptEntity::getId, ids)); + } +} \ No newline at end of file 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 e136e13a4..05b7fbe0b 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 @@ -2,16 +2,20 @@ 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.data.datascope.DataScope; +import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; -import com.bsd.pjcloud.hard.api.dto.HardAuthDto; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +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.service.HardAuthService; +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; @@ -20,10 +24,10 @@ 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.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.Objects; /** * 硬件授权 @@ -37,6 +41,35 @@ public class HardAuthController { private final HardAuthService hardAuthService; + /* ************************************* start app start ************************************* */ + + @Operation(summary = "app获取智能柜授权信息", description = "app获取智能柜授权信息") + @PostMapping("/app/get-auth-hard-door") + public R appGetAuthHardDoor(@Valid @RequestBody HardGetAuthAppDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setUserId(user.getId()); + return R.ok(hardAuthService.appGetAuthHardDoor(dto)); + } + + @Operation(summary = "app智能柜授权", description = "app智能柜授权") + @PostMapping("/app/auth-hard-door") + public R appAuthHardDoor(@Valid @RequestBody HardAuthAppDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setUserId(user.getId()); + return R.ok(hardAuthService.appAuthHardDoor(dto)); + } + + /* ************************************* end app end ************************************* */ + + @Operation(summary = "流程错误手动处理", description = "流程错误手动处理") + @PostMapping("/error-change") + @Idempotent(expireTime = 5, info = "正在开门中,请勿重复操作") + public R errorChange(@Validated @RequestBody HardAuthErrorChangeDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + hardAuthService.errorChange(dto, user.getId()); + return R.ok(); + } + @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('hard_hardAuth_view')") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardDoorFlowController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardDoorFlowController.java new file mode 100644 index 000000000..3a39303cf --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardDoorFlowController.java @@ -0,0 +1,206 @@ +package com.bsd.pjcloud.hard.controller; + +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.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; +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.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.hard.api.constant.flow.HardDoorFlowBizEnum; +import com.bsd.pjcloud.hard.api.constant.HardDoorOpenTypeEnum; +import com.bsd.pjcloud.hard.api.dto.HardDoorFlowDto; +import com.bsd.pjcloud.hard.api.dto.HardDoorFlowOpenDto; +import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; +import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; +import com.bsd.pjcloud.hard.service.HardDoorFlowService; +import com.bsd.pjcloud.thirdparty.dto.door.DoorOpenCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.door.DoorStatusCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.door.DoorVideoCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 智能柜流程 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-door-flow") +@Tag(description = "hard-door-flow", name = "智能柜流程管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardDoorFlowController { + + private final HardDoorFlowService hardDoorFlowService; + + /* ************************************* start 远程调用 start ************************************* */ + + /** + * 处理柜子开门回调 + */ + @Inner() + @PostMapping("/dispose-locak-callback") + public void disposeLocakCallback(@RequestBody DoorOpenCallbackDto dto) { + hardDoorFlowService.disposeLocakCallback(dto); + } + + /** + * 处理柜子视频回调 + */ + @Inner() + @PostMapping("/dispose-video-callback") + public void disposeVideoCallback(@RequestBody DoorVideoCallbackDto dto) { + hardDoorFlowService.disposeVideoCallback(dto); + } + + /** + * 处理柜子状态回调 + */ + @Inner() + @PostMapping("/dispose-status-callback") + public void disposeStatusCallback(@RequestBody DoorStatusCallbackDto dto) { + hardDoorFlowService.disposeStatusCallback(dto); + } + + /** + * 处理旷世识别回调 + */ + @Inner() + @PostMapping("/dispose-recognition-callback") + public void disposeRecognitionCallback(@RequestBody KsRecognitionCallbackDto dto) { + hardDoorFlowService.disposeRecognitionCallback(dto); + } + + /* ************************************* end 远程调用 end ************************************* */ + + /* ************************************* start app start ************************************* */ + + @Operation(summary = "上架开门", description = "上架开门") + @PostMapping("/app/open-repertory") + @Idempotent(expireTime = 5, info = "正在开门中,请勿重复操作") + public R openRepertory(@Validated @RequestBody HardDoorFlowOpenDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setFlowType(HardDoorFlowBizEnum.REPERTORY_OPEN); + dto.setOpenType(HardDoorOpenTypeEnum.NO_RECORD_VIDEO); + dto.setUserId(user.getId()); + return R.ok(hardDoorFlowService.openDoorRepertory(dto)); + } + + @Operation(summary = "app检修开门", description = "app检修开门") + @PostMapping("/app/open-access") + @Idempotent(expireTime = 5, info = "正在开门中,请勿重复操作") + public R appOpenAccess(@Validated @RequestBody HardDoorFlowOpenDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setFlowType(HardDoorFlowBizEnum.ACCESS_OPEN); + dto.setOpenType(HardDoorOpenTypeEnum.MAINTENANCE_UNLOCK); + dto.setUserId(user.getId()); + hardDoorFlowService.openDoorAccess(dto); + return R.ok(); + } + + @Operation(summary = "app检修开门", description = "app检修开门") + @PostMapping("/app/close-access") + @Idempotent(expireTime = 5, info = "正在关门中,请勿重复操作") + public R appCloseAccess(@Validated @RequestBody HardDoorFlowOpenDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setFlowType(HardDoorFlowBizEnum.ACCESS_OPEN); + dto.setOpenType(HardDoorOpenTypeEnum.MAINTENANCE_LOCK); + dto.setUserId(user.getId()); + hardDoorFlowService.closeAccess(dto); + return R.ok(); + } + + /* ************************************* end app end ************************************* */ + + @Operation(summary = "检修开门", description = "检修开门") + @PostMapping("/open-access") + @Idempotent(expireTime = 5, info = "正在开门中,请勿重复操作") + public R openAccess(@Validated @RequestBody HardDoorFlowOpenDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setFlowType(HardDoorFlowBizEnum.ACCESS_OPEN); + dto.setOpenType(HardDoorOpenTypeEnum.MAINTENANCE_UNLOCK); + dto.setUserId(user.getId()); + hardDoorFlowService.openDoorAccess(dto); + return R.ok(); + } + + @Operation(summary = "检修关门", description = "检修关门") + @PostMapping("/close-access") + @Idempotent(expireTime = 5, info = "正在关门中,请勿重复操作") + public R closeAccess(@Validated @RequestBody HardDoorFlowOpenDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setFlowType(HardDoorFlowBizEnum.ACCESS_OPEN); + dto.setOpenType(HardDoorOpenTypeEnum.MAINTENANCE_LOCK); + dto.setUserId(user.getId()); + hardDoorFlowService.closeAccess(dto); + return R.ok(); + } + + @Operation(summary = "复杂查询", description = "复杂查询") + @GetMapping("/page-join") + @PreAuthorize("@pms.hasPermission('dzc_hardDoorFlow_view')") + public R> pageJoin(@ParameterObject Page page, @ParameterObject HardDoorFlowDto dto) { + DataScope dataScope = null; + return R.ok(hardDoorFlowService.scopePageJoin(page, dto, dataScope)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('dzc_hardDoorFlow_view')") + public R join(@PathVariable("id") Long id) { + return R.ok(hardDoorFlowService.join(id)); + } + + @Operation(summary = "通过订单id查询流程", description = "通过订单id查询流程") + @GetMapping("/get-by-order-id") + @PreAuthorize("@pms.hasPermission('dzc_hardDoorFlow_view')") + public R getByOrderId(@RequestParam Long orderId) { + return R.ok(hardDoorFlowService.getByOrderId(orderId)); + } + + + @Operation(summary = "新增智能柜流程", description = "新增智能柜流程") + @SysLog("新增智能柜流程") + @PostMapping + @PreAuthorize("@pms.hasPermission('dzc_hardDoorFlow_add')") + public R save(@RequestBody HardDoorFlowEntity hardDoorFlow) { + return R.ok(hardDoorFlowService.save(hardDoorFlow)); + } + + @Operation(summary = "修改智能柜流程", description = "修改智能柜流程") + @SysLog("修改智能柜流程") + @PutMapping + @PreAuthorize("@pms.hasPermission('dzc_hardDoorFlow_edit')") + public R updateById(@RequestBody HardDoorFlowEntity hardDoorFlow) { + return R.ok(hardDoorFlowService.updateById(hardDoorFlow)); + } + + @Operation(summary = "通过id删除智能柜流程", description = "通过id删除智能柜流程") + @SysLog("通过id删除智能柜流程") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('dzc_hardDoorFlow_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(hardDoorFlowService.removeBatchByIds(CollUtil.toList(ids))); + } + + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('dzc_hardDoorFlow_export')") + public List export(HardDoorFlowEntity hardDoorFlow, Long[] ids) { + return hardDoorFlowService.list(Wrappers.lambdaQuery(hardDoorFlow).in(ArrayUtil.isNotEmpty(ids), HardDoorFlowEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/manager/HardDoorManagerController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/manager/HardDoorManagerController.java index c697e13f5..9db6b6e2b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/manager/HardDoorManagerController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/manager/HardDoorManagerController.java @@ -9,12 +9,15 @@ 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.hard.api.dto.manager.HardDoorCabinetDto; import com.bsd.pjcloud.hard.api.dto.manager.HardDoorManagerDto; import com.bsd.pjcloud.hard.api.dto.spu.HardChangeVolume; +import com.bsd.pjcloud.hard.api.entity.manager.HardDoorCabinetEntity; import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity; +import com.bsd.pjcloud.hard.api.vo.manager.HardDoorCabinetVo; import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo; +import com.bsd.pjcloud.hard.service.HardDoorCabinetService; import com.bsd.pjcloud.hard.service.HardDoorManagerService; -import com.bsd.pjcloud.thirdparty.dto.door.DoorVolumeDto; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -39,16 +42,39 @@ import java.util.List; public class HardDoorManagerController { private final HardDoorManagerService hardDoorManagerService; + private final HardDoorCabinetService hardDoorCabinetService; + + /* ************************************* start APP start ************************************* */ + + @Operation(summary = "app查询智能柜列表", description = "app查询智能柜列表") + @GetMapping("/app/page") + public R> appPage(@ParameterObject Page page, @ParameterObject HardDoorManagerDto dto) { + DataScope dataScope = null; + return R.ok(hardDoorManagerService.scopePageJoin(page, dto, dataScope)); + } + + @Operation(summary = "app查询智能柜详情", description = "app查询智能柜详情") + @GetMapping("/app/detail") + public R appDetail(@RequestParam Long hardDoorId) { + return R.ok(hardDoorManagerService.getByHardDoorId(hardDoorId)); + } + + /* ************************************* start APP start ************************************* */ @Operation(summary = "绑定设备", description = "绑定设备") @PostMapping("/bind") public R bind(@RequestBody HardDoorManagerEntity dto) { if (ObjectUtil.isEmpty(dto.getImei())) throw new RuntimeException("设备IMEI卡号不能为空"); - if (ObjectUtil.isEmpty(dto.getDeviceCode())) throw new RuntimeException("设备内置设备编号不能为空"); hardDoorManagerService.bind(dto); return R.ok(); } + @Operation(summary = "刷新智能柜货柜二维码", description = "刷新智能柜货柜二维码") + @GetMapping("/refresh-qr-code") + public R refreshQrCode(@RequestParam Long hardDoorId, @RequestParam Integer cabinetNo) { + return R.ok(hardDoorCabinetService.refreshQrCode(hardDoorId, cabinetNo)); + } + @Operation(summary = "音量修改", description = "音量修改") @PostMapping("/change-volume") public R changeVolume(@Validated @RequestBody HardChangeVolume dto) { @@ -56,6 +82,12 @@ public class HardDoorManagerController { return R.ok(); } + @Operation(summary = "柜门下拉查询", description = "柜门下拉查询") + @GetMapping("/select-cabinet") + public R> selectCabinet(@ParameterObject Page page, @ParameterObject HardDoorCabinetDto dto) { + return R.ok(hardDoorManagerService.selectCabinet(page, dto)); + } + @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('hard_hardDoorManager_view')") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/manager/HardManagerController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/manager/HardManagerController.java index e06e9978d..f7ea48a63 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/manager/HardManagerController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/manager/HardManagerController.java @@ -55,7 +55,7 @@ public class HardManagerController { @Operation(summary = "分页复杂查询", description = "分页复杂查询") @GetMapping("/page-join") - @PreAuthorize("@pms.hasPermission('hard_hardInvoice_view')") + @PreAuthorize("@pms.hasPermission('hard_hardManager_view')") public R pageJoin(@ParameterObject Page page, @ParameterObject HardManagerDto dto) { return R.ok(hardManagerService.scopePageList(page, 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 00755bb09..f81378aa7 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 @@ -3,7 +3,6 @@ package com.bsd.pjcloud.hard.controller.order; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.resource.ResourceUtil; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; @@ -20,7 +19,6 @@ import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.DataScopeFuncEnum; import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; -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; @@ -44,7 +42,6 @@ import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; 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; import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; @@ -139,7 +136,7 @@ public class HardOrderController { dto.setIsFindCarList(false); PjcloudUser user = SecurityUtils.getUser(); // 查询用户部门 - UserInfo userInfo = userService.getByUserId(user.getId()).getData(); + UserInfo userInfo = userService.getInnerByUserId(user.getId()).getData(); // 判断是否为合作超市管理员工 if (!hardManagerService.isSuperMarketAdmin(user)) return R.ok(new Page()); // 查询用户属于的商户 @@ -164,9 +161,9 @@ public class HardOrderController { @Operation(summary = "app创建订单", description = "app创建订单") @GetMapping("/app/create-order") @Idempotent(expireTime = 10, info = "正在创建订单中,请勿重复操作") - public R appCreateOrder(@RequestParam Long carParentId, @RequestParam HardTypeEnum hardType) { + public R appCreateOrder(@RequestParam Long carParentId, @RequestParam Long apptId, @RequestParam HardTypeEnum hardType) { PjcloudUser user = SecurityUtils.getUser(); - HardAppCreateOrderDto dto = HardAppCreateOrderDto.builder().carParentId(carParentId).walletType(WalletTypeEnum.EAT).hardType(hardType).userId(user.getId()).orderType(HardOrderTypeEnum.RESERVE).payType(HardPayTypeEnum.WALLET_DEFAULT).build(); + HardAppCreateOrderDto dto = HardAppCreateOrderDto.builder().carParentId(carParentId).walletType(WalletTypeEnum.EAT).hardType(hardType).userId(user.getId()).orderType(HardOrderTypeEnum.RESERVE).payType(HardPayTypeEnum.WALLET_DEFAULT).apptId(apptId).build(); return R.ok(hardwareOrderService.appCreateOrder(dto)); } @@ -230,30 +227,6 @@ public class HardOrderController { return R.ok(hardwareOrderService.join(id)); } - @Operation(summary = "新增订单表", description = "新增订单表") - @SysLog("新增订单表") - @PostMapping - @PreAuthorize("@pms.hasPermission('hard_hardwareOrder_add')") - public R save(@RequestBody HardOrderEntity hardwareOrder) { - return R.ok(hardwareOrderService.save(hardwareOrder)); - } - - @Operation(summary = "修改订单表", description = "修改订单表") - @SysLog("修改订单表") - @PutMapping - @PreAuthorize("@pms.hasPermission('hard_hardwareOrder_edit')") - public R updateById(@RequestBody HardOrderEntity hardwareOrder) { - return R.ok(hardwareOrderService.updateById(hardwareOrder)); - } - - @Operation(summary = "通过id删除订单表", description = "通过id删除订单表") - @SysLog("通过id删除订单表") - @DeleteMapping - @PreAuthorize("@pms.hasPermission('hard_hardwareOrder_del')") - public R removeById(@RequestBody Long[] ids) { - return R.ok(hardwareOrderService.removeBatchByIds(CollUtil.toList(ids))); - } - @GetMapping("/export") @PreAuthorize("@pms.hasPermission('hard_hardwareOrder_export')") public void export(HttpServletResponse response, HardOrderDto dto) throws IOException { 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 948c2e7fd..b98c69b17 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 @@ -66,10 +66,10 @@ public class HardOrderTotalController { /* ************************************* start app start ************************************* */ @Operation(summary = "app查询商户每天流水记录", description = "app查询订单列表根据权限") @GetMapping("/app/mch-water-day") - public R appMchTotal(@ParameterObject Page page, @ParameterObject HardOrderDto dto) { + public R appMchWaterDay(@ParameterObject Page page, @ParameterObject HardOrderDto dto) { PjcloudUser user = SecurityUtils.getUser(); // 查询用户部门 - UserInfo userInfo = userService.getByUserId(user.getId()).getData(); + UserInfo userInfo = userService.getInnerByUserId(user.getId()).getData(); dto.setIsFindCarList(false); // 判断是否为合作超市管理员工 if (!hardManagerService.isSuperMarketAdmin(user)) return R.ok(new Page()); @@ -85,6 +85,30 @@ public class HardOrderTotalController { dto.setMchIds(mchDtoIds); return R.ok(hardOrderTotalService.listCsByDay(page, dto, user)); } + + @Operation(summary = "app查询商户全部流水记录", description = "app查询商户全部流水记录") + @GetMapping("/app/mch-water-total") + public R appMchWaterTotal(@ParameterObject HardOrderDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + // 查询用户部门 + UserInfo userInfo = userService.getInnerByUserId(user.getId()).getData(); + dto.setIsFindCarList(false); + // 判断是否为合作超市管理员工 + if (!hardManagerService.isSuperMarketAdmin(user)) return R.ok(new Page()); + // 查询用户属于的商户 + MchManageVo mch = mchService.getFirstMchByDeptId(userInfo.getSysUser().getDeptId()).getData(); + if (ObjectUtil.isEmpty(mch)) throw new RuntimeException("该用户下不存在商户"); + List mchDtoIds = new ArrayList<>(List.of(mch.getId())); + // 查询商户和下面的子商户 + List mchList = mchService.getByParentId(mch.getId()).getData(); + // 查询子商户 + List mchIds = mchList.stream().map(MchManageVo::getId).toList(); + mchDtoIds.addAll(mchIds); + dto.setMchIds(mchDtoIds); + return R.ok(hardOrderTotalService.mchWaterTotal(dto, user)); + } + + /* ************************************* end app end ************************************* */ @PostMapping("/page-list-sb") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuController.java index 462e0713c..36fd5dda5 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuController.java @@ -7,11 +7,14 @@ 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.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.hard.api.dto.spu.HardPutawayDto; import com.bsd.pjcloud.hard.api.dto.spu.HardSpuDto; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuJoinVo; import com.bsd.pjcloud.hard.service.HardSpuService; +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; @@ -39,6 +42,45 @@ public class HardSpuController { private final HardSpuService hardSpuService; + /* ************************************* start APP start ************************************* */ + + @Operation(summary = "app上架", description = "上架") + @PostMapping("/app/putaway") + @Idempotent(expireTime = 5, info = "正在上架中,请勿重复操作") + public R appPutaway(@Valid @RequestBody HardPutawayDto dto) { + hardSpuService.putaway(dto); + return R.ok(); + } + + @Operation(summary = "app下架", description = "下架") + @PostMapping("/app/un-putaway") + @Idempotent(expireTime = 5, info = "正在下架中,请勿重复操作") + public R appUnPutaway(@Valid @RequestBody HardPutawayDto dto) { + hardSpuService.unPutaway(dto); + return R.ok(); + } + + @Operation(summary = "app查询货柜补货商品列表", description = "查询货柜补货商品列表") + @GetMapping("/app/cabinet-putaway-list") + public R appCabinetPutawayList(@RequestParam Long hardDoorId, @RequestParam String cabinetNo) { + return R.ok(hardSpuService.appCabinetPutawayList(hardDoorId, cabinetNo)); + } + + @Operation(summary = "app查询货柜商品列表", description = "查询货柜商品列表") + @GetMapping("/app/cabinet-list") + public R appCabinetList(@RequestParam Long hardId, @RequestParam String cabinetNo) { + return R.ok(hardSpuService.getByCabinetNo(hardId, cabinetNo)); + } + + @Operation(summary = "app商品类表", description = "app商品类表") + @GetMapping("/app/page") + public R appPage(@ParameterObject Page page, @ParameterObject HardSpuDto dto) { + DataScope dataScope = null; + return R.ok(hardSpuService.scopPageJoin(page, dto, dataScope)); + } + + /* ************************************* end APP end ************************************* */ + @Operation(summary = "拉取旷世商品", description = "拉取旷世商品") @GetMapping("/async-all") public R asyncAll() { @@ -52,6 +94,21 @@ public class HardSpuController { return R.ok(hardSpuService.getByCabinetNo(hardId, cabinetNo)); } + @Operation(summary = "上架", description = "上架") + @PostMapping("/putaway") + public R putaway(@RequestBody HardPutawayDto dto) { + hardSpuService.putaway(dto); + return R.ok(); + } + + @Operation(summary = "下架", description = "下架") + @PostMapping("/un-putaway") + public R unPutaway(@RequestBody HardPutawayDto dto) { + hardSpuService.unPutaway(dto); + return R.ok(); + } + + @Operation(summary = "下拉查询", description = "下拉查询") @GetMapping("/select") public R select(@ParameterObject Page page, @ParameterObject HardSpuDto dto) { diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuRepertoryController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuRepertoryController.java index 894c97338..c8cd6846b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuRepertoryController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/spu/HardSpuRepertoryController.java @@ -2,17 +2,21 @@ package com.bsd.pjcloud.hard.controller.spu; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.collection.CollUtil; +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.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; +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.hard.api.dto.spu.DeductionSpuRepertoryDto; import com.bsd.pjcloud.hard.api.dto.spu.HardSpuRepertoryDto; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuRepertoryEntity; import com.bsd.pjcloud.hard.service.HardSpuRepertoryService; +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; @@ -25,7 +29,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.Objects; /** * 硬件商品库存更新记录 @@ -39,10 +42,17 @@ public class HardSpuRepertoryController { private final HardSpuRepertoryService hardSpuRepertoryService; - /* ************************************* start app start ************************************* */ + /* ************************************* start APP start ************************************* */ + @Operation(summary = "app上架完成", description = "app上架完成") + @PostMapping("/app/repertory-done") + @Idempotent(expireTime = 5, info = "正在操作中,请勿重复操作") + public R appRepertoryDone(@Valid @RequestBody DeductionSpuRepertoryDto body) { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(hardSpuRepertoryService.appRepertoryDone(body, user.getId())); + } - /* ************************************* end app end ************************************* */ + /* ************************************* end APP end ************************************* */ @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @@ -71,9 +81,13 @@ public class HardSpuRepertoryController { @SysLog("新增硬件商品库存更新记录") @PostMapping @PreAuthorize("@pms.hasPermission('hard_hardSpuRepertory_add')") - public R save(@Validated @RequestBody HardSpuRepertoryEntity hardSpuRepertory) { + @Idempotent(expireTime = 5, info = "正在上架中,请勿重复操作") + public R save(@Validated @RequestBody HardSpuRepertoryDto dto) { + if (ObjectUtil.isEmpty(dto.getCabinetId())) { + return R.failed("请选择所属柜门"); + } PjcloudUser user = SecurityUtils.getUser(); - return R.ok(hardSpuRepertoryService.create(hardSpuRepertory, user)); + return R.ok(hardSpuRepertoryService.create(dto, user)); } @Operation(summary = "修改硬件商品库存更新记录", description = "修改硬件商品库存更新记录") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardApptMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardApptMapper.java new file mode 100644 index 000000000..dda32c2d8 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardApptMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.hard.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.hard.api.entity.HardApptEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface HardApptMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardDoorFlowMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardDoorFlowMapper.java new file mode 100644 index 000000000..16a988937 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardDoorFlowMapper.java @@ -0,0 +1,38 @@ +package com.bsd.pjcloud.hard.mapper; + +import cn.hutool.core.util.ObjectUtil; +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.HardDoorFlowDto; +import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; +import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; +import com.github.yulichang.query.MPJLambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface HardDoorFlowMapper extends PjcloudBaseMapper { + + + default Page scopePageJoin(Page page, HardDoorFlowDto dto, DataScope dataScope) { + MPJLambdaQueryWrapper wrapper = new MPJLambdaQueryWrapper() + .selectAll(HardDoorFlowEntity.class) + .eq(ObjectUtil.isNotEmpty(dto.getUserId()), HardDoorFlowEntity::getUserId, dto.getUserId()) + .eq(ObjectUtil.isNotEmpty(dto.getBizType()), HardDoorFlowEntity::getBizType, dto.getBizType()) + .eq(ObjectUtil.isNotEmpty(dto.getHardDoorId()), HardDoorFlowEntity::getHardDoorId, dto.getHardDoorId()) + .eq(ObjectUtil.isNotEmpty(dto.getCabinetNo()), HardDoorFlowEntity::getCabinetNo, dto.getCabinetNo()) + .eq(ObjectUtil.isNotEmpty(dto.getOrderId()), HardDoorFlowEntity::getOrderId, dto.getOrderId()) + .eq(ObjectUtil.isNotEmpty(dto.getIsOpen()), HardDoorFlowEntity::getIsOpen, dto.getIsOpen()) + .between( + ObjectUtil.isNotEmpty(dto.getCreateTimeList()), + HardDoorFlowEntity::getCreateTime, + ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[0] : null, + ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[1] : null + ) + .orderByDesc(HardDoorFlowEntity::getCreateTime) + .orderByDesc(HardDoorFlowEntity::getId); + return selectJoinPage(page, HardDoorFlowVo.class, wrapper); + } +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/manager/HardDoorCabinetMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/manager/HardDoorCabinetMapper.java new file mode 100644 index 000000000..1ff0f4db9 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/manager/HardDoorCabinetMapper.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.hard.mapper.manager; + +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.manager.HardDoorCabinetDto; +import com.bsd.pjcloud.hard.api.entity.manager.HardDoorCabinetEntity; +import com.bsd.pjcloud.hard.api.vo.manager.HardDoorCabinetVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface HardDoorCabinetMapper extends PjcloudBaseMapper { + + Page scopePageJoin(Page page, @Param("dto") HardDoorCabinetDto 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/manager/HardDoorManagerMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/manager/HardDoorManagerMapper.java index 7623514eb..391543951 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/manager/HardDoorManagerMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/manager/HardDoorManagerMapper.java @@ -14,5 +14,7 @@ public interface HardDoorManagerMapper extends PjcloudBaseMapper scopePageJoin(Page page, @Param("dto") HardDoorManagerDto dto, DataScope dataScope); - HardDoorManagerVo pageJoin(@Param("hardId") Long hardId); + HardDoorManagerVo pageJoinByHardDoorId(@Param("hardDoorId") Long hardDoorId); + + HardDoorManagerVo pageJoinByHardId(@Param("hardId") Long hardId); } \ No newline at end of file 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 12c06a4ba..20535d003 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 @@ -101,6 +101,8 @@ public interface HardOrderMapper extends PjcloudBaseMapper { List listCsByDay(@Param("dto") HardOrderDto totalDto); + HardOrderCsVo listCsTotal(@Param("dto") HardOrderDto totalDto); + List listOrerPayType(@Param("dto") HardOrderDto dto); List sumAndCount(@Param("dto") HardOrderSumAndCountDto dto); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardApptService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardApptService.java new file mode 100644 index 000000000..7abbc3128 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardApptService.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.hard.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.hard.api.entity.HardApptEntity; + +import java.util.ArrayList; + +public interface HardApptService extends IService { + + /** + * 新增 + */ + Long create(HardApptEntity hardAppt); + + /** + * 修改 + */ + Long edit(HardApptEntity hardAppt); + + /** + * 删除 + */ + void delByIds(ArrayList list); +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAuthService.java index 4285a5857..bd5b661e9 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,11 +3,36 @@ 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.entity.HardAuthEntity; import com.bsd.pjcloud.hard.api.vo.HardAuthVo; +import com.bsd.pjcloud.hard.api.vo.HardGetAuthAppVo; +import jakarta.validation.Valid; public interface HardAuthService extends IService { Page scopePageJoin(Page page, HardAuthDto dto, DataScope dataScope); + + /** + * app获取智能柜授权信息 + */ + HardGetAuthAppVo appGetAuthHardDoor(@Valid HardGetAuthAppDto dto); + + /** + * app智能柜授权 + */ + Long appAuthHardDoor(HardAuthAppDto dto); + + /** + * 判断当前用户信誉 + */ + boolean judgeUserCredit(Long userId); + + /** + * 流程错误手动处理 + */ + 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/HardBroadcastService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardBroadcastService.java index eb5bf30b9..240de46e7 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardBroadcastService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardBroadcastService.java @@ -2,13 +2,24 @@ 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.admin.api.dto.UserInfo; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.hard.api.dto.HardBroadcastDto; import com.bsd.pjcloud.hard.api.entity.HardBroadcastEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; import com.bsd.pjcloud.hard.api.vo.HardBroadcastVo; public interface HardBroadcastService extends IService { Page scopePageJoin(Page page, HardBroadcastDto dto, DataScope dataScope); + /** + * 添加线下食堂预约订单广播 + */ + void addReserveOrderTask(HardOrderEntity orderdetail, UserInfo userInfo); + + /** + * 完成硬件广播 + */ + void doneBroadcast(HardOrderEntity orderdetail); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java index d183aa688..7ed95232c 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCarService.java @@ -31,27 +31,17 @@ public interface HardCarService extends IService { /** * 新增或者更新购物车 - * - * @param dto */ void saveOrUpload(HardCarSaveOrUpdateDto dto); /** - * @param userId 用户id - * @param merchantId 商户id - * @param sysType 硬件设备类型 - * @param list g购物车类表 - * @return 父购物车id + * 创建购物车 */ Long createCard(Long userId, Long merchantId, HardTypeEnum sysType, HardOrderTypeEnum orderTYpe, List list); /** * 生成购买商品的描述 - * - * @param sysType 订单类型 - * @param list 购物车列表 - * @return */ String computerCarSubject(HardTypeEnum sysType, HardOrderTypeEnum orderType, List list); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorCabinetService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorCabinetService.java new file mode 100644 index 000000000..f4aabea87 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorCabinetService.java @@ -0,0 +1,25 @@ +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.manager.HardDoorCabinetDto; +import com.bsd.pjcloud.hard.api.entity.manager.HardDoorCabinetEntity; +import com.bsd.pjcloud.hard.api.vo.manager.HardDoorCabinetVo; +import com.bsd.pjcloud.thirdparty.vo.door.DoorStatusVo; + +import java.util.List; + +public interface HardDoorCabinetService extends IService { + + Page scopePageJoin(Page page, HardDoorCabinetDto dto, DataScope dataScope); + + void saveOrUpdate(Long hardDoorId, List list); + + List getListByHardDoorId(Long hardDoorId); + + /** + * 刷新智能柜货柜二维码 + */ + String refreshQrCode(Long hardDoorId, Integer cabinetNo); +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java new file mode 100644 index 000000000..001fff8b7 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorFlowService.java @@ -0,0 +1,69 @@ +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.HardDoorFlowDto; +import com.bsd.pjcloud.hard.api.dto.HardDoorFlowOpenDto; +import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; +import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; +import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo; +import com.bsd.pjcloud.thirdparty.dto.door.DoorOpenCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.door.DoorStatusCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.door.DoorVideoCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; + +public interface HardDoorFlowService extends IService { + + /** + * 复杂查询 + */ + Page scopePageJoin(Page page, HardDoorFlowDto dto, DataScope dataScope); + + HardDoorFlowVo join(Long id); + + /** + * 通过订单id查询流程 + */ + HardDoorFlowVo getByOrderId(Long orderId); + + /** + * 检修开门 + */ + void openDoorAccess(HardDoorFlowOpenDto dto); + + /** + * 检修关门 + */ + void closeAccess(HardDoorFlowOpenDto dto); + + /** + * 购买开门 + */ + void openDoorPay(HardDoorFlowOpenDto dto, HardDoorManagerVo hardDoorDetail); + + /** + * 上架开门 + */ + Long openDoorRepertory(HardDoorFlowOpenDto dto); + + /** + * 处理开门回调 + */ + void disposeLocakCallback(DoorOpenCallbackDto dto); + + /** + * 处理柜子状态回调 + */ + void disposeStatusCallback(DoorStatusCallbackDto dto); + + /** + * 处理视频回调 + */ + void disposeVideoCallback(DoorVideoCallbackDto dto); + + /** + * 处理旷世识别回调 + */ + void disposeRecognitionCallback(KsRecognitionCallbackDto dto); +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorManagerService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorManagerService.java index 8dce4677c..19292fb6f 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorManagerService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardDoorManagerService.java @@ -3,27 +3,54 @@ 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.manager.HardDoorCabinetDto; import com.bsd.pjcloud.hard.api.dto.manager.HardDoorManagerDto; import com.bsd.pjcloud.hard.api.dto.spu.HardChangeVolume; import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity; +import com.bsd.pjcloud.hard.api.vo.manager.HardDoorCabinetVo; import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo; public interface HardDoorManagerService extends IService { Page scopePageJoin(Page page, HardDoorManagerDto dto, DataScope dataScope); + /** + * 柜门下拉查询 + */ + Page selectCabinet(Page page, HardDoorCabinetDto dto); + + /** + * 根据智能硬件id查询详情 + */ + HardDoorManagerVo getByHardDoorId(Long hardDoorId); + /** * 根据硬件id查询详情 */ HardDoorManagerVo getByHardId(Long hardId); + /** + * 根据硬件设备编号查询详情 + */ + HardDoorManagerVo getByDeviceCode(String deviceCode); + /** * 绑定设备 */ void bind(HardDoorManagerEntity dto); + /** + * 刷新设备信息 + */ + HardDoorManagerEntity refresh(String deviceCode); + /** * 音量修改 */ void changeVolume(HardChangeVolume dto); + + /** + * 校验设备和货柜编号 + */ + HardDoorManagerVo checkDeviceAndCabinet(Long hardDoorId, Integer cabinetNo); } \ No newline at end of file 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 ea46186b9..d1ef932a7 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 @@ -2,15 +2,18 @@ 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.admin.api.dto.UserInfo; 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.dto.hard.HandCancelCodeDto; import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto; +import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateOrderDto; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; +import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; import jakarta.validation.Valid; import java.util.List; @@ -42,6 +45,21 @@ public interface HardOrderService extends IService { */ Long appCreateOrderScancode(@Valid HardAppCreateOrderDto dto); + /** + * 创建智能柜订单 + */ + Long createHardDoorOrder(Long userId, Long hardId); + + /** + * 结算智能柜订单 + */ + Long payHardDoorOrder(HardOrderEntity dto, List ksSpuList); + + /** + * 智能柜取消订单 + */ + Long cancelHardDoorOrder(Long orderId); + /** * 快速扣款,离线订单使用 */ @@ -75,5 +93,5 @@ public interface HardOrderService extends IService { /** * 创建订单后发送mq消息 */ - void createOrderAfterSendMqMsg(Long orderId); + void createOrderAfterSendMqMsg(Long orderId, UserInfo userInfo); } \ No newline at end of file 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 3b48f3a85..fae9cbf87 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 @@ -26,6 +26,11 @@ public interface HardOrderTotalService { */ List listCsByDay(Page page, HardOrderDto dto, PjcloudUser user); + /** + * 查询商户总共流水记录 + */ + HardOrderCsVo mchWaterTotal(HardOrderDto dto, PjcloudUser user); + /** * 部门交易记录 */ @@ -45,4 +50,5 @@ public interface HardOrderTotalService { * 统计每天、每周、每月、每年的交易人数和次数 */ HardChartLatitudeVo chartLatitude(Long merchantId); + } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuJoinService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuJoinService.java index 14880723c..3396cf18e 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuJoinService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuJoinService.java @@ -10,4 +10,6 @@ import java.util.List; public interface HardSpuJoinService extends IService { List scopeList(HardSpuJoinDto dto); + + List getSpuList(Long hardDoorId, Integer cabinetNo); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuRepertoryService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuRepertoryService.java index 8092bfb6c..5e5e18865 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuRepertoryService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuRepertoryService.java @@ -4,9 +4,11 @@ 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.common.security.service.PjcloudUser; +import com.bsd.pjcloud.hard.api.dto.spu.DeductionSpuRepertoryDto; import com.bsd.pjcloud.hard.api.dto.spu.HardSpuRepertoryDto; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuRepertoryEntity; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuRepertoryVo; +import jakarta.validation.Valid; import java.util.ArrayList; @@ -17,7 +19,7 @@ public interface HardSpuRepertoryService extends IService list); + + /** + * app上架完成 + */ + Boolean appRepertoryDone(DeductionSpuRepertoryDto body, Long userId); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuService.java index b02be44f2..e4d8cfc9c 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardSpuService.java @@ -3,7 +3,10 @@ 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.spu.DeductionSpuStockDto; +import com.bsd.pjcloud.hard.api.dto.spu.HardPutawayDto; import com.bsd.pjcloud.hard.api.dto.spu.HardSpuDto; +import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuJoinVo; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuVo; @@ -19,6 +22,10 @@ public interface HardSpuService extends IService { */ Page scopPageJoin(Page page, HardSpuDto dto, DataScope dataScope); + List get(List ksSpuIds); + + List getByIds(List spuIds); + /** * 新增 */ @@ -37,10 +44,35 @@ public interface HardSpuService extends IService { /** * 根据 hardwareId 和 cabinetNo 查询商品 */ - List>> getByCabinetNo(Long hardId, String cabinetNo); + List>> getByCabinetNo(Long Long, String cabinetNo); + + /** + * 查询货柜补货商品列表 + */ + List appCabinetPutawayList(Long hardDoorId, String cabinetNo); + + /** + * 上架 + */ + void putaway(HardPutawayDto dto); + + /** + * 下架 + */ + void unPutaway(HardPutawayDto dto); /** * 拉取旷世商品 */ void asyncAll(); + + /** + * 检验商品 + */ + HardSpuEntity validateSpu(Long hardSpuId); + + /** + * 扣减库存 + */ + Boolean deductionSpuStock(HardDoorFlowEntity hardDoorFlow, List list); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardApiServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardApiServiceImpl.java index 07644f2c3..43ad89152 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardApiServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardApiServiceImpl.java @@ -28,7 +28,7 @@ public class HardApiServiceImpl implements HardApiService { public HardAdUserVo getUserById(Long userId, HardTypeEnum type) { HardAdUserVo result = new HardAdUserVo(); // 查询用户 - UserInfo user = userService.getByUserId(userId).getData(); + UserInfo user = userService.getInnerByUserId(userId).getData(); if (ObjectUtil.isEmpty(user)) return null; // 查询钱包 // WalletTypeEnum walletType = ObjectUtil.equals(HardTypeEnum.CANTEEN, type) ? WalletTypeEnum.EAT : WalletTypeEnum.PAY; @@ -59,7 +59,7 @@ public class HardApiServiceImpl implements HardApiService { WalletManageEntity wallet = remoteWalletService.getWalletByCardNumber(card).getData(); if (ObjectUtil.isEmpty(wallet)) return null; // 查询用户 - UserInfo user = userService.getByUserId(wallet.getUserId()).getData(); + UserInfo user = userService.getInnerByUserId(wallet.getUserId()).getData(); if (ObjectUtil.isEmpty(user)) return null; SysUser sysUser = user.getSysUser(); result.setUserId(sysUser.getUserId()); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardApptServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardApptServiceImpl.java new file mode 100644 index 000000000..b1f4b0a45 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardApptServiceImpl.java @@ -0,0 +1,71 @@ +package com.bsd.pjcloud.hard.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.hard.api.entity.HardApptEntity; +import com.bsd.pjcloud.hard.mapper.HardApptMapper; +import com.bsd.pjcloud.hard.service.HardApptService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.ArrayList; + +/** + * 设备预约管理 + */ +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class HardApptServiceImpl extends ServiceImpl implements HardApptService { + + /** + * 新增 + */ + @Override + public Long create(HardApptEntity dto) { + // title不能重复 + if (existTitle(dto.getTitle(), null)) { + throw new RuntimeException("标题不能重复"); + } + baseMapper.insert(dto); + return 0L; + } + + /** + * 修改 + */ + @Override + public Long edit(HardApptEntity dto) { + // title不能重复 + if (existTitle(dto.getTitle(), dto.getId())) { + throw new RuntimeException("标题不能重复"); + } + baseMapper.updateById(dto); + return dto.getId(); + } + + /** + * 删除 + */ + @Override + public void delByIds(ArrayList list) { + if (ObjectUtil.isEmpty(list)) return; + baseMapper.deleteBatchIds(list); + } + + private boolean existTitle(String title, Long id) { + Long count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(title), HardApptEntity::getTitle, title) + .ne(ObjectUtil.isNotEmpty(id), HardApptEntity::getId, id) + ); + if (ObjectUtil.isNotEmpty(id)) { + return count >= 1; + } + return count > 0; + } + +} \ No newline at end of file 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 434d0b8ad..c53ad4724 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,28 +1,41 @@ package com.bsd.pjcloud.hard.service.impl; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.admin.api.vo.UserVO; +import com.bsd.pjcloud.common.core.constant.enums.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.dto.HardAuthDto; +import com.bsd.pjcloud.hard.api.constant.HardAuthTypeEnum; +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.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.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 lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -35,6 +48,10 @@ import java.util.List; @Service public class HardAuthServiceImpl extends ServiceImpl implements HardAuthService { + private final HardDoorManagerService hardDoorManagerService; + private final HardDoorFlowService hardDoorFlowService; + private final HardOrderService hardOrderService; + private final HardManagerMapper hardManagerMapper; private final RemoteUserService remoteUserService; @@ -46,6 +63,96 @@ public class HardAuthServiceImpl extends ServiceImpl() + .eq(HardAuthEntity::getUserId, userId) + .eq(HardAuthEntity::getAuthStatus, YesNoEnum.YES.getCode()) + .eq(HardAuthEntity::getIsDone, YesNoEnum.NO.getCode()) + .ne(HardAuthEntity::getIsManualChange, YesNoEnum.YES.getCode()) + ); + return count <= 5; + } + + /** + * 流程错误手动处理 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void errorChange(HardAuthErrorChangeDto dto, Long userId) { + HardDoorFlowEntity hardDoorFlow = hardDoorFlowService.getById(dto.getFlowId()); + if (ObjectUtil.isEmpty(hardDoorFlow)) { + throw new RuntimeException("智能柜子购买流程不存在"); + } + HardAuthEntity hardAuth = baseMapper.selectById(hardDoorFlow.getAuthId()); + HardAuthEntity updateObj = new HardAuthEntity(); + updateObj.setId(hardAuth.getId()); + updateObj.setManualChangeUserId(userId); + updateObj.setIsManualChange(YesNoEnum.YES.getCode()); + updateObj.setManualChangeTime(LocalDateTime.now()); + updateObj.setManualChangeRemark(dto.getRemark()); + updateObj.setManualChangePic(dto.getImage()); + baseMapper.updateById(updateObj); + // 更新订单状态 + hardOrderService.cancelHardDoorOrder(hardDoorFlow.getOrderId()); + } + private void disposeList(List list, HardAuthDto dto) { if (ObjectUtil.isEmpty(list)) return; // 设备 @@ -67,4 +174,26 @@ public class HardAuthServiceImpl extends ServiceImpl implements HardBroadcastService { + static private final String TAG = "硬件广播"; + private final HardManagerMapper hardManagerMapper; private final RemoteUserService remoteUserService; + private final RemoteMqttEventService remoteMqttEventService; + @Override public Page scopePageJoin(Page page, HardBroadcastDto dto, DataScope dataScope) { Page pageList = baseMapper.scopePageJoin(page, dto, dataScope); @@ -47,6 +60,116 @@ public class HardBroadcastServiceImpl extends ServiceImpl() + .eq(HardBroadcastEntity::getBizId, orderdetail.getId()) + ); + if (ObjectUtil.isNotEmpty(broadcastDetail)) { + log.error("|{}|发送线下订餐mq消息失败,广播已存在|{}|", TAG, orderdetail.getId()); + return; + } + // 查询设备 + HardManagerEntity hardDetail = hardManagerMapper.selectOne(new LambdaQueryWrapper() + .eq(HardManagerEntity::getMerchantId, orderdetail.getMerchantId()) + .eq(HardManagerEntity::getIsTakeFood, YesNoEnum.YES.getCode()) + ); + if (ObjectUtil.isEmpty(hardDetail)) { + log.error("|{}|发送线下订餐mq消息失败,默认订餐设备不存在|{}|", TAG, orderdetail.getId()); + return; + } + String content = ""; + String phone = userInfo.getSysUser().getPhone(); + if (ObjectUtil.isNotEmpty(phone) && phone.length() >= 4) { + content = phone.substring(phone.length() - 4); + } + if (ObjectUtil.isEmpty(content)) { + log.error("|{}|发送线下订餐mq消息失败,生成发送消息错误|{}|", TAG, orderdetail.getId()); + return; + } + HardBroadcastEntity saveObj = HardBroadcastEntity.builder() + .userId(orderdetail.getUserId()) + .hardId(hardDetail.getId()) + .topic(hardDetail.getMainTopic()) + .bizType(HardBroadcastEnum.OFFLINE_CANTEEN_RESERVE.getType()) + .bizId(String.valueOf(orderdetail.getId())) + .title(HardBroadcastEnum.OFFLINE_CANTEEN_RESERVE.getDescription()) + .content(content) + .broadcastCount(0) + .broadcastMaxCount(20) + .isBroadcast(YesNoEnum.YES.getCode()) + .isDone(YesNoEnum.NO.getCode()) + .build(); + baseMapper.insert(saveObj); + String topic = saveObj.getTopic().replaceAll("/#", ""); + // 发送mq + HardTakeFoodBroadcastMsg msg = new HardTakeFoodBroadcastMsg(); + msg.setTopic(topic); + msg.setAction(MqttActionEnum.TAKE_FOOD_BROADCAST); + msg.setUserId(String.valueOf(userInfo.getSysUser().getUserId())); + msg.setUsername(userInfo.getSysUser().getName()); + msg.setUserMobile(userInfo.getSysUser().getPhone()); + msg.setId(String.valueOf(saveObj.getId())); + msg.setTitle(saveObj.getTitle()); + msg.setContent(saveObj.getContent()); + msg.setBroadcastMaxCount(saveObj.getBroadcastMaxCount()); + msg.setProductDesc(orderdetail.getProductDesc()); + msg.setPayPrice(orderdetail.getPayPrice()); + msg.setHourType(orderdetail.getHourType()); + remoteMqttEventService.sendTakeFoodBroadcast(msg); + } + + /** + * 完成硬件广播 + */ + @Override + public void doneBroadcast(HardOrderEntity orderdetail) { + if (ObjectUtil.isEmpty(orderdetail)) return; + HardTypeEnum hardTypeEnum = HardTypeEnum.valueOfByType(orderdetail.getSysType()); + if (ObjectUtil.isEmpty(orderdetail)) { + log.error("|{}|doneBroadcast发送mq消息失败,设备类型错误hardType不存在hardType|{}|", TAG, orderdetail.getSysType()); + return; + } + if (ObjectUtil.notEqual(hardTypeEnum, HardTypeEnum.CANTEEN)) return; + HardOrderTypeEnum hardOrderType = HardOrderTypeEnum.valueOfByType(orderdetail.getOrderType()); + if (ObjectUtil.isEmpty(hardOrderType)) { + log.error("|{}|doneBroadcast发送mq消息失败,订餐类型错误hardType不存在hardType|{}|", TAG, orderdetail.getOrderType()); + return; + } + if (ObjectUtil.notEqual(hardOrderType, HardOrderTypeEnum.RESERVE)) return; + HardBroadcastEntity broadcastDetail = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(HardBroadcastEntity::getBizId, orderdetail.getId()) + ); + if (ObjectUtil.isEmpty(broadcastDetail)) { + log.error("|{}|doneBroadcast发送mq消息失败,广播不存在|{}|", TAG, orderdetail.getId()); + return; + } + HardBroadcastEntity updateObj = HardBroadcastEntity.builder() + .id(broadcastDetail.getId()) + .isBroadcast(YesNoEnum.NO.getCode()) + .isDone(YesNoEnum.YES.getCode()) + .isDoneTime(orderdetail.getCreateTime()) + .build(); + baseMapper.updateById(updateObj); + } + private void disposeList(List list, HardBroadcastDto dto) { if (ObjectUtil.isEmpty(list)) return; // 设备 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java new file mode 100644 index 000000000..89f717fa3 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardDoorFlowServiceImpl.java @@ -0,0 +1,444 @@ +package com.bsd.pjcloud.hard.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.extra.spring.SpringUtil; +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.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.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.flow.HardDoorFlowBizEnum; +import com.bsd.pjcloud.hard.api.constant.flow.HardDoorFlowEnum; +import com.bsd.pjcloud.hard.api.dto.HardDoorFlowDto; +import com.bsd.pjcloud.hard.api.dto.HardDoorFlowOpenDto; +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.manager.HardDoorManagerEntity; +import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; +import com.bsd.pjcloud.hard.api.utils.HardUtil; +import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; +import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo; +import com.bsd.pjcloud.hard.api.vo.spu.HardSpuJoinVo; + +import java.time.temporal.ChronoUnit; + +import com.bsd.pjcloud.hard.mapper.HardDoorFlowMapper; +import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; +import com.bsd.pjcloud.hard.service.*; +import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdDoorApiService; +import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdKsService; +import com.bsd.pjcloud.thirdparty.dto.door.*; +import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; +import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionDto; +import com.bsd.pjcloud.thirdparty.vo.door.DoorOpenVo; +import com.bsd.pjcloud.thirdparty.vo.ks.KsRecognitionVo; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 智能柜流程 + */ +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class HardDoorFlowServiceImpl extends ServiceImpl implements HardDoorFlowService { + + private static final String TAG = "智能柜流程"; + + private final HardDoorManagerService hardDoorManagerService; + private final HardDoorCabinetService hardDoorCabinetService; + private final HardSpuJoinService hardSpuJoinService; + private final HardOrderService hardOrderService; + @Lazy + private final HardAuthService hardAuthService; + + private final HardManagerMapper hardManagerMapper; + + private final RemoterThirdDoorApiService thirdDoorApiService; + private final RemoterThirdKsService thirdKsService; + private final RemoteUserService remoteUserService; + private final RemoteWalletService remoteWalletService; + + /** + * 复杂查询 + */ + @Override + public Page scopePageJoin(Page page, HardDoorFlowDto dto, DataScope dataScope) { + Page pageList = baseMapper.scopePageJoin(page, dto, dataScope); + disposeList(pageList.getRecords(), dto); + return pageList; + } + + @Override + public HardDoorFlowVo join(Long id) { + HardDoorFlowEntity detail = baseMapper.selectById(id); + if (ObjectUtil.isEmpty(detail)) return null; + HardDoorFlowVo result = BeanUtil.toBean(detail, HardDoorFlowVo.class); + disposeList(result); + return result; + } + + /** + * 通过订单id查询流程 + */ + @Override + public HardDoorFlowVo getByOrderId(Long orderId) { + HardDoorFlowEntity detail = baseMapper.selectOne(new LambdaQueryWrapper().eq(HardDoorFlowEntity::getOrderId, orderId)); + if (ObjectUtil.isEmpty(detail)) return null; + HardDoorFlowVo result = BeanUtil.toBean(detail, HardDoorFlowVo.class); + disposeList(result); + return result; + } + + /** + * 根据旷世识别id查询 + */ + public HardDoorFlowEntity get(String ksRecogId) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(HardDoorFlowEntity::getSkuSubmitRecogId, ksRecogId) + ); + } + + /** + * 开门 + */ + @Transactional(rollbackFor = Exception.class) + public Long openDoor(HardDoorFlowOpenDto dto, HardDoorManagerVo hardDoorVo) { + HardDoorFlowEntity saveObj = HardDoorFlowEntity.builder().flowStatus(HardDoorFlowEnum.FLOW_AUTH.getType()).userId(dto.getUserId()).bizType(dto.getFlowType().getType()).isOpen(YesNoEnum.NO.getCode()).build(); + baseMapper.insert(saveObj); + hardDoorManagerService.refresh(hardDoorVo.getDeviceCode()); + // 校验设备和货柜编号 + HardDoorManagerEntity hardDoorStatus = hardDoorManagerService.checkDeviceAndCabinet(dto.getHardDoorId(), dto.getCabinetNo()); + HardDoorFlowEntity updateObj = HardDoorFlowEntity.builder().id(saveObj.getId()).flowStatus(saveObj.getFlowStatus()).hardId(hardDoorStatus.getHardId()).hardDoorId(dto.getHardDoorId()).cabinetNo(dto.getCabinetNo()).flowStatus(HardDoorFlowEnum.FLOW_APPLY_OPEN.getType()).requestOpenTime(LocalDateTime.now()).build(); + // 请求开门 + DoorOpenDto openDto = BeanUtil.toBean(dto, DoorOpenDto.class); + openDto.setDeviceCode(hardDoorVo.getDeviceCode()); + openDto.setCabinetNo(dto.getCabinetNo()); + openDto.setOutOpenNo(String.valueOf(saveObj.getId())); + openDto.setEventType(Integer.valueOf(dto.getOpenType().getType())); + DoorOpenVo openVo = thirdDoorApiService.open(openDto).getData(); + updateObj.setRequestOpenDto(JSONUtil.toJsonStr(openDto)); + updateObj.setRequestOpenVo(JSONUtil.toJsonStr(openVo)); + if (ObjectUtil.isEmpty(openVo) || !openVo.isSuccess()) { + String errorMsg = "智能柜申请开门错误," + openVo.getMessage(); + updateObj.setError(errorMsg); + baseMapper.updateById(updateObj); + throw new RuntimeException(errorMsg); + } + if (ObjectUtil.isNotEmpty(dto.getAuthId())) updateObj.setAuthId(dto.getAuthId()); + baseMapper.updateById(updateObj); + return updateObj.getId(); + } + + + /** + * 检修开门 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void openDoorAccess(HardDoorFlowOpenDto dto) { + // 查询智能柜 + HardDoorManagerVo doorDetail = hardDoorManagerService.checkDeviceAndCabinet(dto.getHardDoorId(), dto.getCabinetNo()); + getSelf().openDoor(dto, doorDetail); + } + + /** + * 检修关门 + */ + @Override + public void closeAccess(HardDoorFlowOpenDto dto) { + // 查询智能柜 + HardDoorManagerVo doorDetail = hardDoorManagerService.checkDeviceAndCabinet(dto.getHardDoorId(), dto.getCabinetNo()); + // 请求关门 + DoorOpenDto openDto = BeanUtil.toBean(dto, DoorOpenDto.class); + openDto.setDeviceCode(doorDetail.getDeviceCode()); + openDto.setCabinetNo(dto.getCabinetNo()); + openDto.setOutOpenNo(RandomUtil.randomString(32)); + openDto.setEventType(Integer.valueOf(dto.getOpenType().getType())); + DoorOpenVo openVo = thirdDoorApiService.open(openDto).getData(); + if (ObjectUtil.isEmpty(openVo) || !openVo.isSuccess()) { + throw new RuntimeException("关门失败"); + } + } + + /** + * 购买开门 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void openDoorPay(HardDoorFlowOpenDto dto, HardDoorManagerVo hardDoorDetail) { + if (ObjectUtil.isNotEmpty(dto.getHardDoorFlowId()) || ObjectUtil.isEmpty(hardDoorDetail)) { + return; + } + // 查看用户消费钱包余额 + String walletErrorMsg = remoteWalletService.innserIsUseDoor(dto.getUserId()).getData(); + if (ObjectUtil.isNotEmpty(walletErrorMsg)) { + throw new RuntimeException(walletErrorMsg); + } + // 查看用户信誉 + boolean userCredit = hardAuthService.judgeUserCredit(dto.getUserId()); + if (!userCredit) { + throw new RuntimeException("用户信誉不足,请联系管理员"); + } + // 查看当前用户是否有正在进行购买的动作 + Long isHaveFlowCount = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(HardDoorFlowEntity::getUserId, dto.getUserId()) + .eq(HardDoorFlowEntity::getIsOpen, YesNoEnum.NO.getCode()) + .eq(HardDoorFlowEntity::getBizType, HardDoorFlowBizEnum.PAY_OPEN.getType()) + .between(HardDoorFlowEntity::getCreateTime, LocalDateTime.now().minus(1, ChronoUnit.HOURS), LocalDateTime.now()) + ); + if (isHaveFlowCount > 0) throw new RuntimeException("正在购买中请勿重复操作,请稍后再试"); + // 查询货柜是否配置spu信息 + List spuList = hardSpuJoinService.getSpuList(hardDoorDetail.getId(), dto.getCabinetNo()); + if (ObjectUtil.isEmpty(spuList) || spuList.isEmpty()) throw new RuntimeException("货柜商品信息为空,请上架"); + getSelf().openDoor(dto, hardDoorDetail); + } + + /** + * 上架开门 + */ + @Override + public Long openDoorRepertory(HardDoorFlowOpenDto dto) { + // 查询智能柜 + HardDoorManagerVo doorDetail = hardDoorManagerService.checkDeviceAndCabinet(dto.getHardDoorId(), dto.getCabinetNo()); + return getSelf().openDoor(dto, doorDetail); + } + + /** + * 处理开门回调 + */ + @Override + public void disposeLocakCallback(DoorOpenCallbackDto dto) { + if (ObjectUtil.isEmpty(dto.getType()) || ObjectUtil.equals(dto.getResultCode(), "FAIL")) return; + // 查询流程 + HardDoorFlowEntity flowDetail = baseMapper.selectById(dto.getOutOpenNo()); + if (ObjectUtil.isEmpty(flowDetail) || ObjectUtil.isNotEmpty(flowDetail.getOpenCallbackTime())) return; + boolean isOpenDoor = ObjectUtil.equals(dto.getType(), "OPEN"); + HardDoorFlowEntity updateObj = HardDoorFlowEntity.builder().id(flowDetail.getId()).isOpen(isOpenDoor ? YesNoEnum.YES.getCode() : YesNoEnum.NO.getCode()).flowStatus(HardDoorFlowEnum.FLOW_CALLBACK_OPEN.getType()).openCallbackVo(JSONUtil.toJsonStr(dto)).openCallbackTime(LocalDateTime.now()).build(); + // 如果是购买的话 + if (ObjectUtil.equals(flowDetail.getBizType(), HardDoorFlowBizEnum.PAY_OPEN.getType())) { + // 创建订单 + Long orderId = hardOrderService.createHardDoorOrder(flowDetail.getUserId(), flowDetail.getHardId()); + updateObj.setOrderId(orderId); + } + baseMapper.updateById(updateObj); + } + + /** + * 处理柜子状态回调 + */ + @Override + public void disposeStatusCallback(DoorStatusCallbackDto dto) { + if (ObjectUtil.isEmpty(dto)) { + log.error("|{}|disposeStatusCallback 意外的错误,参数错误dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + HardDoorManagerVo hardDoorDetail = hardDoorManagerService.getByDeviceCode(dto.getDeviceCode()); + if (ObjectUtil.isEmpty(hardDoorDetail)) { + log.error("|{}|disposeStatusCallback 意外的错误,设备不存在dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + try { + hardDoorCabinetService.saveOrUpdate(hardDoorDetail.getId(), dto.getCabinetList()); + } catch (Exception e) { + log.error("|{}|disposeStatusCallback 更新柜子状态失败dto|{}|", TAG, JSONUtil.toJsonStr(dto), e); + } + } + + /** + * 处理视频回调 + */ + @Override + public void disposeVideoCallback(DoorVideoCallbackDto dto) { + if (ObjectUtil.isEmpty(dto) || ObjectUtil.isEmpty(dto.getVideoList()) || ObjectUtil.equals(dto.getResultCode(), "FAIL")) { + log.info("|{}|disposeVideoCallback 意外的错误,参数错误或者状态错误dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + // 查询流程 + HardDoorFlowEntity flowDetail = baseMapper.selectById(dto.getOutOpenNo()); + if (ObjectUtil.isEmpty(flowDetail) || ObjectUtil.isNotEmpty(flowDetail.getSkuSubmitTime())) { + log.info("|{}|disposeVideoCallback 意外的错误,流程不存在或重复dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + // 更新视频回调流程 + HardDoorFlowEntity callbackUpdateObj = HardDoorFlowEntity.builder().id(flowDetail.getId()).flowStatus(HardDoorFlowEnum.FLOW_CALLBACK_VIDEO.getType()).videoCallbackVo(JSONUtil.toJsonStr(dto)).videoCallbackTime(LocalDateTime.now()).build(); + baseMapper.updateById(callbackUpdateObj); + // 提交视频 + List videoList = dto.getVideoList().stream().map(DoorVideoCallbackDto.Video::getVideoUrl).toList(); + // 提交柜子商品信息 + List spuList = hardSpuJoinService.getSpuList(flowDetail.getHardDoorId(), flowDetail.getCabinetNo()); + Map ksMap = new HashMap<>(); + List> ksSpuMap = new ArrayList<>(); + for (HardSpuJoinVo v : spuList) { + if (ObjectUtil.isEmpty(v.getSpuDetail())) continue; + Map map = new HashMap<>(); + map.put("sku_id", v.getSpuDetail().getKsSkuId()); + map.put("floor_num", v.getHardDoorNumber()); + ksSpuMap.add(map); + } + ksMap.put("origin_time", System.currentTimeMillis()); + ksMap.put("sku_scope", ksSpuMap); + // 提交识别 + KsRecognitionDto ksRecognitionDto = new KsRecognitionDto(); + ksRecognitionDto.setRecog_id(String.valueOf(flowDetail.getId())); + ksRecognitionDto.setExtra_params(ksMap); + ksRecognitionDto.setResource_type("1"); + ksRecognitionDto.setContainer_id(String.valueOf(flowDetail.getHardDoorId())); + ksRecognitionDto.setResource_urls(videoList); + // third服务生成 + ksRecognitionDto.setNotify_url(""); + ksRecognitionDto.setSub_mch_id(String.valueOf(flowDetail.getOrderId())); + // 更新sku提交流程 + HardDoorFlowEntity submitUploadObj = HardDoorFlowEntity.builder().id(flowDetail.getId()).flowStatus(HardDoorFlowEnum.FLOW_SUBMIT_RECOGNITION.getType()).skuSubmitTime(LocalDateTime.now()).build(); + KsRecognitionVo ksRecognitionVo = thirdKsService.recognition(ksRecognitionDto).getData(); + submitUploadObj.setSkuSubmitDto(JSONUtil.toJsonStr(ksRecognitionDto)); + submitUploadObj.setSkuSubmitVo(JSONUtil.toJsonStr(ksRecognitionVo)); + submitUploadObj.setSkuSubmitRecogId(ksRecognitionVo.getKs_recog_id()); + if (ObjectUtil.isEmpty(ksRecognitionVo) || !ksRecognitionVo.isSuccess() || ObjectUtil.isEmpty(ksRecognitionVo.getKs_recog_id())) { + String errorMsg = String.format("|%s|disposeVideoCallback 提交识别错误dto|%s|vo|%s|", TAG, JSONUtil.toJsonStr(ksRecognitionDto), JSONUtil.toJsonStr(ksRecognitionVo)); + log.error(errorMsg); + submitUploadObj.setErrorDesc(errorMsg); + } + // 更新流程 + baseMapper.updateById(submitUploadObj); + } + + /** + * 处理旷世识别回调 + */ + @Override + public void disposeRecognitionCallback(KsRecognitionCallbackDto dto) { + if (ObjectUtil.isEmpty(dto)) { + log.error("|{}|disposeRecognitionCallback 参数错误dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + // 更新流程 + HardDoorFlowEntity flowDetail = get(dto.getKs_recog_id()); + if (ObjectUtil.isEmpty(flowDetail) || ObjectUtil.isNotEmpty(flowDetail.getSkuCallbackTime())) { + log.error("|{}|disposeRecognitionCallback 意外的错误,流程不存在或重复dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + // 查询授权流程 + HardAuthEntity authDetail = hardAuthService.getById(flowDetail.getAuthId()); + if (ObjectUtil.isEmpty(authDetail)) { + log.error("|{}|disposeRecognitionCallback 意外的错误,授权流程不存在dto|{}|", TAG, JSONUtil.toJsonStr(dto)); + return; + } + HardDoorFlowEntity updateObj = HardDoorFlowEntity.builder().id(flowDetail.getId()).flowStatus(HardDoorFlowEnum.FLOW_CALLBACK_RECOGNITION.getType()).skuCallbackVo(JSONUtil.toJsonStr(dto)).skuCallbackTime(LocalDateTime.now()).build(); + String ksFlowCode = dto.getState().getCode(); + String ksRecognitionCode = dto.getResult().getStatus().getCode(); + if (ObjectUtil.notEqual(ksFlowCode, "2") || ObjectUtil.notEqual(ksRecognitionCode, "2")) { + if (ObjectUtil.equals(ksFlowCode, "2") && ObjectUtil.equals(ksRecognitionCode, "3")) { + // 未拿商品取消订单 + hardOrderService.cancelHardDoorOrder(flowDetail.getOrderId()); + baseMapper.updateById(updateObj); + return; + } + String ksErrorMsg = String.format("商品识别响应错误:ksFlowCode:%s;ksRecognitionCode:%s;", ksFlowCode, ksRecognitionCode); + log.error(ksErrorMsg); + updateObj.setError(ksErrorMsg); + baseMapper.updateById(updateObj); + return; + } + KsRecognitionCallbackDto.Result result = dto.getResult(); + List resultSkuList = result.getResult(); + if (ObjectUtil.isEmpty(resultSkuList)) { + String ksErrorMsg = "商品识别响应错误,识别的商品列表为空"; + log.error(ksErrorMsg); + updateObj.setError(ksErrorMsg); + baseMapper.updateById(updateObj); + return; + } + // 查询订单 + HardOrderEntity orderDetail = hardOrderService.getById(flowDetail.getOrderId()); + if (ObjectUtil.isEmpty(orderDetail)) { + String ksErrorMsg = String.format("订单结算错误,订单不存在orderId%s", flowDetail.getOrderId()); + log.error(ksErrorMsg); + updateObj.setError(ksErrorMsg); + baseMapper.updateById(updateObj); + return; + } + try { + Long orderId = hardOrderService.payHardDoorOrder(orderDetail, resultSkuList); + if (ObjectUtil.isNotEmpty(orderId)) { + updateObj.setPayTime(LocalDateTime.now()); + updateObj.setFlowStatus(HardDoorFlowEnum.FLOW_PAY_ORDER.getType()); + baseMapper.updateById(updateObj); + } + // 完成授权流程 + HardAuthEntity updateAuthObj = HardAuthEntity.builder().id(authDetail.getId()).isDone(YesNoEnum.YES.getCode()).isDoneTime(LocalDateTime.now()).build(); + hardAuthService.updateById(updateAuthObj); + } catch (Exception e) { + String ksErrorMsg = String.format("订单结算错误,订单支付失败error%s;", e.getMessage()); + log.error(ksErrorMsg); + updateObj.setError(ksErrorMsg); + baseMapper.updateById(updateObj); + } + } + + private void disposeList(List list, HardDoorFlowDto dto) { + if (ObjectUtil.isEmpty(list)) return; + // 设备 + List hardIds = list.stream().map(HardDoorFlowVo::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)); + } + } + // 用户相关 + List userIds = list.stream().map(HardDoorFlowVo::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)); + } + } + } + + private void disposeList(HardDoorFlowVo detail) { + // 用户 + List usrList = remoteUserService.getUserDeptByIds(List.of(detail.getUserId())).getData(); + if (ObjectUtil.isNotEmpty(usrList)) { + DataUtil.convertUserDept(detail, usrList.get(0)); + } + // 设备 + HardManagerEntity hardManager = hardManagerMapper.selectById(detail.getHardDoorId()); + if (ObjectUtil.isNotEmpty(hardManager)) { + HardUtil.convertHard(detail, hardManager); + } + // 设备id + HardAuthEntity hardAuth = hardAuthService.getById(detail.getAuthId()); + if (ObjectUtil.isNotEmpty(hardAuth)) { + detail.setHardAuth(hardAuth); + } + } + + private HardDoorFlowServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardInvoiceServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardInvoiceServiceImpl.java index 65f83bd57..84ed8cef5 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardInvoiceServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardInvoiceServiceImpl.java @@ -129,7 +129,7 @@ public class HardInvoiceServiceImpl extends ServiceImpl new RuntimeException("用户不存在")); + UserInfo user = Optional.of(userService.getInnerByUserId(order.getUserId())).map(R::getData).orElseThrow(() -> new RuntimeException("用户不存在")); SysUser sysUser = user.getSysUser(); // 查询商户 MchManageVo mch = Optional.of(remoteMchService.getById(order.getMerchantId())).map(R::getData).orElseThrow(() -> new RuntimeException("商户不存在")); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java index f6c993b97..6ef26efcb 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java @@ -67,13 +67,13 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { public HardCallbackPayVo pay(HardCallbackPayDto dto) { try { // 查询用户 - UserInfo userDetail = remoteUserService.getByUserId(dto.getUserId()).getData(); + UserInfo userDetail = remoteUserService.getInnerByUserId(dto.getUserId()).getData(); if (ObjectUtil.isEmpty(userDetail)) throw new RuntimeException("用户不存在不存在"); // 钱包 WalletManageEntity wallet = remoteWalletService.getWallet(dto.getUserId(), WalletTypeEnum.EAT).getData(); if (ObjectUtil.isEmpty(wallet)) throw new RuntimeException("用户钱包不存在"); // 用户 - UserInfo user = remoteUserService.getByUserId(wallet.getUserId()).getData(); + UserInfo user = remoteUserService.getInnerByUserId(wallet.getUserId()).getData(); if (ObjectUtil.isEmpty(user)) throw new RuntimeException("用户不存在"); // 查询正元默认商户 MchManageVo zyDefaultMch = getZyDefaultMch(); @@ -97,7 +97,6 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { .parentCarId(null) .sysType(null) .orderStatus(HardOrderStatusEnum.CREATE.getType()) - .merchantId(null) .orderType(HardOrderTypeEnum.ZY.getType()) .payType(HardPayTypeEnum.WALLET_CARD.getType()) .orderSourceTypeId(null) @@ -108,6 +107,7 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { .productDesc(subject) .walletId(wallet.getId()) .build(); + log.info("|{}| 正元支付创建订单参数|{}", TAG, JSONUtil.toJsonStr(orderObj)); boolean isCreateOrder = hardOrderService.save(orderObj); if (!isCreateOrder) throw new RuntimeException("创建订单失败"); hardOrderService.fastReduceBalance(orderObj); @@ -136,7 +136,7 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { // 校验订单是否可以退款 HardOrderVo order = hardAfterSaleService.validateOrderCanRefund(dto.getOrderId()); // 用户 - UserInfo user = remoteUserService.getByUserId(order.getUserId()).getData(); + UserInfo user = remoteUserService.getInnerByUserId(order.getUserId()).getData(); if (ObjectUtil.isEmpty(user)) throw new RuntimeException("用户不存在"); // 添加售后订单 HardAfterSaleEntity saveObj = BeanUtils.toBean(dto, HardAfterSaleEntity.class); 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 new file mode 100644 index 000000000..01974dd53 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorCabinetServiceImpl.java @@ -0,0 +1,121 @@ +package com.bsd.pjcloud.hard.service.impl.manager; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.ObjectUtil; +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.feign.RemoteFileService; +import com.bsd.pjcloud.common.core.util.QRCodeImageGenerator; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.dto.manager.HardDoorCabinetDto; +import com.bsd.pjcloud.hard.api.entity.manager.HardDoorCabinetEntity; +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.thirdparty.vo.door.DoorStatusVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.multipart.MultipartFile; + +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 智能柜货柜 + */ +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class HardDoorCabinetServiceImpl extends ServiceImpl implements HardDoorCabinetService { + + private final RemoteFileService remoteFileService; + + @Override + public Page scopePageJoin(Page page, HardDoorCabinetDto dto, DataScope dataScope) { + return baseMapper.scopePageJoin(page, dto, dataScope); + } + + @Override + public void saveOrUpdate(Long hardDoorId, List list) { + List cabinetList = baseMapper.selectList(new LambdaQueryWrapper() + .eq(HardDoorCabinetEntity::getHardDoorId, hardDoorId) + ); + if (ObjectUtil.isEmpty(cabinetList)) { + List addList = new ArrayList<>(); + for (DoorStatusVo.Cabinet cabinet : list) { + HardDoorCabinetEntity entity = new HardDoorCabinetEntity(); + entity.setHardDoorId(hardDoorId); + entity.setCabinetNo(cabinet.getCabinetNo()); + entity.setIsLockOnline(cabinet.getIsLockOnline()); + entity.setLockStatus(cabinet.getLockStatus()); + entity.setDoorStatus(cabinet.getDoorStatus()); + entity.setSaleStatus(cabinet.getSaleStatus()); + addList.add(entity); + } + baseMapper.insert(addList); + return; + } + for (DoorStatusVo.Cabinet cabinet : list) { + cabinetList.stream().filter(i -> ObjectUtil.equals(i.getCabinetNo(), cabinet.getCabinetNo())) + .findFirst() + .ifPresent(i -> { + i.setIsLockOnline(cabinet.getIsLockOnline()); + i.setLockStatus(cabinet.getLockStatus()); + i.setDoorStatus(cabinet.getDoorStatus()); + i.setSaleStatus(cabinet.getSaleStatus()); + baseMapper.updateById(i); + }); + } + } + + @Override + public List getListByHardDoorId(Long hardDoorId) { + return baseMapper.selectList(new LambdaQueryWrapper() + .eq(HardDoorCabinetEntity::getHardDoorId, hardDoorId) + ); + } + + /** + * 刷新智能柜货柜二维码 + */ + @Override + public String refreshQrCode(Long hardDoorId, Integer cabinetNo) { + // 查找货柜 + HardDoorCabinetEntity cabinetDetail = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(HardDoorCabinetEntity::getHardDoorId, hardDoorId) + .eq(HardDoorCabinetEntity::getCabinetNo, cabinetNo) + ); + if (ObjectUtil.isEmpty(cabinetDetail)) throw new RuntimeException("货柜不存在"); + HardDoorCabinetCodeVo cabinetCodeVo = new HardDoorCabinetCodeVo(); + cabinetCodeVo.setHardDoorId(String.valueOf(hardDoorId)); + cabinetCodeVo.setCabinetNo(String.valueOf(cabinetNo)); + // 生成二维码 + String coeContent = Base64.encode(JSONUtil.toJsonStr(cabinetCodeVo)); + try { + byte[] bytes = QRCodeImageGenerator.generateQrCodeImage(coeContent, 300); + MultipartFile multipartFile = new MockMultipartFile("file", hardDoorId + "-" + System.currentTimeMillis() + ".png", "image/png", new ByteArrayInputStream(bytes)); + R upload = remoteFileService.innerUpload(multipartFile, null, null, null); + Map data = (Map) upload.getData(); + String url = (String) data.get("url"); + // 更新 + HardDoorCabinetEntity updateObj = new HardDoorCabinetEntity(); + updateObj.setId(cabinetDetail.getId()); + updateObj.setQrCode(url); + baseMapper.updateById(updateObj); + return url; + } catch (Exception e) { + log.error("refreshQrCode刷新智能柜货柜二维码,hardDoorId:{},cabinetNo:{}", hardDoorId, cabinetNo, e); + throw new RuntimeException("刷新二维码失败"); + } + } +} \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorManagerServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorManagerServiceImpl.java index 965bea5b2..a4e93d30e 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorManagerServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorManagerServiceImpl.java @@ -1,28 +1,40 @@ package com.bsd.pjcloud.hard.service.impl.manager; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; +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.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.dto.manager.HardDoorCabinetDto; import com.bsd.pjcloud.hard.api.dto.manager.HardDoorManagerDto; +import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; import com.bsd.pjcloud.hard.api.dto.spu.HardChangeVolume; +import com.bsd.pjcloud.hard.api.entity.manager.HardDoorCabinetEntity; import com.bsd.pjcloud.hard.api.entity.manager.HardDoorManagerEntity; +import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; +import com.bsd.pjcloud.hard.api.utils.HardUtil; +import com.bsd.pjcloud.hard.api.vo.manager.HardDoorCabinetVo; import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo; import com.bsd.pjcloud.hard.mapper.manager.HardDoorManagerMapper; +import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; +import com.bsd.pjcloud.hard.service.HardDoorCabinetService; import com.bsd.pjcloud.hard.service.HardDoorManagerService; import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdDoorApiService; -import com.bsd.pjcloud.thirdparty.dto.door.DoorBindDto; -import com.bsd.pjcloud.thirdparty.dto.door.DoorRegisterDto; -import com.bsd.pjcloud.thirdparty.dto.door.DoorVideoDto; -import com.bsd.pjcloud.thirdparty.dto.door.DoorVolumeDto; +import com.bsd.pjcloud.thirdparty.dto.door.*; import com.bsd.pjcloud.thirdparty.vo.door.DoorBindVo; import com.bsd.pjcloud.thirdparty.vo.door.DoorRegisterVo; +import com.bsd.pjcloud.thirdparty.vo.door.DoorStatusVo; import com.bsd.pjcloud.thirdparty.vo.door.DoorVolumeVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.util.List; + /** * 智能柜设置 */ @@ -32,11 +44,41 @@ import org.springframework.validation.annotation.Validated; @Service public class HardDoorManagerServiceImpl extends ServiceImpl implements HardDoorManagerService { + private final HardDoorCabinetService hardDoorCabinetService; + + private final HardManagerMapper hardManagerMapper; + private final RemoterThirdDoorApiService thirdDoorApiService; @Override public Page scopePageJoin(Page page, HardDoorManagerDto dto, DataScope dataScope) { - return baseMapper.scopePageJoin(page, dto, dataScope); + Page pageList = baseMapper.scopePageJoin(page, dto, dataScope); + disposeList(pageList.getRecords(), dto); + return pageList; + } + + /** + * 柜门下拉查询 + */ + @Override + public Page selectCabinet(Page page, HardDoorCabinetDto dto) { + DataScope dataScope = new DataScope(); + return hardDoorCabinetService.scopePageJoin(page, dto, dataScope); + } + + /** + * 根据硬件id查询详情 + */ + @Override + public HardDoorManagerVo getByHardDoorId(Long hardDoorId) { + HardDoorManagerVo hardDoor = baseMapper.pageJoinByHardDoorId(hardDoorId); + if (ObjectUtil.isNotEmpty(hardDoor)) { + List cabinetList = hardDoorCabinetService.getListByHardDoorId(hardDoor.getId()); + if (ObjectUtil.isNotEmpty(cabinetList)) { + hardDoor.setCabinetList(cabinetList); + } + } + return hardDoor; } /** @@ -44,39 +86,57 @@ public class HardDoorManagerServiceImpl extends ServiceImpl cabinetList = hardDoorCabinetService.getListByHardDoorId(hardDoor.getId()); + if (ObjectUtil.isNotEmpty(cabinetList)) { + hardDoor.setCabinetList(cabinetList); + } + } + return hardDoor; + } + + @Override + public HardDoorManagerVo getByDeviceCode(String deviceCode) { + HardDoorManagerEntity hardDoor = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(HardDoorManagerEntity::getDeviceCode, deviceCode) + ); + if (ObjectUtil.isEmpty(hardDoor)) return null; + HardDoorManagerVo hardDoorVo = BeanUtil.toBean(hardDoor, HardDoorManagerVo.class); + if (ObjectUtil.isNotEmpty(hardDoorVo)) { + List cabinetList = hardDoorCabinetService.getListByHardDoorId(hardDoor.getId()); + if (ObjectUtil.isNotEmpty(cabinetList)) { + hardDoorVo.setCabinetList(cabinetList); + } + } + return hardDoorVo; } /** * 绑定设备 */ @Override + @Transactional(rollbackFor = Exception.class) public void bind(HardDoorManagerEntity dto) { // 查询设备 - HardDoorManagerVo hardDoorDetail = getByHardId(dto.getHardId()); + HardDoorManagerVo hardDoorDetail = getByHardDoorId(dto.getHardId()); if (ObjectUtil.isEmpty(hardDoorDetail)) { HardDoorManagerEntity saveOrUpdate = new HardDoorManagerEntity(); saveOrUpdate.setHardId(dto.getHardId()); saveOrUpdate.setImei(dto.getImei()); saveOrUpdate.setDeviceCode(dto.getDeviceCode()); + saveOrUpdate.setDoorCount(dto.getDoorCount()); baseMapper.insert(saveOrUpdate); + dto.setId(saveOrUpdate.getId()); } else { HardDoorManagerEntity saveOrUpdate = new HardDoorManagerEntity(); saveOrUpdate.setId(hardDoorDetail.getId()); saveOrUpdate.setHardId(dto.getHardId()); saveOrUpdate.setImei(dto.getImei()); saveOrUpdate.setDeviceCode(dto.getDeviceCode()); + saveOrUpdate.setDoorCount(dto.getDoorCount()); baseMapper.updateById(saveOrUpdate); } - // 设备绑定 - DoorBindDto bindDto = new DoorBindDto(); - bindDto.setImei(dto.getImei()); - bindDto.setDeviceCode(dto.getDeviceCode()); - bindDto.setOutDeviceCode(String.valueOf(dto.getHardId())); - DoorBindVo bindVo = thirdDoorApiService.bind(bindDto).getData(); - if (!bindVo.isSuccess()) { - throw new RuntimeException(bindVo.getMessage()); - } // 设备注册 DoorRegisterDto registerDto = new DoorRegisterDto(); registerDto.setImei(dto.getImei()); @@ -85,6 +145,62 @@ public class HardDoorManagerServiceImpl extends ServiceImpl() + .eq(HardDoorManagerEntity::getDeviceCode, deviceCode) + .orderByDesc(HardDoorManagerEntity::getCreateTime) + .last("limit 1") + ); + if (ObjectUtil.isEmpty(hardDoorDetail)) throw new RuntimeException("刷新失败,设备不存在"); + DoorStatusDto statusDto = new DoorStatusDto(); + statusDto.setDeviceCode(deviceCode); + DoorStatusVo statusVo = thirdDoorApiService.status(statusDto).getData(); + if (!statusVo.isSuccess()) { + throw new RuntimeException(statusVo.getMessage()); + } + HardDoorManagerEntity updateObj = new HardDoorManagerEntity(); + updateObj.setId(hardDoorDetail.getId()); + updateObj.setPowerStatus(statusVo.getPowerStatus()); + updateObj.setNetStatus(statusVo.getNetStatus()); + updateObj.setNetStatus(statusVo.getSaleStatus()); + updateObj.setSaleStatus(statusVo.getSaleStatus()); + updateObj.setSimSn(statusVo.getSimSn()); + updateObj.setSignalIntensity(statusVo.getSignalIntensity()); + updateObj.setSignalRatio(statusVo.getSignalRatio()); + updateObj.setSignalTime(statusVo.getSignalTime()); + if (ObjectUtil.isNotEmpty(statusVo.getCabinetStatusList())) { + hardDoorCabinetService.saveOrUpdate(hardDoorDetail.getId(), statusVo.getCabinetStatusList()); + } + baseMapper.updateById(updateObj); + return updateObj; } /** @@ -93,7 +209,7 @@ public class HardDoorManagerServiceImpl extends ServiceImpl cabinetList = hardDoorCabinetService.getListByHardDoorId(hardDoorId); + if (ObjectUtil.isEmpty(cabinetList)) throw new RuntimeException("货柜不存在"); + if (ObjectUtil.isEmpty(cabinetList.stream().filter(i -> ObjectUtil.equals(i.getCabinetNo(), cabinetNo)).findFirst().orElse(null))) { + throw new RuntimeException("货柜不存在"); + } + HardDoorManagerVo doorVo = BeanUtil.toBean(doorDetail, HardDoorManagerVo.class); + doorVo.setCabinetList(cabinetList); + return doorVo; + } + + private void disposeList(List list, HardDoorManagerDto dto) { + if (ObjectUtil.isEmpty(list)) return; + // 设备 + List hardIds = list.stream().map(HardDoorManagerVo::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)); + } + } } } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardManagerServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardManagerServiceImpl.java index b805cacd3..537fedd45 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardManagerServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardManagerServiceImpl.java @@ -216,7 +216,7 @@ public class HardManagerServiceImpl extends ServiceImpl getCurrentUserMchInfo(PjcloudUser user, List mchIds) { if (ObjectUtil.isEmpty(mchIds)) mchIds = new ArrayList<>(); - UserInfo userInfo = userService.getByUserId(user.getId()).getData(); + UserInfo userInfo = userService.getInnerByUserId(user.getId()).getData(); if (ObjectUtil.isEmpty(userInfo)) return mchIds; String[] roles = userInfo.getRoleCodes(); if (roles.length == 0) return mchIds; @@ -258,7 +258,7 @@ public class HardManagerServiceImpl extends ServiceImpl user = userService.getByUserId(detail.getUserId()); + R user = userService.getInnerByUserId(detail.getUserId()); if (ObjectUtil.isNotEmpty(user.getData())) { DataUtil.convertUser(detail, user.getData().getSysUser()); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java index d47bec2d5..646cc5511 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardCarServiceImpl.java @@ -20,11 +20,13 @@ import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; +import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.mapper.order.HardCarMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.mapper.order.HardParentCarMapper; import com.bsd.pjcloud.hard.service.HardCarService; +import com.bsd.pjcloud.hard.service.HardSpuService; import com.bsd.pjcloud.supermarket.api.feign.RemoteSupermarketUnitSkuService; import com.bsd.pjcloud.supermarket.vo.erp.SmErpUnitWithSpuVo; import lombok.RequiredArgsConstructor; @@ -53,6 +55,7 @@ public class HardCarServiceImpl extends ServiceImpl { + AtomicInteger doorTotalPrice = new AtomicInteger(); + // 查询智能柜 + List supList = hardSpuService.getByIds(productIds); + for (HardCreateCarDto v : list) { + supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> { + Integer price = spu.getPrice(); + if (ObjectUtil.isNotEmpty(v.getProductCount()) && !ObjectUtil.equals(v.getProductCount(), 0)) { + // 按数量 + int itemTotalPrice = v.getProductCount() * price; + doorTotalPrice.addAndGet(itemTotalPrice); + } else if (ObjectUtil.isNotEmpty(v.getProductWeight()) && v.getProductWeight().compareTo(BigDecimal.valueOf(0)) != 0) { + // 按重量 + // 向上取整 + int itemTotalPrice = v.getProductWeight().multiply(BigDecimal.valueOf(price)).setScale(0, RoundingMode.CEILING).intValue(); + doorTotalPrice.addAndGet(itemTotalPrice); + } + }); + } + yield doorTotalPrice.get(); + } default -> null; }; } @@ -272,6 +296,37 @@ public class HardCarServiceImpl extends ServiceImpl carObjectList = new ArrayList<>(); + List supList = hardSpuService.getByIds(productIds); + for (HardCreateCarDto v : productList) { + HardCarEntity item = HardCarEntity.builder().parentCarId(parentCarId).build(); + supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> { + Integer price = spu.getPrice(); + int totalPrice = 0; + // 按重量 + if (ObjectUtil.isNotEmpty(v.getProductCount()) && !ObjectUtil.equals(v.getProductCount(), 0)) { + // 按数量 + totalPrice = v.getProductCount() * price; + } else if (ObjectUtil.isNotEmpty(v.getProductWeight()) && v.getProductWeight().compareTo(BigDecimal.valueOf(0)) != 0) { + // 按重量 + totalPrice = v.getProductWeight().multiply(BigDecimal.valueOf(price)).setScale(0, RoundingMode.CEILING).intValue(); + } + item.setProductId(spu.getId()); + item.setProductName(spu.getName()); + item.setProductPrice(price); + item.setProductPic(spu.getCover()); + item.setTotalPrice((long) totalPrice); + // item.setProductNature(v.getProductNature().getType()); + item.setProductCount(v.getProductCount()); + item.setProductWeight(v.getProductWeight()); + carObjectList.add(item); + }); + } + baseMapper.insert(carObjectList); + return; + } } @Override @@ -308,6 +363,15 @@ public class HardCarServiceImpl extends ServiceImpl supList = hardSpuService.getByIds(productIds); + for (HardCreateCarDto v : list) { + supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> { + str.append(spu.getName()).append("x").append(v.getProductCount()).append(";"); + }); + } + } return str.toString(); } 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 972adf779..869c1be6f 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 @@ -2,7 +2,9 @@ package com.bsd.pjcloud.hard.service.impl.order; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; +import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; +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; @@ -13,12 +15,14 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.canteen.api.feign.RemoteOnlineCanteenSpuService; import com.bsd.pjcloud.canteen.dto.CanteenSpuUpdateStockReqDTO; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.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.common.security.service.PjcloudUser; +import com.bsd.pjcloud.hard.api.constant.HardProductNatureEnum; import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; @@ -29,21 +33,24 @@ import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto; import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateOrderDto; +import com.bsd.pjcloud.hard.api.dto.spu.DeductionSpuStockDto; +import com.bsd.pjcloud.hard.api.entity.HardApptEntity; 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; import com.bsd.pjcloud.hard.api.entity.order.HardParentCarEntity; +import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; import com.bsd.pjcloud.hard.api.utils.HardUtil; +import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; +import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; -import com.bsd.pjcloud.hard.service.HardCarService; -import com.bsd.pjcloud.hard.service.HardInvoiceService; -import com.bsd.pjcloud.hard.service.HardManagerService; -import com.bsd.pjcloud.hard.service.HardOrderService; +import com.bsd.pjcloud.hard.service.*; import com.bsd.pjcloud.supermarket.api.feign.RemoteSupermarketSpuService; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockReqDTO; +import com.bsd.pjcloud.thirdparty.dto.ks.KsRecognitionCallbackDto; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; @@ -90,6 +97,11 @@ public class HardOrderServiceImpl extends ServiceImpl user = userService.getByUserId(detail.getUserId()); + R user = userService.getInnerByUserId(detail.getUserId()); if (ObjectUtil.isNotEmpty(user.getData())) { DataUtil.convertUser(detail, user.getData().getSysUser()); } @@ -215,7 +227,7 @@ public class HardOrderServiceImpl extends ServiceImpl 100) throw new RuntimeException("您有" + reserveCount + "笔未核销的预约订单,请先核销"); // 钱包 WalletManageEntity wallet = remoteWalletService.getWallet(dto.getUserId(), dto.getWalletType()).getData(); if (ObjectUtil.isEmpty(wallet)) throw new RuntimeException("用户钱包不存在"); @@ -297,7 +312,7 @@ public class HardOrderServiceImpl extends ServiceImpl carList = hardCarService.getByParentCarId(dto.getCarParentId()); @@ -339,12 +354,21 @@ public class HardOrderServiceImpl extends ServiceImpl ksSpuList) { + if (ObjectUtil.isEmpty(dto) || ObjectUtil.isEmpty(ksSpuList)) return null; + // 创建购物车 + List ksSpuIds = ksSpuList.stream().map(KsRecognitionCallbackDto.ResultSku::getKs_sku_id).toList(); + List hardSpuList = hardSpuService.get(ksSpuIds); + if (ObjectUtil.isEmpty(hardSpuList)) { + log.error("|{}|智能柜订单结算,商品不存在dto|{}|ksSpuList|{}|", TAG, JSONUtil.toJsonStr(dto), JSONUtil.toJsonStr(ksSpuList)); + return null; + } + List carListDto = new ArrayList<>(); + for (KsRecognitionCallbackDto.ResultSku v : ksSpuList) { + hardSpuList.stream().filter(i -> ObjectUtil.equals(i.getKsSkuId(), v.getKs_sku_id())).findFirst().ifPresent(hardSpu -> { + HardCreateCarDto entity = new HardCreateCarDto(); + entity.setProductId(hardSpu.getId()); + entity.setProductNature(HardProductNatureEnum.DEFAULT); + entity.setProductCount(Integer.parseInt(v.getSku_num())); + carListDto.add(entity); + }); + } + HardTypeEnum sysType = HardTypeEnum.valueOfByType(dto.getSysType()); + HardOrderTypeEnum orderType = HardOrderTypeEnum.valueOfByType(dto.getOrderType()); + // 获取商品价格 + Integer totalPrice = hardCarService.computerCarTotalPrice(sysType, orderType, carListDto); + // 添加购物车 + Long parentCarId = hardCarService.createCard(dto.getUserId(), dto.getMerchantId(), sysType, orderType, carListDto); + // 获取商品描述 + String subject = hardCarService.computerCarSubject(sysType, orderType, carListDto); + // 更新订单信息 + HardOrderEntity updateObj = HardOrderEntity.builder() + .id(dto.getId()) + .parentCarId(parentCarId) + .totalPrice(totalPrice) + .payPrice(totalPrice) + .extraPrice(0) + .productDesc(subject) + .build(); + baseMapper.updateById(updateObj); + HardOrderEntity orderObj = baseMapper.selectById(updateObj.getId()); + // 扣减库存 + getSelf().fastenerInventory(orderObj, YesNoEnum.YES); + // 钱包扣款 + getSelf().fastReduceBalance(orderObj); + return orderObj.getId(); + } + + /** + * 智能柜取消订单 + */ + @Override + public Long cancelHardDoorOrder(Long orderId) { + // 查询订单 + HardOrderEntity order = baseMapper.selectById(orderId); + if (ObjectUtil.isEmpty(order)) { + log.error("|{}|智能柜订单取消失败,订单不存在|{}|", TAG, orderId); + return null; + } + if (ObjectUtil.isNotEmpty(order.getPayPrice()) && order.getPayPrice() > 0) { + log.error("|{}|智能柜订单取消失败,订单价格大于0|{}|", TAG, orderId); + return null; + } + if (ObjectUtil.isNotEmpty(order.getOrderStatus()) && ObjectUtil.equals(order.getOrderStatus(), HardOrderStatusEnum.UNFOLLOW.getType())) { + log.error("|{}|智能柜订单取消失败,订单已核销|{}|", TAG, orderId); + return null; + } + HardOrderEntity updateObj = HardOrderEntity.builder() + .id(order.getId()) + .orderStatus(HardOrderStatusEnum.UNFOLLOW.getType()) + .unfollowTime(LocalDateTime.now()) + .build(); + baseMapper.updateById(updateObj); + return updateObj.getId(); + } + @Override @Transactional(rollbackFor = Exception.class) public void fastReduceBalance(HardOrderEntity order) { @@ -513,7 +654,7 @@ public class HardOrderServiceImpl extends ServiceImpl carList = hardCarService.getByParentCarId(order.getParentCarId()); @@ -534,7 +675,7 @@ public class HardOrderServiceImpl extends ServiceImpl carList = hardCarService.getByParentCarId(order.getParentCarId()); @@ -563,11 +704,36 @@ public class HardOrderServiceImpl extends ServiceImpl carList = hardCarService.getByParentCarId(order.getParentCarId()); + if (ObjectUtil.isEmpty(carList)) throw new RuntimeException("扣减库存错误,购物车不存在"); + List list = carList.stream().map(v -> { + DeductionSpuStockDto entity = new DeductionSpuStockDto(); + entity.setHardSpuId(v.getProductId()); + entity.setIncrCount(v.getProductCount()); + return entity; + }).toList(); + // 查询订单流程 + HardDoorFlowVo doorFlow = hardDoorFlowService.getByOrderId(order.getId()); + if (ObjectUtil.isEmpty(doorFlow)) { + log.info("|{}|{},失败,order不存在:|{}|,isReduce:|{}|,params:|{}|", TAG, CarErrorMsg, JSON.toJSON(order), isReduce, JSON.toJSON(list)); + return; + } + Boolean isDeduction = hardSpuService.deductionSpuStock(doorFlow, list); + if (!isDeduction) { + log.info("|{}|{},失败,order:|{}|,isReduce:|{}|,params:|{}|", TAG, CarErrorMsg, JSON.toJSON(order), isReduce, JSON.toJSON(list)); + throw new RuntimeException("扣减智能柜库存" + CarErrorMsg + "错误"); + } + log.info("扣减智能柜库存成功|{}|{},成功,order:|{}|,isReduce:|{}|,params:|{}|", TAG, CarErrorMsg, JSON.toJSON(order), isReduce, JSON.toJSON(list)); + return; + } } // 发送mq消息 @Override - public void createOrderAfterSendMqMsg(Long orderId) { + public void createOrderAfterSendMqMsg(Long orderId, UserInfo userInfo) { try { HardOrderEntity orderdetail = baseMapper.selectById(orderId); if (ObjectUtil.isEmpty(orderdetail)) { @@ -587,8 +753,20 @@ public class HardOrderServiceImpl extends ServiceImpl { + HardOrderTypeEnum hardOrderType = HardOrderTypeEnum.valueOfByType(orderdetail.getOrderType()); + if (ObjectUtil.isEmpty(hardTypeEnum)) { + log.error("|{}|发送mq消息失败,订餐类型错误hardType不存在hardType|{}|", TAG, orderdetail.getOrderType()); + return; + } + // 发送订餐mq + if (ObjectUtil.equals(hardOrderType, HardOrderTypeEnum.RESERVE)) { + hardBroadcastService.addReserveOrderTask(orderdetail, userInfo); + } + } } } catch (Exception e) { + // 不返回错误 log.info("|{}|发送mq消息成功,意外的错误error|{}|", TAG, e.getMessage()); } } @@ -650,6 +828,17 @@ public class HardOrderServiceImpl extends ServiceImpl() + .eq(HardOrderEntity::getUserId, userId) + .eq(HardOrderEntity::getMerchantType, MerchantTypeEnum.CANTEEN.getType()) + .eq(HardOrderEntity::getSysType, HardTypeEnum.CANTEEN.getType()) + .eq(HardOrderEntity::getOrderType, HardOrderTypeEnum.RESERVE.getType()) + .eq(HardOrderEntity::getOrderStatus, HardOrderStatusEnum.PAY.getType()) + ); + } + /* ************************************* end 支付相关 end ************************************* */ private HardOrderServiceImpl getSelf() { 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 b2dc7a8cd..5aee99170 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 @@ -87,7 +87,7 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { DataScope refundDataScope = DataScope.of().func(DataScopeFuncEnum.ALL); refundDataScope.setScopeDeptName("merchant_dept_id"); List refundList = hardOrderMapper.listSb(refundDto, refundDataScope); - // 盈利 + // 消费净次数 HardOrderDto profitDto = BeanUtil.toBean(dto, HardOrderDto.class); profitDto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); DataScope profitDataScope = DataScope.of().func(DataScopeFuncEnum.ALL); @@ -102,7 +102,7 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { v.setTotalRefundCount(i.getTotalPayCount()); }); } - // 盈利 + // 消费净次数 if (ObjectUtil.isNotEmpty(profitList)) { profitList.stream().filter(i -> ObjectUtil.equals(i.getHardId(), v.getHardId())).findFirst().ifPresent(i -> { v.setTotalProfitPrice(i.getTotalPayPrice()); @@ -153,7 +153,7 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { DataScope refundDataScope = DataScope.of(); refundDataScope.setScopeDeptName("merchant_dept_id"); List refundList = hardOrderMapper.listCs(refundDto, refundDataScope); - // 盈利 + // 消费净次数 HardOrderDto profitDto = BeanUtil.toBean(dto, HardOrderDto.class); profitDto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); DataScope profitDataScope = DataScope.of(); @@ -167,7 +167,7 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { v.setTotalRefundCount(i.getTotalPayCount()); }); } - // 盈利 + // 消费净次数 if (ObjectUtil.isNotEmpty(profitList)) { profitList.stream().filter(i -> ObjectUtil.equals(i.getMerchantId(), v.getMerchantId())).findFirst().ifPresent(i -> { v.setTotalProfitPrice(i.getTotalPayPrice()); @@ -203,7 +203,7 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); return hardOrderMapper.listCsByDay(refundDto); }); - // 盈利 + // 消费净次数 CompletableFuture> profitListFuture = CompletableFuture.supplyAsync(() -> { HardOrderDto profitDto = BeanUtil.toBean(dto, HardOrderDto.class); profitDto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); @@ -222,7 +222,7 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { v.setTotalRefundCount(i.getTotalPayCount()); }); } - // 盈利 + // 消费净次数 if (ObjectUtil.isNotEmpty(profitList)) { profitList.stream().filter(i -> ObjectUtil.equals(i.getDay(), v.getDay()) && ObjectUtil.equals(i.getMerchantId(), v.getMerchantId())).findFirst().ifPresent(i -> { v.setTotalProfitPrice(i.getTotalPayPrice()); @@ -244,186 +244,237 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { return totalList; } + /** + * 查询商户总共流水记录 + */ + @Override + public HardOrderCsVo mchWaterTotal(HardOrderDto dto, PjcloudUser user) { + // 查询总流水 + CompletableFuture totalFuture = CompletableFuture.supplyAsync(() -> { + HardOrderDto totalDto = BeanUtil.toBean(dto, HardOrderDto.class); + totalDto.setOrderStatusCodes(HardOrderStatusEnum.getPayPrice()); + return hardOrderMapper.listCsTotal(totalDto); + }); + // 扣款总流水 + CompletableFuture refundFuture = CompletableFuture.supplyAsync(() -> { + HardOrderDto refundDto = BeanUtil.toBean(dto, HardOrderDto.class); + refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); + return hardOrderMapper.listCsTotal(refundDto); + }); + // 消费净次数 + CompletableFuture profitFuture = CompletableFuture.supplyAsync(() -> { + HardOrderDto profitDto = BeanUtil.toBean(dto, HardOrderDto.class); + profitDto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + return hardOrderMapper.listCsTotal(profitDto); + }); + CompletableFuture allFutures = CompletableFuture.allOf(totalFuture, refundFuture, profitFuture); + allFutures.join(); + HardOrderCsVo totalList = totalFuture.join(); + HardOrderCsVo refundList = refundFuture.join(); + HardOrderCsVo profitList = profitFuture.join(); + // 聚合一下数据 + if (ObjectUtil.isEmpty(totalList)) return new HardOrderCsVo(); + if (ObjectUtil.isNotEmpty(refundList)) { + if (ObjectUtil.isNotEmpty(refundList.getTotalPayPrice())) { + totalList.setTotalRefundPrice(refundList.getTotalPayPrice()); + } + if (ObjectUtil.isNotEmpty(refundList.getTotalPayCount())) { + totalList.setTotalRefundCount(refundList.getTotalPayCount()); + } + } + if (ObjectUtil.isNotEmpty(profitList)) { + if (ObjectUtil.isNotEmpty(profitList.getTotalPayPrice())) { + totalList.setTotalProfitPrice(profitList.getTotalPayPrice()); + } + if (ObjectUtil.isNotEmpty(profitList.getTotalPayCount())) { + totalList.setTotalProfitCount(profitList.getTotalPayCount()); + } + } + // 商户 + MchManageVo mchDetail = remoteMchService.getById(totalList.getMerchantId()).getData(); + if (ObjectUtil.isNotEmpty(mchDetail)) { + WalletDataUtil.convertMch(totalList, mchDetail); + } + return totalList; + } + /** * 部门交易记录 */ @Override public List pageListDept(HardDeptTotalDto dto) { // 查询部门 - CompletableFuture> deptFuture = CompletableFuture.supplyAsync(() -> { - DeptAllListDto deptDto = new DeptAllListDto(); - deptDto.setIsInclude(dto.getIsInclude()); - if (ObjectUtil.isNotEmpty(dto.getDeptId())) { - deptDto.setDeptId(dto.getDeptId()); + 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 = remoteDeptService.getInnerAllDept(deptDto).getData(); + if (ObjectUtil.isEmpty(deptList)) return null; + List deptIds = deptList.stream().map(SysDept::getDeptId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + List resultList = deptList.stream().map(v -> { + HardDeptTotalVo item = new HardDeptTotalVo(); + item.setDeptId(v.getDeptId()); + item.setDeptName(v.getName()); + return item; + }).toList(); + // 查询钱包批量充值流水 + CompletableFuture> walletBatchFuture = CompletableFuture.supplyAsync(() -> { + WalletTransactionSumAndCountDto walletDto = new WalletTransactionSumAndCountDto(); + walletDto.setDeptIds(deptIds); + walletDto.setBizTypes(List.of(WalletBizEnum.BATCH.getCode())); + walletDto.setType(WalletTransactionSumAndCountDto.TYPE_INCOME); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + walletDto.setCreateTimeList(dto.getCreateTimeList()); } - if (ObjectUtil.isNotEmpty(dto.getDeptIds())) { - deptDto.setDeptId(null); - deptDto.setDeptIds(dto.getDeptIds()); + if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { + walletDto.setWalletTypeId(dto.getWalletTypeId()); } - return remoteDeptService.getInnerAllDept(deptDto).getData(); + return remoteWalletTransactionService.sumAndCount(walletDto).getData(); }); - CompletableFuture> resultListFuture = deptFuture.thenApply(deptList -> { - if (ObjectUtil.isEmpty(deptList)) return null; - List deptIds = deptList.stream().map(SysDept::getDeptId).filter(ObjectUtil::isNotEmpty).distinct().toList(); - List resultList = deptList.stream().map(v -> { - HardDeptTotalVo item = new HardDeptTotalVo(); - item.setDeptId(v.getDeptId()); - item.setDeptName(v.getName()); - return item; - }).toList(); - // 查询钱包批量充值流水 - CompletableFuture> walletBatchFuture = CompletableFuture.supplyAsync(() -> { - WalletTransactionSumAndCountDto walletDto = new WalletTransactionSumAndCountDto(); - walletDto.setDeptIds(deptIds); - walletDto.setBizTypes(List.of(WalletBizEnum.BATCH.getCode())); - walletDto.setType(WalletTransactionSumAndCountDto.TYPE_INCOME); - if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { - walletDto.setCreateTimeList(dto.getCreateTimeList()); - } - if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { - walletDto.setWalletTypeId(dto.getWalletTypeId()); - } - return remoteWalletTransactionService.sumAndCount(walletDto).getData(); - }); - // 查询钱包批量扣减流水 - CompletableFuture> walletReduceFuture = CompletableFuture.supplyAsync(() -> { - WalletTransactionSumAndCountDto walletDto = new WalletTransactionSumAndCountDto(); - walletDto.setDeptIds(deptIds); - walletDto.setBizTypes(List.of(WalletBizEnum.BATCH.getCode())); - walletDto.setType(WalletTransactionSumAndCountDto.TYPE_EXPENSE); - if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { - walletDto.setCreateTimeList(dto.getCreateTimeList()); - } - if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { - walletDto.setWalletTypeId(dto.getWalletTypeId()); - } - return remoteWalletTransactionService.sumAndCount(walletDto).getData(); - }); - // 查询钱包单次充值流水 - CompletableFuture> walletOnceBatchFuture = CompletableFuture.supplyAsync(() -> { - WalletTransactionSumAndCountDto walletDto = new WalletTransactionSumAndCountDto(); - walletDto.setDeptIds(deptIds); - walletDto.setBizTypes(List.of(WalletBizEnum.UPDATE.getCode())); - walletDto.setType(WalletTransactionSumAndCountDto.TYPE_INCOME); - if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { - walletDto.setCreateTimeList(dto.getCreateTimeList()); - } - if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { - walletDto.setWalletTypeId(dto.getWalletTypeId()); - } - return remoteWalletTransactionService.sumAndCount(walletDto).getData(); - }); - // 查询钱包单次扣减流水 - CompletableFuture> walletOnceReduceFuture = CompletableFuture.supplyAsync(() -> { - WalletTransactionSumAndCountDto walletDto = new WalletTransactionSumAndCountDto(); - walletDto.setDeptIds(deptIds); - walletDto.setBizTypes(List.of(WalletBizEnum.UPDATE.getCode())); - walletDto.setType(WalletTransactionSumAndCountDto.TYPE_EXPENSE); - if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { - walletDto.setCreateTimeList(dto.getCreateTimeList()); - } - if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { - walletDto.setWalletTypeId(dto.getWalletTypeId()); - } - return remoteWalletTransactionService.sumAndCount(walletDto).getData(); - }); - // 查询订单支付流水 - CompletableFuture> payFuture = CompletableFuture.supplyAsync(() -> { - HardOrderSumAndCountDto payDto = new HardOrderSumAndCountDto(); - payDto.setUserDeptIds(deptIds); - payDto.setOrderStatusCodes(HardOrderStatusEnum.getPayPrice()); - if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { - payDto.setCreateTimeList(dto.getCreateTimeList()); - } - if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { - payDto.setWalletTypeId(dto.getWalletTypeId()); - } - return hardOrderMapper.sumAndCount(payDto); - }); - // 查询订单退款流水 - CompletableFuture> refundFuture = CompletableFuture.supplyAsync(() -> { - HardOrderSumAndCountDto refundDto = new HardOrderSumAndCountDto(); - refundDto.setUserDeptIds(deptIds); - refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); - if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { - refundDto.setCreateTimeList(dto.getCreateTimeList()); - } - if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { - refundDto.setWalletTypeId(dto.getWalletTypeId()); - } - return hardOrderMapper.sumAndCount(refundDto); - }); + // 查询钱包批量扣减流水 + CompletableFuture> walletReduceFuture = CompletableFuture.supplyAsync(() -> { + WalletTransactionSumAndCountDto walletDto = new WalletTransactionSumAndCountDto(); + walletDto.setDeptIds(deptIds); + walletDto.setBizTypes(List.of(WalletBizEnum.BATCH.getCode())); + walletDto.setType(WalletTransactionSumAndCountDto.TYPE_EXPENSE); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + walletDto.setCreateTimeList(dto.getCreateTimeList()); + } + if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { + walletDto.setWalletTypeId(dto.getWalletTypeId()); + } + return remoteWalletTransactionService.sumAndCount(walletDto).getData(); + }); + // 查询钱包单次充值流水 + CompletableFuture> walletOnceBatchFuture = CompletableFuture.supplyAsync(() -> { + WalletTransactionSumAndCountDto walletDto = new WalletTransactionSumAndCountDto(); + walletDto.setDeptIds(deptIds); + walletDto.setBizTypes(List.of(WalletBizEnum.UPDATE.getCode())); + walletDto.setType(WalletTransactionSumAndCountDto.TYPE_INCOME); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + walletDto.setCreateTimeList(dto.getCreateTimeList()); + } + if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { + walletDto.setWalletTypeId(dto.getWalletTypeId()); + } + return remoteWalletTransactionService.sumAndCount(walletDto).getData(); + }); + // 查询钱包单次扣减流水 + CompletableFuture> walletOnceReduceFuture = CompletableFuture.supplyAsync(() -> { + WalletTransactionSumAndCountDto walletDto = new WalletTransactionSumAndCountDto(); + walletDto.setDeptIds(deptIds); + walletDto.setBizTypes(List.of(WalletBizEnum.UPDATE.getCode())); + walletDto.setType(WalletTransactionSumAndCountDto.TYPE_EXPENSE); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + walletDto.setCreateTimeList(dto.getCreateTimeList()); + } + if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { + walletDto.setWalletTypeId(dto.getWalletTypeId()); + } + return remoteWalletTransactionService.sumAndCount(walletDto).getData(); + }); + // 查询订单支付流水 + CompletableFuture> payFuture = CompletableFuture.supplyAsync(() -> { + HardOrderSumAndCountDto payDto = new HardOrderSumAndCountDto(); + payDto.setUserDeptIds(deptIds); + payDto.setOrderStatusCodes(HardOrderStatusEnum.getPayPrice()); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + payDto.setCreateTimeList(dto.getCreateTimeList()); + } + if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { + payDto.setWalletTypeId(dto.getWalletTypeId()); + } + return hardOrderMapper.sumAndCount(payDto); + }); + // 查询订单退款流水 + CompletableFuture> refundFuture = CompletableFuture.supplyAsync(() -> { + HardOrderSumAndCountDto refundDto = new HardOrderSumAndCountDto(); + refundDto.setUserDeptIds(deptIds); + refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + refundDto.setCreateTimeList(dto.getCreateTimeList()); + } + if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { + refundDto.setWalletTypeId(dto.getWalletTypeId()); + } + return hardOrderMapper.sumAndCount(refundDto); + }); + // 消费净次数 + CompletableFuture> profitFuture = CompletableFuture.supplyAsync(() -> { + HardOrderSumAndCountDto refundDto = new HardOrderSumAndCountDto(); + refundDto.setUserDeptIds(deptIds); + refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + refundDto.setCreateTimeList(dto.getCreateTimeList()); + } + if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { + refundDto.setWalletTypeId(dto.getWalletTypeId()); + } + return hardOrderMapper.sumAndCount(refundDto); + }); + CompletableFuture allFutures = CompletableFuture.allOf(walletBatchFuture, walletReduceFuture, payFuture, refundFuture, walletOnceBatchFuture, walletOnceReduceFuture, profitFuture); + allFutures.join(); + List walletBatchList = walletBatchFuture.join(); + List walletReduceList = walletReduceFuture.join(); + List walletOnceBatchList = walletOnceBatchFuture.join(); + List walletOnceReduceList = walletOnceReduceFuture.join(); + List payList = payFuture.join(); + List refundList = refundFuture.join(); + List profitList = profitFuture.join(); + // 聚合一下数据 + for (HardDeptTotalVo v : resultList) { + if (ObjectUtil.isNotEmpty(walletBatchList)) { + walletBatchList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { + v.setWalletPrice(i.getSum()); + v.setWalletCount(i.getCount()); + }); + } + if (ObjectUtil.isNotEmpty(walletReduceList)) { + walletReduceList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { + // v.setWalletReducePrice(i.getSum()); + v.setWalletReducePrice(Math.abs(i.getSum())); + v.setWalletReduceCount(i.getCount()); + }); + } + if (ObjectUtil.isNotEmpty(walletOnceBatchList)) { + walletOnceBatchList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { + v.setWalletOncePrice(i.getSum()); + v.setWalletOnceCount(i.getCount()); + }); + } + if (ObjectUtil.isNotEmpty(walletOnceReduceList)) { + walletOnceReduceList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { + // v.setWalletOnceReducePrice(i.getSum()); + v.setWalletOnceReducePrice(Math.abs(i.getSum())); + v.setWalletOnceReduceCount(i.getCount()); + }); + } + if (ObjectUtil.isNotEmpty(payList)) { + payList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { + v.setOrderPayPrice(i.getSum()); + v.setOrderPayCount(i.getCount()); + }); + } + if (ObjectUtil.isNotEmpty(refundList)) { + refundList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { + v.setOrderRefundPrice(i.getSum()); + v.setOrderRefundCont(i.getCount()); + }); + } // 查看盈利流水 - CompletableFuture> profitFuture = CompletableFuture.supplyAsync(() -> { - HardOrderSumAndCountDto refundDto = new HardOrderSumAndCountDto(); - refundDto.setUserDeptIds(deptIds); - refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); - if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { - refundDto.setCreateTimeList(dto.getCreateTimeList()); - } - if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { - refundDto.setWalletTypeId(dto.getWalletTypeId()); - } - return hardOrderMapper.sumAndCount(refundDto); - }); - CompletableFuture allFutures = CompletableFuture.allOf(walletBatchFuture, walletReduceFuture, payFuture, refundFuture, walletOnceBatchFuture, walletOnceReduceFuture, profitFuture); - allFutures.join(); - List walletBatchList = walletBatchFuture.join(); - List walletReduceList = walletReduceFuture.join(); - List walletOnceBatchList = walletOnceBatchFuture.join(); - List walletOnceReduceList = walletOnceReduceFuture.join(); - List payList = payFuture.join(); - List refundList = refundFuture.join(); - List profitList = profitFuture.join(); - // 聚合一下数据 - for (HardDeptTotalVo v : resultList) { - if (ObjectUtil.isNotEmpty(walletBatchList)) { - walletBatchList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { - v.setWalletPrice(i.getSum()); - v.setWalletCount(i.getCount()); - }); - } - if (ObjectUtil.isNotEmpty(walletReduceList)) { - walletReduceList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { - v.setWalletReducePrice(i.getSum()); - v.setWalletReduceCount(i.getCount()); - }); - } - if (ObjectUtil.isNotEmpty(walletOnceBatchList)) { - walletOnceBatchList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { - v.setWalletOncePrice(i.getSum()); - v.setWalletOnceCount(i.getCount()); - }); - } - if (ObjectUtil.isNotEmpty(walletOnceReduceList)) { - walletOnceReduceList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { - v.setWalletOnceReducePrice(i.getSum()); - v.setWalletOnceReduceCount(i.getCount()); - }); - } - if (ObjectUtil.isNotEmpty(payList)) { - payList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { - v.setOrderPayPrice(i.getSum()); - v.setOrderPayCount(i.getCount()); - }); - } - if (ObjectUtil.isNotEmpty(refundList)) { - refundList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { - v.setOrderRefundPrice(i.getSum()); - v.setOrderRefundCont(i.getCount()); - }); - } - // 查看盈利流水 - if (ObjectUtil.isNotEmpty(profitList)) { - profitList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { - v.setOrderProfitPrice(i.getSum()); - v.setOrderProfitCont(i.getCount()); - }); - } + if (ObjectUtil.isNotEmpty(profitList)) { + profitList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { + v.setOrderProfitPrice(i.getSum()); + v.setOrderProfitCont(i.getCount()); + }); } - return resultList; - }); - return resultListFuture.join(); + } + return resultList; } /** diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuJoinServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuJoinServiceImpl.java index 150416d7e..0363fc7cc 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuJoinServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuJoinServiceImpl.java @@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.util.ArrayList; import java.util.List; /** @@ -33,20 +34,34 @@ public class HardSpuJoinServiceImpl extends ServiceImpl scopeList(HardSpuJoinDto dto) { List list = baseMapper.selectList(new LambdaQueryWrapper() - .eq(HardSpuJoinEntity::getHardDoorNumber, dto.getHardDoorNumber()) - .eq(HardSpuJoinEntity::getHardDoorId, dto.getHardDoorId()) - .eq(HardSpuJoinEntity::getCabinetNo, dto.getCabinetNo()) + .eq(ObjectUtil.isNotEmpty(dto.getHardDoorNumber()), HardSpuJoinEntity::getHardDoorNumber, dto.getHardDoorNumber()) + .eq(ObjectUtil.isNotEmpty(dto.getHardDoorId()), HardSpuJoinEntity::getHardDoorId, dto.getHardDoorId()) + .eq(ObjectUtil.isNotEmpty(dto.getCabinetNo()), HardSpuJoinEntity::getCabinetNo, dto.getCabinetNo()) + .isNotNull(ObjectUtil.isNotEmpty(dto.getIsSpu()) && dto.getIsSpu(), HardSpuJoinEntity::getSpuId) + .orderByAsc(HardSpuJoinEntity::getHardDoorNumber) + .orderByDesc(HardSpuJoinEntity::getSpuId) ); - if (ObjectUtil.isEmpty(list)) return List.of(); + if (ObjectUtil.isEmpty(list)) return new ArrayList<>(); List joinList = BeanUtils.toBean(list, HardSpuJoinVo.class); List spuIds = joinList.stream().map(HardSpuJoinVo::getSpuId).toList(); // 查询商品 if (ObjectUtil.isNotEmpty(spuIds)) { - List spuList = hardSpuMapper.scopPageList(HardSpuDto.builder().build(), null); + HardSpuDto spuDto = new HardSpuDto(); + spuDto.setSpuIdList(spuIds); + List spuList = hardSpuMapper.scopPageList(spuDto, null); for (HardSpuJoinVo v : joinList) { spuList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getSpuId())).findFirst().ifPresent(v::setSpuDetail); } } - return List.of(); + return joinList; + } + + @Override + public List getSpuList(Long hardDoorId, Integer cabinetNo) { + HardSpuJoinDto queryDto = new HardSpuJoinDto(); + queryDto.setHardDoorId(hardDoorId); + queryDto.setCabinetNo(String.valueOf(cabinetNo)); + queryDto.setIsSpu(true); + return scopeList(queryDto); } } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuRepertoryServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuRepertoryServiceImpl.java index 3728114e4..605c1c900 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuRepertoryServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuRepertoryServiceImpl.java @@ -12,17 +12,17 @@ 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.spu.HardSpuRepertoryTypeEnum; -import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; +import com.bsd.pjcloud.hard.api.dto.spu.DeductionSpuRepertoryDto; import com.bsd.pjcloud.hard.api.dto.spu.HardSpuRepertoryDto; -import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; +import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; +import com.bsd.pjcloud.hard.api.entity.manager.HardDoorCabinetEntity; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; +import com.bsd.pjcloud.hard.api.entity.spu.HardSpuJoinEntity; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuRepertoryEntity; -import com.bsd.pjcloud.hard.api.utils.HardUtil; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuRepertoryVo; import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; import com.bsd.pjcloud.hard.mapper.spu.HardSpuRepertoryMapper; -import com.bsd.pjcloud.hard.service.HardSpuRepertoryService; -import com.bsd.pjcloud.hard.service.HardSpuService; +import com.bsd.pjcloud.hard.service.*; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; @@ -45,12 +45,13 @@ import java.util.List; public class HardSpuRepertoryServiceImpl extends ServiceImpl implements HardSpuRepertoryService { private final HardSpuService hardSpuService; + private final HardDoorFlowService hardDoorFlowService; + private final HardDoorCabinetService hardDoorCabinetService; + private final HardSpuJoinService hardSpuJoinService; private final RemoteMchService remoteMchService; private final RemoteUserService remoteUserService; - private final HardManagerMapper hardManagerMapper; - @Override public Page scopePageJoin(Page page, HardSpuRepertoryDto dto, DataScope dataScope) { Page pageList = baseMapper.scopePageJoin(page, dto, dataScope); @@ -63,27 +64,54 @@ public class HardSpuRepertoryServiceImpl extends ServiceImpl() + .eq(HardSpuJoinEntity::getHardDoorId, dto.getHardDoorId()) + .eq(HardSpuJoinEntity::getCabinetNo, dto.getCabinetNo()) + .eq(HardSpuJoinEntity::getSpuId, dto.getSpuId()) + ); + if (ObjectUtil.isEmpty(cabinetSpu)) { + throw new RuntimeException("货柜中没有这个商品"); + } Integer beforeCount = 0; if (ObjectUtil.isNotEmpty(spuDetail.getRepertoryCount())) { beforeCount = spuDetail.getRepertoryCount(); } - entity.setBeforeCount(beforeCount); - entity.setUserId(user.getId()); - entity.setHardId(entity.getHardId()); - entity.setBizType(HardSpuRepertoryTypeEnum.HANDLER.getType()); - baseMapper.insert(entity); - // 更新商品库存 + dto.setBeforeCount(beforeCount); + dto.setUserId(user.getId()); + dto.setBizType(HardSpuRepertoryTypeEnum.HANDLER.getType()); + baseMapper.insert(dto); + // 更新商品总库存 HardSpuEntity spu = new HardSpuEntity(); spu.setId(spuDetail.getId()); - spu.setRepertoryCount(entity.getCount() + beforeCount); + spu.setRepertoryCount(dto.getCount() + beforeCount); + spu.setVersion(spuDetail.getVersion()); hardSpuService.updateById(spu); - return entity.getId(); + // 更新柜门商品库存 + HardSpuJoinEntity cabinetSpuJoin = new HardSpuJoinEntity(); + cabinetSpuJoin.setId(cabinetSpu.getId()); + cabinetSpuJoin.setVersion(cabinetSpu.getVersion()); + cabinetSpuJoin.setRepertoryCount(dto.getCount() + cabinetSpu.getRepertoryCount()); + hardSpuJoinService.updateById(cabinetSpuJoin); + return dto.getId(); } /** @@ -143,6 +171,70 @@ public class HardSpuRepertoryServiceImpl extends ServiceImpl().eq(HardSpuRepertoryEntity::getBizId, body.getFlowId())); + if (count > 0) { + throw new RuntimeException("改上架已结束"); + } + List list = body.getList().stream().filter(v -> v.getPlusCount() > 0).toList(); + if (ObjectUtil.isEmpty(list)) { + throw new RuntimeException("上架商品不能为空"); + } + // 查询商品列表 + List spuIds = list.stream().map(DeductionSpuRepertoryDto.Item::getHardSpuId).toList(); + List spuList = hardSpuService.listByIds(spuIds); + // 查询货柜商品列表 + List spuJoinList = hardSpuJoinService.list(new LambdaQueryWrapper() + .in(HardSpuJoinEntity::getSpuId, spuIds) + .eq(HardSpuJoinEntity::getHardDoorId, hardDoorFlow.getHardDoorId()) + .eq(HardSpuJoinEntity::getCabinetNo, hardDoorFlow.getCabinetNo()) + ); + // 更新上架记录 + for (DeductionSpuRepertoryDto.Item i : list) { + spuList.stream().filter(v -> v.getId().equals(i.getHardSpuId())).findFirst().ifPresent(spu -> { + HardSpuRepertoryEntity entity = new HardSpuRepertoryEntity(); + Integer beforeCount = 0; + if (ObjectUtil.isNotEmpty(spu.getRepertoryCount())) { + beforeCount = spu.getRepertoryCount(); + } + entity.setHardDoorId(hardDoorFlow.getHardDoorId()); + entity.setCabinetNo(hardDoorFlow.getCabinetNo()); + entity.setSpuId(spu.getId()); + entity.setUserId(userId); + entity.setBeforeCount(beforeCount); + entity.setCount(i.getPlusCount()); + entity.setBizId(body.getFlowId()); + entity.setBizType(HardSpuRepertoryTypeEnum.PERSION.getType()); + baseMapper.insert(entity); + // 更新总商品库存 + HardSpuEntity spuEntity = new HardSpuEntity(); + spuEntity.setId(spu.getId()); + spuEntity.setVersion(spu.getVersion()); + spuEntity.setRepertoryCount(entity.getCount() + beforeCount); + hardSpuService.updateById(spuEntity); + // 更新货柜商品库存 + spuJoinList.stream().filter(v -> ObjectUtil.equals(v.getSpuId(), spu.getId())).findFirst().ifPresent(spuJoin -> { + HardSpuJoinEntity spuJoinEntity = new HardSpuJoinEntity(); + spuJoinEntity.setId(spuJoin.getId()); + spuJoinEntity.setVersion(spuJoin.getVersion()); + spuJoinEntity.setRepertoryCount(entity.getCount() + spuJoin.getRepertoryCount()); + hardSpuJoinService.updateById(spuJoinEntity); + }); + }); + } + return false; + } + private void disposeList(List list, HardSpuRepertoryDto dto) { if (ObjectUtil.isEmpty(list)) return; // 商户 @@ -154,16 +246,6 @@ public class HardSpuRepertoryServiceImpl extends ServiceImpl hardIds = list.stream().map(HardSpuRepertoryVo::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)); - } - } // 用户 List userIds = list.stream().map(HardSpuRepertoryVo::getUserId).distinct().toList(); R> userList = remoteUserService.getUserById(new ArrayList<>(userIds)); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuServiceImpl.java index f958f7184..3ecc61e85 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/spu/HardSpuServiceImpl.java @@ -1,14 +1,23 @@ package com.bsd.pjcloud.hard.service.impl.spu; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.constant.spu.HardKsCheckStatusEnum; import com.bsd.pjcloud.hard.api.constant.spu.HardKsSkuTypeEnum; +import com.bsd.pjcloud.hard.api.dto.spu.DeductionSpuStockDto; +import com.bsd.pjcloud.hard.api.dto.spu.HardPutawayDto; import com.bsd.pjcloud.hard.api.dto.spu.HardSpuDto; import com.bsd.pjcloud.hard.api.dto.spu.HardSpuJoinDto; +import com.bsd.pjcloud.hard.api.entity.HardDoorFlowEntity; import com.bsd.pjcloud.hard.api.entity.spu.HardSpuEntity; +import com.bsd.pjcloud.hard.api.entity.spu.HardSpuJoinEntity; import com.bsd.pjcloud.hard.api.vo.manager.HardDoorManagerVo; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuJoinVo; import com.bsd.pjcloud.hard.api.vo.spu.HardSpuVo; @@ -20,10 +29,12 @@ import com.bsd.pjcloud.hard.service.HardSpuService; import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdKsService; import com.bsd.pjcloud.thirdparty.dto.ks.KsBarcodeLikeDto; import com.bsd.pjcloud.thirdparty.vo.ks.KsBarcodeLikeVo; +import com.bsd.pjcloud.thirdparty.vo.ks.KsSpuVo; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.*; @@ -37,6 +48,8 @@ import java.util.*; @Service public class HardSpuServiceImpl extends ServiceImpl implements HardSpuService { + private static final String TAG = "硬件商品"; + private final HardManagerService hardManagerService; private final HardDoorManagerService hardDoorManagerService; private final HardSpuJoinService hardSpuJoinService; @@ -55,14 +68,24 @@ public class HardSpuServiceImpl extends ServiceImpl get(List ksSpuIds) { + return baseMapper.selectList(new LambdaQueryWrapper().in(HardSpuEntity::getKsSkuId, ksSpuIds)); + } + + @Override + public List getByIds(List spuIds) { + return baseMapper.selectList(new LambdaQueryWrapper().in(HardSpuEntity::getId, spuIds)); + } + /** * 新增 */ @Override public Long create(HardSpuEntity entity) { - if (existName(entity)) { - throw new RuntimeException("商品名不能重复"); - } + // if (existName(entity)) { + // throw new RuntimeException("商品名不能重复"); + // } entity.setSkuType(HardKsSkuTypeEnum.SELF.getType()); baseMapper.insert(entity); // 发起审核 @@ -75,9 +98,9 @@ public class HardSpuServiceImpl extends ServiceImpl>> getByCabinetNo(Long hardId, String cabinetNo) { List>> result = new LinkedList<>(); // 查询设备 HardDoorManagerVo doorManagerVo = hardDoorManagerService.getByHardId(hardId); if (ObjectUtil.isEmpty(doorManagerVo)) return result; - int doorCount = 6; + int doorCount = 5; int storeySpuMaxCount = 10; if (ObjectUtil.isNotEmpty(doorCount)) { doorCount = doorManagerVo.getDoorCount().intValue(); @@ -108,22 +132,85 @@ public class HardSpuServiceImpl extends ServiceImpl storeySpu = hardSpuJoinService.scopeList(spuJoinDto); int storeySpuSize = storeySpu.size(); int emptyStoreySpuSize = storeySpuMaxCount - storeySpuSize; for (int j = 0; j < emptyStoreySpuSize; j++) { - HardSpuJoinVo hardSpuJoinEntity = new HardSpuJoinVo(); - hardSpuJoinEntity.setHardDoorId(hardId); + HardSpuJoinEntity hardSpuJoinEntity = new HardSpuJoinEntity(); + hardSpuJoinEntity.setCabinetNo(cabinetNo); + hardSpuJoinEntity.setHardDoorId(doorManagerVo.getId()); hardSpuJoinEntity.setHardDoorNumber(i); - storeySpu.add(hardSpuJoinEntity); + hardSpuJoinService.save(hardSpuJoinEntity); + HardSpuJoinVo hardSpuJoinVo = new HardSpuJoinVo(); + hardSpuJoinVo.setId(hardSpuJoinEntity.getId()); + hardSpuJoinVo.setCabinetNo(hardSpuJoinEntity.getCabinetNo()); + hardSpuJoinVo.setHardDoorId(hardSpuJoinEntity.getHardDoorId()); + hardSpuJoinVo.setHardDoorNumber(hardSpuJoinEntity.getHardDoorNumber()); + if (ObjectUtil.isNotEmpty(hardSpuJoinVo)) { + storeySpu.add(hardSpuJoinVo); + } } Map> addMap = new HashMap<>(); addMap.put(i, storeySpu); result.add(addMap); } - return List.of(); + return result; + } + + /** + * 查询货柜补货商品列表 + */ + @Override + public List appCabinetPutawayList(Long hardDoorId, String cabinetNo) { + HardSpuJoinDto spuJoinDto = new HardSpuJoinDto(); + spuJoinDto.setHardDoorId(hardDoorId); + spuJoinDto.setCabinetNo(cabinetNo); + spuJoinDto.setIsSpu(true); + return hardSpuJoinService.scopeList(spuJoinDto); + } + + /** + * 上架id + */ + @Override + public void putaway(HardPutawayDto dto) { + // 查询有没有货柜 + HardSpuJoinEntity spuJoinDetail = hardSpuJoinService.getOne(new LambdaQueryWrapper() + .eq(HardSpuJoinEntity::getId, dto.getId()) + ); + if (ObjectUtil.isEmpty(spuJoinDetail)) throw new RuntimeException("货柜不存在"); + // 校验商品 + HardSpuEntity spuDetail = validateSpu(dto.getHardSpuId()); + // 判断这一层是否重复 + long doorCount = hardSpuJoinService.count(new LambdaUpdateWrapper() + .eq(HardSpuJoinEntity::getHardDoorId, spuJoinDetail.getHardDoorId()) + .eq(HardSpuJoinEntity::getCabinetNo, spuJoinDetail.getCabinetNo()) + .eq(HardSpuJoinEntity::getSpuId, spuDetail.getId()) + ); + if (doorCount > 0) throw new RuntimeException("该货柜已有相同商品"); + LambdaUpdateWrapper updateObj = new LambdaUpdateWrapper() + .set(HardSpuJoinEntity::getSpuId, spuDetail.getId()) + .eq(HardSpuJoinEntity::getId, dto.getId()); + hardSpuJoinService.update(updateObj); + } + + /** + * 下架 + */ + @Override + public void unPutaway(HardPutawayDto dto) { + // 查询有没有商品 + HardSpuJoinEntity hardSpuJoinDetail = hardSpuJoinService.getOne(new LambdaQueryWrapper() + .eq(HardSpuJoinEntity::getSpuId, dto.getHardSpuId()) + .eq(HardSpuJoinEntity::getId, dto.getId()) + ); + if (ObjectUtil.isEmpty(hardSpuJoinDetail)) throw new RuntimeException("该商品不存在"); + LambdaUpdateWrapper updateObj = new LambdaUpdateWrapper() + .set(HardSpuJoinEntity::getSpuId, null) + .eq(HardSpuJoinEntity::getId, dto.getId()); + hardSpuJoinService.update(updateObj); } /** @@ -135,16 +222,170 @@ public class HardSpuServiceImpl extends ServiceImpl list) { + if (ObjectUtil.isEmpty(hardDoorFlow)) { + log.error("|{}|扣减商品库存失败flow为空dto|{}|", TAG, JSONUtil.toJsonStr(list)); + return false; + } + if (ObjectUtil.isEmpty(list)) { + log.error("|{}|扣减商品库存失败list为空", TAG); + return false; + } + List hardSpuIdes = list.stream().map(DeductionSpuStockDto::getHardSpuId).toList(); + List hardSpuList = getByIds(hardSpuIdes); + if (ObjectUtil.isEmpty(hardSpuList)) { + log.error("|{}|扣减商品库存失败查询到的智能柜商品为空dto|{}|", TAG, JSONUtil.toJsonStr(list)); + return false; + } + // 查询货柜商品 + List hardSpuJoinList = hardSpuJoinService.list(new LambdaQueryWrapper() + .in(HardSpuJoinEntity::getSpuId, hardSpuIdes) + .eq(HardSpuJoinEntity::getHardDoorId, hardDoorFlow.getHardDoorId()) + .eq(HardSpuJoinEntity::getCabinetNo, hardDoorFlow.getCabinetNo()) + ); + for (HardSpuEntity i : hardSpuList) { + list.stream().filter(j -> ObjectUtil.equals(i.getId(), j.getHardSpuId())).findFirst().ifPresent(hardSpu -> { + if (ObjectUtil.isNotEmpty(hardSpu.getIncrCount())) { + HardSpuEntity entity = new HardSpuEntity(); + entity.setId(hardSpu.getHardSpuId()); + entity.setSalesCount(i.getSalesCount() + hardSpu.getIncrCount()); + entity.setRepertoryCount(i.getRepertoryCount() - hardSpu.getIncrCount()); + entity.setVersion(i.getVersion()); + // 乐观锁循环扣减库存 + baseMapper.updateById(entity); + } + }); + } + for (HardSpuJoinEntity i : hardSpuJoinList) { + // 更新货柜商品库存 + list.stream().filter(v -> ObjectUtil.equals(v.getHardSpuId(), i.getSpuId())).findFirst().ifPresent(spu -> { + HardSpuJoinEntity spuJoinEntity = new HardSpuJoinEntity(); + spuJoinEntity.setId(i.getId()); + spuJoinEntity.setVersion(i.getVersion()); + spuJoinEntity.setRepertoryCount(i.getRepertoryCount() - spu.getIncrCount()); + hardSpuJoinService.updateById(spuJoinEntity); + }); + } + return true; + } + + public boolean asyncAllGroup(KsBarcodeLikeDto likeDto) { + KsBarcodeLikeVo data = remoterThirdKsService.barcodeSkuLike(likeDto).getData(); + if (ObjectUtil.isEmpty(data) || !data.isSuccess() || ObjectUtil.isEmpty(data.getResultList())) return false; + List spuList = new ArrayList<>(); + for (KsSpuVo i : data.getResultList()) { + try { + HardSpuEntity entity = HardSpuEntity + .builder() + .spuCategoryId(null) + .name(i.getSku_name()) + .cover(i.getCover()) + .skuType(i.getSku_type()) + .ksSkuId(i.getKs_sku_id()) + .ksResSkuId(i.getSku_id()) + .ksBarcode(i.getBarcode()) + .ksHasSubSku(i.getHas_sub_sku()) + .build(); + // 图片 + if (ObjectUtil.isNotEmpty(i.getImg_urls())) { + entity.setPic(String.join(",", i.getImg_urls())); + } + // 审核状态 + entity.setKsStatus(HardKsCheckStatusEnum.CHECK_DONE.getType()); + entity.setKsStatusTitle(HardKsCheckStatusEnum.CHECK_DONE.getDescription()); + entity.setKsComments("API同步"); + // 处理规格 + KsSpuVo.KsSpuSpecsVo specs = i.getSpecs(); + if (ObjectUtil.isNotEmpty(specs)) { + if (ObjectUtil.isNotEmpty(specs.getTaste())) entity.setSpecsTaste(specs.getTaste()); + if (ObjectUtil.isNotEmpty(specs.getCapacity())) entity.setSpecsCapacity(specs.getCapacity()); + if (ObjectUtil.isNotEmpty(specs.getWeight())) entity.setSpecsWeight(specs.getWeight()); + } + // 处理集合SKU的子SKU信息 + if (ObjectUtil.isEmpty(i.getSub_sku())) { + entity.setKsSubSkuJson(""); + spuList.add(entity); + } else { + HardSpuEntity entityCopy = BeanUtil.toBean(entity, HardSpuEntity.class); + for (KsSpuVo j : i.getSub_sku()) { + entityCopy.setKsSkuId(j.getKs_sku_id()); + entityCopy.setKsResSkuId(j.getSku_id()); + entityCopy.setKsBarcode(j.getBarcode()); + entityCopy.setName(j.getSku_name()); + entityCopy.setSkuType(j.getSku_type()); + entityCopy.setCover(i.getCover()); + entityCopy.setKsSubSkuJson(JSONUtil.toJsonStr(j.getSub_sku())); + // 图片 + if (ObjectUtil.isNotEmpty(j.getImg_urls())) { + entityCopy.setPic(String.join(",", j.getImg_urls())); + } + spuList.add(entityCopy); + } + } + } catch (Exception e) { + log.error("|{}|添加旷世商品错误|{}|", TAG, e.getMessage()); + } + } + if (ObjectUtil.isNotEmpty(spuList)) { + List insertList = new ArrayList<>(); + List updateList = new ArrayList<>(); + for (HardSpuEntity i : spuList) { + HardSpuEntity entity = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(HardSpuEntity::getKsResSkuId, i.getKsResSkuId()) + .eq(HardSpuEntity::getKsSkuId, i.getKsSkuId()) + ); + if (ObjectUtil.isEmpty(entity)) { + i.setPrice(0); + i.setSalesCount(0); + i.setRepertoryCount(0); + i.setSort(0); + i.setIsDefault(YesNoEnum.YES.getCode()); + i.setStatus(YesNoEnum.YES.getCode()); + insertList.add(i); + } else { + i.setId(entity.getId()); + updateList.add(i); + } + } + if (ObjectUtil.isNotEmpty(insertList)) { + baseMapper.insert(insertList); + } + if (ObjectUtil.isNotEmpty(updateList)) { + baseMapper.updateById(updateList); + } + } + return true; } /** diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/商户交易金额汇总.xlsx b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/商户交易金额汇总.xlsx index 831e78567..557541e5c 100644 Binary files a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/商户交易金额汇总.xlsx 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 index 4509264c9..95ad4b2bd 100644 Binary files a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/支付方式交易汇总.xlsx 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 index 26441d9e0..923260b8f 100644 Binary files a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/部门交易金额汇总.xlsx 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/HardApptMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardApptMapper.xml new file mode 100644 index 000000000..ab239b590 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardApptMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardAuthMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardAuthMapper.xml index 8421a5a8d..6a2633937 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardAuthMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardAuthMapper.xml @@ -39,10 +39,13 @@ a.del_flag = '0' - and a.userId = #{dto.userId} + and a.user_id = #{dto.userId} + + + and a.hard_id = #{dto.hardId} - and a.authStatus = #{dto.auth_status} + and a.auth_status = #{dto.authStatus} and a.is_done = #{dto.isDone} @@ -65,5 +68,6 @@ + order by a.create_time desc , a.id desc \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardBroadcastMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardBroadcastMapper.xml index af902b355..ff348dcc2 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardBroadcastMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardBroadcastMapper.xml @@ -7,6 +7,7 @@ + @@ -28,6 +29,7 @@ a.user_id, a.hard_id, a.topic, + a.biz_type, a.biz_id, a.title, a.content, @@ -52,6 +54,9 @@ and a.hard_id = #{dto.hardId} + + and a.biz_type = #{dto.bizType} + and a.biz_id = #{dto.bizId} @@ -77,5 +82,4 @@ - \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardDoorFlowMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardDoorFlowMapper.xml new file mode 100644 index 000000000..a75e914ca --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardDoorFlowMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/manager/HardDoorCabinetMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/manager/HardDoorCabinetMapper.xml new file mode 100644 index 000000000..e5a3c1cc1 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/manager/HardDoorCabinetMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + select a.id, + a.hard_door_id, + a.cabinet_no, + a.is_lock_online, + a.lock_status, + a.door_status, + a.sale_status, + a.qr_code, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id, + + + + a.del_flag = '0' + + and a.hard_door_id = #{dto.hardDoorId} + + + and a.cabinet_no like concat('%', #{dto.cabinetNo}, '%') + + + + + \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/manager/HardDoorManagerMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/manager/HardDoorManagerMapper.xml index 5b66bd7e2..a54e99383 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/manager/HardDoorManagerMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/manager/HardDoorManagerMapper.xml @@ -14,11 +14,13 @@ + - + + @@ -39,11 +41,13 @@ a.power_status, a.net_status, a.sale_status, + a.sim_sn, a.signal_intensity, a.signal_ratio, a.signal_time, - a.cabinet_list, a.restart_time, + a.system_volume, + a.media_volume, a.create_by, a.create_time, a.update_by, @@ -90,7 +94,14 @@ order by a.create_time desc , a.id desc - + + + a.id = #{hardDoorId} + + + + + + - + + + soureD.name as sourceDeptName, + targetD.name as targetDeptName, + u.username as username, + u.phone as userMobile, + u.avatar as userAvatar + from sys_user_transaction a + left join sys_dept soureD on soureD.dept_id = a.source_dept_id + left join sys_dept targetD on targetD.dept_id = a.target_dept_id + left join sys_user u on u.user_id = a.user_id + + + + + \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/UserTrustedDeviceMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/UserTrustedDeviceMapper.xml new file mode 100644 index 000000000..132bdc870 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/UserTrustedDeviceMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file 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 3d415b576..91f0f6093 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 @@ -13,6 +13,7 @@ public enum WalletCodeBizEnum { FOREIGN("2", "外来人员"), CANTEEN_RESERVE("3", "食堂线上预订"), SUPERMARKET_RESERVE("4", "超市线上预订"), + USER_WALLET("5", "用户钱包二维码"), ; private final String code; diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java index 65a7779b2..e71c525bb 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletTypeEnum.java @@ -14,7 +14,7 @@ import java.util.Arrays; public enum WalletTypeEnum { EAT("1", "饭卡钱包"), - PAY("2", "虚拟钱包"), + PAY("2", "消费钱包"), ; private final String code; diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletCodeUseEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletCodeUseEntity.java index 0a1b98f9e..26d1d08cb 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletCodeUseEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletCodeUseEntity.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import com.bsd.pjcloud.common.core.util.TenantTable; + import java.time.LocalDateTime; /** @@ -24,94 +25,100 @@ import java.time.LocalDateTime; public class WalletCodeUseEntity extends Model { - /** - * 编号 - */ + /** + * 编号 + */ @TableId(type = IdType.ASSIGN_ID) - @Schema(description="编号") + @Schema(description = "编号") private Long id; - /** - * 用户id - */ - @Schema(description="用户id") + /** + * 用户id + */ + @Schema(description = "用户id") private Long userId; - /** - * 类型 - */ - @Schema(description="类型") + /** + * 类型 + */ + @Schema(description = "类型") private String bizType; - /** - * 类型关联id - */ - @Schema(description="类型关联id") + /** + * 类型关联id + */ + @Schema(description = "类型关联id") private Long bizId; - /** - * 是否使用 - */ - @Schema(description="是否使用") + /** + * 是否使用 + */ + @Schema(description = "是否使用") private String status; - /** - * 二维码 - */ - @Schema(description="二维码") + /** + * 二维码 + */ + @Schema(description = "二维码") private String code; - /** - * 二维码内容 - */ - @Schema(description="二维码内容") + /** + * 二维码内容 + */ + @Schema(description = "二维码内容") private String codeContent; - /** - * 使用时间 - */ - @Schema(description="使用时间") + /** + * 短码 + */ + @Schema(description = "短码") + private String shortCode; + + /** + * 使用时间 + */ + @Schema(description = "使用时间") private LocalDateTime useTime; - /** - * 创建人 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建人") + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") private String createBy; - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建时间") + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") private LocalDateTime createTime; - /** - * 修改人 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(description="修改人") + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") private String updateBy; - /** - * 修改时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - @Schema(description="修改时间") + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") private LocalDateTime updateTime; - /** - * 删除标记 - */ + /** + * 删除标记 + */ @TableLogic - @TableField(fill = FieldFill.INSERT) - @Schema(description="删除标记") + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") private String delFlag; - /** - * 租户ID - */ - @Schema(description="租户ID") + /** + * 租户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/WalletTransactionEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java index a6baae84b..55d771e39 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletTransactionEntity.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.wallet.api.entity; import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.bsd.pjcloud.common.core.util.TenantTable; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; @@ -15,6 +16,7 @@ import java.time.LocalDateTime; * @date 2024-12-30 09:17:49 */ @Data +@TenantTable @TableName("wallet_transaction") @EqualsAndHashCode(callSuper = true) @Schema(description = "会员钱包流水表") diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java index ec3118e7d..759d5730a 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletService.java @@ -36,7 +36,6 @@ public interface RemoteWalletService { @GetMapping("/wallet-manage/get-wallet-by-card-number") R getWalletByCardNumber(@RequestParam String cardNumber); - @NoToken @GetMapping("/wallet-manage/create-wallet") R createWallet(@RequestParam Long userId); @@ -52,4 +51,7 @@ public interface RemoteWalletService { @GetMapping("/wallet-manage/is-del") R isDel(@RequestParam Long userId); + + @GetMapping("/wallet-manage/inner/is-use-door") + R innserIsUseDoor(@RequestParam Long userId); } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyCompareVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyCompareVo.java index 4ec0f4c4e..8b283f1dd 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyCompareVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyCompareVo.java @@ -23,6 +23,11 @@ public class WalletRechargeApplyCompareVo extends HashMap { */ private String userMobile; + /** + * 扣减之后的余额 + */ + private Integer afterBalance; + public void setUserId(Long userId) { this.userId = userId; this.put("userId", userId); @@ -58,4 +63,13 @@ public class WalletRechargeApplyCompareVo extends HashMap { this.userMobile = userMobile; this.put("userMobile", userMobile); } + + public Integer getAfterBalance() { + return (Integer) this.get("afterBalance"); + } + + public void setAfterBalance(Integer discountBalance) { + this.afterBalance = discountBalance; + this.put("afterBalance", discountBalance); + } } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplySelectCompareVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplySelectCompareVo.java index 97de6fff6..89aa740ea 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplySelectCompareVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplySelectCompareVo.java @@ -18,7 +18,7 @@ public class WalletRechargeApplySelectCompareVo { @Schema(description = "当前月的金额") private Integer price; - @Schema(description = "总金额(加上倒入)") + @Schema(description = "总金额(加上导入)") private Integer totalPrice; @Schema(description = "充值月", requiredMode = Schema.RequiredMode.REQUIRED) 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 332b1a7d1..8cabfb93f 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 @@ -7,7 +7,6 @@ import com.bsd.pjcloud.common.security.annotation.Inner; 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; @@ -33,24 +32,37 @@ public class WalletCodeUseController { private final WalletCodeUseService walletCodeUseService; /* ************************************* start 远程调用 start ************************************* */ + + /** + * 核销二维码 + */ @Inner @GetMapping("/cancel-code") public R cancelCode(@RequestParam Long id) { return R.ok(walletCodeUseService.cancelCode(id)); } + /** + * 是否核销 + */ @Inner @GetMapping("/is-cancel-code") public R isCancelCode(@RequestParam Long id) { return R.ok(walletCodeUseService.isCancelCode(id)); } + /** + * 生成二维码 + */ @Inner @GetMapping("/generate-code") public R generateCode(@RequestParam Long id, @RequestParam Long userId, @RequestParam WalletCodeBizEnum walletCodeBiz, @RequestParam Integer count) { return R.ok(walletCodeUseService.generate(id, userId, walletCodeBiz, count)); } + /** + * 根据ids查询 + */ @Inner @GetMapping("/get-by-biz-ids") public R> getByBizIds(@RequestParam List ids) { @@ -60,6 +72,9 @@ public class WalletCodeUseController { return R.ok(list); } + /** + * 根据id查询 + */ @Inner @GetMapping("/get-by-biz-id") public R getByBizId(@RequestParam Long id) { @@ -78,6 +93,14 @@ public class WalletCodeUseController { } /* ************************************* end app end ************************************* */ + /* ************************************* start android start ************************************* */ + @Operation(summary = "根据短码查询加密信息", description = "根据短码查询加密信息") + @GetMapping("/ad/by-short-code") + public R adByShortCode(@RequestParam String shortCode) { + return R.ok(walletCodeUseService.getByShortCode(shortCode)); + } + /* ************************************* end android end ************************************* */ + @Operation(summary = "二维码列表", description = "二维码列表") @GetMapping("/code-list") public R codeList(@ParameterObject Page page, @ParameterObject WalletCodeUseDto dto) { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java index 7aca69942..0ec0aea09 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletManageController.java @@ -71,7 +71,6 @@ public class WalletManageController { return R.ok(wallet); } - @Inner @GetMapping("/create-wallet") public R getWallet(@RequestParam Long userId) { walletManageService.createWallet(userId); @@ -126,11 +125,22 @@ public class WalletManageController { return R.ok(true); } + /** + * 这个用户是否能够删除 + */ @GetMapping("/is-del") public R isDel(@RequestParam Long userId) { return R.ok(walletManageService.isDel(userId)); } + /** + * 这个用户是否能够使用智能柜 + */ + @GetMapping("/inner/is-use-door") + public R innserIsUseDoor(@RequestParam Long userId) { + return R.ok(walletManageService.isUseDoor(userId)); + } + /* ************************************* end 远程调用 end ************************************* */ @@ -159,6 +169,13 @@ public class WalletManageController { public R getQrCode(@RequestParam Long walletId) { return R.ok(walletManageService.getQrCode(walletId)); } + + @GetMapping("/app/is-use-door") + @Operation(summary = "是够能够使用智能柜") + public R isUseDoor() { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(walletManageService.isUseDoor(user.getId())); + } /* ************************************* end app end ************************************* */ @Operation(summary = "分页查询", description = "分页查询") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java index f78c54de1..6a48a2c5b 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 @@ -43,8 +43,8 @@ public class WalletRechargeApplyController { /* ************************************* start callback start ************************************* */ @Inner(value = false) @PostMapping("/apply-callback") - public void applyCallback(@RequestBody ProcessNodeRecordAssignUserParamDto dto) { - walletRechargeApplyService.applyCallback(dto); + public void applyCallback(@RequestBody ProcessNodeRecordAssignUserParamDto dto, @RequestParam(required = false) Long tenantId) { + walletRechargeApplyService.applyCallback(dto, tenantId); } /* ************************************* start callback start ************************************* */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletCodeUseService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletCodeUseService.java index 81821a017..f0dec9a0d 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletCodeUseService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletCodeUseService.java @@ -10,22 +10,30 @@ import jakarta.validation.constraints.NotNull; public interface WalletCodeUseService extends IService { + /** + * 生成二维码 + */ Boolean generate(@NotNull Long id, @NotNull Long userId, @NotNull WalletCodeBizEnum walletCodeBizEnum, @NotNull Integer count); + /** + * 生成钱包二码 + */ + WalletCodeUseEntity generateWallet(@NotNull Long walletId); + Page pageJoin(Page page, WalletCodeUseDto dto); /** * 核销二维码 - * @param id useCodeId - * @return */ Boolean cancelCode(Long id); /** * 二维码是否核销 - * @param id useCodeId - * @return */ Boolean isCancelCode(Long id); + /** + * 根据短码查询加密信息 + */ + String getByShortCode(String shortCode); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java index ab9ab2751..7d5524869 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletManageService.java @@ -97,4 +97,9 @@ public interface WalletManageService extends IService { * 是否可以删除该用户 */ String isDel(Long userId); + + /** + * 是够能够使用智能柜 + */ + String isUseDoor(Long userId); } \ 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 31ccc885c..dabffccd0 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 @@ -49,7 +49,7 @@ public interface WalletRechargeApplyService extends IService() + .eq(WalletCodeUseEntity::getUserId, wallet.getUserId()) + .eq(WalletCodeUseEntity::getBizType, WalletCodeBizEnum.USER_WALLET.getCode()) + .eq(WalletCodeUseEntity::getBizId, wallet.getId()) + ); + String shortCode = generateShortCode(encodeJson); + WalletCodeUseEntity codeUseEntity = WalletCodeUseEntity.builder() + .userId(wallet.getUserId()) + .bizType(WalletCodeBizEnum.USER_WALLET.getCode()) + .bizId(wallet.getId()) + .status(YesNoEnum.NO.getCode()) + .code("") + .codeContent(encodeJson) + .shortCode(shortCode) + .build(); + baseMapper.insert(codeUseEntity); + return codeUseEntity; + } + + @Override public Page pageJoin(Page page, WalletCodeUseDto dto) { Page list = baseMapper.pageJoin(page, dto); @@ -126,4 +200,34 @@ public class WalletCodeUseServiceImpl extends ServiceImpl() + .eq(WalletCodeUseEntity::getShortCode, shortCode) + .orderByDesc(WalletCodeUseEntity::getCreateTime) + .orderByDesc(WalletCodeUseEntity::getId) + .last("limit 1") + ); + return detail.getCodeContent(); + } + + // 生成短码 + public String generateShortCode(String codeContent) { + while (true) { + String shortCode = DigestUtils.md5Hex(codeContent); + // 判断code是否存在 + Long count = baseMapper.selectCount(new LambdaQueryWrapper().eq(WalletCodeUseEntity::getShortCode, shortCode)); + if (count == 0) { + return shortCode; + } + } + } + + private WalletCodeUseServiceImpl getSelf() { + return SpringUtil.getBean(getClass()); + } } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletForeignServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletForeignServiceImpl.java index 26b758485..aa67676a0 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletForeignServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletForeignServiceImpl.java @@ -61,7 +61,7 @@ public class WalletForeignServiceImpl extends ServiceImpl list = walletTypeMapper.selectList(new LambdaQueryWrapper<>()); if (ObjectUtil.isEmpty(list)) return; - if (ObjectUtil.isEmpty(user)) user = userService.getByUserId(userId).getData(); + if (ObjectUtil.isEmpty(user)) user = userService.getInnerByUserId(userId).getData(); for (WalletTypeEntity v : list) { WalletManageEntity wallet = baseMapper.selectOne(new LambdaQueryWrapper() .eq(WalletManageEntity::getUserId, userId) @@ -207,34 +193,9 @@ public class WalletManageServiceImpl extends ServiceImpl= 100 * 100) { + return null; + } + return "消费钱包余额不足100元"; + } + private void disposeList(List list, WalletManageDto dto) { if (ObjectUtil.isNotEmpty(list)) { // 用户 diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletStrideServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletStrideServiceImpl.java index 2d2121078..8b777a5ac 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletStrideServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletStrideServiceImpl.java @@ -69,7 +69,7 @@ public class WalletStrideServiceImpl extends ServiceImpl tableListStr = new ArrayList<>(); tableListStr.add(merge.get(0) + "(上个月总充值金额)"); 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 382408e0b..3ae2f4f98 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 @@ -16,11 +16,11 @@ 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.exception.ErrorCodes; +import com.bsd.pjcloud.admin.api.vo.UserVO; import com.bsd.pjcloud.common.core.util.BeanUtils; 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.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; @@ -32,6 +32,7 @@ import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletBizRechargeEnum; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; import com.bsd.pjcloud.wallet.api.dto.WalletTypeDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto; @@ -41,9 +42,11 @@ import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeImportEntity; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; +import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeImportVo; import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo; +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.recharge.WalletRechargeApplyMapper; @@ -82,10 +85,11 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl batchSaveList = list.stream().map(v -> WalletRechargeImportEntity.builder().price(v.getPriceNumber()).userId(v.getUserId()).userDeptId(v.getUserDeptId()).build()).toList(); batchSaveList.forEach(v -> v.setApplyId(insertObj.getId())); rechargeImportService.saveBatch(batchSaveList); - return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED)); + return R.ok(null, "导入成功"); } /* ************************************* end excel end ************************************* */ @Override @Transactional(rollbackFor = Exception.class) - public void applyCallback(ProcessNodeRecordAssignUserParamDto dto) { + public void applyCallback(ProcessNodeRecordAssignUserParamDto dto, Long tenantId) { if (!flowUtil.checkCallback(dto)) { return; } + if (ObjectUtil.isNotEmpty(tenantId) && ObjectUtil.notEqual(tenantId, 1L)) { + TenantContextHolder.setTenantId(tenantId); + } String processId = dto.getProcessInstanceId(); WalletRechargeApplyEntity detail = baseMapper.selectOne(new LambdaQueryWrapper().eq(WalletRechargeApplyEntity::getProcessId, processId)); if (ObjectUtil.isEmpty(detail)) { @@ -392,48 +402,47 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl list, WalletRechargeApplyDto dto) { - if (ObjectUtil.isNotEmpty(list)) { - // 用户 - List userIds = list.stream().map(WalletRechargeApplyVo::getUserId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> userList = userService.getUserById(new ArrayList<>(userIds)); - if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(list, CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); - } + if (ObjectUtil.isEmpty(list)) return; + // 用户 + 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)) { - R> deptList = deptService.getDeptByDeptIds(deptIds); - if (ObjectUtil.isNotEmpty(deptList.getData())) { - DataUtil.convertDeptList(list, deptList.getData()); - } + } + // 部门 + 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)); - } + } + // 饭卡类型 + 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()) { - 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); - if (ObjectUtil.isNotEmpty(taskList)) { - Map taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); - CollectionUtils.convertList(list, v -> { - TaskDto task = taskMap.get(v.getProcessId()); - if (ObjectUtil.isNotEmpty(task)) { - v.setIsCheckUser(true); - } - return v; - }); - } + } + // 审批流程 + if (dto.getIsFindCheckUser()) { + 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); + if (ObjectUtil.isNotEmpty(taskList)) { + Map taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); + CollectionUtils.convertList(list, v -> { + TaskDto task = taskMap.get(v.getProcessId()); + if (ObjectUtil.isNotEmpty(task)) { + v.setIsCheckUser(true); + } + return v; + }); } } } @@ -444,6 +453,113 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl= 3; } + /** + * 判断申请下如果类型为记账扣款,余额是否够扣款 + */ + private void validateWalletBalance(WalletRechargeApplyEntity applyDto) { + if (ObjectUtil.notEqual(applyDto.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) return; + List importList = rechargeImportService.list(new LambdaQueryWrapper() + .eq(WalletRechargeImportEntity::getApplyId, applyDto.getId()) + ); + List importUserIds = importList.stream().map(WalletRechargeImportEntity::getUserId).distinct().toList(); + // 查询用户 + List userList = userService.getUserDeptByIds(importUserIds).getData(); + // 错误信息 + StringBuilder errorMsg = new StringBuilder(); + // 查询用户钱包 + WalletManageDto userWalletDto = new WalletManageDto(); + userWalletDto.setUserIds(importUserIds); + List userWalletList = walletManageMapper.joinList(userWalletDto); + for (WalletRechargeImportEntity i : importList) { + List walletList = userWalletList.stream().filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId())).toList(); + int walletBalance = walletList.stream().map(WalletManageEntity::getBalance).map(BigDecimal::valueOf).reduce(BigDecimal::add).get().intValue(); + int discountPrice = walletBalance - i.getPrice(); + if (discountPrice < 0) { + // 查询用户名字 + UserVO userTarget = userList.stream().filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId())).findFirst().get(); + if (ObjectUtil.isEmpty(userTarget)) { + errorMsg.append("用户id<").append(i.getUserId()).append(">"); + } else { + errorMsg.append("用户名<").append(userTarget.getName()).append(">"); + } + errorMsg.append("记账扣款失败,"); + for (WalletManageVo j : walletList) { + WalletTypeEnum walletTypeEnum = WalletTypeEnum.valueOfByCode(j.getWalletTypeUniqueCode()); + errorMsg.append(walletTypeEnum.getDesc()).append("余额为<").append(j.getBalance() / 100).append(">,"); + } + errorMsg.append("总余额为<").append(walletBalance / 100).append(">"); + errorMsg.append("记账扣款的金额<").append(i.getPrice() / 100).append(">,"); + errorMsg.append("记账扣款后的金额<").append(discountPrice / 100).append(">\n"); + } + } + String errorMsgString = errorMsg.toString(); + if (ObjectUtil.isNotEmpty(errorMsgString)) throw new RuntimeException(errorMsgString); + } + + private void validateWalletBalanceByType(WalletRechargeApplyEntity applyDto) { + if (ObjectUtil.notEqual(applyDto.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) return; + List importList = rechargeImportService.list(new LambdaQueryWrapper() + .eq(WalletRechargeImportEntity::getApplyId, applyDto.getId()) + ); + List importUserIds = importList.stream().map(WalletRechargeImportEntity::getUserId).distinct().toList(); + // 查询用户 + List userList = userService.getUserDeptByIds(importUserIds).getData(); + // 错误信息 + StringBuilder errorMsg = new StringBuilder(); + // 查询用户余额 + WalletManageDto userWalletDto = new WalletManageDto(); + userWalletDto.setUserIds(importUserIds); + userWalletDto.setWalletTypeId(applyDto.getWalletTypeId()); + List userWalletList = walletManageMapper.list(userWalletDto); + for (WalletRechargeImportEntity i : importList) { + userWalletList.stream().filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId())).findFirst().ifPresent(wallet -> { + int discountPrice = wallet.getBalance() - i.getPrice(); + if (discountPrice < 0) { + // 查询用户名字 + UserVO userTarget = userList.stream().filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId())).findFirst().get(); + if (ObjectUtil.isEmpty(userTarget)) { + errorMsg.append("用户id<").append(wallet.getUserId()).append(">"); + } else { + errorMsg.append("用户名<").append(userTarget.getName()).append(">"); + } + errorMsg.append("记账扣款失败,"); + errorMsg.append("操作前的金额<").append(wallet.getBalance() / 100).append(">,"); + errorMsg.append("记账扣款的金额<").append(i.getPrice() / 100).append(">,"); + errorMsg.append("记账扣款后的金额<").append(discountPrice / 100).append(">\n"); + } + }); + } + String errorMsgString = errorMsg.toString(); + if (ObjectUtil.isNotEmpty(errorMsgString)) throw new RuntimeException(errorMsgString); + } + + public void updateAllWalletBalance(WalletRechargeApplyEntity applyDto, List importList) { + if (ObjectUtil.notEqual(applyDto.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) return; + List importUserIds = importList.stream().map(WalletRechargeImportEntity::getUserId).distinct().toList(); + // 查询用户钱包 + WalletManageDto userWalletDto = new WalletManageDto(); + userWalletDto.setUserIds(importUserIds); + List userWalletList = walletManageMapper.joinList(userWalletDto); + for (WalletRechargeImportEntity i : importList) { + // 消费钱包 + WalletManageVo payWalletVo = userWalletList.stream() + .filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId()) && ObjectUtil.equals(j.getWalletTypeUniqueCode(), WalletTypeEnum.PAY.getCode())) + .findFirst().get(); + if (ObjectUtil.isEmpty(payWalletVo)) continue; + // 饭卡钱包 + WalletManageVo cardWalletVo = userWalletList.stream() + .filter(j -> ObjectUtil.equals(i.getUserId(), j.getUserId()) && ObjectUtil.equals(j.getWalletTypeUniqueCode(), WalletTypeEnum.EAT.getCode())) + .findFirst().get(); + if (ObjectUtil.isEmpty(cardWalletVo)) continue; + // 先判断消费钱包是不是够用 + int discountPrice = payWalletVo.getBalance() - i.getPrice(); + walletTransactionService.addWalletBalance(payWalletVo.getId(), payWalletVo.getBalance() * -1, String.valueOf(i.getId()), WalletBizEnum.BATCH); + if (discountPrice < 0) { + walletTransactionService.addWalletBalance(cardWalletVo.getId(), discountPrice, String.valueOf(i.getId()), WalletBizEnum.BATCH); + } + } + } + private WalletRechargeApplyServiceImpl getSelf() { return SpringUtil.getBean(getClass()); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleJoinServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleJoinServiceImpl.java index 984239115..c54fc67e8 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleJoinServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleJoinServiceImpl.java @@ -159,7 +159,7 @@ public class WalletRuleJoinServiceImpl extends ServiceImpl detail = flowApiFlowService.getDetail(defaultRole); + R detail = flowApiFlowService.getProcessByBusinessKey(defaultRole); if (Optional.of(detail.getData()).map(Process::getId).isEmpty()) { log.error("|{}|未查询到该审批流程;userId:|{}|businessId:|{}|", TAG, user.getUserId(), businessId); throw new RuntimeException("未查询到该审批流程"); } - ProcessVO processVo = detail.getData(); + Process processVo = detail.getData(); ProcessInstanceParamDto processDto = new ProcessInstanceParamDto(); Map dtoMap = null; if (ObjectUtil.isNotEmpty(dto)) { 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 a3447be01..8379e5bf8 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 @@ -40,7 +40,9 @@ FROM wallet_transaction a INNER JOIN wallet_manage w ON w.id = a.wallet_id - WHERE biz_type = #{bizType} + WHERE + a.del_flag = '0' + and a.biz_type = #{bizType} and DATE_FORMAT(a.create_time, '%Y-%m') = #{dateTime} and w.user_id in