diff --git a/db/1000pjcloudx_thirdparty.sql b/db/1000pjcloudx_thirdparty.sql index 896b8a121..0561eec61 100644 --- a/db/1000pjcloudx_thirdparty.sql +++ b/db/1000pjcloudx_thirdparty.sql @@ -58,6 +58,60 @@ CREATE TABLE `third_door_log` COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT ='智能柜日志'; +-- ---------------------------- +-- Table structure for third_pay_log +-- ---------------------------- +DROP TABLE IF EXISTS `third_pay_log`; +CREATE TABLE `third_pay_log` +( + `id` bigint NOT NULL COMMENT '主键', + `pay_source_type` varchar(32) NOT NULL COMMENT '支付发起方类型id', + `biz_type` varchar(32) NOT NULL COMMENT '支付类型', + `biz_id` varchar(2048) DEFAULT NULL COMMENT '支付类型id', + `api_url` text DEFAULT NULL COMMENT 'api-url', + `header` text DEFAULT NULL COMMENT 'header', + `res` text DEFAULT NULL COMMENT 'res', + `req` text DEFAULT NULL COMMENT 'req', + `error` text DEFAULT NULL COMMENT '调用错误', + `time_consuming` char(64) DEFAULT NULL COMMENT '耗时(毫秒)', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除时间', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci + ROW_FORMAT = DYNAMIC COMMENT ='第三方支付日志'; + +-- ---------------------------- +-- Table structure for third_key_manage +-- ---------------------------- +DROP TABLE IF EXISTS `third_key_manage`; +CREATE TABLE `third_key_manage` +( + `id` bigint NOT NULL COMMENT '主键', + `name` varchar(32) NOT NULL COMMENT '第三方名字', + `biz_type` varchar(32) NOT NULL COMMENT '第三方类型id(常量)', + `app_key` varchar(256) DEFAULT NULL COMMENT 'appKey', + `app_secret` varchar(256) DEFAULT NULL COMMENT 'appSecret', + `field_key` varchar(256) DEFAULT NULL COMMENT '字段加密key', + `status` varchar(32) DEFAULT '1' COMMENT '状态', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `create_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', + `update_by` varchar(32) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '删除时间', + `tenant_id` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_general_ci + ROW_FORMAT = DYNAMIC COMMENT ='第三方密钥管理'; + -- ---------------------------- -- Table structure for third_zy_id_dict diff --git a/db/800pjcloudx_wallet.sql b/db/800pjcloudx_wallet.sql index 292582a18..8322e62a9 100644 --- a/db/800pjcloudx_wallet.sql +++ b/db/800pjcloudx_wallet.sql @@ -7,6 +7,7 @@ DROP TABLE IF EXISTS sys_user_transaction; CREATE TABLE `sys_user_transaction` ( id bigint NOT NULL COMMENT '编号', + apply_user_id bigint NOT NULL COMMENT '申请用户id', user_id bigint NOT NULL COMMENT '用户id', biz_id bigint DEFAULT NULL COMMENT '业务id', biz_type varchar(32) NOT NULL COMMENT '业务类型', @@ -20,6 +21,7 @@ CREATE TABLE `sys_user_transaction` process_id varchar(256) DEFAULT NULL COMMENT '流程id', process_status varchar(10) DEFAULT NULL COMMENT '审核状体', process_time datetime DEFAULT NULL COMMENT '审核时间', + remark varchar(1024) 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 '修改人', @@ -91,6 +93,29 @@ CREATE TABLE mch_manage COLLATE = utf8mb4_general_ci COMMENT ='商户管理'; CREATE INDEX idx_dept_id ON mch_manage (dept_id); + +-- ---------------------------- +-- Table structure for mch_catgory +-- ---------------------------- +DROP TABLE IF EXISTS `mch_catgory`; +CREATE TABLE mch_catgory +( + id bigint NOT NULL COMMENT '主键', + name varchar(64) NOT NULL COMMENT '分类名', + biz_type varchar(64) NOT NULL COMMENT '分类名类型', + sort int DEFAULT 0 COMMENT '排序', + remark varchar(512) DEFAULT '' 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 mch_dpet_user -- ---------------------------- @@ -234,6 +259,7 @@ DROP TABLE IF EXISTS wallet_rule_transaction; CREATE TABLE wallet_rule_transaction ( id BIGINT(19) not null comment '主键', + biz_type VARCHAR(32) default null comment '转账类型', source_wallet_id BIGINT(19) not null comment '源钱包id', target_wallet_id BIGINT(19) not null comment '目标钱包id', source_wallet_balance int not null comment '源钱包余额', @@ -359,6 +385,37 @@ CREATE TABLE wallet_recharge_apply COLLATE = utf8mb4_general_ci COMMENT ='充值申请表'; CREATE INDEX idx_dept_id ON wallet_recharge_apply (user_id); +-- ---------------------------- +-- Table structure for wallet_recharge_invoice +-- ---------------------------- +DROP TABLE IF EXISTS wallet_recharge_invoice; +CREATE TABLE wallet_recharge_invoice +( + id bigint NOT NULL COMMENT '主键ID', + apply_user_id bigint DEFAULT NULL COMMENT '申请用户id', + apply_dept_id bigint DEFAULT NULL COMMENT '申请用户部门id', + apply_id bigint DEFAULT NULL COMMENT '申请id', + code varchar(32) NOT NULL COMMENT '发票代码(七位数)', + time datetime DEFAULT NULL COMMENT '发票日期', + dept_or_user varchar(64) DEFAULT NULL COMMENT '交款单位或个人', + total_price int DEFAULT NULL COMMENT '合计人民币', + payee_dept varchar(64) DEFAULT NULL COMMENT '收款单位', + payee_user varchar(64) DEFAULT NULL COMMENT '收款人', + item_json varchar(2048) DEFAULT NULL COMMENT '备注', + remark varchar(1024) DEFAULT NULL COMMENT '备注', + status varchar(32) DEFAULT NULL COMMENT '状态', + pic_url varchar(1024) 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 wallet_recharge_import -- ---------------------------- @@ -534,4 +591,27 @@ CREATE TABLE wallet_setting del_flag char(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', tenant_id bigint DEFAULT NULL COMMENT '租户ID', PRIMARY KEY (id) -) ENGINE = InnoDB COMMENT ='支付设置'; \ No newline at end of file +) ENGINE = InnoDB COMMENT ='支付设置'; + + +-- ---------------------------- +-- Table structure for mch_checkout +-- ---------------------------- +DROP TABLE IF EXISTS mch_checkout; +CREATE TABLE mch_checkout +( + id bigint NOT NULL AUTO_INCREMENT COMMENT '创建者', + checkout_time date NOT NULL COMMENT '结账年月日(存入年月就行)', + checkout_user_id bigint NOT NULL COMMENT '结账人', + merchant_id bigint NOT NULL COMMENT '商户id', + price bigint NOT NULL COMMENT '结账价格', + pic varchar(2048) DEFAULT NULL COMMENT '结账凭证图片', + remark 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 ='商户结账表'; \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constant/InventoryTypeEnum.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constant/InventoryTypeEnum.java new file mode 100644 index 000000000..5db8c7a4c --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constant/InventoryTypeEnum.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.canteen.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 入库类型编码前兆 + */ +@AllArgsConstructor +@Getter +public enum InventoryTypeEnum { + + CGRK("1", "CGRK"), + SCJG("2", "SCJG"), + ; + private final String type; + private final String value; + + + // 根据数字返回对应的值 + public static String getValueByType(String type) { + for (InventoryTypeEnum v : InventoryTypeEnum.values()) { + if (v.type.equals(type)) { + return v.value; + } + } + return ""; // 如果没有找到对应的数字 + } + + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constant/OrderTypeEnum.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constant/OrderTypeEnum.java new file mode 100644 index 000000000..8b8d4e247 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constant/OrderTypeEnum.java @@ -0,0 +1,22 @@ +package com.bsd.pjcloud.canteen.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 出库入口 + */ +@AllArgsConstructor +@Getter +public enum OrderTypeEnum { + + RK("1", "入库"), + CK("2", "出库"), + No("0", "无盈亏") + ; + private final String type; + private final String description; + + + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constant/StockTypeEnum.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constant/StockTypeEnum.java new file mode 100644 index 000000000..1e7d9ce3c --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/constant/StockTypeEnum.java @@ -0,0 +1,22 @@ +package com.bsd.pjcloud.canteen.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 库存类型 + */ +@AllArgsConstructor +@Getter +public enum StockTypeEnum { + + MATERIAL("1", "食材"), + DISH("2", "菜品"), + ONLINE_DISH("3", "在线菜品库存") + ; + private final String type; + private final String description; + + + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenErpMaterialEditorDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenErpMaterialEditorDTO.java new file mode 100644 index 000000000..3b7e1bf82 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenErpMaterialEditorDTO.java @@ -0,0 +1,10 @@ +package com.bsd.pjcloud.canteen.dto.erp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class CanteenErpMaterialEditorDTO extends CanteenErpMaterialSaveDTO { + + private Long id; +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenErpMaterialSaveDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenErpMaterialSaveDTO.java new file mode 100644 index 000000000..21fe8a32d --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenErpMaterialSaveDTO.java @@ -0,0 +1,47 @@ +package com.bsd.pjcloud.canteen.dto.erp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class CanteenErpMaterialSaveDTO { + + /** + * 商品名称 + */ + @Schema(description="商品名称") + private String name; + + /** + * 商品单位 + */ + @Schema(description="商品单位") + private String unit; + + + /** + * 期初数量 + */ + @Schema(description="期初数量") + private Double baseStock; + + + /** + * 库存上限 + */ + @Schema(description="库存上限") + private Integer inventoryUpperLimit; + + /** + * 库存下限 + */ + @Schema(description="库存下限") + private Integer inventoryLowerLimit; + + + @Schema(description="采购价格") + private Integer purchasePrice; + + @Schema(description="所属分类id") + private Long categoryId; +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordEditDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordEditDTO.java new file mode 100644 index 000000000..c26a51a52 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordEditDTO.java @@ -0,0 +1,95 @@ +package com.bsd.pjcloud.canteen.dto.erp; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + + +@Data +@Schema(description = "出入库记录修改对象") +public class CanteenInventoryRecordEditDTO { + + + /** + * 主键 + */ + @Schema(description="主键") + private Long id; + + /** + * 单据编号(规则生成,出入库编号) + */ + @Schema(description="单据编号(规则生成,出入库编号)") + private String inventoryCode; + + /** + * 单据日期 + */ + @Schema(description="单据日期") + private LocalDate inventoryDate; + + /** + * 单据类型(字典inventory_type)采购入库、采购退货、盘点入库等 + */ + @Schema(description="单据类型(字典inventory_type)采购入库、采购退货、盘点入库等") + private String inventoryType; + + + + /** + * 经办人id + */ + @Schema(description="经办人id") + private Long handlerUserId; + + + /** + * 商户编号 + */ + @Schema(description="商户编号") + private Long merchantId; + + + /** + * 货商 + */ + @Schema(description="货商") + private Long supplierId; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 订单类型(1入库 2出库) + */ + @Schema(description="订单类型(1入库 2出库)") + private String orderType; + + /** + * 入库总金额 + */ + @Schema(description="入库总金额") + private Integer totalAmount; + + + @Schema(description="收货数量") + private Integer receiveAmount; + + + /** + * @Link SmCgPlanEditItemDTO + */ + @Schema(description="items") + private List items; + + + + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordEditItemDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordEditItemDTO.java new file mode 100644 index 000000000..8ede09cc6 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordEditItemDTO.java @@ -0,0 +1,92 @@ +package com.bsd.pjcloud.canteen.dto.erp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Data +@Schema(description = "出入库记录编辑-item") +public class CanteenInventoryRecordEditItemDTO { + + /** + * id + */ + + @Schema(description="id") + private Long id; + + /** + * 单据类型(字典inventory_type) + */ + @Schema(description="单据类型(字典inventory_type)") + private String inventoryType; + + /** + * 商品id + */ + @Schema(description="原料id") + private Long erpMaterialId; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * 出入库数量 + */ + @Schema(description="出入库数量") + private Double quantity; + + /** + * 单价 + */ + @Schema(description="单价") + private Integer unitPrice; + + /** + * 总金额 + */ + @Schema(description="总金额") + private Integer totalAmount; + + /** + * 税率% + */ + @Schema(description="税率%") + private Integer taxRate; + + /** + * 税前金额 + */ + @Schema(description="税前金额") + private Integer taxAmount; + + /** + * 货商 + */ + @Schema(description="货商") + private Long supplierId; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 订单类型(1入库 2出库) + */ + @Schema(description="订单类型(1入库 2出库)") + private String orderType; + + + + /** + * 实际单价 + */ + @Schema(description="实际单价") + private Integer realPrice; + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordsItemDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordsItemDTO.java new file mode 100644 index 000000000..2cd1cd854 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordsItemDTO.java @@ -0,0 +1,97 @@ +package com.bsd.pjcloud.canteen.dto.erp; + +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; + +import java.time.LocalDateTime; + +/** + * 采购记录明细表 + * + * @author zjf + * @date 2025-05-07 17:02:53 + */ +@Data +@Schema(description = "采购记录明细表") +public class CanteenInventoryRecordsItemDTO { + + + /** + * 原料id + */ + @Schema(description="原料id") + private Long erpMaterialId; + + + /** + * 出入库数量 + */ + @Schema(description="出入库数量") + private Double quantity; + + /** + * 单价 + */ + @Schema(description="单价") + private Integer unitPrice; + + /** + * 总金额 + */ + @Schema(description="总金额") + private Integer totalAmount; + + /** + * 税率% + */ + @Schema(description="税率%") + private Integer taxRate; + + /** + * 税前金额 + */ + @Schema(description="税前金额") + private Integer taxAmount; + + /** + * 货商 + */ + @Schema(description="货商") + private Long supplierId; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 订单类型(1入库 2出库) + */ + @Schema(description="订单类型(1入库 2出库)") + private String orderType; + + /** + * 出入库关联id + */ + @Schema(description="出入库关联id") + private Long inventoryId; + + /** + * 总数 + */ + @Schema(description="总数") + private Integer totalNumber; + + + /** + * 实际单价 + */ + @Schema(description="实际单价") + private Integer realPrice; + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordsdDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordsdDTO.java new file mode 100644 index 000000000..72d14a3c6 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenInventoryRecordsdDTO.java @@ -0,0 +1,73 @@ +package com.bsd.pjcloud.canteen.dto.erp; + + +import com.baomidou.mybatisplus.annotation.*; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsItemEntity; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class CanteenInventoryRecordsdDTO { + + + /** + * 单据编号(规则生成,出入库编号) + */ + @Schema(description="单据编号(规则生成,出入库编号)") + private String inventoryCode; + + /** + * 单据日期 + */ + @Schema(description="单据日期") + private LocalDate inventoryDate; + + /** + * 单据类型(字典inventory_type)采购入库 + */ + @Schema(description="单据类型采购入库=1") + private String inventoryType; + + + /** + * 经办人id + */ + @Schema(description="经办人id") + private Long handlerUserId; + + + /** + * 货商 + */ + @Schema(description="货商") + private Long supplierId; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 订单类型(1入库 2出库) + */ + @Schema(description="订单类型(1入库 2出库)") + private String orderType; + + /** + * 入库总金额 + */ + @Schema(description="入库总金额") + private Integer totalAmount; + + + + @Schema(description="入库明细") + private List items; + + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenProductRecordSaveDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenProductRecordSaveDTO.java new file mode 100644 index 000000000..999644454 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/CanteenProductRecordSaveDTO.java @@ -0,0 +1,121 @@ +package com.bsd.pjcloud.canteen.dto.erp; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDate; +import java.util.List; + +@Data +public class CanteenProductRecordSaveDTO { + + // 生产时间(格式:yyyy-MM-dd) + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate productionTime; + + // 加工人姓名 + private String handlerUser; + + // 记录编号(示例值:SCJG-2025051403005) + private String recordCode; + + // 生产明细列表 + private List productionDetailList; + + // 使用内部类表示明细 + @Data + public static class ProductionDetail { + + @Schema(description = "模板ID") + private String templateId; + + + // 菜品名称(示例值:"咸菜豆腐汤") + @Schema(description = "菜品名称") + private String dishName; + + @Schema(description = "菜品ID") + private Long dishId; + + // 原料单位(示例值:"斤") + private String materialUnit; + + // 生产数量(示例值:1) + @Schema(description = "生产数量") + private Double produceQuantity; + + // 是否手动修改(示例值:false) + private Boolean manualModified; + + private List materialDetailList; + } + + + @Data + public static class MaterialDetailList { + + /** + * id + */ + @Schema(description="id") + private Long id; + + /** + * 食材id + */ + @Schema(description="食材id") + private Long materialId; + + /** + * 记录item表id + */ + @Schema(description="记录item表id") + private Long recordItemId; + + /** + * 食材名称 + */ + @Schema(description="食材名称") + private String materialName; + + /** + * 食材单位 + */ + @Schema(description="食材单位") + private String unit; + + /** + * 计算用量 + */ + @Schema(description="计算用量") + private Double calculatedUsage; + + /** + * 折损率 + */ + @Schema(description="折损率") + private Double lossRate; + + /** + * 基础用量 + */ + @Schema(description="基础用量") + private Double baseUsage; + + /** + * 实际用量 + */ + @Schema(description="实际用量") + private Double actualUsage; + + /** + * 实际折损率 + */ + @Schema(description="实际折损率") + private Double actualLossRate; + + } +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/UpdateStockDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/UpdateStockDTO.java new file mode 100644 index 000000000..5db2b7532 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/dto/erp/UpdateStockDTO.java @@ -0,0 +1,35 @@ +package com.bsd.pjcloud.canteen.dto.erp; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 更新库存 DTO + * + * @author LeeYan9 + * @since 2022-08-26 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UpdateStockDTO { + + /** + * 商品 SKU 编号 + */ + @NotNull(message = "商品 SPU 编号不能为空") + private Long id; + + /** + * 库存变化数量 + * + * 正数:增加库存 + * 负数:扣减库存 + */ + @NotNull(message = "库存变化数量不能为空") + private Double incrCount; + + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/BoxesBookingEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/BoxesBookingEntity.java index bd9a0c211..f02d95cb0 100644 --- a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/BoxesBookingEntity.java +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/BoxesBookingEntity.java @@ -7,6 +7,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; /** * 包厢预约记录表 @@ -38,13 +39,13 @@ public class BoxesBookingEntity extends Model { * 开始时间 */ @Schema(description="开始时间") - private Object startTime; + private LocalTime startTime; /** * 结束时间 */ @Schema(description="结束时间") - private Object endTime; + private LocalTime endTime; /** * 审核人id diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenErpMaterialEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenErpMaterialEntity.java new file mode 100644 index 000000000..01170ef8d --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenErpMaterialEntity.java @@ -0,0 +1,103 @@ +package com.bsd.pjcloud.canteen.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; + +/** + * 原料表 + * + * @author zjf + * @date 2025-05-07 13:16:32 + */ +@Data +@TenantTable +@TableName("canteen_erp_material") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "原料表") +public class CanteenErpMaterialEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 商品名称 + */ + @Schema(description="商品名称") + private String name; + + /** + * 商品单位 + */ + @Schema(description="商品单位") + private String unit; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * 创建人 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; + + + /** + * 采购价格 + */ + @Schema(description="采购价格") + private Integer purchasePrice; + + + @Schema(description="所属分类id") + private Long categoryId; + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenInventoryRecordsEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenInventoryRecordsEntity.java new file mode 100644 index 000000000..51702c140 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenInventoryRecordsEntity.java @@ -0,0 +1,176 @@ +package com.bsd.pjcloud.canteen.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.LocalDate; +import java.time.LocalDateTime; + +/** + * 采购记录表 + * + * @author zjf + * @date 2025-05-07 17:00:50 + */ +@Data +@TenantTable +@TableName("canteen_inventory_records") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "采购记录表") +public class CanteenInventoryRecordsEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="主键") + private Long id; + + /** + * 单据编号(规则生成,出入库编号) + */ + @Schema(description="单据编号(规则生成,出入库编号)") + private String inventoryCode; + + /** + * 单据日期 + */ + @Schema(description="单据日期") + private LocalDate inventoryDate; + + /** + * 单据类型(字典inventory_type)采购入库 + */ + @Schema(description="单据类型(字典inventory_type)采购入库") + private String inventoryType; + + /** + * 来源ID(根据类型指向对应的表,如采购单ID、退货单ID等) + */ + @Schema(description="来源ID(根据类型指向对应的表,如采购单ID、退货单ID等)") + private String linkCode; + + /** + * 经办人id + */ + @Schema(description="经办人id") + private Long handlerUserId; + + /** + * 审批状态 + */ + @Schema(description="审批状态") + private String checkStatus; + + /** + * 审批人id + */ + @Schema(description="审批人id") + private Long checkUserId; + + /** + * 审核日期 + */ + @Schema(description="审核日期") + private LocalDateTime checkTime; + + /** + * 商户编号 + */ + @Schema(description="商户编号") + private Long merchantId; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * 货商 + */ + @Schema(description="货商") + private Long supplierId; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 订单类型(1入库 2出库) + */ + @Schema(description="订单类型(1入库 2出库)") + private String orderType; + + /** + * 入库总金额 + */ + @Schema(description="入库总金额") + private Integer totalAmount; + + /** + * 收款金额 + */ + @Schema(description="收款金额") + private Integer receiveAmount; + + /** + * 实例id + */ + @Schema(description="实例id") + private String processInstanceId; + + /** + * 审核原因 + */ + @Schema(description="审核原因") + private String checkReason; + + /** + * 创建人 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenInventoryRecordsItemEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenInventoryRecordsItemEntity.java new file mode 100644 index 000000000..02c0d0ec8 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenInventoryRecordsItemEntity.java @@ -0,0 +1,175 @@ +package com.bsd.pjcloud.canteen.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; + +/** + * 采购记录明细表 + * + * @author zjf + * @date 2025-05-07 17:02:53 + */ +@Data +@TenantTable +@TableName("canteen_inventory_records_item") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "采购记录明细表") +public class CanteenInventoryRecordsItemEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 单据类型(字典inventory_type) + */ + @Schema(description="单据类型(字典inventory_type)") + private String inventoryType; + + /** + * 原料id + */ + @Schema(description="原料id") + private Long erpMaterialId; + + /** + * 商户编号 + */ + @Schema(description="商户编号") + private Long merchantId; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * 出入库数量 + */ + @Schema(description="出入库数量") + private Double quantity; + + /** + * 单价 + */ + @Schema(description="单价") + private Integer unitPrice; + + /** + * 总金额 + */ + @Schema(description="总金额") + private Integer totalAmount; + + /** + * 税率% + */ + @Schema(description="税率%") + private Integer taxRate; + + /** + * 税前金额 + */ + @Schema(description="税前金额") + private Integer taxAmount; + + /** + * 货商 + */ + @Schema(description="货商") + private Long supplierId; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 订单类型(1入库 2出库) + */ + @Schema(description="订单类型(1入库 2出库)") + private String orderType; + + /** + * 出入库关联id + */ + @Schema(description="出入库关联id") + private Long inventoryId; + + /** + * 总数 + */ + @Schema(description="总数") + private Integer totalNumber; + + /** + * 账面数量 + */ + @Schema(description="账面数量") + private Integer accountNumber; + + /** + * 实际数量 + */ + @Schema(description="实际数量") + private Integer realNumber; + + /** + * 实际单价 + */ + @Schema(description="实际单价") + private Integer realPrice; + + /** + * 创建人 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionRecordEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionRecordEntity.java new file mode 100644 index 000000000..9fbe9b621 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionRecordEntity.java @@ -0,0 +1,109 @@ +package com.bsd.pjcloud.canteen.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; + +/** + * 食材加工记录表 + * + * @author zjf + * @date 2025-05-08 11:02:09 + */ +@Data +@TenantTable +@TableName("canteen_production_record") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "食材加工记录表") +public class CanteenProductionRecordEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 加工日期 + */ + @Schema(description="加工日期") + private LocalDateTime productionTime; + + /** + * 加工人 + */ + @Schema(description="加工人") + private String handlerUser; + + /** + * 主id + */ + @Schema(description="主id") + private Long recordId; + + /** + * 加工批次号 + */ + @Schema(description="加工批次号") + private String recordCode; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * 创建人 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionRecordItemEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionRecordItemEntity.java new file mode 100644 index 000000000..595da5607 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionRecordItemEntity.java @@ -0,0 +1,128 @@ +package com.bsd.pjcloud.canteen.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; + +/** + * 食材加工记录明细表 + * + * @author zjf + * @date 2025-05-08 11:05:02 + */ +@Data +@TenantTable +@TableName("canteen_production_record_item") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "食材加工记录明细表") +public class CanteenProductionRecordItemEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 关系表菜品id + */ + @Schema(description="关系表菜品id") + private Long itemRelationId; + + /** + * 食材id + */ + @Schema(description="食材id") + private Long materialId; + + /** + * 实际消耗原料量数量 + */ + @Schema(description="实际消耗原料量数量") + private Double inputQuantity; + + /** + * 实际产出菜品量 + */ + @Schema(description="实际产出菜品量") + private Double outputQuantity; + + /** + * 主id + */ + @Schema(description="主id") + private Long recordId; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 折损率 + */ + @Schema(description="折损率") + private Double lossRate; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * 创建人 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; + + + @Schema(description = "菜品ID") + private Long dishId; + + @Schema(description = "菜品名称") + private String dishName; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionTemplateDetailEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionTemplateDetailEntity.java new file mode 100644 index 000000000..41d737648 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionTemplateDetailEntity.java @@ -0,0 +1,103 @@ +package com.bsd.pjcloud.canteen.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; + +/** + * 加工模版明细表 + * + * @author zjf + * @date 2025-05-12 13:53:57 + */ +@Data +@TenantTable +@TableName("canteen_production_template_detail") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "加工模版明细表") +public class CanteenProductionTemplateDetailEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 模版id + */ + @Schema(description="模版id") + private Long templateId; + + /** + * 原料id + */ + @Schema(description="原料id") + private Long materialId; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * 基准用量 + */ + @Schema(description="基准用量") + private Double baseUsage; + + /** + * 损耗率 + */ + @Schema(description="损耗率") + private Double lossRate; + + /** + * 创建人 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionTemplateEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionTemplateEntity.java new file mode 100644 index 000000000..966d0a622 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenProductionTemplateEntity.java @@ -0,0 +1,104 @@ +package com.bsd.pjcloud.canteen.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 com.alibaba.excel.annotation.ExcelIgnore; +import com.github.yulichang.annotation.EntityMapping; +import java.util.List; + +/** + * 加工模版表 + * + * @author zjf + * @date 2025-05-12 13:41:26 + */ +@Data +@TenantTable +@TableName("canteen_production_template") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "加工模版表") +public class CanteenProductionTemplateEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 模版名称 + */ + @Schema(description="模版名称") + private String templateName; + + /** + * 菜品id + */ + @Schema(description="菜品id") + private Long dishId; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * 基准产出量(碗) + */ + @Schema(description="基准产出量(碗)") + private Double baseOutput; + + /** + * 创建人 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; + @ExcelIgnore + @TableField(exist = false) + @EntityMapping(thisField = "id", joinField = "templateId") + private List canteenProductionTemplateDetailList; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenStockEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenStockEntity.java new file mode 100644 index 000000000..86095c0b1 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenStockEntity.java @@ -0,0 +1,118 @@ +package com.bsd.pjcloud.canteen.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; + +/** + * 库存表 + * + * @author zjf + * @date 2025-05-07 16:40:35 + */ +@Data +@TenantTable +@TableName("canteen_stock") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "库存表") +public class CanteenStockEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 期初数量 + */ + @Schema(description="期初数量") + private Double baseStock; + + /** + * 类型 原料/成品 + */ + @Schema(description="类型 原料/成品") + private String itemType; + + /** + * 成品id/原料id + */ + @Schema(description="成品id/原料id") + private Long itemId; + + /** + * 乐观锁版本号 + */ + @Schema(description="乐观锁版本号") + private Integer version; + + /** + * 库存上限 + */ + @Schema(description="库存上限") + private Integer inventoryUpperLimit; + + /** + * 库存下限 + */ + @Schema(description="库存下限") + private Integer inventoryLowerLimit; + + /** + * 当前库存数量 + */ + @Schema(description="当前库存数量") + private Double currentStock; + + /** + * 创建人 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; + + @Schema(description="部门id") + private Long deptId; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenSupplierEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenSupplierEntity.java new file mode 100644 index 000000000..0513484e2 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenSupplierEntity.java @@ -0,0 +1,163 @@ +package com.bsd.pjcloud.canteen.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; + +/** + * 货商信息 + * + * @author zjf + * @date 2025-05-09 13:18:19 + */ +@Data +@TenantTable +@TableName("canteen_supplier") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "货商信息") +public class CanteenSupplierEntity extends Model { + + + /** + * 货商ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="货商ID") + private Long supplierId; + + /** + * 货商名称 + */ + @Schema(description="货商名称") + private String supplierName; + + /** + * 货商地址 + */ + @Schema(description="货商地址") + private String address; + + /** + * 电话号码 + */ + @Schema(description="电话号码") + private String phone; + + /** + * 税号 + */ + @Schema(description="税号") + private String tax; + + /** + * 联系人 + */ + @Schema(description="联系人") + private String linkName; + + /** + * 开户行账号 + */ + @Schema(description="开户行账号") + private String openAccount; + + /** + * 邮箱地址 + */ + @Schema(description="邮箱地址") + private String email; + + /** + * 所属部门ID + */ + @Schema(description="所属部门ID") + private Long deptId; + + /** + * 货商类别 + */ + @Schema(description="货商类别") + private Long supplierType; + + /** + * 货商地区 + */ + @Schema(description="货商地区") + private String supplierArea; + + /** + * 修改时间 + */ + @Schema(description="修改时间") + private LocalDateTime passwordModifyTime; + + /** + * 开户行 + */ + @Schema(description="开户行") + private String openName; + + /** + * 合同号 + */ + @Schema(description="合同号") + private String contractNumber; + + /** + * 状态 0使用 1禁用 + */ + @Schema(description="状态 0使用 1禁用") + private String status; + + /** + * 拼音简码 + */ + @Schema(description="拼音简码") + private String pinyinCod; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description="修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description="修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记,0未删除,1已删除 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description="删除标记,0未删除,1已删除") + private String delFlag; + + /** + * 所属租户ID + */ + @Schema(description="所属租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/ProductionRecordItemRelationEntity.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/ProductionRecordItemRelationEntity.java new file mode 100644 index 000000000..8fcc3b653 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/entity/ProductionRecordItemRelationEntity.java @@ -0,0 +1,84 @@ +package com.bsd.pjcloud.canteen.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 食材加工菜品关系表 + * + * @author zjf + * @date 2025-05-14 12:47:16 + */ +@Data +@TableName("production_record_item_relation") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "食材加工菜品关系表") +public class ProductionRecordItemRelationEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 食材id + */ + @Schema(description="食材id") + private Long materialId; + + /** + * 记录item表id + */ + @Schema(description="记录item表id") + private Long recordItemId; + + /** + * 食材名称 + */ + @Schema(description="食材名称") + private String materialName; + + /** + * 食材单位 + */ + @Schema(description="食材单位") + private String unit; + + /** + * 计算用量 + */ + @Schema(description="计算用量") + private Double calculatedUsage; + + /** + * 折损率 + */ + @Schema(description="折损率") + private Double lossRate; + + /** + * 基础用量 + */ + @Schema(description="基础用量") + private Double baseUsage; + + /** + * 实际用量 + */ + @Schema(description="实际用量") + private Double actualUsage; + + /** + * 实际折损率 + */ + @Schema(description="实际折损率") + private Double actualLossRate; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenDailyMenuListVO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenDailyMenuListVO.java index c428ad969..3f522b01e 100644 --- a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenDailyMenuListVO.java +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/ADCanteenDailyMenuListVO.java @@ -39,4 +39,9 @@ public class ADCanteenDailyMenuListVO { * 时间类型 */ private Integer hourType; + + /** + * 排序 + */ + private Integer sort; } diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenErpCategorySimpleVo.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenErpCategorySimpleVo.java new file mode 100644 index 000000000..479d615f6 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenErpCategorySimpleVo.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.canteen.vo.erp; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class CanteenErpCategorySimpleVo { + + + @Schema(description = "分类id") + private Long id; + + + @Schema(description = "分类名称") + private String name; +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenErpMaterialVO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenErpMaterialVO.java new file mode 100644 index 000000000..983e28509 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenErpMaterialVO.java @@ -0,0 +1,53 @@ +package com.bsd.pjcloud.canteen.vo.erp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class CanteenErpMaterialVO { + + private Long id; + + /** + * 商品名称 + */ + @Schema(description="商品名称") + private String name; + + /** + * 商品单位 + */ + @Schema(description="商品单位") + private String unit; + + + /** + * 期初数量 + */ + @Schema(description="期初数量") + private Double baseStock; + + + /** + * 库存上限 + */ + @Schema(description="库存上限") + private Integer inventoryUpperLimit; + + /** + * 库存下限 + */ + @Schema(description="库存下限") + private Integer inventoryLowerLimit; + + + @Schema(description="当前总库存") + private Double currentStock; + + + @Schema(description="采购价格") + private Integer purchasePrice; + + @Schema(description="所属分类id") + private Long categoryId; +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenProductionRecordPageVO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenProductionRecordPageVO.java new file mode 100644 index 000000000..ac36c9e7a --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenProductionRecordPageVO.java @@ -0,0 +1,161 @@ +package com.bsd.pjcloud.canteen.vo.erp; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Map; + +/** + * 食材加工记录表 + * + * @author zjf + * @date 2025-05-08 11:02:09 + */ +@Data +@Schema(description = "采购入库分页vo") +public class CanteenProductionRecordPageVO { + + + + /** + * 主键 + */ + @Schema(description="主键") + private Long id; + + /** + * 单据编号(规则生成,出入库编号) + */ + @Schema(description="单据编号(规则生成,出入库编号)") + private String inventoryCode; + + /** + * 单据日期 + */ + @Schema(description="单据日期") + private LocalDate inventoryDate; + + /** + * 单据类型(字典inventory_type)采购入库、采购退货、盘点入库等 + */ + @Schema(description="单据类型(字典inventory_type)采购入库、采购退货、盘点入库等") + private String inventoryType; + + /** + * 来源ID(根据类型指向对应的表,如采购单ID、退货单ID等) + */ + @Schema(description="来源code") + private String linkCode; + + /** + * 仓库id + */ + @Schema(description="仓库id") + private String warehouseId; + + /** + * 经办人id + */ + @Schema(description="经办人id") + private Long handlerUserId; + + /** + * 审批状态 + */ + @Schema(description="审批状态") + private String checkStatus; + + /** + * 审批人id + */ + @Schema(description="审批人id") + private String checkUserId; + + /** + * 审核日期 + */ + @Schema(description="审核日期") + private LocalDateTime checkTime; + + /** + * 商户编号 + */ + @Schema(description="商户编号") + private Long merchantId; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * 货商 + */ + @Schema(description="货商") + private Long supplierId; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 订单类型(1入库 2出库) + */ + @Schema(description="订单类型(1入库 2出库)") + private String orderType; + + /** + * 入库总金额 + */ + @Schema(description="入库总金额") + private Integer totalAmount; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建时间") + private LocalDateTime createTime; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; + + @Schema(description="设备类型") + private Integer deviceType; + + @Schema(description="流程实例id") + private String processInstanceId; + + @Schema(description="审核原因") + private String checkReason; + + @Schema(description="商品名称") + @TableField(exist = false) + private String productName; + + @Schema(description="经办人名称") + @TableField(exist = false) + private String handlerUserName; + + @Schema(description="收货数量") + private Integer receiveAmount; + + @Schema(description="货商名称") + @TableField(exist = false) + private String supplierName; + + + @Schema(description="参数") + @TableField(exist = false) + private Map paramMap; + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenSpuSimpleVO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenSpuSimpleVO.java new file mode 100644 index 000000000..e6b435585 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenSpuSimpleVO.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.canteen.vo.erp; + + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class CanteenSpuSimpleVO { + + + + @Schema(description="id") + private Long id; + + /** + * 商品名称 + */ + @Schema(description="菜品名称") + private String name; + + + /** + * 商品封面图 + */ + @Schema(description="菜品封面图") + private String picUrl; + + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenSpuStockVO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenSpuStockVO.java new file mode 100644 index 000000000..4db494a9a --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenSpuStockVO.java @@ -0,0 +1,56 @@ +package com.bsd.pjcloud.canteen.vo.erp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 菜品库存VO + * + * @author zhangjiafu + */ +@Data +@Schema(description = "菜品库存VO") +public class CanteenSpuStockVO { + + /** + * 商品 SPU 编号 + */ + @Schema(description = "库存ida") + private Long id; + + /** + * 商品名称 + */ + @Schema(description = "商品名称") + private String name; + + /** + * 商品封面图 + */ + @Schema(description = "商品封面图") + private String picUrl; + + /** + * 期初库存 + */ + @Schema(description = "期初库存") + private Double baseStock; + + /** + * 当前库存 + */ + @Schema(description = "当前库存") + private Double currentStock; + + /** + * 库存上限 + */ + @Schema(description="库存上限") + private Integer inventoryUpperLimit; + + /** + * 库存下限 + */ + @Schema(description="库存下限") + private Integer inventoryLowerLimit; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenSupplierSimpleVo.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenSupplierSimpleVo.java new file mode 100644 index 000000000..dd54d897e --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/CanteenSupplierSimpleVo.java @@ -0,0 +1,23 @@ +package com.bsd.pjcloud.canteen.vo.erp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Data +@Schema(description = "货商下拉") +public class CanteenSupplierSimpleVo { + + /** + * id + */ + @Schema(description="id") + private Long supplierId; + + /** + * 货商类别名称 + */ + @Schema(description="货商名称") + private String supplierName; + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ErpMaterialPageVo.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ErpMaterialPageVo.java new file mode 100644 index 000000000..c65626eab --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ErpMaterialPageVo.java @@ -0,0 +1,40 @@ +package com.bsd.pjcloud.canteen.vo.erp; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Schema(description = "erp选择食材分页vo") +public class ErpMaterialPageVo { + /** + * id + */ + @Schema(description="食材id") + private Long id; + + /** + * 商品名称 + */ + @Schema(description="食材名称") + private String name; + + /** + * 商品单位 + */ + @Schema(description="食材单位") + private String unit; + + + /** + * 当前库存数量 + */ + @Schema(description="当前库存数量") + private Double stock; + + + @Schema(description="采购价格") + private Integer purchasePrice; +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/InventoryRecordItemVo.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/InventoryRecordItemVo.java new file mode 100644 index 000000000..bc9d7ec0e --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/InventoryRecordItemVo.java @@ -0,0 +1,75 @@ +package com.bsd.pjcloud.canteen.vo.erp; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * 采购计划-item + * + * @author zjf + * @date 2025-02-11 17:11:41 + */ +@Data +@Schema(description = "采购计划-item") +public class InventoryRecordItemVo { + + @Schema(description = "id") + private Long id; + + + @Schema(description="食材id") + private Long erpMaterialId; + + @Schema(description="食材名称") + private String name; + + /** + * 主表id + */ + @Schema(description="主表id") + private Long inventoryId; + /** + * 数量 + */ + @Schema(description="数量") + private Integer quantity; + + /** + * 进价 + */ + @Schema(description="进价") + private Integer unitPrice; + + /** + * 累计总金额 + */ + @Schema(description="累计总金额") + private Integer totalAmount; + + /** + * 累计数量 + */ + @Schema(description="累计数量") + private Integer totalNumber; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + + + @Schema(description="实际进价") + private Integer realPrice; + + /** + * 进价(分为单位) + */ + @Schema(description="进价(分为单位)") + + private Integer purchasePrice; + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/InventoryRecordVo.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/InventoryRecordVo.java new file mode 100644 index 000000000..76981f766 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/InventoryRecordVo.java @@ -0,0 +1,72 @@ +package com.bsd.pjcloud.canteen.vo.erp; + + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "采购根据id查询-编辑回显 vo") +@Data +public class InventoryRecordVo { + + @Schema(description ="id") + private Long id; + /** + * 采购计划编号 + */ + @Schema(description="编号") + private String inventoryCode; + + /** + * 采购计划单据日期 + */ + @Schema(description="单据日期") + private LocalDate inventoryDate; + + + @Schema(description="商品名称") + private String productName; + + /** + * 经办人id + */ + @Schema(description="经办人id") + private Long handlerUserId; + + + @Schema(description="供应商id") + private Long supplierId; + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建时间") + private LocalDateTime createTime; + + + + /** + * @link InventoryRecordItemVo + */ + @Schema(description="item") + private List items; + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductTemplateVO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductTemplateVO.java new file mode 100644 index 000000000..3bf633e09 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductTemplateVO.java @@ -0,0 +1,54 @@ +package com.bsd.pjcloud.canteen.vo.erp; + + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.baomidou.mybatisplus.annotation.*; +import com.github.yulichang.annotation.EntityMapping; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@Schema(description = "菜品模版vo") +public class ProductTemplateVO { + + /** + * id + */ + @Schema(description="id") + private Long id; + + /** + * 模版名称 + */ + @Schema(description="模版名称") + private String templateName; + + /** + * 菜品id + */ + @Schema(description="菜品id") + private Long dishId; + + + /** + * 基准产出量(碗) + */ + @Schema(description="基准产出量(碗)") + private Double baseOutput; + + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建时间") + private LocalDateTime createTime; + + @Schema(description="菜品名称") + private String dishName; + + private List canteenProductionTemplateDetailList; +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductionRecordDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductionRecordDTO.java new file mode 100644 index 000000000..4452b59a0 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductionRecordDTO.java @@ -0,0 +1,43 @@ +package com.bsd.pjcloud.canteen.vo.erp; + + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class ProductionRecordDTO { + /** + * id + */ + @Schema(description="id") + private Long id; + + /** + * 加工日期 + */ + @Schema(description="加工日期") + private LocalDateTime productionTime; + + /** + * 加工人 + */ + @Schema(description="加工人") + private String handlerUser; + + /** + * 加工批次号 + */ + @Schema(description="加工批次号") + private String recordCode; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductionRecordItemDTO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductionRecordItemDTO.java new file mode 100644 index 000000000..52cd557b0 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductionRecordItemDTO.java @@ -0,0 +1,105 @@ +package com.bsd.pjcloud.canteen.vo.erp; + + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class ProductionRecordItemDTO { + /** + * id + */ + @Schema(description="id") + private Long id; + + /** + * 单据类型(字典inventory_type) + */ + @Schema(description="单据类型(字典inventory_type)") + private String inventoryType; + + /** + * 原料id + */ + @Schema(description="原料id") + private Long erpMaterialId; + + /** + * 商户编号 + */ + @Schema(description="商户编号") + private Long merchantId; + + + /** + * 出入库数量 + */ + @Schema(description="出入库数量") + private Double quantity; + + /** + * 单价 + */ + @Schema(description="单价") + private Integer unitPrice; + + /** + * 总金额 + */ + @Schema(description="总金额") + private Integer totalAmount; + + /** + * 税率% + */ + @Schema(description="税率%") + private Integer taxRate; + + /** + * 税前金额 + */ + @Schema(description="税前金额") + private Integer taxAmount; + + /** + * 货商 + */ + @Schema(description="货商") + private Long supplierId; + + /** + * 备注 + */ + @Schema(description="备注") + private String remark; + + + /** + * 总数 + */ + @Schema(description="总数") + private Integer totalNumber; + + /** + * 账面数量 + */ + @Schema(description="账面数量") + private Integer accountNumber; + + /** + * 实际数量 + */ + @Schema(description="实际数量") + private Integer realNumber; + + /** + * 实际单价 + */ + @Schema(description="实际单价") + private Integer realPrice; + + +} diff --git a/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductionTemplateDetailVO.java b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductionTemplateDetailVO.java new file mode 100644 index 000000000..bfb605c5b --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-api/src/main/java/com/bsd/pjcloud/canteen/vo/erp/ProductionTemplateDetailVO.java @@ -0,0 +1,62 @@ +package com.bsd.pjcloud.canteen.vo.erp; + +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; + +import java.time.LocalDateTime; + +/** + * 加工模版明细表 + * + * @author zjf + * @date 2025-05-12 13:53:57 + */ +@Data +@Schema(description = "加工模版明细表") +public class ProductionTemplateDetailVO{ + + + /** + * id + */ + @Schema(description="id") + private Long id; + + /** + * 模版id + */ + @Schema(description="模版id") + private Long templateId; + + /** + * 原料id + */ + @Schema(description="原料id") + private Long materialId; + + + /** + * 基准用量 + */ + @Schema(description="基准用量") + private Double baseUsage; + + /** + * 损耗率 + */ + @Schema(description="损耗率") + private Double lossRate; + + + + @Schema(description="食材名称") + private String materialName; + + @Schema(description="单位") + private String unit; + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/pom.xml b/pjcloud-canteen/pjcloud-canteen-biz/pom.xml index fd559cc8c..d07884323 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/pom.xml +++ b/pjcloud-canteen/pjcloud-canteen-biz/pom.xml @@ -14,6 +14,11 @@ + + org.springframework.retry + spring-retry + 1.3.4 + @@ -71,6 +76,11 @@ com.bsd pjcloud-common-feign + + + com.bsd + pjcloud-common-sequence + com.bsd diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/config/PjcloudBizName.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/config/PjcloudBizName.java new file mode 100644 index 000000000..5792e04a7 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/config/PjcloudBizName.java @@ -0,0 +1,14 @@ +package com.bsd.pjcloud.canteen.config; + +import cn.hutool.core.date.DateUtil; +import com.bsd.pjcloud.common.sequence.range.BizName; + +public class PjcloudBizName implements BizName { + /** + * 生成名称 + */ + @Override + public String create() { + return DateUtil.today(); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/config/SequenceConfig.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/config/SequenceConfig.java new file mode 100644 index 000000000..86d1aecff --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/config/SequenceConfig.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.canteen.config; + +import com.bsd.pjcloud.common.sequence.builder.DbSeqBuilder; +import com.bsd.pjcloud.common.sequence.sequence.Sequence; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +/** + *

+ * 设置发号器生成规则 + */ +@Configuration +public class SequenceConfig { + + @Bean + public Sequence sequence(DataSource dataSource) { + return DbSeqBuilder + .create() + .bizName(new PjcloudBizName())// 定义切片规则 + .dataSource(dataSource) // 注入数据源 + .step(1000) // 每次获取数据的个数 + .retryTimes(3) // 重试次数 + .tableName("pjcloud_sequence") // 存储表名信息 + .build(); + } +} + diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/BoxesBookingController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/BoxesBookingController.java index 39ccf9ac2..3bd78aa15 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/BoxesBookingController.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/BoxesBookingController.java @@ -7,6 +7,7 @@ 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.boxes.admin.BokingPageDTO; +import com.bsd.pjcloud.canteen.job.BoxesAvaliabilityJob; import com.bsd.pjcloud.canteen.vo.AppMakeSaveReqVO; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; @@ -47,6 +48,9 @@ public class BoxesBookingController { private final BoxesBookingService boxesBookingService; + + private final BoxesAvaliabilityJob batchAvaliabilityJob; + /** * 分页查询 * @param page 分页对象 @@ -157,6 +161,15 @@ public class BoxesBookingController { } + + + @Operation(summary = "同步包厢时间" , description = "同步包厢时间" ) + @GetMapping("/anscyJob" ) + public R getById() { + batchAvaliabilityJob.avaliabilityJobHandler(); + return R.ok(); + } + //-------------app------------------ // @GetMapping("/getMyBookingPage") // @Operation(summary = "获得我的预约包厢信息") diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenCommonController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenCommonController.java new file mode 100644 index 000000000..bfeb1590e --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenCommonController.java @@ -0,0 +1,49 @@ +package com.bsd.pjcloud.canteen.controller; + +import com.bsd.pjcloud.canteen.constant.InventoryTypeEnum; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.sequence.sequence.Sequence; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 超市公共接口 + * + * @author pjcloud + * @date 2025-02-10 12:15:37 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteen/common" ) +@Tag(description = "食堂公共部分接口" , name = "食堂公共部分接口" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenCommonController { + + @Autowired + private Sequence sequence; + + /** + * 采购计划选择商品分页数据 + * 分页查询 + * @param type @link InventoryTypeEnum + * @return + */ + @Operation(summary = "获取业务流水编号" , description = "获取业务流水编号" ) + @GetMapping("/getSequence") + public R getErpSpuPage(@RequestParam("type")String type) { + String valueByType = InventoryTypeEnum.getValueByType(type); + String s = sequence.nextNo(); + String result = valueByType + "-" + s; + return R.ok(result); + } + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenErpCategoryController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenErpCategoryController.java new file mode 100644 index 000000000..4fabf6050 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenErpCategoryController.java @@ -0,0 +1,141 @@ +package com.bsd.pjcloud.canteen.controller; + +import cn.hutool.core.util.StrUtil; +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.canteen.entity.CanteenCategoryEntity; +import com.bsd.pjcloud.canteen.vo.erp.CanteenErpCategorySimpleVo; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenErpCategoryEntity; +import com.bsd.pjcloud.canteen.service.CanteenErpCategoryService; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +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; + +/** + * 食材分类 + * + * @author zjf + * @date 2025-05-28 11:12:41 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenErpCategory" ) +@Tag(description = "canteenErpCategory" , name = "食材分类管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenErpCategoryController { + + private final CanteenErpCategoryService canteenErpCategoryService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenErpCategory 食材分类 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenErpCategory_view')" ) + public R getCanteenErpCategoryPage(@ParameterObject Page page, @ParameterObject CanteenErpCategoryEntity canteenErpCategory) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(StrUtil.isNotBlank(canteenErpCategory.getName()),CanteenErpCategoryEntity::getName,canteenErpCategory.getName()); + return R.ok(canteenErpCategoryService.pageScope(page, wrapper)); + } + + + /** + * 通过id查询食材分类 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenErpCategory_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(canteenErpCategoryService.getById(id)); + } + + /** + * 新增食材分类 + * @param canteenErpCategory 食材分类 + * @return R + */ + @Operation(summary = "新增食材分类" , description = "新增食材分类" ) + @SysLog("新增食材分类" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenErpCategory_add')" ) + public R save(@RequestBody CanteenErpCategoryEntity canteenErpCategory) { + canteenErpCategory.setDeptId(SecurityUtils.getUser().getDeptId()); + return R.ok(canteenErpCategoryService.save(canteenErpCategory)); + } + + /** + * 修改食材分类 + * @param canteenErpCategory 食材分类 + * @return R + */ + @Operation(summary = "修改食材分类" , description = "修改食材分类" ) + @SysLog("修改食材分类" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenErpCategory_edit')" ) + public R updateById(@RequestBody CanteenErpCategoryEntity canteenErpCategory) { + return R.ok(canteenErpCategoryService.updateById(canteenErpCategory)); + } + + /** + * 通过id删除食材分类 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除食材分类" , description = "通过id删除食材分类" ) + @SysLog("通过id删除食材分类" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenErpCategory_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(canteenErpCategoryService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param canteenErpCategory 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenErpCategory_export')" ) + public List export(CanteenErpCategoryEntity canteenErpCategory,Long[] ids) { + return canteenErpCategoryService.list(Wrappers.lambdaQuery(canteenErpCategory).in(ArrayUtil.isNotEmpty(ids), CanteenErpCategoryEntity::getId, ids)); + } + + + + /** + * 获取所有分类 + * @return + */ + @Operation(summary = "下拉查询") + @GetMapping("/simpleAll") + public R getSimpleAll(@RequestParam(value = "id",required = false)Long categoryId) { + List list = canteenErpCategoryService.listScope(categoryId); + List bean = BeanUtils.toBean(list, CanteenErpCategorySimpleVo.class); + return R.ok(bean); + } + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenErpMaterialController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenErpMaterialController.java new file mode 100644 index 000000000..dfc226e9f --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenErpMaterialController.java @@ -0,0 +1,139 @@ +package com.bsd.pjcloud.canteen.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.canteen.dto.erp.CanteenErpMaterialEditorDTO; +import com.bsd.pjcloud.canteen.dto.erp.CanteenErpMaterialSaveDTO; +import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; +import com.bsd.pjcloud.canteen.service.CanteenStockService; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenErpMaterialEntity; +import com.bsd.pjcloud.canteen.service.CanteenErpMaterialService; +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.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 原料表 + * + * @author zjf + * @date 2025-05-07 13:16:32 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenErpMaterial" ) +@Tag(description = "canteenErpMaterial" , name = "原料表管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenErpMaterialController { + + private final CanteenErpMaterialService canteenErpMaterialService; + + private final CanteenStockService canteenStockService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenErpMaterial 原料表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenErpMaterial_view')" ) + public R getCanteenErpMaterialPage(@ParameterObject Page page, @ParameterObject CanteenErpMaterialEntity canteenErpMaterial) { + return R.ok(canteenErpMaterialService.pageScope(page, canteenErpMaterial)); + } + + + /** + * 通过id查询原料表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenErpMaterial_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(canteenErpMaterialService.getCanteenErpMaterialVOById(id)); + } + + /** + * 新增原料表 + * @param + * @return R + */ + @Operation(summary = "新增原料表" , description = "新增原料表" ) + @SysLog("新增原料表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenErpMaterial_add')" ) + public R save(@RequestBody CanteenErpMaterialSaveDTO canteenErpMaterialSaveDTO) { + return R.ok(canteenErpMaterialService.saveCanteenErpMaterialDTO(canteenErpMaterialSaveDTO)); + } + + /** + * 修改原料表 + * @return R + */ + @Operation(summary = "修改原料表" , description = "修改原料表" ) + @SysLog("修改原料表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenErpMaterial_edit')" ) + public R updateById(@RequestBody CanteenErpMaterialEditorDTO canteenErpMaterialEditorDTO) { + return R.ok(canteenErpMaterialService.updateById(canteenErpMaterialEditorDTO)); + } + + /** + * 通过id删除原料表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除原料表" , description = "通过id删除原料表" ) + @SysLog("通过id删除原料表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenErpMaterial_del')") + @Transactional + public R removeById(@RequestBody Long[] ids) { + boolean b = canteenErpMaterialService.removeBatchByIds(CollUtil.toList(ids)); + canteenStockService.remove(Wrappers.lambdaQuery(CanteenStockEntity.class).in(CanteenStockEntity::getItemId, ids)); + return R.ok(b); + } + + + /** + * 导出excel 表格 + * @param canteenErpMaterial 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenErpMaterial_export')" ) + public List export(CanteenErpMaterialEntity canteenErpMaterial,Long[] ids) { + return canteenErpMaterialService.list(Wrappers.lambdaQuery(canteenErpMaterial).in(ArrayUtil.isNotEmpty(ids), CanteenErpMaterialEntity::getId, ids)); + } + + + /** + * erp选择食材分页数据 + * 分页查询 + * @param page 分页对象 + * @return + */ + @Operation(summary = "选择食材分页数据" , description = "选择食材分页数据" ) + @GetMapping("/erpMaterialPage" ) + public R getErpMaterialPage(@ParameterObject Page page, @RequestParam(value = "name",required = false)String name) { + return R.ok(canteenErpMaterialService.getErpMaterialPage(page, name)); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenInventoryRecordsController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenInventoryRecordsController.java new file mode 100644 index 000000000..9f45f4a77 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenInventoryRecordsController.java @@ -0,0 +1,134 @@ +package com.bsd.pjcloud.canteen.controller; + +import cn.hutool.core.util.StrUtil; +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.canteen.dto.erp.CanteenInventoryRecordEditDTO; +import com.bsd.pjcloud.canteen.dto.erp.CanteenInventoryRecordsdDTO; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsEntity; +import com.bsd.pjcloud.canteen.service.CanteenInventoryRecordsService; +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; + +/** + * 采购记录表 + * + * @author zjf + * @date 2025-05-07 17:00:50 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenInventoryRecords" ) +@Tag(description = "canteenInventoryRecords" , name = "食堂进销管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenInventoryRecordsController { + + private final CanteenInventoryRecordsService canteenInventoryRecordsService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenInventoryRecords 采购记录表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecords_view')" ) + public R getCanteenInventoryRecordsPage(@ParameterObject Page page, @ParameterObject CanteenInventoryRecordsEntity canteenInventoryRecords) { +// LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); +// wrapper.eq(StrUtil.isNotBlank(canteenInventoryRecords.getInventoryCode()),CanteenInventoryRecordsEntity::getInventoryCode,canteenInventoryRecords.getInventoryCode()); +// wrapper.eq(Objects.nonNull(canteenInventoryRecords.getInventoryDate()),CanteenInventoryRecordsEntity::getInventoryDate,canteenInventoryRecords.getInventoryDate()); + return R.ok(canteenInventoryRecordsService.pageScope(page, canteenInventoryRecords)); + } + + + /** + * 通过id查询采购记录表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecords_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(canteenInventoryRecordsService.getInventoryDetailById(id)); + } + + /** + * 新增采购记录表 + * @param canteenInventoryRecordsdDTO 采购记录表 + * @return R + */ + @Operation(summary = "新增采购记录表" , description = "新增采购记录表" ) + @SysLog("新增采购记录表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecords_add')" ) + public R save(@RequestBody CanteenInventoryRecordsdDTO canteenInventoryRecordsdDTO) { + return R.ok(canteenInventoryRecordsService.saveCanteenInventoryRecordsdDTO(canteenInventoryRecordsdDTO)); + } + + + @Operation(summary = "采购验收" , description = "采购验收" ) + @SysLog("采购验收" ) + @PostMapping("/ys") + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecords_ys')" ) + public R ys(@RequestParam Long id) { + canteenInventoryRecordsService.ys(id); + return R.ok(); + } + + /** + * 修改采购记录表 + * @param canteenInventoryRecordEditDTO 采购记录表 + * @return R + */ + @Operation(summary = "修改采购记录表" , description = "修改采购记录表" ) + @SysLog("修改采购记录表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecords_edit')" ) + public R updateById(@RequestBody CanteenInventoryRecordEditDTO canteenInventoryRecordEditDTO) { + return R.ok(canteenInventoryRecordsService.updateByCanteenInventoryRecordEditDTO(canteenInventoryRecordEditDTO)); + } + + /** + * 通过id删除采购记录表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除采购记录表" , description = "通过id删除采购记录表" ) + @SysLog("通过id删除采购记录表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecords_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(canteenInventoryRecordsService.removeBatch(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param canteenInventoryRecords 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecords_export')" ) + public List export(CanteenInventoryRecordsEntity canteenInventoryRecords,Long[] ids) { + return canteenInventoryRecordsService.list(Wrappers.lambdaQuery(canteenInventoryRecords).in(ArrayUtil.isNotEmpty(ids), CanteenInventoryRecordsEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenInventoryRecordsItemController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenInventoryRecordsItemController.java new file mode 100644 index 000000000..d354e35dc --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenInventoryRecordsItemController.java @@ -0,0 +1,119 @@ +package com.bsd.pjcloud.canteen.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsItemEntity; +import com.bsd.pjcloud.canteen.service.CanteenInventoryRecordsItemService; +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; + +/** + * 采购记录明细表 + * + * @author zjf + * @date 2025-05-07 17:02:53 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenInventoryRecordsItem" ) +@Tag(description = "canteenInventoryRecordsItem" , name = "食堂进销管理明细管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenInventoryRecordsItemController { + + private final CanteenInventoryRecordsItemService canteenInventoryRecordsItemService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenInventoryRecordsItem 采购记录明细表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecordsItem_view')" ) + public R getCanteenInventoryRecordsItemPage(@ParameterObject Page page, @ParameterObject CanteenInventoryRecordsItemEntity canteenInventoryRecordsItem) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(canteenInventoryRecordsItemService.page(page, wrapper)); + } + + + /** + * 通过id查询采购记录明细表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecordsItem_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(canteenInventoryRecordsItemService.getById(id)); + } + + /** + * 新增采购记录明细表 + * @param canteenInventoryRecordsItem 采购记录明细表 + * @return R + */ + @Operation(summary = "新增采购记录明细表" , description = "新增采购记录明细表" ) + @SysLog("新增采购记录明细表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecordsItem_add')" ) + public R save(@RequestBody CanteenInventoryRecordsItemEntity canteenInventoryRecordsItem) { + return R.ok(canteenInventoryRecordsItemService.save(canteenInventoryRecordsItem)); + } + + /** + * 修改采购记录明细表 + * @param canteenInventoryRecordsItem 采购记录明细表 + * @return R + */ + @Operation(summary = "修改采购记录明细表" , description = "修改采购记录明细表" ) + @SysLog("修改采购记录明细表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecordsItem_edit')" ) + public R updateById(@RequestBody CanteenInventoryRecordsItemEntity canteenInventoryRecordsItem) { + return R.ok(canteenInventoryRecordsItemService.updateById(canteenInventoryRecordsItem)); + } + + /** + * 通过id删除采购记录明细表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除采购记录明细表" , description = "通过id删除采购记录明细表" ) + @SysLog("通过id删除采购记录明细表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecordsItem_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(canteenInventoryRecordsItemService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param canteenInventoryRecordsItem 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenInventoryRecordsItem_export')" ) + public List export(CanteenInventoryRecordsItemEntity canteenInventoryRecordsItem,Long[] ids) { + return canteenInventoryRecordsItemService.list(Wrappers.lambdaQuery(canteenInventoryRecordsItem).in(ArrayUtil.isNotEmpty(ids), CanteenInventoryRecordsItemEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenOnlineSpuController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenOnlineSpuController.java index c8170ec19..684e79835 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenOnlineSpuController.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenOnlineSpuController.java @@ -191,7 +191,7 @@ public class CanteenOnlineSpuController { */ @Operation(summary = "通过ids查询", description = "通过ids查询") @PostMapping("/app/getSpuListByIds") - @PreAuthorize("@pms.hasPermission('canteen_canteenSpu_view')") + // @PreAuthorize("@pms.hasPermission('canteen_canteenSpu_view')") public R> getByIds(@RequestBody List ids) { List list = canteenOnlineSpuService.list(new LambdaQueryWrapper().in(CanteenOnlineSpuEntity::getId, ids)); List canteenOnlineSpuAppVOS = BeanUtils.toBean(list, CanteenOnlineSpuAppVO.class); diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionRecordController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionRecordController.java new file mode 100644 index 000000000..ceb88b90a --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionRecordController.java @@ -0,0 +1,122 @@ +package com.bsd.pjcloud.canteen.controller; + +import cn.hutool.core.util.StrUtil; +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.canteen.dto.erp.CanteenProductRecordSaveDTO; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordEntity; +import com.bsd.pjcloud.canteen.service.CanteenProductionRecordService; +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; + +/** + * 食材加工记录表 + * + * @author zjf + * @date 2025-05-08 11:02:09 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenProductionRecord" ) +@Tag(description = "canteenProductionRecord" , name = "食材加工记录表管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenProductionRecordController { + + private final CanteenProductionRecordService canteenProductionRecordService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenProductionRecord 食材加工记录表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecord_view')" ) + public R getCanteenProductionRecordPage(@ParameterObject Page page, @ParameterObject CanteenProductionRecordEntity canteenProductionRecord) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(Objects.nonNull(canteenProductionRecord.getProductionTime()),CanteenProductionRecordEntity::getProductionTime,canteenProductionRecord.getProductionTime()); + wrapper.eq(StrUtil.isNotBlank(canteenProductionRecord.getRecordCode()),CanteenProductionRecordEntity::getRecordCode,canteenProductionRecord.getRecordCode()); + return R.ok(canteenProductionRecordService.pageScope(page, wrapper)); + } + + + /** + * 通过id查询食材加工记录表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecord_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(canteenProductionRecordService.getById(id)); + } + + /** + * 新增食材加工记录表 + * @return R + */ + @Operation(summary = "新增食材加工记录表" , description = "新增食材加工记录表" ) + @SysLog("新增食材加工记录表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecord_add')" ) + public R save(@RequestBody CanteenProductRecordSaveDTO canteenProductRecordSaveDTO) { + return R.ok(canteenProductionRecordService.saveCanteenProductRecordSaveDTO(canteenProductRecordSaveDTO)); + } + + /** + * 修改食材加工记录表 + * @param canteenProductionRecord 食材加工记录表 + * @return R + */ + @Operation(summary = "修改食材加工记录表" , description = "修改食材加工记录表" ) + @SysLog("修改食材加工记录表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecord_edit')" ) + public R updateById(@RequestBody CanteenProductionRecordEntity canteenProductionRecord) { + return R.ok(canteenProductionRecordService.updateById(canteenProductionRecord)); + } + + /** + * 通过id删除食材加工记录表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除食材加工记录表" , description = "通过id删除食材加工记录表" ) + @SysLog("通过id删除食材加工记录表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecord_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(canteenProductionRecordService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param canteenProductionRecord 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecord_export')" ) + public List export(CanteenProductionRecordEntity canteenProductionRecord,Long[] ids) { + return canteenProductionRecordService.list(Wrappers.lambdaQuery(canteenProductionRecord).in(ArrayUtil.isNotEmpty(ids), CanteenProductionRecordEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionRecordItemController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionRecordItemController.java new file mode 100644 index 000000000..9d0d058e5 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionRecordItemController.java @@ -0,0 +1,119 @@ +package com.bsd.pjcloud.canteen.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordItemEntity; +import com.bsd.pjcloud.canteen.service.CanteenProductionRecordItemService; +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; + +/** + * 食材加工记录明细表 + * + * @author zjf + * @date 2025-05-08 11:05:02 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenProductionRecordItem" ) +@Tag(description = "canteenProductionRecordItem" , name = "食材加工记录明细表管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenProductionRecordItemController { + + private final CanteenProductionRecordItemService canteenProductionRecordItemService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenProductionRecordItem 食材加工记录明细表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecordItem_view')" ) + public R getCanteenProductionRecordItemPage(@ParameterObject Page page, @ParameterObject CanteenProductionRecordItemEntity canteenProductionRecordItem) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(canteenProductionRecordItemService.page(page, wrapper)); + } + + + /** + * 通过id查询食材加工记录明细表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecordItem_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(canteenProductionRecordItemService.getById(id)); + } + + /** + * 新增食材加工记录明细表 + * @param canteenProductionRecordItem 食材加工记录明细表 + * @return R + */ + @Operation(summary = "新增食材加工记录明细表" , description = "新增食材加工记录明细表" ) + @SysLog("新增食材加工记录明细表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecordItem_add')" ) + public R save(@RequestBody CanteenProductionRecordItemEntity canteenProductionRecordItem) { + return R.ok(canteenProductionRecordItemService.save(canteenProductionRecordItem)); + } + + /** + * 修改食材加工记录明细表 + * @param canteenProductionRecordItem 食材加工记录明细表 + * @return R + */ + @Operation(summary = "修改食材加工记录明细表" , description = "修改食材加工记录明细表" ) + @SysLog("修改食材加工记录明细表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecordItem_edit')" ) + public R updateById(@RequestBody CanteenProductionRecordItemEntity canteenProductionRecordItem) { + return R.ok(canteenProductionRecordItemService.updateById(canteenProductionRecordItem)); + } + + /** + * 通过id删除食材加工记录明细表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除食材加工记录明细表" , description = "通过id删除食材加工记录明细表" ) + @SysLog("通过id删除食材加工记录明细表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecordItem_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(canteenProductionRecordItemService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param canteenProductionRecordItem 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionRecordItem_export')" ) + public List export(CanteenProductionRecordItemEntity canteenProductionRecordItem,Long[] ids) { + return canteenProductionRecordItemService.list(Wrappers.lambdaQuery(canteenProductionRecordItem).in(ArrayUtil.isNotEmpty(ids), CanteenProductionRecordItemEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionTemplateController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionTemplateController.java new file mode 100644 index 000000000..eecdaa44a --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionTemplateController.java @@ -0,0 +1,132 @@ +package com.bsd.pjcloud.canteen.controller; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateEntity; +import com.bsd.pjcloud.canteen.service.CanteenProductionTemplateService; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +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; + +/** + * 加工模版表 + * + * @author zjf + * @date 2025-05-12 13:41:26 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenProductionTemplate" ) +@Tag(description = "canteenProductionTemplate" , name = "加工模版表管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenProductionTemplateController { + + private final CanteenProductionTemplateService canteenProductionTemplateService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenProductionTemplate 加工模版表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplate_view')" ) + public R getCanteenProductionTemplatePage(@ParameterObject Page page, @ParameterObject CanteenProductionTemplateEntity canteenProductionTemplate) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(StrUtil.isNotBlank(canteenProductionTemplate.getTemplateName()),CanteenProductionTemplateEntity::getTemplateName,canteenProductionTemplate.getTemplateName()); + return R.ok(canteenProductionTemplateService.pageScope(page, wrapper)); + } + + + /** + * 通过id查询加工模版表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplate_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(canteenProductionTemplateService.getDetailById(id)); + } + + /** + * 新增加工模版表 + * @param canteenProductionTemplate 加工模版表 + * @return R + */ + @Operation(summary = "新增加工模版表" , description = "新增加工模版表" ) + @SysLog("新增加工模版表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplate_add')" ) + public R save(@RequestBody CanteenProductionTemplateEntity canteenProductionTemplate) { + canteenProductionTemplate.setDeptId(SecurityUtils.getUser().getDeptId()); + return R.ok(canteenProductionTemplateService.saveDeep(canteenProductionTemplate)); + } + + /** + * 修改加工模版表 + * @param canteenProductionTemplate 加工模版表 + * @return R + */ + @Operation(summary = "修改加工模版表" , description = "修改加工模版表" ) + @SysLog("修改加工模版表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplate_edit')" ) + public R updateById(@RequestBody CanteenProductionTemplateEntity canteenProductionTemplate) { + return R.ok(canteenProductionTemplateService.updateDeep(canteenProductionTemplate)); + } + + /** + * 通过id删除加工模版表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除加工模版表" , description = "通过id删除加工模版表" ) + @SysLog("通过id删除加工模版表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplate_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(canteenProductionTemplateService.removeDeep(ids)); + } + + + /** + * 导出excel 表格 + * @param canteenProductionTemplate 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplate_export')" ) + public List export(CanteenProductionTemplateEntity canteenProductionTemplate,Long[] ids) { + return canteenProductionTemplateService.list(Wrappers.lambdaQuery(canteenProductionTemplate).in(ArrayUtil.isNotEmpty(ids), CanteenProductionTemplateEntity::getId, ids)); + } + + + + + @Operation(summary = "选择加工菜品模版分页" , description = "选择加工菜品模版分页" ) + @GetMapping("/getSelectTemplatePage" ) + public R getSelectTemplatePage(@ParameterObject Page page, @RequestParam(value = "name",required = false)String name) { + return R.ok(canteenProductionTemplateService.getSelectTemplatePageScope(page, name)); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionTemplateDetailController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionTemplateDetailController.java new file mode 100644 index 000000000..39f8d2c66 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenProductionTemplateDetailController.java @@ -0,0 +1,119 @@ +package com.bsd.pjcloud.canteen.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateDetailEntity; +import com.bsd.pjcloud.canteen.service.CanteenProductionTemplateDetailService; +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; + +/** + * 加工模版明细表 + * + * @author zjf + * @date 2025-05-12 13:53:57 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenProductionTemplateDetail" ) +@Tag(description = "canteenProductionTemplateDetail" , name = "加工模版明细表管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenProductionTemplateDetailController { + + private final CanteenProductionTemplateDetailService canteenProductionTemplateDetailService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenProductionTemplateDetail 加工模版明细表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplateDetail_view')" ) + public R getCanteenProductionTemplateDetailPage(@ParameterObject Page page, @ParameterObject CanteenProductionTemplateDetailEntity canteenProductionTemplateDetail) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(canteenProductionTemplateDetailService.page(page, wrapper)); + } + + + /** + * 通过id查询加工模版明细表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplateDetail_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(canteenProductionTemplateDetailService.getById(id)); + } + + /** + * 新增加工模版明细表 + * @param canteenProductionTemplateDetail 加工模版明细表 + * @return R + */ + @Operation(summary = "新增加工模版明细表" , description = "新增加工模版明细表" ) + @SysLog("新增加工模版明细表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplateDetail_add')" ) + public R save(@RequestBody CanteenProductionTemplateDetailEntity canteenProductionTemplateDetail) { + return R.ok(canteenProductionTemplateDetailService.save(canteenProductionTemplateDetail)); + } + + /** + * 修改加工模版明细表 + * @param canteenProductionTemplateDetail 加工模版明细表 + * @return R + */ + @Operation(summary = "修改加工模版明细表" , description = "修改加工模版明细表" ) + @SysLog("修改加工模版明细表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplateDetail_edit')" ) + public R updateById(@RequestBody CanteenProductionTemplateDetailEntity canteenProductionTemplateDetail) { + return R.ok(canteenProductionTemplateDetailService.updateById(canteenProductionTemplateDetail)); + } + + /** + * 通过id删除加工模版明细表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除加工模版明细表" , description = "通过id删除加工模版明细表" ) + @SysLog("通过id删除加工模版明细表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplateDetail_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(canteenProductionTemplateDetailService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param canteenProductionTemplateDetail 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenProductionTemplateDetail_export')" ) + public List export(CanteenProductionTemplateDetailEntity canteenProductionTemplateDetail,Long[] ids) { + return canteenProductionTemplateDetailService.list(Wrappers.lambdaQuery(canteenProductionTemplateDetail).in(ArrayUtil.isNotEmpty(ids), CanteenProductionTemplateDetailEntity::getId, ids)); + } +} \ 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 bc238cb9f..adadc35c5 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 @@ -6,9 +6,16 @@ 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.canteen.constant.StockTypeEnum; import com.bsd.pjcloud.canteen.dto.CanteenDailySpuDTO; import com.bsd.pjcloud.canteen.dto.CanteenSpuUpdateStockReqDTO; +import com.bsd.pjcloud.canteen.entity.CanteenErpMaterialEntity; import com.bsd.pjcloud.canteen.entity.CanteenOnlineSpuEntity; +import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenStockMapper; +import com.bsd.pjcloud.canteen.service.CanteenStockService; +import com.bsd.pjcloud.canteen.vo.erp.CanteenSpuSimpleVO; +import com.bsd.pjcloud.canteen.vo.erp.CanteenSpuStockVO; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; @@ -43,6 +50,8 @@ public class CanteenSpuController { private final CanteenSpuService canteenSpuService; + private final CanteenStockService canteenStockService; + /** * 分页查询 * @@ -58,6 +67,27 @@ public class CanteenSpuController { } + @Operation(summary = "erp分页查询", description = "erp分页查询") + @GetMapping("/erp/page") + @PreAuthorize("@pms.hasPermission('canteen_canteenSpu_view')") + public R> getCanteenSpuErpPage(@ParameterObject Page page, @ParameterObject CanteenSpuEntity canteenSpu) { + return R.ok(canteenSpuService.erpPageScope(page, canteenSpu)); + } + + + /** + * 选择菜品分页查询 + * 1.生产加工模版选择菜品 + * @param page + * @param canteenSpu + * @return + */ + @Operation(summary = "生产加工模版选择菜品分页查询", description = "生产加工模版选择菜品分页查询") + @GetMapping("/getCanteenSpuSimplePage") + public R> getCanteenSpuSimplePage(@ParameterObject Page page, @ParameterObject CanteenSpuEntity canteenSpu) { + return R.ok(canteenSpuService.getCanteenSpuSimplePageScope(page, canteenSpu)); + } + /** * 每日分页查询 * @@ -96,9 +126,21 @@ public class CanteenSpuController { @SysLog("新增菜品spu") @PostMapping @PreAuthorize("@pms.hasPermission('canteen_canteenSpu_add')") + @Transactional public R save(@RequestBody CanteenSpuEntity canteenSpu) { - canteenSpu.setDeptId(SecurityUtils.getUser().getDeptId()); - return R.ok(canteenSpuService.save(canteenSpu)); + Long deptId = SecurityUtils.getUser().getDeptId(); + canteenSpu.setDeptId(deptId); + boolean save = canteenSpuService.save(canteenSpu); + CanteenStockEntity canteenStockEntity = new CanteenStockEntity(); + canteenStockEntity.setItemId(canteenSpu.getId()); + canteenStockEntity.setItemType(StockTypeEnum.DISH.getType()); + canteenStockEntity.setBaseStock(0D); + canteenStockEntity.setInventoryUpperLimit(0); + canteenStockEntity.setInventoryLowerLimit(0); + canteenStockEntity.setCurrentStock(0D); + canteenStockEntity.setDeptId(deptId); + canteenStockService.save(canteenStockEntity); + return R.ok(save); } /** @@ -115,6 +157,20 @@ public class CanteenSpuController { return R.ok(canteenSpuService.updateById(canteenSpu)); } + /** + * 修改菜品spu + * + * @param canteenSpu 菜品spu + * @return R + */ +// @Operation(summary = "修改erp菜品库存", description = "修改erp菜品库存") +// @SysLog("修改erp菜品库存") +// @PutMapping("/editor") +// @PreAuthorize("@pms.hasPermission('canteen_canteenSpu_edit')") +// public R updateById(@RequestBody CanteenSpuEntity canteenSpu) { +// return R.ok(canteenSpuService.updateById(canteenSpu)); +// } + /** * 通过id删除菜品spu * @@ -194,4 +250,7 @@ public class CanteenSpuController { } return R.ok(); } + + + } \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenStockController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenStockController.java new file mode 100644 index 000000000..a86d844b7 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenStockController.java @@ -0,0 +1,185 @@ +package com.bsd.pjcloud.canteen.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.canteen.entity.CanteenErpMaterialEntity; +import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; +import com.bsd.pjcloud.canteen.service.CanteenSpuService; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; +import com.bsd.pjcloud.canteen.service.CanteenStockService; +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; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 库存表 + * + * @author zjf + * @date 2025-05-07 16:40:35 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenStock" ) +@Tag(description = "canteenStock" , name = "库存表管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenStockController { + + private final CanteenStockService canteenStockService; + + private final CanteenSpuService canteenSpuService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenStock 库存表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenStock_view')" ) + public R getCanteenStockPage(@ParameterObject Page page, @ParameterObject CanteenStockEntity canteenStock) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(canteenStockService.page(page, wrapper)); + } + + + /** + * 通过id查询库存表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenStock_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(canteenStockService.getById(id)); + } + + /** + * 新增库存表 + * @param canteenStock 库存表 + * @return R + */ + @Operation(summary = "新增库存表" , description = "新增库存表" ) + @SysLog("新增库存表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenStock_add')" ) + public R save(@RequestBody CanteenStockEntity canteenStock) { + return R.ok(canteenStockService.save(canteenStock)); + } + + /** + * 修改库存表 + * @param canteenStock 库存表 + * @return R + */ + @Operation(summary = "修改库存表" , description = "修改库存表" ) + @SysLog("修改库存表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenStock_edit')" ) + public R updateById(@RequestBody CanteenStockEntity canteenStock) { + return R.ok(canteenStockService.updateById(canteenStock)); + } + + /** + * 通过id删除库存表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除库存表" , description = "通过id删除库存表" ) + @SysLog("通过id删除库存表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenStock_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(canteenStockService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param canteenStock 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenStock_export')" ) + public List export(CanteenStockEntity canteenStock,Long[] ids) { + return canteenStockService.list(Wrappers.lambdaQuery(canteenStock).in(ArrayUtil.isNotEmpty(ids), CanteenStockEntity::getId, ids)); + } + + + @PostMapping("/canteen/ansync") + @PreAuthorize("@pms.hasPermission('canteen_canteenStock_add')" ) + public R ansyncStock() { + + // 获取所有SPU列表 + List list = canteenSpuService.list(); + + // 提取所有SPU ID + List skuIds = list.stream() + .map(CanteenSpuEntity::getId) + .collect(Collectors.toList()); + + // 查询已存在的库存记录 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.in(CanteenStockEntity::getItemId, skuIds); + List existingStocks = canteenStockService.list(wrapper); + + // 将已存在的itemId存入Set用于快速查找 + Set existingItemIds = existingStocks.stream() + .map(CanteenStockEntity::getItemId) + .collect(Collectors.toSet()); + + // 过滤出需要新增的SPU + List toSaveList = list.stream() + .filter(spu -> !existingItemIds.contains(spu.getId())) + .map(spu -> { + CanteenStockEntity entity = new CanteenStockEntity(); + entity.setCurrentStock(0D); + entity.setBaseStock(0D); + entity.setItemType("2"); + entity.setItemId(spu.getId()); + entity.setDeptId(spu.getDeptId()); + entity.setInventoryUpperLimit(0); + entity.setInventoryLowerLimit(0); + return entity; + }).collect(Collectors.toList()); + + // 批量保存新数据 + if (CollUtil.isNotEmpty(toSaveList)) { + canteenStockService.saveBatch(toSaveList); + } + + return R.ok(); + } + + +// /** +// * 分页查询 +// * @param page 分页对象 +// * @return +// */ +// @Operation(summary = "分页查询" , description = "分页查询" ) +// @GetMapping("/dishStockPage" ) +// @PreAuthorize("@pms.hasPermission('canteen_canteenErpMaterial_view')" ) +// public R getDishStockPage(@ParameterObject Page page, @ParameterObject CanteenSpuEntity canteenSpuEntity) { +// return R.ok(canteenErpMaterialService.pageScope(page, canteenErpMaterial)); +// } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSupplierController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSupplierController.java new file mode 100644 index 000000000..4dcd0e0b5 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/CanteenSupplierController.java @@ -0,0 +1,138 @@ +package com.bsd.pjcloud.canteen.controller; + +import cn.hutool.core.util.StrUtil; +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.canteen.vo.erp.CanteenSupplierSimpleVo; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.CanteenSupplierEntity; +import com.bsd.pjcloud.canteen.service.CanteenSupplierService; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +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; + +/** + * 货商信息 + * + * @author zjf + * @date 2025-05-09 13:18:19 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/canteenSupplier" ) +@Tag(description = "canteenSupplier" , name = "货商信息管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class CanteenSupplierController { + + private final CanteenSupplierService canteenSupplierService; + + /** + * 分页查询 + * @param page 分页对象 + * @param canteenSupplier 货商信息 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenSupplier_view')" ) + public R getCanteenSupplierPage(@ParameterObject Page page, @ParameterObject CanteenSupplierEntity canteenSupplier) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StrUtil.isNotBlank(canteenSupplier.getSupplierName()),CanteenSupplierEntity::getSupplierName,canteenSupplier.getSupplierName()); + wrapper.eq(StrUtil.isNotBlank(canteenSupplier.getPhone()),CanteenSupplierEntity::getPhone,canteenSupplier.getPhone()); + return R.ok(canteenSupplierService.pageScope(page, wrapper)); + } + + + /** + * 通过id查询货商信息 + * @param supplierId id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{supplierId}" ) + @PreAuthorize("@pms.hasPermission('canteen_canteenSupplier_view')" ) + public R getById(@PathVariable("supplierId" ) Long supplierId) { + return R.ok(canteenSupplierService.getById(supplierId)); + } + + /** + * 新增货商信息 + * @param canteenSupplier 货商信息 + * @return R + */ + @Operation(summary = "新增货商信息" , description = "新增货商信息" ) + @SysLog("新增货商信息" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenSupplier_add')" ) + public R save(@RequestBody CanteenSupplierEntity canteenSupplier) { + canteenSupplier.setDeptId(SecurityUtils.getUser().getDeptId()); + return R.ok(canteenSupplierService.save(canteenSupplier)); + } + + /** + * 修改货商信息 + * @param canteenSupplier 货商信息 + * @return R + */ + @Operation(summary = "修改货商信息" , description = "修改货商信息" ) + @SysLog("修改货商信息" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenSupplier_edit')" ) + public R updateById(@RequestBody CanteenSupplierEntity canteenSupplier) { + return R.ok(canteenSupplierService.updateById(canteenSupplier)); + } + + /** + * 通过id删除货商信息 + * @param ids supplierId列表 + * @return R + */ + @Operation(summary = "通过id删除货商信息" , description = "通过id删除货商信息" ) + @SysLog("通过id删除货商信息" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_canteenSupplier_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(canteenSupplierService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param canteenSupplier 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_canteenSupplier_export')" ) + public List export(CanteenSupplierEntity canteenSupplier,Long[] ids) { + return canteenSupplierService.list(Wrappers.lambdaQuery(canteenSupplier).in(ArrayUtil.isNotEmpty(ids), CanteenSupplierEntity::getSupplierId, ids)); + } + + /** + * 货商下拉 + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/selectSimpleAll" ) + public R selectSimpleAll(@RequestParam(value = "name",required = false)String name, + @RequestParam(value = "supplierId",required = false)Long supplierId) { + List list = canteenSupplierService.selectSimpleAllScope(name,supplierId); + List bean = BeanUtils.toBean(list, CanteenSupplierSimpleVo.class); + return R.ok(bean); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/ProductionRecordItemRelationController.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/ProductionRecordItemRelationController.java new file mode 100644 index 000000000..dc70e42e7 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/controller/ProductionRecordItemRelationController.java @@ -0,0 +1,119 @@ +package com.bsd.pjcloud.canteen.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.canteen.entity.ProductionRecordItemRelationEntity; +import com.bsd.pjcloud.canteen.service.ProductionRecordItemRelationService; +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; + +/** + * 食材加工菜品关系表 + * + * @author zjf + * @date 2025-05-14 12:47:16 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/productionRecordItemRelation" ) +@Tag(description = "productionRecordItemRelation" , name = "食材加工菜品关系表管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ProductionRecordItemRelationController { + + private final ProductionRecordItemRelationService productionRecordItemRelationService; + + /** + * 分页查询 + * @param page 分页对象 + * @param productionRecordItemRelation 食材加工菜品关系表 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('canteen_productionRecordItemRelation_view')" ) + public R getProductionRecordItemRelationPage(@ParameterObject Page page, @ParameterObject ProductionRecordItemRelationEntity productionRecordItemRelation) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(productionRecordItemRelationService.page(page, wrapper)); + } + + + /** + * 通过id查询食材加工菜品关系表 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('canteen_productionRecordItemRelation_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(productionRecordItemRelationService.getById(id)); + } + + /** + * 新增食材加工菜品关系表 + * @param productionRecordItemRelation 食材加工菜品关系表 + * @return R + */ + @Operation(summary = "新增食材加工菜品关系表" , description = "新增食材加工菜品关系表" ) + @SysLog("新增食材加工菜品关系表" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('canteen_productionRecordItemRelation_add')" ) + public R save(@RequestBody ProductionRecordItemRelationEntity productionRecordItemRelation) { + return R.ok(productionRecordItemRelationService.save(productionRecordItemRelation)); + } + + /** + * 修改食材加工菜品关系表 + * @param productionRecordItemRelation 食材加工菜品关系表 + * @return R + */ + @Operation(summary = "修改食材加工菜品关系表" , description = "修改食材加工菜品关系表" ) + @SysLog("修改食材加工菜品关系表" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('canteen_productionRecordItemRelation_edit')" ) + public R updateById(@RequestBody ProductionRecordItemRelationEntity productionRecordItemRelation) { + return R.ok(productionRecordItemRelationService.updateById(productionRecordItemRelation)); + } + + /** + * 通过id删除食材加工菜品关系表 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除食材加工菜品关系表" , description = "通过id删除食材加工菜品关系表" ) + @SysLog("通过id删除食材加工菜品关系表" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('canteen_productionRecordItemRelation_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(productionRecordItemRelationService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param productionRecordItemRelation 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('canteen_productionRecordItemRelation_export')" ) + public List export(ProductionRecordItemRelationEntity productionRecordItemRelation,Long[] ids) { + return productionRecordItemRelationService.list(Wrappers.lambdaQuery(productionRecordItemRelation).in(ArrayUtil.isNotEmpty(ids), ProductionRecordItemRelationEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenErpCategoryEntity.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenErpCategoryEntity.java new file mode 100644 index 000000000..2f57ab6c5 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/entity/CanteenErpCategoryEntity.java @@ -0,0 +1,115 @@ +package com.bsd.pjcloud.canteen.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; + +/** + * 食材分类 + * + * @author zjf + * @date 2025-05-28 11:12:41 + */ +@Data +@TenantTable +@TableName("canteen_erp_category") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "食材分类") +public class CanteenErpCategoryEntity extends Model { + + + /** + * 分类编号 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="分类编号") + private Long id; + + /** + * 父分类编号 + */ + @Schema(description="父分类编号") + private Long parentId; + + /** + * 分类名称 + */ + @Schema(description="分类名称") + private String name; + + /** + * 分类图 + */ + @Schema(description="分类图") + private String picUrl; + + /** + * 分类排序 + */ + @Schema(description="分类排序") + private Integer sort; + + /** + * 开启状态 + */ + @Schema(description="开启状态") + private String status; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * merchantId + */ + @Schema(description="merchantId") + private Long merchantId; + + /** + * 创建者 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/entity/ProductionRecordItemRelationEntity.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/entity/ProductionRecordItemRelationEntity.java new file mode 100644 index 000000000..0c685c881 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/entity/ProductionRecordItemRelationEntity.java @@ -0,0 +1,82 @@ +package com.bsd.pjcloud.canteen.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; + +/** + * 食材加工菜品关系表 + * + * @author zjf + * @date 2025-05-14 12:47:16 + */ +@Data +@TableName("production_record_item_relation") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "食材加工菜品关系表") +public class ProductionRecordItemRelationEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 食材id + */ + @Schema(description="食材id") + private Long materialId; + + /** + * 记录item表id + */ + @Schema(description="记录item表id") + private Long recordItemId; + + /** + * 食材名称 + */ + @Schema(description="食材名称") + private String materialName; + + /** + * 食材单位 + */ + @Schema(description="食材单位") + private String unit; + + /** + * 计算用量 + */ + @Schema(description="计算用量") + private Double calculatedUsage; + + /** + * 折损率 + */ + @Schema(description="折损率") + private Double lossRate; + + /** + * 基础用量 + */ + @Schema(description="基础用量") + private Double baseUsage; + + /** + * 实际用量 + */ + @Schema(description="实际用量") + private Double actualUsage; + + /** + * 实际折损率 + */ + @Schema(description="实际折损率") + private Double actualLossRate; +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/job/BoxesAvaliabilityJob.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/job/BoxesAvaliabilityJob.java index 82fe613c8..5f841de50 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/job/BoxesAvaliabilityJob.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/job/BoxesAvaliabilityJob.java @@ -26,7 +26,7 @@ public class BoxesAvaliabilityJob { private final BoxesAvailabilityMapper boxesAvailabilityMapper; @XxlJob("avaliabilityJobHandler") - public void demoJobHandler() { + public void avaliabilityJobHandler() { //查询所有包厢 List rooms = boxesInfoMapper.selectList(null); diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenErpCategoryMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenErpCategoryMapper.java new file mode 100644 index 000000000..2e5593e89 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenErpCategoryMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenErpCategoryEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CanteenErpCategoryMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenErpMaterialMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenErpMaterialMapper.java new file mode 100644 index 000000000..d0dd3166c --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenErpMaterialMapper.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.canteen.vo.erp.CanteenErpMaterialVO; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenErpMaterialEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface CanteenErpMaterialMapper extends PjcloudBaseMapper { + + + + Page selectPageDataByScope(Page page, @Param("canteenErpMaterial") CanteenErpMaterialEntity canteenErpMaterial, DataScope of); +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenInventoryRecordsItemMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenInventoryRecordsItemMapper.java new file mode 100644 index 000000000..1b646dd0d --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenInventoryRecordsItemMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsItemEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CanteenInventoryRecordsItemMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenInventoryRecordsMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenInventoryRecordsMapper.java new file mode 100644 index 000000000..2c4452d34 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenInventoryRecordsMapper.java @@ -0,0 +1,23 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.canteen.vo.erp.CanteenProductionRecordPageVO; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsEntity; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface CanteenInventoryRecordsMapper extends PjcloudBaseMapper { + + + /** + * 分页查询 + * @param page + * @param canteenInventoryRecords + * @param of + * @return + */ + Page selectPageDataByScope(Page page, @Param("canteenInventoryRecords") CanteenInventoryRecordsEntity canteenInventoryRecords, DataScope of); +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionRecordItemMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionRecordItemMapper.java new file mode 100644 index 000000000..c57ea9c8f --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionRecordItemMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordItemEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CanteenProductionRecordItemMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionRecordMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionRecordMapper.java new file mode 100644 index 000000000..46f5b33c0 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionRecordMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CanteenProductionRecordMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionTemplateDetailMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionTemplateDetailMapper.java new file mode 100644 index 000000000..96bf755d3 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionTemplateDetailMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateDetailEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CanteenProductionTemplateDetailMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionTemplateMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionTemplateMapper.java new file mode 100644 index 000000000..a0758785f --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenProductionTemplateMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CanteenProductionTemplateMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenStockMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenStockMapper.java new file mode 100644 index 000000000..b523371da --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenStockMapper.java @@ -0,0 +1,14 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.bsd.pjcloud.canteen.dto.erp.UpdateStockDTO; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CanteenStockMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenSupplierMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenSupplierMapper.java new file mode 100644 index 000000000..def616a2a --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/CanteenSupplierMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.CanteenSupplierEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface CanteenSupplierMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/ProductionRecordItemRelationMapper.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/ProductionRecordItemRelationMapper.java new file mode 100644 index 000000000..3a0639685 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/mapper/ProductionRecordItemRelationMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.canteen.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.canteen.entity.ProductionRecordItemRelationEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ProductionRecordItemRelationMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenErpCategoryService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenErpCategoryService.java new file mode 100644 index 000000000..84d72b005 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenErpCategoryService.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.entity.CanteenCategoryEntity; +import com.bsd.pjcloud.canteen.entity.CanteenErpCategoryEntity; + +import java.util.List; + +public interface CanteenErpCategoryService extends IService { + + + /** + * 分页查询 + * @param page + * @param wrapper + * @return + */ + Object pageScope(Page page, LambdaQueryWrapper wrapper); + + + /** + * 查询下拉分类 + * @param categoryId + * @return + */ + List listScope(Long categoryId); +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenErpMaterialService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenErpMaterialService.java new file mode 100644 index 000000000..676682996 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenErpMaterialService.java @@ -0,0 +1,46 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.dto.erp.CanteenErpMaterialEditorDTO; +import com.bsd.pjcloud.canteen.dto.erp.CanteenErpMaterialSaveDTO; +import com.bsd.pjcloud.canteen.entity.CanteenErpMaterialEntity; +import com.bsd.pjcloud.canteen.vo.erp.CanteenErpMaterialVO; + +public interface CanteenErpMaterialService extends IService { + + + /** + * 保存 + * @param canteenErpMaterialSaveDTO + * @return + */ + Object saveCanteenErpMaterialDTO(CanteenErpMaterialSaveDTO canteenErpMaterialSaveDTO); + + /** + * 修改 + * @param canteenErpMaterialEditorDTO + * @return + */ + Object updateById(CanteenErpMaterialEditorDTO canteenErpMaterialEditorDTO); + + /** + * 分页查询 + * @param page + + * @return + */ + Page pageScope(Page page, CanteenErpMaterialEntity canteenErpMaterial); + + CanteenErpMaterialVO getCanteenErpMaterialVOById(Long id); + + + /** + * erp选择分页 + * @param page + * @param name + * @return + */ + Object getErpMaterialPage(Page page, String name); +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenInventoryRecordsItemService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenInventoryRecordsItemService.java new file mode 100644 index 000000000..23b6d7363 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenInventoryRecordsItemService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsItemEntity; + +public interface CanteenInventoryRecordsItemService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenInventoryRecordsService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenInventoryRecordsService.java new file mode 100644 index 000000000..2fac79844 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenInventoryRecordsService.java @@ -0,0 +1,47 @@ +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.erp.CanteenInventoryRecordEditDTO; +import com.bsd.pjcloud.canteen.dto.erp.CanteenInventoryRecordsdDTO; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsEntity; +import com.bsd.pjcloud.canteen.vo.erp.CanteenProductionRecordPageVO; + +import java.util.ArrayList; +import java.util.List; + +public interface CanteenInventoryRecordsService extends IService { + + + /** + * 新增 + * @param canteenInventoryRecordsdDTO + * @return + */ + Object saveCanteenInventoryRecordsdDTO(CanteenInventoryRecordsdDTO canteenInventoryRecordsdDTO); + + + /** + * 分页 + * @param page + * @param canteenInventoryRecords + * @return + */ + Page pageScope(Page page, CanteenInventoryRecordsEntity canteenInventoryRecords); + + + /** + * 修改 + * @param canteenInventoryRecordEditDTO + * @return + */ + Object updateByCanteenInventoryRecordEditDTO(CanteenInventoryRecordEditDTO canteenInventoryRecordEditDTO); + + Object getInventoryDetailById(Long id); + + + + Object removeBatch(List list); + + void ys(Long id); +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionRecordItemService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionRecordItemService.java new file mode 100644 index 000000000..21d304a43 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionRecordItemService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordItemEntity; + +public interface CanteenProductionRecordItemService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionRecordService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionRecordService.java new file mode 100644 index 000000000..482855dc3 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionRecordService.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.dto.erp.CanteenProductRecordSaveDTO; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordEntity; + +public interface CanteenProductionRecordService extends IService { + + + /** + * 分页 + * @param page + * @param wrapper + * @return + */ + Object pageScope(Page page, LambdaQueryWrapper wrapper); + + + /** + * 保存 + * @param canteenProductRecordSaveDTO + * @return + */ + Object saveCanteenProductRecordSaveDTO(CanteenProductRecordSaveDTO canteenProductRecordSaveDTO); +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionTemplateDetailService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionTemplateDetailService.java new file mode 100644 index 000000000..6895ffc94 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionTemplateDetailService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateDetailEntity; + +public interface CanteenProductionTemplateDetailService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionTemplateService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionTemplateService.java new file mode 100644 index 000000000..257fe11b2 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenProductionTemplateService.java @@ -0,0 +1,40 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.canteen.vo.erp.ProductTemplateVO; +import com.github.yulichang.extension.mapping.base.MPJDeepService; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateDetailEntity; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateEntity; + +public interface CanteenProductionTemplateService extends MPJDeepService { + Boolean saveDeep(CanteenProductionTemplateEntity canteenProductionTemplate); + + Boolean updateDeep(CanteenProductionTemplateEntity canteenProductionTemplate); + + Boolean removeDeep(Long[] ids); + + Boolean removeChild(Long[] ids); + + + + ProductTemplateVO getDetailById(Long id); + + /** + * 分页 + * @param page + * @param wrapper + * @return + */ + + Object pageScope(Page page, LambdaQueryWrapper wrapper); + + + /** + * 获取模版分页选择下拉 + * @param page + * @param name + * @return + */ + Object getSelectTemplatePageScope(Page page, String name); +} \ 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 613151372..bf1f2bbb2 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 @@ -6,8 +6,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.canteen.dto.CanteenDailySpuDTO; import com.bsd.pjcloud.canteen.dto.CanteenSpuUpdateStockReqDTO; import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; +import com.bsd.pjcloud.canteen.vo.erp.CanteenSpuSimpleVO; +import com.bsd.pjcloud.canteen.vo.erp.CanteenSpuStockVO; import com.bsd.pjcloud.common.core.util.R; +import java.util.List; + public interface CanteenSpuService extends IService { @@ -51,4 +55,17 @@ public interface CanteenSpuService extends IService { * @return */ Object pageDailyScope(Page page, CanteenDailySpuDTO canteenDailySpuDTO); + + Page getCanteenSpuSimplePageScope(Page page, CanteenSpuEntity canteenSpu); + + + /** + * erp分页查询 + * @param page + * @param canteenSpu 查询参数 + * @return 分页菜品库存VO + */ + Page erpPageScope(Page page, CanteenSpuEntity canteenSpu); + + } \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenStockService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenStockService.java new file mode 100644 index 000000000..4a97c61a4 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenStockService.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.dto.erp.UpdateStockDTO; +import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; + +import java.util.List; + +public interface CanteenStockService extends IService { + + + void updateStock(List updateStockDTOS); +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenSupplierService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenSupplierService.java new file mode 100644 index 000000000..345074f21 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/CanteenSupplierService.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.entity.CanteenSupplierEntity; + +import java.util.List; + +public interface CanteenSupplierService extends IService { + + + /** + * 数据权限分页查询 + * @param page + * @param wrapper + * @return + */ + Object pageScope(Page page, LambdaQueryWrapper wrapper); + + + /** + * 货商下拉 + * @param name + * @param supplierId + * @return + */ + List selectSimpleAllScope(String name, Long supplierId); +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/ProductionRecordItemRelationService.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/ProductionRecordItemRelationService.java new file mode 100644 index 000000000..a8979861f --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/ProductionRecordItemRelationService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.canteen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.canteen.entity.ProductionRecordItemRelationEntity; + +public interface ProductionRecordItemRelationService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/BoxesBookingServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/BoxesBookingServiceImpl.java index 0ede5315e..4a6ed1b2c 100644 --- a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/BoxesBookingServiceImpl.java +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/BoxesBookingServiceImpl.java @@ -128,6 +128,9 @@ public class BoxesBookingServiceImpl extends ServiceImpl records = pageData.getRecords(); + if (CollectionUtils.isEmpty(records)){ + return pageData; + } Set boxesIds = records.stream().map(boxesBookingEntity -> boxesBookingEntity.getBoxesId()).collect(Collectors.toSet()); Set usersIds = records.stream().map(boxesBookingEntity -> boxesBookingEntity.getUserId()).collect(Collectors.toSet()); diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenErpCategoryServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenErpCategoryServiceImpl.java new file mode 100644 index 000000000..41fb984d6 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenErpCategoryServiceImpl.java @@ -0,0 +1,36 @@ +package com.bsd.pjcloud.canteen.service.impl; + +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.entity.CanteenCategoryEntity; +import com.bsd.pjcloud.canteen.entity.CanteenErpCategoryEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenErpCategoryMapper; +import com.bsd.pjcloud.canteen.service.CanteenErpCategoryService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 食材分类 + * + * @author zjf + * @date 2025-05-28 11:12:41 + */ +@Service +public class CanteenErpCategoryServiceImpl extends ServiceImpl implements CanteenErpCategoryService { + @Override + public Object pageScope(Page page, LambdaQueryWrapper wrapper) { + return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + } + + @Override + public List listScope(Long categoryId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (categoryId != null) { + wrapper.eq(CanteenErpCategoryEntity::getId, categoryId); + } + return baseMapper.selectListByScope(wrapper, DataScope.of()); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenErpMaterialServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenErpMaterialServiceImpl.java new file mode 100644 index 000000000..5187415ae --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenErpMaterialServiceImpl.java @@ -0,0 +1,149 @@ +package com.bsd.pjcloud.canteen.service.impl; + +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.erp.CanteenErpMaterialEditorDTO; +import com.bsd.pjcloud.canteen.dto.erp.CanteenErpMaterialSaveDTO; +import com.bsd.pjcloud.canteen.entity.CanteenErpMaterialEntity; +import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenErpMaterialMapper; +import com.bsd.pjcloud.canteen.mapper.CanteenStockMapper; +import com.bsd.pjcloud.canteen.service.CanteenErpMaterialService; +import com.bsd.pjcloud.canteen.vo.erp.CanteenErpMaterialVO; +import com.bsd.pjcloud.canteen.vo.erp.ErpMaterialPageVo; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 原料表 + * + * @author zjf + * @date 2025-05-07 13:16:32 + */ +@Service +@AllArgsConstructor +public class CanteenErpMaterialServiceImpl extends ServiceImpl implements CanteenErpMaterialService { + + private final CanteenStockMapper canteenStockMapper; + @Override + @Transactional + public Object saveCanteenErpMaterialDTO(CanteenErpMaterialSaveDTO canteenErpMaterialSaveDTO) { + Long deptId = SecurityUtils.getUser().getDeptId(); + CanteenErpMaterialEntity canteenErpMaterialEntity = new CanteenErpMaterialEntity(); + canteenErpMaterialEntity.setName(canteenErpMaterialSaveDTO.getName()); + canteenErpMaterialEntity.setUnit(canteenErpMaterialSaveDTO.getUnit()); + canteenErpMaterialEntity.setDeptId(deptId); + canteenErpMaterialEntity.setPurchasePrice(canteenErpMaterialSaveDTO.getPurchasePrice()); + canteenErpMaterialEntity.setCategoryId(canteenErpMaterialSaveDTO.getCategoryId()); + int insert = baseMapper.insert(canteenErpMaterialEntity); + CanteenStockEntity canteenStockEntity = new CanteenStockEntity(); + canteenStockEntity.setItemType("1"); + canteenStockEntity.setItemId(canteenErpMaterialEntity.getId()); + canteenStockEntity.setBaseStock(canteenErpMaterialSaveDTO.getBaseStock()); + canteenStockEntity.setCurrentStock(canteenErpMaterialSaveDTO.getBaseStock()); + canteenStockEntity.setInventoryUpperLimit(canteenErpMaterialSaveDTO.getInventoryUpperLimit()); + canteenStockEntity.setInventoryLowerLimit(canteenErpMaterialSaveDTO.getInventoryLowerLimit()); + canteenStockMapper.insert(canteenStockEntity); + return insert; + } + + @Override + @Transactional + public Object updateById(CanteenErpMaterialEditorDTO canteenErpMaterialEditorDTO) { + Long id = canteenErpMaterialEditorDTO.getId(); + CanteenErpMaterialEntity canteenErpMaterialEntity = new CanteenErpMaterialEntity(); + canteenErpMaterialEntity.setId(id); + canteenErpMaterialEntity.setName(canteenErpMaterialEditorDTO.getName()); + canteenErpMaterialEntity.setUnit(canteenErpMaterialEditorDTO.getUnit()); + canteenErpMaterialEntity.setPurchasePrice(canteenErpMaterialEditorDTO.getPurchasePrice()); + canteenErpMaterialEntity.setCategoryId(canteenErpMaterialEditorDTO.getCategoryId()); + + LambdaQueryWrapper canteenStockEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + canteenStockEntityLambdaQueryWrapper.eq(CanteenStockEntity::getItemId, id); + CanteenStockEntity sourceCanteenStockEntity = canteenStockMapper.selectOne(canteenStockEntityLambdaQueryWrapper); + + CanteenStockEntity canteenStockEntity = new CanteenStockEntity(); + canteenStockEntity.setItemId(canteenErpMaterialEntity.getId()); + canteenStockEntity.setBaseStock(canteenErpMaterialEditorDTO.getBaseStock()); + canteenStockEntity.setCurrentStock(canteenErpMaterialEditorDTO.getBaseStock()+(sourceCanteenStockEntity.getCurrentStock()-sourceCanteenStockEntity.getBaseStock())); + canteenStockEntity.setInventoryUpperLimit(canteenErpMaterialEditorDTO.getInventoryUpperLimit()); + canteenStockEntity.setInventoryLowerLimit(canteenErpMaterialEditorDTO.getInventoryLowerLimit()); + int i = baseMapper.updateById(canteenErpMaterialEntity); + canteenStockMapper.update(canteenStockEntity, + new LambdaQueryWrapper().eq(CanteenStockEntity::getItemId, id)); + return i; + } + + @Override + public Page pageScope(Page page, CanteenErpMaterialEntity canteenErpMaterial) { + return baseMapper.selectPageDataByScope(page, canteenErpMaterial, DataScope.of()); + } + + + @Override + public CanteenErpMaterialVO getCanteenErpMaterialVOById(Long id) { + CanteenErpMaterialEntity canteenErpMaterialEntity = baseMapper.selectById(id); + LambdaQueryWrapper canteenStockEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + canteenStockEntityLambdaQueryWrapper.eq(CanteenStockEntity::getItemId, id); + CanteenStockEntity sourceCanteenStockEntity = canteenStockMapper.selectOne(canteenStockEntityLambdaQueryWrapper); + + CanteenErpMaterialVO canteenErpMaterialVO = new CanteenErpMaterialVO(); + canteenErpMaterialVO.setId(canteenErpMaterialEntity.getId()); + canteenErpMaterialVO.setName(canteenErpMaterialEntity.getName()); + canteenErpMaterialVO.setUnit(canteenErpMaterialEntity.getUnit()); + canteenErpMaterialVO.setBaseStock(sourceCanteenStockEntity.getBaseStock()); + canteenErpMaterialVO.setInventoryUpperLimit(sourceCanteenStockEntity.getInventoryUpperLimit()); + canteenErpMaterialVO.setInventoryLowerLimit(sourceCanteenStockEntity.getInventoryLowerLimit()); + canteenErpMaterialVO.setCurrentStock(sourceCanteenStockEntity.getCurrentStock()); + canteenErpMaterialVO.setPurchasePrice(canteenErpMaterialEntity.getPurchasePrice()); + canteenErpMaterialVO.setCategoryId(canteenErpMaterialEntity.getCategoryId()); + return canteenErpMaterialVO; + } + + @Override + public Page getErpMaterialPage(Page page, String name) { + LambdaQueryWrapper smErpUnitEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + smErpUnitEntityLambdaQueryWrapper.like(StringUtils.isNotBlank(name), CanteenErpMaterialEntity::getName, name); + Page spuPage = baseMapper.selectPageByScope(page, smErpUnitEntityLambdaQueryWrapper, DataScope.of()); + + // 将 SmErpSpuEntity 转换为 SmErpPageScopeVo + List voList = spuPage.getRecords().stream() + .map(entity -> BeanUtils.toBean(entity, ErpMaterialPageVo.class)) + .collect(Collectors.toList()); + + List materialIds = voList.stream().map(vo -> vo.getId()).collect(Collectors.toList()); + + // 批量查询库存信息 + List stocks = canteenStockMapper.selectList( + new LambdaQueryWrapper() + .in(CanteenStockEntity::getItemId, materialIds)); + + // 建立SPU ID与库存的映射关系 + Map stockMap = stocks.stream() + .collect(Collectors.toMap(CanteenStockEntity::getItemId, smErpStockEntity -> smErpStockEntity)); + + + voList.stream().forEach(vo -> { + //库存 + CanteenStockEntity smErpStockEntity = stockMap.get(vo.getId()); + vo.setStock(smErpStockEntity != null ? smErpStockEntity.getCurrentStock() : 0); + }); + + // 创建新的 Page 对象并设置数据 + Page resultPage = new Page<>(); + org.springframework.beans.BeanUtils.copyProperties(spuPage, resultPage); + resultPage.setRecords(voList); + return resultPage; + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenInventoryRecordsItemServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenInventoryRecordsItemServiceImpl.java new file mode 100644 index 000000000..a33e412d9 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenInventoryRecordsItemServiceImpl.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.canteen.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsItemEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenInventoryRecordsItemMapper; +import com.bsd.pjcloud.canteen.service.CanteenInventoryRecordsItemService; +import org.springframework.stereotype.Service; +/** + * 采购记录明细表 + * + * @author zjf + * @date 2025-05-07 17:02:53 + */ +@Service +public class CanteenInventoryRecordsItemServiceImpl extends ServiceImpl implements CanteenInventoryRecordsItemService { +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenInventoryRecordsServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenInventoryRecordsServiceImpl.java new file mode 100644 index 000000000..8cd7c150b --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenInventoryRecordsServiceImpl.java @@ -0,0 +1,287 @@ +package com.bsd.pjcloud.canteen.service.impl; + +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.constant.OrderTypeEnum; +import com.bsd.pjcloud.canteen.dto.erp.*; +import com.bsd.pjcloud.canteen.entity.CanteenErpMaterialEntity; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsEntity; +import com.bsd.pjcloud.canteen.entity.CanteenInventoryRecordsItemEntity; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordEntity; +import com.bsd.pjcloud.canteen.mapper.*; +import com.bsd.pjcloud.canteen.service.CanteenInventoryRecordsService; +import com.bsd.pjcloud.canteen.service.CanteenStockService; +import com.bsd.pjcloud.canteen.vo.erp.CanteenProductionRecordPageVO; +import com.bsd.pjcloud.canteen.vo.erp.InventoryRecordItemVo; +import com.bsd.pjcloud.canteen.vo.erp.InventoryRecordVo; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 采购记录表 + * + * @author zjf + * @date 2025-05-07 17:00:50 + */ +@Service +@AllArgsConstructor +public class CanteenInventoryRecordsServiceImpl extends ServiceImpl implements CanteenInventoryRecordsService { + + private final CanteenInventoryRecordsItemMapper canteenInventoryRecordsItemMapper; + + private final CanteenStockMapper canteenStockMapper; + + private final CanteenStockService canteenStockService; + + private final CanteenErpMaterialMapper canteenErpMaterialMapper; + @Override + @Transactional + public Object saveCanteenInventoryRecordsdDTO(CanteenInventoryRecordsdDTO canteenInventoryRecordsdDTO) { + + Long deptId = SecurityUtils.getUser().getDeptId(); + CanteenInventoryRecordsEntity canteenInventoryRecordsEntity= BeanUtils.toBean(canteenInventoryRecordsdDTO, CanteenInventoryRecordsEntity.class); + canteenInventoryRecordsEntity.setDeptId(deptId); + canteenInventoryRecordsEntity.setCheckStatus(TaskCheckStatusEnum.PADDING.getCode()); +// canteenInventoryRecordsEntity.setCheckStatus(TaskCheckStatusEnum.RESULT.getCode()); + baseMapper.insert(canteenInventoryRecordsEntity); + Long id = canteenInventoryRecordsEntity.getId(); + + List canteenInventoryRecordsItemDTOS = canteenInventoryRecordsdDTO.getItems(); + List canteenInventoryRecordsItemEntityList = BeanUtils.toBean(canteenInventoryRecordsItemDTOS, CanteenInventoryRecordsItemEntity.class); + + +// List updateStockDTOS = new ArrayList<>(); + for (CanteenInventoryRecordsItemEntity canteenInventoryRecordsItemEntity : canteenInventoryRecordsItemEntityList){ + canteenInventoryRecordsItemEntity.setInventoryId(id); + canteenInventoryRecordsItemEntity.setDeptId(deptId); + String orderType = canteenInventoryRecordsEntity.getOrderType(); + canteenInventoryRecordsItemEntity.setOrderType(orderType); +// UpdateStockDTO updateStockDTO = new UpdateStockDTO(); +// updateStockDTO.setId(canteenInventoryRecordsItemEntity.getErpMaterialId()); + Double quantity = canteenInventoryRecordsItemEntity.getQuantity(); +// if (orderType.equals(OrderTypeEnum.RK.getType())){ +// updateStockDTO.setIncrCount(quantity); +// }else if (orderType.equals(OrderTypeEnum.CK.getType())){ +// updateStockDTO.setIncrCount(-quantity); +// }else if (orderType.equals(OrderTypeEnum.No.getType())){ + //无需更新库存 +// }else { +// throw new RuntimeException("订单类型错误"); +// } +// updateStockDTOS.add(updateStockDTO); + } + + canteenInventoryRecordsItemMapper.insert(canteenInventoryRecordsItemEntityList); + +// if (!CollectionUtils.isEmpty(updateStockDTOS)){ +// canteenStockService.updateStock(updateStockDTOS); +// } + + return id; + } + + @Override + public Page pageScope(Page page, CanteenInventoryRecordsEntity canteenInventoryRecords) { + + return baseMapper.selectPageDataByScope(page,canteenInventoryRecords, DataScope.of()); + } + + @Override + public Object updateByCanteenInventoryRecordEditDTO(CanteenInventoryRecordEditDTO canteenInventoryRecordEditDTO) { + CanteenInventoryRecordsEntity smErpInventoryRecordsEntity = BeanUtils.toBean(canteenInventoryRecordEditDTO, CanteenInventoryRecordsEntity.class); + int i = baseMapper.updateById(smErpInventoryRecordsEntity); + List items = canteenInventoryRecordEditDTO.getItems(); + List updateStockDTOS = new ArrayList<>(); + List CanteenInventoryRecordsItemEntityList = new ArrayList<>(); + + for (CanteenInventoryRecordEditItemDTO item : items){ + CanteenInventoryRecordsItemEntity CanteenInventoryRecordsItemEntity = new CanteenInventoryRecordsItemEntity(); + org.springframework.beans.BeanUtils.copyProperties(item,CanteenInventoryRecordsItemEntity); + //库存更新对象 + UpdateStockDTO updateStockDTO = new UpdateStockDTO(); + updateStockDTO.setId(item.getErpMaterialId()); + Double quantity = item.getQuantity(); + String orderType = smErpInventoryRecordsEntity.getOrderType(); + CanteenInventoryRecordsItemEntity.setOrderType(orderType); + if (orderType.equals(OrderTypeEnum.RK.getType())){ + updateStockDTO.setIncrCount(quantity); + }else if (orderType.equals(OrderTypeEnum.CK.getType())){ + updateStockDTO.setIncrCount(-quantity); + }else { + throw new RuntimeException("订单类型错误"); + } + CanteenInventoryRecordsItemEntityList.add(CanteenInventoryRecordsItemEntity); + updateStockDTOS.add(updateStockDTO); + + } + + + List insertItems = CanteenInventoryRecordsItemEntityList.stream(). + filter(CanteenInventoryRecordsItemEntity -> CanteenInventoryRecordsItemEntity.getId() == null).collect(Collectors.toList()); + insertItems.forEach(item -> {item.setInventoryId(smErpInventoryRecordsEntity.getId());}); + List updateItems = CanteenInventoryRecordsItemEntityList.stream(). + filter(CanteenInventoryRecordsItemEntity -> CanteenInventoryRecordsItemEntity.getId() != null).collect(Collectors.toList()); + + + //更新的话,查询之前保存了哪些item,然后去库存表删掉从新计算库存 + List dataBaseCanteenInventoryRecordsItemEntityList = canteenInventoryRecordsItemMapper + .selectList(new LambdaQueryWrapper().eq(CanteenInventoryRecordsItemEntity::getInventoryId, canteenInventoryRecordEditDTO.getId())); + + //这部分是数据库原本添加的库存数据,需要全部减掉,重新添加更新的库存数据进去 + dataBaseCanteenInventoryRecordsItemEntityList.forEach(item -> { + UpdateStockDTO updateStockDTO = new UpdateStockDTO(); + updateStockDTO.setId(item.getErpMaterialId()); + updateStockDTO.setIncrCount(-item.getQuantity()); + updateStockDTOS.add(updateStockDTO); + }); + + + + List existingCodeIds = canteenInventoryRecordsItemMapper.selectList( + new LambdaQueryWrapper() + .eq(CanteenInventoryRecordsItemEntity::getInventoryId, smErpInventoryRecordsEntity.getId()) + ).stream().map(CanteenInventoryRecordsItemEntity::getId).collect(Collectors.toList()); + + // 收集本次提交的ID(排除新增的) + List submittedCodeIds = updateItems.stream() + .map(CanteenInventoryRecordsItemEntity::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 计算需要删除的ID + List toDeleteCodeIds = existingCodeIds.stream() + .filter(id -> !submittedCodeIds.contains(id)) + .collect(Collectors.toList()); + + canteenInventoryRecordsItemMapper.updateById(updateItems); + canteenInventoryRecordsItemMapper.insert(insertItems); + // 批量删除失效 + if (!toDeleteCodeIds.isEmpty()) { + canteenInventoryRecordsItemMapper.deleteByIds(toDeleteCodeIds); + } + //更新库存 + if (!CollectionUtils.isEmpty(updateStockDTOS)){ + canteenStockService.updateStock(updateStockDTOS); + } + + return i; + } + + @Override + public Object getInventoryDetailById(Long id) { + CanteenInventoryRecordsEntity smErpInventoryRecordsEntity = this.getById(id); + List list =canteenInventoryRecordsItemMapper.selectList(new LambdaQueryWrapper() + .eq(CanteenInventoryRecordsItemEntity::getInventoryId, id)); + + InventoryRecordVo bean = BeanUtils.toBean(smErpInventoryRecordsEntity, InventoryRecordVo.class, (source) -> { + List smeErpCgPlanItemVos = BeanUtils.toBean(list, InventoryRecordItemVo.class); + smeErpCgPlanItemVos.stream().forEach(item -> { + CanteenErpMaterialEntity canteenErpMaterialEntity = canteenErpMaterialMapper.selectById(item.getErpMaterialId()); + item.setName(canteenErpMaterialEntity.getName()); + }); + source.setItems(smeErpCgPlanItemVos); + }); + + return bean; + } + + @Override + public Object removeBatch(List list) { + //首先先查询是否有当前数据权限 + LambdaQueryWrapper eq = new LambdaQueryWrapper() + .in(CanteenInventoryRecordsEntity::getId, list); + List smErpCgDdEntities = baseMapper.selectListByScope(eq,DataScope.of()); + List delIds= smErpCgDdEntities.stream().map(smErpCgDdEntity -> smErpCgDdEntity.getId()).collect(Collectors.toList()); + + LambdaQueryWrapper itemEntityLambdaQueryWrapper = new LambdaQueryWrapper() + .in(CanteenInventoryRecordsItemEntity::getInventoryId, delIds); + //要删除的item + List items = canteenInventoryRecordsItemMapper.selectList(itemEntityLambdaQueryWrapper); + canteenInventoryRecordsItemMapper.delete(itemEntityLambdaQueryWrapper); + baseMapper.deleteByIds(delIds); + List toDeleteIds = delIds.stream() + .filter(id -> !list.contains(id)) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(toDeleteIds)){ + return R.failed("越权删除!"); + } + //删除之前入库的库存 + List updateStockDTOS = new ArrayList<>(); + for (CanteenInventoryRecordsItemEntity item : items){ + //库存更新对象 + UpdateStockDTO updateStockDTO = new UpdateStockDTO(); + updateStockDTO.setId(item.getErpMaterialId()); + Double quantity = item.getQuantity(); + String orderType = item.getOrderType(); + //入库的删除就是减去入的库存,所以是负数 + if (orderType.equals(OrderTypeEnum.RK.getType())){ + updateStockDTO.setIncrCount(-quantity); + }else if (orderType.equals(OrderTypeEnum.CK.getType())){ + updateStockDTO.setIncrCount(quantity); + }else { + throw new RuntimeException("订单类型错误"); + } + updateStockDTOS.add(updateStockDTO); + } + canteenStockService.updateStock(updateStockDTOS); + return R.ok(); + } + + + /** + * 采购验收 + * @param id + * @return + */ + @Override + public void ys(Long id) { + CanteenInventoryRecordsEntity canteenInventoryRecordsEntity = baseMapper.selectById(id); + LambdaQueryWrapper canteenInventoryRecordsItemEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + canteenInventoryRecordsItemEntityLambdaQueryWrapper.eq(CanteenInventoryRecordsItemEntity::getInventoryId, id); + List canteenInventoryRecordsItemEntityList = canteenInventoryRecordsItemMapper.selectList(canteenInventoryRecordsItemEntityLambdaQueryWrapper); + + + List updateStockDTOS = new ArrayList<>(); + for (CanteenInventoryRecordsItemEntity canteenInventoryRecordsItemEntity : canteenInventoryRecordsItemEntityList){ + String orderType = canteenInventoryRecordsEntity.getOrderType(); + canteenInventoryRecordsItemEntity.setOrderType(orderType); + UpdateStockDTO updateStockDTO = new UpdateStockDTO(); + updateStockDTO.setId(canteenInventoryRecordsItemEntity.getErpMaterialId()); + Double quantity = canteenInventoryRecordsItemEntity.getQuantity(); + if (orderType.equals(OrderTypeEnum.RK.getType())){ + updateStockDTO.setIncrCount(quantity); + }else if (orderType.equals(OrderTypeEnum.CK.getType())){ + updateStockDTO.setIncrCount(-quantity); + }else if (orderType.equals(OrderTypeEnum.No.getType())){ + //无需更新库存 + }else { + throw new RuntimeException("订单类型错误"); + } + updateStockDTOS.add(updateStockDTO); + } + + if (!CollectionUtils.isEmpty(updateStockDTOS)){ + canteenStockService.updateStock(updateStockDTOS); + CanteenInventoryRecordsEntity updateCanteenInventoryRecordsEntity = new CanteenInventoryRecordsEntity(); + updateCanteenInventoryRecordsEntity.setCheckStatus(TaskCheckStatusEnum.RESULT.getCode()); + updateCanteenInventoryRecordsEntity.setId(id); + updateCanteenInventoryRecordsEntity.setCheckTime(LocalDateTime.now()); + updateCanteenInventoryRecordsEntity.setCheckUserId(SecurityUtils.getUser().getId()); + baseMapper.updateById(canteenInventoryRecordsEntity); + } + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionRecordItemServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionRecordItemServiceImpl.java new file mode 100644 index 000000000..94dd8f8e1 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionRecordItemServiceImpl.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.canteen.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordItemEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenProductionRecordItemMapper; +import com.bsd.pjcloud.canteen.service.CanteenProductionRecordItemService; +import org.springframework.stereotype.Service; +/** + * 食材加工记录明细表 + * + * @author zjf + * @date 2025-05-08 11:05:02 + */ +@Service +public class CanteenProductionRecordItemServiceImpl extends ServiceImpl implements CanteenProductionRecordItemService { +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionRecordServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionRecordServiceImpl.java new file mode 100644 index 000000000..0a711b1d6 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionRecordServiceImpl.java @@ -0,0 +1,87 @@ +package com.bsd.pjcloud.canteen.service.impl; + +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.erp.CanteenProductRecordSaveDTO; +import com.bsd.pjcloud.canteen.dto.erp.UpdateStockDTO; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordEntity; +import com.bsd.pjcloud.canteen.entity.CanteenProductionRecordItemEntity; +import com.bsd.pjcloud.canteen.entity.ProductionRecordItemRelationEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenProductionRecordItemMapper; +import com.bsd.pjcloud.canteen.mapper.CanteenProductionRecordMapper; +import com.bsd.pjcloud.canteen.mapper.ProductionRecordItemRelationMapper; +import com.bsd.pjcloud.canteen.service.CanteenProductionRecordService; +import com.bsd.pjcloud.canteen.service.CanteenStockService; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 食材加工记录表 + * + * @author zjf + * @date 2025-05-08 11:02:09 + */ +@Service +@AllArgsConstructor +public class CanteenProductionRecordServiceImpl extends ServiceImpl implements CanteenProductionRecordService { + + private final CanteenProductionRecordItemMapper canteenProductionRecordItemMapper; + + private final ProductionRecordItemRelationMapper productionRecordItemRelationMapper; + + private final CanteenStockService canteenStockService; + + @Override + public Object pageScope(Page page, LambdaQueryWrapper wrapper) { + return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + } + + @Override + @Transactional + public Object saveCanteenProductRecordSaveDTO(CanteenProductRecordSaveDTO canteenProductRecordSaveDTO) { + CanteenProductionRecordEntity canteenProductionRecord = BeanUtils.toBean(canteenProductRecordSaveDTO, CanteenProductionRecordEntity.class); + List productionDetailList = canteenProductRecordSaveDTO.getProductionDetailList(); + + canteenProductionRecord.setDeptId(SecurityUtils.getUser().getDeptId()); + int insert = baseMapper.insert(canteenProductionRecord); + List materialUpdateStockDTOS = new ArrayList<>(); + List dishUpdateStockDTOS = new ArrayList<>(); + + for (CanteenProductRecordSaveDTO.ProductionDetail item: productionDetailList){ + CanteenProductionRecordItemEntity canteenProductionRecordItemEntity = BeanUtils.toBean(item, CanteenProductionRecordItemEntity.class); + canteenProductionRecordItemEntity.setRecordId(canteenProductionRecord.getId()); + canteenProductionRecordItemMapper.insert(canteenProductionRecordItemEntity); + UpdateStockDTO dishUpdateStockDTO = new UpdateStockDTO(); + dishUpdateStockDTO.setId(item.getDishId()); + dishUpdateStockDTO.setIncrCount(item.getProduceQuantity()); + dishUpdateStockDTOS.add(dishUpdateStockDTO); + + List materialDetailList = item.getMaterialDetailList(); + List productionRecordItemRelationEntities = BeanUtils.toBean(materialDetailList, ProductionRecordItemRelationEntity.class); + for (ProductionRecordItemRelationEntity materialDetailListItem: productionRecordItemRelationEntities){ + materialDetailListItem.setRecordItemId(canteenProductionRecordItemEntity.getId()); + UpdateStockDTO updateStockDTO = new UpdateStockDTO(); + updateStockDTO.setId(materialDetailListItem.getMaterialId()); + updateStockDTO.setIncrCount(-materialDetailListItem.getActualUsage()); + materialUpdateStockDTOS.add(updateStockDTO); + } + productionRecordItemRelationMapper.insert(productionRecordItemRelationEntities); + } + + //食材出库 + canteenStockService.updateStock(materialUpdateStockDTOS); + + //菜品入库 + canteenStockService.updateStock(dishUpdateStockDTOS); + return insert; + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionTemplateDetailServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionTemplateDetailServiceImpl.java new file mode 100644 index 000000000..b162c1482 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionTemplateDetailServiceImpl.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.canteen.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateDetailEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenProductionTemplateDetailMapper; +import com.bsd.pjcloud.canteen.service.CanteenProductionTemplateDetailService; +import org.springframework.stereotype.Service; +/** + * 加工模版明细表 + * + * @author zjf + * @date 2025-05-12 13:53:57 + */ +@Service +public class CanteenProductionTemplateDetailServiceImpl extends ServiceImpl implements CanteenProductionTemplateDetailService { +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionTemplateServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionTemplateServiceImpl.java new file mode 100644 index 000000000..2147d855b --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenProductionTemplateServiceImpl.java @@ -0,0 +1,156 @@ +package com.bsd.pjcloud.canteen.service.impl; + +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.entity.CanteenErpMaterialEntity; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateEntity; +import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenErpMaterialMapper; +import com.bsd.pjcloud.canteen.mapper.CanteenProductionTemplateMapper; +import com.bsd.pjcloud.canteen.mapper.CanteenSpuMapper; +import com.bsd.pjcloud.canteen.service.CanteenProductionTemplateService; +import com.bsd.pjcloud.canteen.vo.erp.ProductTemplateVO; +import com.bsd.pjcloud.canteen.vo.erp.ProductionTemplateDetailVO; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsd.pjcloud.canteen.entity.CanteenProductionTemplateDetailEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenProductionTemplateDetailMapper; +import org.springframework.transaction.annotation.Transactional; +import lombok.RequiredArgsConstructor; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 加工模版表 + * + * @author zjf + * @date 2025-05-12 13:41:26 + */ +@Service +@RequiredArgsConstructor +public class CanteenProductionTemplateServiceImpl extends ServiceImpl implements CanteenProductionTemplateService { + private final CanteenProductionTemplateDetailMapper canteenProductionTemplateDetailMapper; + private final CanteenSpuMapper canteenSpuMapper; + private final CanteenErpMaterialMapper canteenErpMaterialMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveDeep(CanteenProductionTemplateEntity canteenProductionTemplate) { + baseMapper.insert(canteenProductionTemplate); + for (CanteenProductionTemplateDetailEntity canteenProductionTemplateDetail : canteenProductionTemplate.getCanteenProductionTemplateDetailList()) { + canteenProductionTemplateDetail.setTemplateId(canteenProductionTemplate.getId()); + canteenProductionTemplateDetailMapper.insert( canteenProductionTemplateDetail); + } + + return Boolean.TRUE; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateDeep(CanteenProductionTemplateEntity canteenProductionTemplate) { + baseMapper.updateById(canteenProductionTemplate); + for (CanteenProductionTemplateDetailEntity canteenProductionTemplateDetail : canteenProductionTemplate.getCanteenProductionTemplateDetailList()) { + if (Objects.isNull(canteenProductionTemplateDetail.getId())) { + canteenProductionTemplateDetail.setTemplateId(canteenProductionTemplate.getId()); + canteenProductionTemplateDetailMapper.insert(canteenProductionTemplateDetail); + } else { + canteenProductionTemplateDetailMapper.updateById(canteenProductionTemplateDetail); + } + } + return Boolean.TRUE; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean removeDeep(Long[] ids) { + baseMapper.deleteBatchIds(CollUtil.toList(ids)); + canteenProductionTemplateDetailMapper.delete(Wrappers.lambdaQuery().in(CanteenProductionTemplateDetailEntity::getTemplateId, ids)); + return Boolean.TRUE; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean removeChild(Long[] ids) { + canteenProductionTemplateDetailMapper.deleteBatchIds(CollUtil.toList(ids)); + return Boolean.TRUE; + } + + @Override + public ProductTemplateVO getDetailById(Long id) { + CanteenProductionTemplateEntity canteenProductionTemplateEntity = baseMapper.selectById(id); + Long dishId = canteenProductionTemplateEntity.getDishId(); + CanteenSpuEntity canteenSpuEntity = canteenSpuMapper.selectById(dishId); + LambdaQueryWrapper canteenProductionTemplateDetailEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + canteenProductionTemplateDetailEntityLambdaQueryWrapper.eq(CanteenProductionTemplateDetailEntity::getTemplateId, id); + List canteenProductionTemplateDetailEntities = canteenProductionTemplateDetailMapper.selectList(canteenProductionTemplateDetailEntityLambdaQueryWrapper); + ProductTemplateVO bean = BeanUtils.toBean(canteenProductionTemplateEntity, ProductTemplateVO.class); + bean.setDishName(canteenSpuEntity.getName()); + List productionTemplateDetailVOList= BeanUtils.toBean(canteenProductionTemplateDetailEntities, ProductionTemplateDetailVO.class); + for (ProductionTemplateDetailVO productionTemplateDetailVO : productionTemplateDetailVOList) { + Long materialId = productionTemplateDetailVO.getMaterialId(); + CanteenErpMaterialEntity canteenErpMaterialEntity = canteenErpMaterialMapper.selectById(materialId); + productionTemplateDetailVO.setMaterialName(canteenErpMaterialEntity.getName()); + productionTemplateDetailVO.setUnit(canteenErpMaterialEntity.getUnit()); + } + bean.setCanteenProductionTemplateDetailList(productionTemplateDetailVOList); + return bean; + } + + @Override + public Object pageScope(Page page, LambdaQueryWrapper wrapper) { + Page pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of()); +// pageData.getRecords().forEach(item->{ +// }); + return pageData; + } + + @Override + public Object getSelectTemplatePageScope(Page page, String name) { + Page pageData = baseMapper.selectPageByScope(page, Wrappers.lambdaQuery().like(StringUtils.isNotBlank(name),CanteenProductionTemplateEntity::getTemplateName, name), DataScope.of()); + List records = pageData.getRecords(); + if (CollectionUtils.isEmpty(records)){ + return pageData; + } + List canteenProductionTemplateVOList = BeanUtils.toBean(records, ProductTemplateVO.class); + Set distinctIds = canteenProductionTemplateVOList.stream().map(ProductTemplateVO::getDishId).collect(Collectors.toSet()); + List templateIds = canteenProductionTemplateVOList.stream().map(ProductTemplateVO::getId).collect(Collectors.toList()); + List canteenSpuEntities = canteenSpuMapper.selectByIds(distinctIds); + Map dishMap = canteenSpuEntities.stream() + .collect(Collectors.toMap(CanteenSpuEntity::getId, entity -> entity)); + + List canteenProductionTemplateDetailEntities = canteenProductionTemplateDetailMapper.selectList(Wrappers.lambdaQuery().in(CanteenProductionTemplateDetailEntity::getTemplateId, templateIds)); + Set materialIds = canteenProductionTemplateDetailEntities.stream().map(CanteenProductionTemplateDetailEntity::getMaterialId).collect(Collectors.toSet()); + List canteenErpMaterialEntities = canteenErpMaterialMapper.selectByIds(materialIds); + + Map materialMap = canteenErpMaterialEntities.stream() + .collect(Collectors.toMap(CanteenErpMaterialEntity::getId, entity -> entity)); + + + Page productTemplateVOPage = new Page<>(); + List productionTemplateDetailVOList = BeanUtils.toBean(canteenProductionTemplateDetailEntities, ProductionTemplateDetailVO.class); + productionTemplateDetailVOList.forEach(item->{ + item.setMaterialName(materialMap.getOrDefault(item.getMaterialId(), new CanteenErpMaterialEntity()).getName()); + item.setUnit(materialMap.getOrDefault(item.getMaterialId(), new CanteenErpMaterialEntity()).getUnit()); + }); + Map> detailMap = productionTemplateDetailVOList.stream() + .collect(Collectors.groupingBy(ProductionTemplateDetailVO::getTemplateId)); + + canteenProductionTemplateVOList.forEach(item-> { + item.setDishName(dishMap.getOrDefault(item.getDishId(), new CanteenSpuEntity()).getName()); + item.setCanteenProductionTemplateDetailList(detailMap.getOrDefault(item.getId(), new ArrayList<>())); + }); + productTemplateVOPage.setRecords(canteenProductionTemplateVOList); + productTemplateVOPage.setTotal(pageData.getTotal()); + productTemplateVOPage.setPages(pageData.getPages()); + productTemplateVOPage.setCurrent(pageData.getCurrent()); + return productTemplateVOPage; + + } +} \ No newline at end of file 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 55482a806..375ce5e0d 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 @@ -11,12 +11,17 @@ import com.bsd.pjcloud.canteen.entity.CanteenCategoryEntity; import com.bsd.pjcloud.canteen.entity.CanteenDailyMenuEntity; import com.bsd.pjcloud.canteen.entity.CanteenOnlineSpuEntity; import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; +import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; import com.bsd.pjcloud.canteen.mapper.CanteenCategoryMapper; import com.bsd.pjcloud.canteen.mapper.CanteenDailyMenuMapper; import com.bsd.pjcloud.canteen.mapper.CanteenSpuMapper; +import com.bsd.pjcloud.canteen.mapper.CanteenStockMapper; import com.bsd.pjcloud.canteen.service.CanteenDailyMenuService; import com.bsd.pjcloud.canteen.service.CanteenSpuService; +import com.bsd.pjcloud.canteen.service.CanteenStockService; import com.bsd.pjcloud.canteen.vo.ADCanteenSpuListVO; +import com.bsd.pjcloud.canteen.vo.erp.CanteenSpuSimpleVO; +import com.bsd.pjcloud.canteen.vo.erp.CanteenSpuStockVO; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; @@ -26,6 +31,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -44,6 +50,7 @@ public class CanteenSpuServiceImpl extends ServiceImpl wrapper) { return baseMapper.selectListByScope(wrapper, DataScope.of()); @@ -133,5 +140,93 @@ public class CanteenSpuServiceImpl extends ServiceImpl getCanteenSpuSimplePageScope(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()); + List canteenSpuSimpleVOList = BeanUtils.toBean(pageData.getRecords(), CanteenSpuSimpleVO.class); + Page canteenSpuSimpleVOPage = new Page<>(); + canteenSpuSimpleVOPage.setRecords(canteenSpuSimpleVOList); + pageData.setCurrent(pageData.getCurrent()); + canteenSpuSimpleVOPage.setPages(pageData.getPages()); + canteenSpuSimpleVOPage.setSize(pageData.getSize()); + canteenSpuSimpleVOPage.setTotal(pageData.getTotal()); + // 复制分页参数 + return canteenSpuSimpleVOPage; + } + + @Override + public Page erpPageScope(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); + + // 查询SPU分页数据 + Page pageData = baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + List records = pageData.getRecords(); + + // 构建返回的VO列表 + List resultList = new ArrayList<>(); + + if (!CollectionUtils.isEmpty(records)) { + // 获取所有SPU ID + List spuIds = records.stream() + .map(CanteenSpuEntity::getId) + .collect(Collectors.toList()); + + // 查询对应的库存信息 + LambdaQueryWrapper stockWrapper = Wrappers.lambdaQuery(); + stockWrapper.in(CanteenStockEntity::getItemId, spuIds); + stockWrapper.eq(CanteenStockEntity::getItemType, "2"); // 假设"成品"表示菜品的类型 + List stockList = canteenStockMapper.selectList(stockWrapper); + + // 将库存信息映射到SPU ID + Map stockMap = stockList.stream() + .collect(Collectors.toMap(CanteenStockEntity::getItemId, stock -> stock, (v1, v2) -> v1)); + + // 构建返回结果 + for (CanteenSpuEntity spu : records) { + CanteenSpuStockVO vo = new CanteenSpuStockVO(); + vo.setName(spu.getName()); + vo.setPicUrl(spu.getPicUrl()); + + // 设置库存信息 + CanteenStockEntity stock = stockMap.get(spu.getId()); + if (stock != null) { + vo.setId(stock.getId()); + vo.setBaseStock(stock.getBaseStock()); + vo.setCurrentStock(stock.getCurrentStock()); + vo.setInventoryUpperLimit(stock.getInventoryUpperLimit()); + vo.setInventoryLowerLimit(stock.getInventoryLowerLimit()); + } else { + // 如果没有对应的库存记录,则设置默认值 + vo.setBaseStock(0.0); + vo.setCurrentStock(0.0); + vo.setInventoryUpperLimit(0); + vo.setInventoryLowerLimit(0); + } + + resultList.add(vo); + } + } + + // 构建分页返回对象 + Page resultPage = new Page<>(); + resultPage.setRecords(resultList); + resultPage.setTotal(pageData.getTotal()); + resultPage.setSize(pageData.getSize()); + resultPage.setCurrent(pageData.getCurrent()); + resultPage.setPages(pageData.getPages()); + + return resultPage; + } + + + } \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenStockServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenStockServiceImpl.java new file mode 100644 index 000000000..f109d0a5d --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenStockServiceImpl.java @@ -0,0 +1,66 @@ +package com.bsd.pjcloud.canteen.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.canteen.dto.erp.UpdateStockDTO; +import com.bsd.pjcloud.canteen.entity.CanteenErpMaterialEntity; +import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; +import com.bsd.pjcloud.canteen.entity.CanteenStockEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenErpMaterialMapper; +import com.bsd.pjcloud.canteen.mapper.CanteenStockMapper; +import com.bsd.pjcloud.canteen.service.CanteenStockService; +import lombok.AllArgsConstructor; +import org.springframework.dao.OptimisticLockingFailureException; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 库存表 + * + * @author zjf + * @date 2025-05-07 16:40:35 + */ +@Service +@AllArgsConstructor +public class CanteenStockServiceImpl extends ServiceImpl implements CanteenStockService { + + + private final CanteenErpMaterialMapper canteenErpMaterialMapper; + + @Override + @Transactional +// @Retryable(value = {OptimisticLockingFailureException.class}, maxAttempts = 3) + public void updateStock(List updateStockDTOS) { + // 更新库存(手动乐观锁) + for (UpdateStockDTO item : updateStockDTOS) { + // 1. 先查询当前版本号 + LambdaQueryWrapper stockEntityLambdaQueryWrapper = new LambdaQueryWrapper(); + stockEntityLambdaQueryWrapper.eq(CanteenStockEntity::getItemId,item.getId()); + CanteenStockEntity smErpStockEntity = baseMapper.selectOne(stockEntityLambdaQueryWrapper); + + LambdaQueryWrapper updateStockWithLockWrapper = new LambdaQueryWrapper(); + updateStockWithLockWrapper.eq(CanteenStockEntity::getItemId,item.getId()); + updateStockWithLockWrapper.eq(CanteenStockEntity::getVersion,smErpStockEntity.getVersion()); + CanteenStockEntity updateSmErpStockEntity = new CanteenStockEntity(); + Double currentStock = smErpStockEntity.getCurrentStock(); + if (item.getIncrCount()<0 &¤tStock canteenErpMaterialEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + canteenErpMaterialEntityLambdaQueryWrapper.eq(CanteenErpMaterialEntity::getId,item.getId()); + CanteenErpMaterialEntity canteenErpMaterialEntity = canteenErpMaterialMapper.selectOne(canteenErpMaterialEntityLambdaQueryWrapper); + throw new RuntimeException(canteenErpMaterialEntity.getName()+"库存不足"); + } + updateSmErpStockEntity.setCurrentStock(currentStock +item.getIncrCount()); + updateSmErpStockEntity.setVersion(smErpStockEntity.getVersion()+1); + int update = baseMapper.update(updateSmErpStockEntity, updateStockWithLockWrapper); + // 3. 检查更新结果 + if (update == 0) { + throw new RuntimeException("库存更新冲突,请重试操作"); + } + } + + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSupplierServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSupplierServiceImpl.java new file mode 100644 index 000000000..1b664169d --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/CanteenSupplierServiceImpl.java @@ -0,0 +1,38 @@ +package com.bsd.pjcloud.canteen.service.impl; + +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.entity.CanteenSupplierEntity; +import com.bsd.pjcloud.canteen.mapper.CanteenSupplierMapper; +import com.bsd.pjcloud.canteen.service.CanteenSupplierService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 货商信息 + * + * @author zjf + * @date 2025-05-09 13:18:19 + */ +@Service +@AllArgsConstructor +public class CanteenSupplierServiceImpl extends ServiceImpl implements CanteenSupplierService { + @Override + public Object pageScope(Page page, LambdaQueryWrapper wrapper) { + return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + } + + @Override + public List selectSimpleAllScope(String name, Long supplierId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); + wrapper.eq(CanteenSupplierEntity::getStatus, "0"); + wrapper.like(StringUtils.isNotBlank(name),CanteenSupplierEntity::getSupplierName,name); + wrapper.eq(supplierId!=null,CanteenSupplierEntity::getSupplierId,supplierId); + return baseMapper.selectListByScope(wrapper, DataScope.of()); + } +} \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/ProductionRecordItemRelationServiceImpl.java b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/ProductionRecordItemRelationServiceImpl.java new file mode 100644 index 000000000..a551584b3 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/java/com/bsd/pjcloud/canteen/service/impl/ProductionRecordItemRelationServiceImpl.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.canteen.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.canteen.entity.ProductionRecordItemRelationEntity; +import com.bsd.pjcloud.canteen.mapper.ProductionRecordItemRelationMapper; +import com.bsd.pjcloud.canteen.service.ProductionRecordItemRelationService; +import org.springframework.stereotype.Service; +/** + * 食材加工菜品关系表 + * + * @author zjf + * @date 2025-05-14 12:47:16 + */ +@Service +public class ProductionRecordItemRelationServiceImpl extends ServiceImpl implements ProductionRecordItemRelationService { +} \ No newline at end of file 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 e456c331c..f47debe6c 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 @@ -2,8 +2,7 @@ - - + @@ -16,7 +15,7 @@ - + @@ -27,28 +26,29 @@ + @@ -62,6 +62,7 @@ sp.price, sp.stock, sp.category_id, + sp.sort, t.dept_id, t.create_by FROM canteen_daily_menu t @@ -83,22 +84,23 @@ - SELECT m.id, - m.hour_type, - s.id as spu_id, - s.`name`, - s.price, - s.stock, - s.pic_url, - s.sort, - s.is_show, - c.id as category_id + m.hour_type, + s.id as spu_id, + s.`name`, + s.price, + s.stock, + s.pic_url, + s.sort, + s.is_show, + c.id as category_id FROM `canteen_daily_menu` m - left JOIN canteen_spu s - on m.spu_id = s.id - LEFT JOIN canteen_category c - on s.category_id = c.id + left JOIN canteen_spu s + on m.spu_id = s.id + LEFT JOIN canteen_category c + on s.category_id = c.id m.del_flag = 0 and s.del_flag = 0 and m.merchant_id = #{dailyMenuDTO.merchantId} and s.is_show = 0 @@ -112,6 +114,5 @@ order by s.sort asc - \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenErpCategoryMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenErpCategoryMapper.xml new file mode 100644 index 000000000..7ac0fc16c --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenErpCategoryMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenErpMaterialMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenErpMaterialMapper.xml new file mode 100644 index 000000000..aa126d214 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenErpMaterialMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenInventoryRecordsItemMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenInventoryRecordsItemMapper.xml new file mode 100644 index 000000000..974a508dd --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenInventoryRecordsItemMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenInventoryRecordsMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenInventoryRecordsMapper.xml new file mode 100644 index 000000000..6642f9a29 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenInventoryRecordsMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionRecordItemMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionRecordItemMapper.xml new file mode 100644 index 000000000..c7941d081 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionRecordItemMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionRecordMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionRecordMapper.xml new file mode 100644 index 000000000..69cb17355 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionRecordMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionTemplateDetailMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionTemplateDetailMapper.xml new file mode 100644 index 000000000..c7d65b365 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionTemplateDetailMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionTemplateMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionTemplateMapper.xml new file mode 100644 index 000000000..fee5abfc2 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenProductionTemplateMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenStockMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenStockMapper.xml new file mode 100644 index 000000000..0c77b7d6b --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenStockMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenSupplierMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenSupplierMapper.xml new file mode 100644 index 000000000..4cb1bdfb7 --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/CanteenSupplierMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/ProductionRecordItemRelationMapper.xml b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/ProductionRecordItemRelationMapper.xml new file mode 100644 index 000000000..4995d933f --- /dev/null +++ b/pjcloud-canteen/pjcloud-canteen-biz/src/main/resources/mapper/ProductionRecordItemRelationMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java index a497f05ae..c1bee2b88 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java @@ -145,4 +145,8 @@ public interface CacheConstants { String THIRDPARTY_ZY_SELF_TOKEN = "thirdparty:zy:self_token:"; /* ************************************* end 第三方对接相关 end ************************************* */ + + + /** mfa */ + String SMS_CODE_KEY="sms_code:"; } 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 e65f74aad..62cccee7b 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 @@ -10,6 +10,7 @@ public enum MerchantTypeEnum { CANTEEN("1", "自营食堂"), SUPERMARKET("2", "合作商家"), SELF_SUPERMARKET("3", "自营商家"), + THIRD_APP("4", "第三方应用"), ; /** diff --git a/pjcloud-flow/pjcloud-flow-engine/pjcloud-flow-engine-biz/src/main/java/com/bsd/pjcloud/flow/engine/controller/EngineFlowController.java b/pjcloud-flow/pjcloud-flow-engine/pjcloud-flow-engine-biz/src/main/java/com/bsd/pjcloud/flow/engine/controller/EngineFlowController.java index 007404cbf..573785ecd 100644 --- a/pjcloud-flow/pjcloud-flow-engine/pjcloud-flow-engine-biz/src/main/java/com/bsd/pjcloud/flow/engine/controller/EngineFlowController.java +++ b/pjcloud-flow/pjcloud-flow-engine/pjcloud-flow-engine-biz/src/main/java/com/bsd/pjcloud/flow/engine/controller/EngineFlowController.java @@ -304,7 +304,7 @@ public class EngineFlowController { long count = taskQuery.count(); if (count != 1) { log.debug("queryAssignTaskOne查询错误,count!=1,processInstanceId:{}", processInstanceId); - return null; + return R.failed(); } Task task = taskQuery.singleResult(); String taskId = task.getId(); diff --git a/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/api/feign/RemoteFlowApiFlowService.java b/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/api/feign/RemoteFlowApiFlowService.java index 5ce0bb7d6..bf97b7ddf 100644 --- a/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/api/feign/RemoteFlowApiFlowService.java +++ b/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/api/feign/RemoteFlowApiFlowService.java @@ -61,6 +61,15 @@ public interface RemoteFlowApiFlowService { @PostMapping("/process-instance/queryMineTask") R> queryMineTask(@RequestBody TaskQueryParamDto queryParamDto); + /** + * 查询当前用户的已任务 + * + * @param queryParamDto + * @return {@link R } 流程实例ID {@link String} + */ + @PostMapping("/process-instance/queryMineEndTask") + R> queryMineEndTask(@RequestBody TaskQueryParamDto queryParamDto); + /** * 获取流程数据 * @param businessKey 业务key diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java index d5a0684ff..84601db0b 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardTypeEnum.java @@ -20,6 +20,7 @@ public enum HardTypeEnum { READ_CARD("3", "读卡器"), DOOR("4", "生鲜柜"), MERCHANT_QR_CODE("5", "商户二维码扣款牌"), + OTHER("6","其他支付方式(第三方接口对接)") ; private final String type; private final String description; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java index a9f0a6d98..2e6dc277c 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java @@ -14,10 +14,11 @@ import java.util.List; @Getter public enum HardOrderTypeEnum { BELOW("1", "线下购买"), - RESERVE("2", "线上订餐"), + RESERVE("2", "线上预定"), FOREIGN_TICKET("3", "外来人员"), STRIDE_DEPT("4", "跨单位"), ZY("5", "正元公务餐"), + LB("6", "宁波银行(美好生活)"), ; private final String type; private final String description; @@ -27,7 +28,7 @@ public enum HardOrderTypeEnum { return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); } - public static final List refundList = List.of(BELOW, RESERVE, FOREIGN_TICKET, ZY); + public static final List refundList = List.of(BELOW, RESERVE, FOREIGN_TICKET, ZY, LB); public static final List payList = List.of(BELOW, RESERVE); 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 e051ec26a..63bbb45b3 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 @@ -21,9 +21,11 @@ public enum HardPayTypeEnum { FACE("4", "人脸识别支付"), STRIDE_DEPT_QR_CODE("5", "跨单位二维码支付"), FOREIGN_TICKET_QR_CODE("6", "外来人员二维码支付"), - RESERVE_QR_CODE("7", "线上订餐二维码支付"), + RESERVE_QR_CODE("7", "线上二维码支付"), CASH("8", "现金支付"), HARD_DOOR_FREE_PAY("9", "智能柜免密支付"), + WECHANT_SELF_QR_CODE_PAY("10", "微信付款码支付"), + ALI_SELF_QR_CODE_PAY("11", "支付宝付款码支付"), ; private final String type; private final String description; @@ -36,6 +38,18 @@ public enum HardPayTypeEnum { CASH ); + public static final List isNotWalletPay = List.of( + STRIDE_DEPT_QR_CODE, + FOREIGN_TICKET_QR_CODE, + WECHANT_SELF_QR_CODE_PAY, + ALI_SELF_QR_CODE_PAY + ); + + public static final List isNeedCancel = List.of( + STRIDE_DEPT_QR_CODE, + FOREIGN_TICKET_QR_CODE + ); + public static HardPayTypeEnum 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/dto/HardAdBroadcastDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAdBroadcastDto.java new file mode 100644 index 000000000..db338e2b1 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardAdBroadcastDto.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.hard.api.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class HardAdBroadcastDto { + + /** + * 广播id + */ + private List ids; + + /** + * 广播次数 + */ + private Integer count; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliMicropayDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliMicropayDto.java new file mode 100644 index 000000000..ffb329347 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliMicropayDto.java @@ -0,0 +1,42 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 付款码支付入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliMicropayDto { + + /** + * 商户id + */ + private Long merId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 订单支付金额(分) + */ + private Integer price; + + /** + * 订单标题 + */ + private String subject; + + /** + * 支付授权码 + */ + private String authCode; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliQueryDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliQueryDto.java new file mode 100644 index 000000000..89ce8e49a --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliQueryDto.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliQueryDto { + + /** + * 订单id + */ + private String orderId; + + /** + * 阿里订单id + */ + private String aliOrderId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundDto.java new file mode 100644 index 000000000..5b1e35497 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundDto.java @@ -0,0 +1,37 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 支付宝退款入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliRefundDto { + + /** + * 退款金额(分) + */ + private Integer refundPrice; + + /** + * 订单id + */ + private Long orderId; + + /** + * 支付宝订单id + */ + private String aliOrderId; + + /** + * 退款id + */ + private Long refundId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundQueryDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundQueryDto.java new file mode 100644 index 000000000..c3c04de84 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliRefundQueryDto.java @@ -0,0 +1,22 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 支付宝退款查询入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliRefundQueryDto { + + /** + * 退款单号 + */ + private Long refundId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliReverseDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliReverseDto.java new file mode 100644 index 000000000..ccd23a257 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/ali/AliReverseDto.java @@ -0,0 +1,25 @@ +package com.bsd.pjcloud.hard.api.dto.ali; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 支付宝订单撤销入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AliReverseDto { + /** + * 订单id + */ + private Long orderId; + + /** + * 阿里订单id + */ + private String aliOrderId; +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/async/OfflineOrder.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/async/OfflineOrder.java index 91b75025e..d21281bb6 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/async/OfflineOrder.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/async/OfflineOrder.java @@ -7,6 +7,7 @@ import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; @@ -70,10 +71,10 @@ public class OfflineOrder { private Double weight; @Schema(description = "支付时间") - private String payTime; + private LocalDateTime payTime; @Schema(description = "创建时间") - private Date createTime; + private LocalDateTime createTime; @Schema(description = "购物车列表") private List carList; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/hard/HardOfflinePayDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/hard/HardOfflinePayDto.java new file mode 100644 index 000000000..41b2fba5e --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/hard/HardOfflinePayDto.java @@ -0,0 +1,12 @@ +package com.bsd.pjcloud.hard.api.dto.hard; + +import lombok.Data; + +import java.util.List; + +@Data +public class HardOfflinePayDto { + + private List orderIds; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java index 277796076..e246c21de 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardCarDto.java @@ -3,9 +3,22 @@ package com.bsd.pjcloud.hard.api.dto.order; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; import lombok.Data; +import java.time.LocalDate; +import java.util.List; + @Data public class HardCarDto extends HardCarEntity { private Long orderId; + private String createTimeStr; + + private LocalDate[] createTimeList; + + private List orderStatusCodes; + + private String hourType; + + private Long merchantId; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java index ad5ef2478..23b780b6e 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderDto.java @@ -37,15 +37,24 @@ public class HardOrderDto extends HardOrderEntity implements BaseIsIncludeTreeIn private LocalDateTime[] payTimeList; + private LocalDateTime[] refundTimeList; + private List orderTypeCodes; private List orderPayTypeCodes; private List hardTypeCodes; + private List refundStatusCodes; + /** * 是否查询购物车列表 */ private Boolean isFindCarList = false; + /** + * 退款相关 + */ + private String afterSaleNo; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderSumAndCountDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderSumAndCountDto.java index e6893a34a..5b435e8db 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderSumAndCountDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/order/HardOrderSumAndCountDto.java @@ -10,12 +10,26 @@ public class HardOrderSumAndCountDto { private List userDeptIds; + /** + * 是否包含deptIds + */ + private Boolean isInclude = false; + private List orderStatusCodes; + private List refundStatusCodes; + private LocalDateTime[] createTimeList; + private LocalDateTime[] refundTimeList; + private Long walletTypeId; private List mchIds; + /** + * 退款成功 + */ + private Boolean isRefundSuccess; + } 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 d5940b6d3..0e8fdfaa8 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 @@ -13,4 +13,9 @@ public class HardSpuDto extends HardSpuEntity { private LocalDateTime[] createTimeList; + /** + * 分类不能为空 + */ + private Boolean spuCategoryIdIsNotNull = false; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechantReverseDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechantReverseDto.java new file mode 100644 index 000000000..71e2ca977 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechantReverseDto.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.hard.api.dto.wechat; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 撤销订单入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WechantReverseDto { + + private Long orderId; + + private String wechantOrderId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatMicropayDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatMicropayDto.java new file mode 100644 index 000000000..cdcecd72b --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatMicropayDto.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.hard.api.dto.wechat; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WechatMicropayDto { + + /** + * 商户id + */ + private Long merId; + + /** + * 订单id + */ + private Long orderId; + + /** + * 支付金额(分) + */ + private Integer price; + + /** + * 微信付款码code + */ + private String wechatQrCode; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatQueryDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatQueryDto.java new file mode 100644 index 000000000..c3678e794 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatQueryDto.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.hard.api.dto.wechat; + +import lombok.Data; + +/** + * 查询订单入参 + */ +@Data +public class WechatQueryDto { + + /** + * 微信订单号 + */ + private String wechantOrderId; + + /** + * 商户订单号 + */ + private String orderId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java new file mode 100644 index 000000000..837bc8152 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.hard.api.dto.wechat; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 退款入参 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WechatRefundDto { + + private Long orderId; + + private String wechantOrderId; + + private Long refundId; + + private Integer orderPrice; + + private Integer refundPrice; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundQueryDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundQueryDto.java new file mode 100644 index 000000000..b01d99737 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundQueryDto.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.hard.api.dto.wechat; + +import lombok.Data; + +/** + * 微信退款查询入参 + */ +@Data +public class WechatRefundQueryDto { + + /** + * 退款id + */ + private String refundId; + + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorCabinetEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorCabinetEntity.java index a3a54b0e2..560449077 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorCabinetEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/manager/HardDoorCabinetEntity.java @@ -6,6 +6,7 @@ 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; /** @@ -22,94 +23,100 @@ import java.time.LocalDateTime; public class HardDoorCabinetEntity extends Model { - /** - * 编号 - */ + /** + * 编号 + */ @TableId(type = IdType.ASSIGN_ID) - @Schema(description="编号") + @Schema(description = "编号") private Long id; - /** - * 智能柜编号 - */ - @Schema(description="智能柜编号") + /** + * 智能柜编号 + */ + @Schema(description = "智能柜编号") private Long hardDoorId; - /** - * 货柜编号(1,2) - */ - @Schema(description="货柜编号(1,2)") + /** + * 货柜编号(1,2) + */ + @Schema(description = "货柜编号(1,2)") private Integer cabinetNo; - /** - * 锁在线1:在线;2:离线; - */ - @Schema(description="锁在线1:在线;2:离线;") + /** + * 锁在线1:在线;2:离线; + */ + @Schema(description = "锁在线1:在线;2:离线;") private String isLockOnline; - /** - * 锁状态1:开锁;2:关锁; - */ - @Schema(description="锁状态1:开锁;2:关锁;") + /** + * 锁状态1:开锁;2:关锁; + */ + @Schema(description = "锁状态1:开锁;2:关锁;") private Integer lockStatus; - /** - * 门状态1:门关;2:门开 - */ - @Schema(description="门状态1:门关;2:门开") + /** + * 门状态1:门关;2:门开 + */ + @Schema(description = "门状态1:门关;2:门开") private Integer doorStatus; - /** - * 货柜售卖状态1:在售;2:停售 - */ - @Schema(description="货柜售卖状态1:在售;2:停售") + /** + * 货柜售卖状态1:在售;2:停售 + */ + @Schema(description = "货柜售卖状态1:在售;2:停售") private Integer saleStatus; - /** - * 二维码 - */ - @Schema(description="二维码") + /** + * 二维码 + */ + @Schema(description = "二维码") private String qrCode; - /** - * 创建人 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建人") + /** + * url二维码 + */ + @Schema(description = "url二维码") + private String urlQrCode; + + /** + * 创建人 + */ + @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/order/HardOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java index a62211489..0f1f7b4b4 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 @@ -35,7 +35,7 @@ public class HardOrderEntity extends Model { /** * 订单编号 */ - @Schema(description = "订单编号 目前正元正在使用") + @Schema(description = "订单编号 目前正元、微信支付、支付宝支付正在使用") private String orderNo; /** 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 b13f3518d..a662ed16d 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 @@ -155,12 +155,20 @@ public class HardSpuEntity extends Model { /** * 旷世审核状态 + * 0:待审核 + * 1:审核中 + * 2:审核通过 + * 3:审核不通过 */ @Schema(description = "旷世审核状态") private String ksStatus; /** * 旷世审核状态标题 + * 0:待审核 + * 1:审核中 + * 2:审核通过 + * 3:审核不通过 */ @Schema(description = "旷世审核状态标题") private String ksStatusTitle; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardSpuController.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardSpuController.java new file mode 100644 index 000000000..a72e31d37 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardSpuController.java @@ -0,0 +1,19 @@ +package com.bsd.pjcloud.hard.api.feign; + + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.thirdparty.dto.ks.KsSkuSubmitCallbackDto; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(contextId = "remoteHardSpuController", value = ServiceNameConstants.HARDWARE_SERVICE) +public interface RemoteHardSpuController { + + @NoToken + @PostMapping("/sku-check-callback") + R skuCheckCallback(@RequestBody KsSkuSubmitCallbackDto dto); + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdPayService.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdPayService.java new file mode 100644 index 000000000..dd703ccc7 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdPayService.java @@ -0,0 +1,52 @@ +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.constant.pay.ThirdPaySoureBizTypeEnum; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDetailDto; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.dto.pay.WaterDto; +import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayWaterVo; +import com.bsd.pjcloud.thirdparty.vo.pay.RefundVo; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient(contextId = "remoteHardThirdPayService", value = ServiceNameConstants.HARDWARE_SERVICE) +public interface RemoteHardThirdPayService { + /** + * 第三方支付 + */ + @NoToken + @PostMapping("/hard-third-pay/wallet-pay") + PayBaseVo walletPay(@RequestBody PayDto dto, @RequestParam WalletTypeEnum walletType, @RequestParam ThirdPaySoureBizTypeEnum soureType); + + /** + * 第三方退款 + */ + @NoToken + @PostMapping("/hard-third-pay/wallet-refund") + PayBaseVo walletRefund(@RequestBody RefundDto dto, @RequestParam ThirdPaySoureBizTypeEnum soureType); + + /** + * 第三方退款 + */ + @NoToken + @PostMapping("/hard-third-pay/water") + PayBaseVo> waterList(@RequestBody WaterDto dto, @RequestParam ThirdPaySoureBizTypeEnum soureType); + + /** + * 订单详情 + */ + @NoToken + @PostMapping("/hard-third-pay/detail") + PayBaseVo orderDetail(@RequestBody PayDetailDto dto, @RequestParam ThirdPaySoureBizTypeEnum soureType); +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardBroadcastVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardBroadcastVo.java index 78572391e..229679387 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardBroadcastVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardBroadcastVo.java @@ -32,5 +32,16 @@ public class HardBroadcastVo extends HardBroadcastEntity implements BaseHardInte private String userDeptName; + /** + * 订单相关 + */ + private Long orderId; + + private String productDesc; + + private Integer payPrice; + + private String hourType; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardInvoiceVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardInvoiceVo.java index 8356d7fa4..0cd57feb6 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardInvoiceVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardInvoiceVo.java @@ -29,6 +29,8 @@ public class HardInvoiceVo extends HardInvoiceEntity implements BaseDeptInterfac private String logoPic; + private String merchantType; + /** * 订单相关 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/android/HardAdUserVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/android/HardAdUserVo.java index f52f16579..2af51ea2e 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/android/HardAdUserVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/android/HardAdUserVo.java @@ -44,4 +44,9 @@ public class HardAdUserVo { * 是否冻结饭卡 */ private String walletIsFreeze; + + /** + * 查询用户食堂信息 + */ + private Long canteenId; } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardManagerVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardManagerVo.java index 274ba9005..92578fee1 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardManagerVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/manager/HardManagerVo.java @@ -20,6 +20,8 @@ public class HardManagerVo extends HardManagerEntity implements BaseDeptInterfac private String logoPic; + private String merchantType; + /** * 分类相关 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java new file mode 100644 index 000000000..106582980 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCanteenProductTotalVo.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.hard.api.vo.order; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class HardCanteenProductTotalVo { + + @Schema(description = "购买日期(年月日)") + private LocalDateTime createTime; + + @Schema(description = "用餐时间段(早中晚)") + private String hourType; + + @Schema(description = "食品总数量") + private Long payCount; + + @Schema(description = "食品总价格") + private Long totalPrice; + + @Schema(description = "购买次数") + private Long timeCount; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCarVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCarVo.java index 56925463a..59dabb76d 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCarVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardCarVo.java @@ -15,4 +15,10 @@ public class HardCarVo extends HardCarEntity { // 商品规格【超市特有】 private String unit; + // 商品数量【统计使用】 + private Long count; + + // 购买次数【统计使用】 + private Long payCount; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardDeptTotalVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardDeptTotalVo.java index 1337eca32..287cc9d6c 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardDeptTotalVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardDeptTotalVo.java @@ -24,6 +24,12 @@ public class HardDeptTotalVo { @Schema(description = "批量扣减次数") private Long walletReduceCount = 0L; + @Schema(description = "退还各自食堂金额") + private Long walletReturnCanteenPrice = 0L; + + @Schema(description = "退还各自食堂次数") + private Long walletReturnCanteenCount = 0L; + @Schema(description = "单次充值金额") private Long walletOncePrice = 0L; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderCsVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderCsVo.java index 510b50afb..7f58a1192 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderCsVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderCsVo.java @@ -25,12 +25,21 @@ public class HardOrderCsVo implements BaseMchInterface, BaseHardInterface { @Schema(description = "商户名") private String merchantName; + @Schema(description = "商户部门名") + private String merchantDeptName; + + @Schema(description = "商户部门id") + private Long merchantDeptId; + @Schema(description = "商户logo") private String logoPic; @Schema(description = "商户id") private Long merchantId; + @Schema(description = "商户类型") + private String merchantType; + @Schema(description = "总消费金额") private BigDecimal totalPayPrice; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderSbVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderSbVo.java index f6b825e8e..b8d9c901c 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderSbVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderSbVo.java @@ -30,6 +30,9 @@ public class HardOrderSbVo implements BaseMchInterface, BaseHardInterface { @Schema(description = "商户名称") private String merchantName; + @Schema(description = "商户类型") + private String merchantType; + @Schema(description = "商户logo") private String logoPic; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderVo.java index 2f01ab08b..129ba706e 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/HardOrderVo.java @@ -51,4 +51,11 @@ public class HardOrderVo extends HardOrderEntity implements BaseUserInterface, B * 预约二维码信息 */ private String reserveCode; + + /** + * 退款相关 + */ + private Long afterSaleId; + + private String afterSaleNo; } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuCategoryVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuCategoryVo.java index 00c953a46..b8c6a0adf 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuCategoryVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/spu/HardSpuCategoryVo.java @@ -16,4 +16,6 @@ public class HardSpuCategoryVo extends HardSpuCategoryEntity implements BaseMchI private String logoPic; + private String merchantType; + } 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 cfbe2fcb9..052836be2 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 @@ -34,6 +34,8 @@ public class HardSpuRepertoryVo extends HardSpuRepertoryEntity implements BaseMc private String logoPic; + private String merchantType; + /** * 用户相关 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackSoureVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackSoureVo.java new file mode 100644 index 000000000..8f0905354 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackSoureVo.java @@ -0,0 +1,30 @@ +package com.bsd.pjcloud.hard.api.vo.wechat; + +import lombok.Data; + +/** + * 微信退款回调加密的返回参数 + */ +@Data +public class WechantRefunCallbackSoureVo { + + /** + * 公众账号ID + */ + private String appid; + + /** + * 退款的商户号 + */ + private String mch_id; + + /** + * 随机字符串 + */ + private String nonce_str; + + /** + * 加密信息 + */ + private String req_info; +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackVo.java new file mode 100644 index 000000000..cf289e298 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackVo.java @@ -0,0 +1,77 @@ +package com.bsd.pjcloud.hard.api.vo.wechat; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; + +/** + * 微信退款回调返回参数 + */ +@Data +public class WechantRefunCallbackVo { + + public static final String SUCCESS_CODE = "SUCCESS"; + + /** + * 微信订单号 + */ + private String transaction_id; + + /** + * 商户订单号 + */ + private String out_trade_no; + + /** + * 微信退款单号 + */ + private String refund_id; + + /** + * 商户退款单号 + */ + private String out_refund_no; + + /** + * 订单金额 + */ + private String total_fee; + + /** + * 应结订单金额 + */ + private String settlement_total_fee; + + /** + * 申请退款金额 + */ + private String refund_fee; + + /** + * 退款金额 + */ + private String settlement_refund_fee; + + /** + * 退款状态 + */ + private String refund_status; + + public boolean isAllSuccess() { + return ObjectUtil.equals(refund_status, SUCCESS_CODE); + } + + public static String wechantError() { + return "" + + "" + + "" + + ""; + } + + public static String wechantSuccess() { + return "" + + " " + + " \n" + + ""; + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantReverseVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantReverseVo.java new file mode 100644 index 000000000..b9bd73a5c --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantReverseVo.java @@ -0,0 +1,44 @@ +package com.bsd.pjcloud.hard.api.vo.wechat; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; + +/** + * 撤销订单返回 + */ +@Data +public class WechantReverseVo { + public static final String SUCCESS = "SUCCESS"; + + private String return_code; + + private String return_msg; + + private String appid; + + private String mch_id; + + private String nonce_str; + + private String sign; + + private String result_code; + + private String err_code; + + private String err_code_des; + + private String recall; + + public boolean isHttpSucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, return_code); + } + + public boolean isPaySucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, result_code); + } + + public boolean isAllSuccess() { + return isHttpSucess() && isPaySucess(); + } +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatMicropayVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatMicropayVo.java new file mode 100644 index 000000000..0c3878e6a --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatMicropayVo.java @@ -0,0 +1,43 @@ +package com.bsd.pjcloud.hard.api.vo.wechat; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; + +@Data +public class WechatMicropayVo { + + public static final String SUCCESS = "SUCCESS"; + + private String return_code; + + private String return_msg; + + private String appid; + + private String mch_id; + + private String device_info; + + private String nonce_str; + + private String sign; + + private String result_code; + + private String err_code; + + private String err_code_des; + + public boolean isHttpSucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, return_code); + } + + public boolean isPaySucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, result_code); + } + + public boolean isAllSuccess(){ + return isHttpSucess() && isPaySucess(); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatQueryVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatQueryVo.java new file mode 100644 index 000000000..c4cd034b6 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatQueryVo.java @@ -0,0 +1,125 @@ +package com.bsd.pjcloud.hard.api.vo.wechat; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; + +/** + * 查询订单返回 + */ +@Data +public class WechatQueryVo { + public static final String SUCCESS = "SUCCESS"; + + private String return_code; + + private String return_msg; + + private String appid; + + private String mch_id; + + private String nonce_str; + + private String sign; + + private String result_code; + + private String err_code; + + private String err_code_des; + + private String device_info; + + /** + * 用户标识 + */ + private String openid; + + /** + * 是否关注公众账号 + */ + private String is_subscribe; + + /** + * 交易类型 + */ + private String trade_type; + + /** + * 交易状态 + */ + private String trade_state; + + /** + * 付款银行 + */ + private String bank_type; + + /** + * 标价金额 + */ + private String total_fee; + + /** + * 应结订单金额 + */ + private String settlement_total_fee; + + /** + * 标价币种 + */ + private String fee_type; + + /** + * 现金支付金额 + */ + private String cash_fee; + + /** + * 现金支付币种 + */ + private String cash_fee_type; + + /** + * 代金券金额 + */ + private String coupon_fee; + + /** + * 代金券使用数量 + */ + private String coupon_count; + + /** + * 微信支付订单号 + */ + private String transaction_id; + + /** + * 商户订单号 + */ + private String out_trade_no; + + /** + * 附加数据 + */ + private String attach; + + /** + * 支付完成时间 + */ + private String time_end; + + /** + * 交易状态描述 + */ + private String trade_state_desc; + + public boolean isHttpSucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, return_code); + } + + public boolean isPaySucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, result_code); + } +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatRefundQueryVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatRefundQueryVo.java new file mode 100644 index 000000000..3479d177e --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatRefundQueryVo.java @@ -0,0 +1,102 @@ +package com.bsd.pjcloud.hard.api.vo.wechat; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; + +/** + * 退款返回 + */ +@Data +public class WechatRefundQueryVo { + + public static final String SUCCESS = "SUCCESS"; + + /** + * 业务结果 + */ + private String result_code; + + /** + * 错误码 + */ + private String err_code; + + /** + * 错误描述 + */ + private String err_code_des; + + /** + * 公众账号ID + */ + private String appid; + + /** + * 商户号 + */ + private String mch_id; + + /** + * 随机字符串 + */ + private String nonce_str; + + /** + * 签名 + */ + private String sign; + + /** + * 订单总退款次数 + */ + private Long total_refund_count; + + /** + * 微信订单号 + */ + private String transaction_id; + + /** + * 商户订单号 + */ + private String out_trade_no; + + /** + * 订单金额 + */ + private Long total_fee; + + /** + * 应结订单金额 + */ + private Long settlement_total_fee; + + /** + * 货币种类 + */ + private String fee_type; + + /** + * 现金支付金额 + */ + private Long cash_fee; + + /** + * 退款笔数 + */ + private Long refund_count; + + /** + * 退款总金额 + */ + private Long refund_fee; + + public boolean isHttpSucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, err_code); + } + + public boolean isPaySucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, result_code); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatRefundVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatRefundVo.java new file mode 100644 index 000000000..4355502e7 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechatRefundVo.java @@ -0,0 +1,84 @@ +package com.bsd.pjcloud.hard.api.vo.wechat; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; + +/** + * 退款返回 + */ +@Data +public class WechatRefundVo { + + public static final String SUCCESS = "SUCCESS"; + + private String return_code; + + private String return_msg; + + private String result_code; + + private String err_code; + + private String err_code_des; + + private String appid; + + private String mch_id; + + private String nonce_str; + + + private String sign; + + /** + * 微信支付订单号 + */ + private String transaction_id; + + /** + * 商户订单号 + */ + private String out_trade_no; + + /** + * 商户退款单号 + */ + private String out_refund_no; + + /** + * 微信退款单号 + */ + private String refund_id; + + /** + * 退款金额 + */ + private String refund_fee; + + /** + * 应结退款金额 + */ + private String settlement_refund_fee; + + /** + * 标价金额 + */ + private String total_fee; + + /** + * 应结订单金额 + */ + private String settlement_total_fee; + + public boolean isHttpSucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, return_code); + } + + public boolean isPaySucess() { + return ObjectUtil.equals(WechatMicropayVo.SUCCESS, result_code); + } + + public boolean isAllSuccess() { + return isHttpSucess() && isPaySucess(); + } +} 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 910612a76..9504a92a8 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,3 +1,5 @@ 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 +com.bsd.pjcloud.hard.api.feign.RemoteHardSpuController +com.bsd.pjcloud.hard.api.feign.RemoteHardThirdPayService +com.bsd.pjcloud.hard.api.feign.RemoteHardThirdSelfZyService diff --git a/pjcloud-hardware/pjcloud-hardware-biz/pom.xml b/pjcloud-hardware/pjcloud-hardware-biz/pom.xml index 240860ee9..e704d33a7 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/pom.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/pom.xml @@ -160,6 +160,11 @@ 2.12.7 compile + + com.alipay.sdk + alipay-sdk-java + 4.40.251.ALL + diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java new file mode 100644 index 000000000..7aaec00d5 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/AlipayConf.java @@ -0,0 +1,40 @@ +package com.bsd.pjcloud.hard.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 支付宝支付配置 + */ +@Component +@ConfigurationProperties(prefix = "ali-pay") +@Data +public class AlipayConf { + + /** + * 应用ID + */ + private String appId; + + /** + * 私钥 + */ + private String privateKey; + + /** + * 公钥 + */ + private String publicKey; + + /** + * 支付宝公钥 + */ + private String alipayPublicKey; + + /** + * 回调地址 + */ + private String callbackUrl; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/LbCallbackConfig.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/LbCallbackConfig.java new file mode 100644 index 000000000..383a73cf4 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/LbCallbackConfig.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.hard.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@ConfigurationProperties(prefix = "pay-callback") +@Component +public class LbCallbackConfig { + + /** + * 宁波银行(美好生活)商户id + */ + private Long lbMchId; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/WechatPay.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/WechatPay.java new file mode 100644 index 000000000..a0e432d75 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/WechatPay.java @@ -0,0 +1,47 @@ +package com.bsd.pjcloud.hard.config; + + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "wechat-pay") +@Data +public class WechatPay { + + /** + * 基础路径 + */ + private String baseUrl; + + /** + * 微信公共平台 appId + */ + private String appId; + + /** + * 商户号 + */ + private String merchantId; + + /** + * 商户证书序列path + */ + private String merchantSerialPath; + + /** + * 商户APIV2密钥 + */ + private String apiV2Key; + + /** + * 退款回调地址 + */ + private String refundCallbackUrl; + + /** + * 调用ip + */ + private String spbillCreateIp; +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/zy/config/ZyCallbackConfig.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/ZyCallbackConfig.java similarity index 87% rename from pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/zy/config/ZyCallbackConfig.java rename to pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/ZyCallbackConfig.java index 84591da9d..6de622300 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/zy/config/ZyCallbackConfig.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/config/ZyCallbackConfig.java @@ -1,4 +1,4 @@ -package com.bsd.pjcloud.hard.zy.config; +package com.bsd.pjcloud.hard.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; 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 index 20b43bbc2..68b73b41a 100644 --- 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 @@ -22,7 +22,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.Objects; /** * 设备预约管理 diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardBroadcastController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardBroadcastController.java index debdb64a5..e1f54df10 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardBroadcastController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardBroadcastController.java @@ -2,12 +2,13 @@ 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.constant.enums.YesNoEnum; 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.HardAdBroadcastDto; import com.bsd.pjcloud.hard.api.dto.HardBroadcastDto; import com.bsd.pjcloud.hard.api.entity.HardBroadcastEntity; import com.bsd.pjcloud.hard.api.vo.HardBroadcastVo; @@ -22,8 +23,8 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; import java.util.List; -import java.util.Objects; /** * 设备广播 @@ -37,6 +38,27 @@ public class HardBroadcastController { private final HardBroadcastService hardBroadcastService; + /* ************************************* start android start ************************************* */ + + @Operation(summary = "android查询今日的广播", description = "android查询今日的广播") + @GetMapping("/ad/today") + public R> androidToday(@ParameterObject Page page, @RequestBody HardBroadcastDto dto) { + DataScope dataScope = null; + LocalDate today = LocalDate.now(); + dto.setIsDone(YesNoEnum.NO.getCode()); + dto.setCreateTimeList(new LocalDate[]{today, today.plusDays(1)}); + return R.ok(hardBroadcastService.scopePageJoin(page, dto, dataScope)); + } + + @Operation(summary = "android完成一轮广播", description = "android完成一轮广播") + @PostMapping("/ad/broadcast") + public R> androidDoneBroadcast(@RequestBody HardAdBroadcastDto dto) { + hardBroadcastService.androidDoneBroadcast(dto); + return R.ok(); + } + + /* ************************************* start android start ************************************* */ + @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('hard_hardBroadcast_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 index 3a39303cf..8ef15f99d 100644 --- 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 @@ -126,6 +126,8 @@ public class HardDoorFlowController { /* ************************************* end app end ************************************* */ + + @Operation(summary = "检修开门", description = "检修开门") @PostMapping("/open-access") @Idempotent(expireTime = 5, info = "正在开门中,请勿重复操作") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/ali/AliPayController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/ali/AliPayController.java new file mode 100644 index 000000000..173b1c7bf --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/ali/AliPayController.java @@ -0,0 +1,47 @@ +package com.bsd.pjcloud.hard.controller.ali; + +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.hard.service.AlipayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-ali-pay") +@Tag(description = "hard-ali-pay", name = "支付宝相关") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +@Validated +public class AliPayController { + + private final AlipayService aliPayService; + + /* ************************************* start callback start ************************************* */ + + @Inner(value = false) + @PostMapping("/callback") + @Operation(summary = "支付宝回调") + public String refundCallback(HttpServletRequest request) { + Map parameterMap = request.getParameterMap(); + Map params = new HashMap<>(); + for (Map.Entry entry : parameterMap.entrySet()) { + params.put(entry.getKey(), entry.getValue()[0]); + } + return aliPayService.refundCallback(params); + } + + /* ************************************* end callback end ************************************* */ + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/hard/HardApiController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/hard/HardApiController.java index cbb3446c2..fc55a87d3 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/hard/HardApiController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/hard/HardApiController.java @@ -96,7 +96,7 @@ public class HardApiController { @PostMapping("/sync-offline-order") @Operation(summary = "同步离线订单") - @Idempotent(expireTime = 10, info = "正在处理中,请勿重复操作") + @Idempotent(expireTime = 1, info = "正在处理中,请勿重复操作") public R> syncOfflineOrder(@Valid @RequestBody SyncOfflineReqVo dto) { return R.ok(hardOrderSyncService.syncOfflineOrder(dto)); } 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 9db6b6e2b..e7e4f423e 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 @@ -72,7 +72,8 @@ public class HardDoorManagerController { @Operation(summary = "刷新智能柜货柜二维码", description = "刷新智能柜货柜二维码") @GetMapping("/refresh-qr-code") public R refreshQrCode(@RequestParam Long hardDoorId, @RequestParam Integer cabinetNo) { - return R.ok(hardDoorCabinetService.refreshQrCode(hardDoorId, cabinetNo)); + hardDoorCabinetService.refreshQrCode(hardDoorId, cabinetNo); + return R.ok(); } @Operation(summary = "音量修改", description = "音量修改") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardAfterSaleController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardAfterSaleController.java index ffead336f..604739aa5 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardAfterSaleController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardAfterSaleController.java @@ -94,6 +94,18 @@ public class HardAfterSaleController { } /* ************************************* end app end ************************************* */ + /* ************************************* start android start ************************************* */ + + @GetMapping(value = "/ad/time-limit-refund") + @Operation(summary = "消费机限时退款") + @Idempotent(expireTime = 5, info = "正在退款中,请勿重复操作") + public R adTimeLintRefund(@RequestParam Long orderId, @RequestParam String reason) { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(hardAfterSaleService.adTimeLintRefund(orderId, reason, user)); + } + + /* ************************************* end android end ************************************* */ + @PostMapping(value = "/admin-refund") @Operation(summary = "后台退款") @Idempotent(expireTime = 10, info = "正在退款中,请勿重复操作") @@ -138,8 +150,13 @@ public class HardAfterSaleController { @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('hard_hardAfterSale_view')") - public R getHardAfterSalePage(@ParameterObject Page page, @ParameterObject HardAfterSaleEntity hardAfterSale) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + public R getHardAfterSalePage(@ParameterObject Page page, @ParameterObject HardAfterSaleDto dto) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(HardAfterSaleEntity::getOrderId, dto.getOrderId()) + .eq(HardAfterSaleEntity::getUserId, dto.getUserId()) + .eq(HardAfterSaleEntity::getStatus, dto.getStatus()) + .orderByDesc(HardAfterSaleEntity::getCreateTime) + .orderByDesc(HardAfterSaleEntity::getOrderId); return R.ok(hardAfterSaleService.page(page, wrapper)); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java new file mode 100644 index 000000000..329dd95d0 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardCanteenTotalController.java @@ -0,0 +1,44 @@ +package com.bsd.pjcloud.hard.controller.order; + +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.hard.api.dto.order.HardCarDto; +import com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; +import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; +import com.bsd.pjcloud.hard.service.HardCanteenTotalService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +/** + * 食堂统计 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-canteen-total-log") +@Tag(description = "hard-canteen-total-log", name = "食堂统计") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardCanteenTotalController { + + private final HardCanteenTotalService canteenTotalService; + + @Operation(summary = "食堂菜品购买统计", description = "食堂菜品购买统计") + @PostMapping("/proudct-total") + public R> productTotal(@ParameterObject Page page, @RequestBody HardOrderDto dto) { + DataScope dataScope = null; + return R.ok(canteenTotalService.productTotal(page, dto, dataScope)); + } + + @Operation(summary = "菜品出售统计", description = "菜品出售统计") + @PostMapping("/proudct-query") + public R> proudctQuery(@ParameterObject Page page, @RequestBody HardCarDto dto) { + return R.ok(canteenTotalService.proudctQuery(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 f81378aa7..3c35a300f 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 @@ -28,6 +28,7 @@ import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.hard.api.dto.app.HardAppCreateOrderScancode; import com.bsd.pjcloud.hard.api.dto.hard.CurrentUserHardTypeInfoDto; +import com.bsd.pjcloud.hard.api.dto.hard.HardOfflinePayDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderPreferencesDto; import com.bsd.pjcloud.hard.api.dto.order.app.HardAppCreateOrderDto; @@ -37,6 +38,7 @@ import com.bsd.pjcloud.hard.api.vo.order.excel.HardOrderExcelVo; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.HardManagerService; import com.bsd.pjcloud.hard.service.HardOrderService; +import com.bsd.pjcloud.hard.service.HardOrderSyncService; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; @@ -73,6 +75,7 @@ public class HardOrderController { private final HardOrderService hardwareOrderService; private final HardManagerService hardManagerService; + private final HardOrderSyncService hardOrderSyncService; private final HardOrderMapper hardOrderMapper; @@ -140,7 +143,7 @@ public class HardOrderController { // 判断是否为合作超市管理员工 if (!hardManagerService.isSuperMarketAdmin(user)) return R.ok(new Page()); // 查询用户属于的商户 - MchManageVo mch = mchService.getFirstMchByDeptId(userInfo.getSysUser().getDeptId()).getData(); + MchManageVo mch = mchService.getFirstMchByDeptId(userInfo.getSysUser().getDeptId(), MerchantTypeEnum.SUPERMARKET).getData(); if (ObjectUtil.isEmpty(mch)) throw new RuntimeException("该用户下不存在商户"); // 查询商户和下面的子商户 List mchDtoIds = new java.util.ArrayList<>(List.of(mch.getId())); @@ -158,15 +161,32 @@ public class HardOrderController { return R.ok(hardwareOrderService.join(id)); } - @Operation(summary = "app创建订单", description = "app创建订单") + @Operation(summary = "app创建食堂预定订单", description = "app创建食堂预定订单") @GetMapping("/app/create-order") - @Idempotent(expireTime = 10, info = "正在创建订单中,请勿重复操作") + @Idempotent(expireTime = 3, info = "正在创建订单中,请勿重复操作") 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).apptId(apptId).build(); return R.ok(hardwareOrderService.appCreateOrder(dto)); } + @Operation(summary = "app创建线上超市预定订单", description = "app创建线上超市预定订单") + @GetMapping("/app/create-supermarket-order") + @Idempotent(expireTime = 3, info = "正在创建订单中,请勿重复操作") + public R appCreateSupermarketReserveOrder(@RequestParam Long carParentId, @RequestParam HardTypeEnum hardType) { + PjcloudUser user = SecurityUtils.getUser(); + HardAppCreateOrderDto dto = HardAppCreateOrderDto.builder() + .carParentId(carParentId).walletType(WalletTypeEnum.EAT) + .hardType(hardType) + .userId(user.getId()) + .walletType(WalletTypeEnum.PAY) + .orderType(HardOrderTypeEnum.RESERVE) + .payType(HardPayTypeEnum.WALLET_DEFAULT) + .hardType(HardTypeEnum.SUPERMARKET) + .build(); + return R.ok(hardwareOrderService.appCreateSupermarketReserveOrder(dto)); + } + @Operation(summary = "app创建订单扫一扫", description = "app创建订单扫一扫") @PostMapping("/app/create-order-scan-qrcode") @Idempotent(expireTime = 5, info = "正在创建订单中,请勿重复操作") @@ -227,6 +247,14 @@ public class HardOrderController { return R.ok(hardwareOrderService.join(id)); } + @Operation(summary = "离线订单手动支付", description = "离线订单手动支付") + @PostMapping("/offline-pay") + @PreAuthorize("@pms.hasPermission('hard_hardwareOrder_offlinePay')") + public R offlinePay(@RequestBody HardOfflinePayDto dto) { + hardOrderSyncService.offlinePay(dto.getOrderIds()); + return R.ok(); + } + @GetMapping("/export") @PreAuthorize("@pms.hasPermission('hard_hardwareOrder_export')") public void export(HttpServletResponse response, HardOrderDto dto) throws IOException { @@ -246,7 +274,7 @@ public class HardOrderController { dto.setMchIds(mchDtoIds); } } - List list = hardwareOrderService.scopeList(dto); + List list = hardwareOrderService.scopeList(dto, DataScope.of()); List excelList = BeanUtils.toBean(list, HardOrderExcelVo.class); try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/订单交易汇总.xlsx")).build()) { WriteSheet writeSheet = EasyExcel.writerSheet().build(); 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 b98c69b17..4ca52ffe1 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 @@ -11,6 +11,7 @@ import com.alibaba.excel.write.metadata.fill.FillConfig; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.service.PjcloudUser; @@ -74,7 +75,7 @@ public class HardOrderTotalController { // 判断是否为合作超市管理员工 if (!hardManagerService.isSuperMarketAdmin(user)) return R.ok(new Page()); // 查询用户属于的商户 - MchManageVo mch = mchService.getFirstMchByDeptId(userInfo.getSysUser().getDeptId()).getData(); + MchManageVo mch = mchService.getFirstMchByDeptId(userInfo.getSysUser().getDeptId(), MerchantTypeEnum.SUPERMARKET).getData(); if (ObjectUtil.isEmpty(mch)) throw new RuntimeException("该用户下不存在商户"); List mchDtoIds = new ArrayList<>(List.of(mch.getId())); // 查询商户和下面的子商户 @@ -96,7 +97,7 @@ public class HardOrderTotalController { // 判断是否为合作超市管理员工 if (!hardManagerService.isSuperMarketAdmin(user)) return R.ok(new Page()); // 查询用户属于的商户 - MchManageVo mch = mchService.getFirstMchByDeptId(userInfo.getSysUser().getDeptId()).getData(); + MchManageVo mch = mchService.getFirstMchByDeptId(userInfo.getSysUser().getDeptId(), MerchantTypeEnum.SUPERMARKET).getData(); if (ObjectUtil.isEmpty(mch)) throw new RuntimeException("该用户下不存在商户"); List mchDtoIds = new ArrayList<>(List.of(mch.getId())); // 查询商户和下面的子商户 @@ -149,10 +150,10 @@ public class HardOrderTotalController { } @Operation(summary = "设备交易记录导出", description = "设备交易记录导出") - @GetMapping("/export-sb") + @PostMapping("/export-sb") @SysLog("设备交易记录导出") @PreAuthorize("@pms.hasPermission('hard_hardTotal_export_sb')") - public void exportSb(HttpServletResponse response, HardOrderDto dto) throws IOException { + public void exportSb(HttpServletResponse response, @RequestBody HardOrderDto dto) throws IOException { dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); List list = hardOrderTotalService.listSb(dto); try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/设备交易金额汇总.xlsx")).build()) { @@ -223,10 +224,10 @@ public class HardOrderTotalController { @Operation(summary = "商户交易记录导出", description = "商户交易记录导出") - @GetMapping("/export-cs") + @PostMapping("/export-cs") @SysLog("商户交易记录导出") @PreAuthorize("@pms.hasPermission('hard_hardTotal_export_cs')") - public void exportTk(HttpServletResponse response, HardOrderDto dto) throws IOException { + public void exportTk(HttpServletResponse response, @RequestBody HardOrderDto dto) throws IOException { dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); // 查询商户和下面的子商户 List mchDtoIds = new ArrayList<>(); @@ -308,10 +309,10 @@ public class HardOrderTotalController { } @Operation(summary = "支付方式交易记录", description = "支付方式交易记录") - @GetMapping("/export-payType") + @PostMapping("/export-payType") @SysLog("支付方式交易记录") @PreAuthorize("@pms.hasPermission('hard_hardTotal_export_payType')") - public void exportPayType(HttpServletResponse response, HardOrderDto dto) throws IOException { + public void exportPayType(HttpServletResponse response, @RequestBody HardOrderDto dto) throws IOException { List list = hardOrderTotalService.listPayType(dto); try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/支付方式交易汇总.xlsx")).build()) { WriteSheet writeSheet = EasyExcel.writerSheet().build(); @@ -416,6 +417,9 @@ public class HardOrderTotalController { // 盈利 BigDecimal orderProfitPriceSum = BigDecimal.ZERO; BigDecimal orderProfitContSum = BigDecimal.ZERO; + // 退还各自食堂金额 + BigDecimal walletReturnCanteenPriceSum = BigDecimal.ZERO; + BigDecimal walletReturnCanteenCountSum = BigDecimal.ZERO; Long lineNumber = 1L; for (HardDeptTotalVo v : list) { @@ -484,6 +488,15 @@ public class HardOrderTotalController { orderProfitContSum = orderProfitContSum.add(BigDecimal.valueOf(v.getOrderProfitCont())); v.setOrderProfitCont(BigDecimal.valueOf(v.getOrderProfitCont()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).longValue()); } + // 退还各自食堂金额 + if (ObjectUtil.isNotEmpty(v.getWalletReturnCanteenPrice())) { + walletReturnCanteenPriceSum = walletReturnCanteenPriceSum.add(BigDecimal.valueOf(v.getWalletReturnCanteenPrice())); + v.setWalletReturnCanteenPrice(BigDecimal.valueOf(v.getWalletReturnCanteenPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).longValue()); + } + if (ObjectUtil.isNotEmpty(v.getWalletReturnCanteenCount())) { + walletReturnCanteenCountSum = walletReturnCanteenCountSum.add(BigDecimal.valueOf(v.getWalletReturnCanteenCount())); + v.setWalletReturnCanteenCount(BigDecimal.valueOf(v.getWalletReturnCanteenCount()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).longValue()); + } // 批量充值 map.put("walletPriceSum", walletPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); map.put("walletCountSum", walletCountSum.toString()); @@ -505,6 +518,10 @@ public class HardOrderTotalController { map.put("orderProfitPriceSum", orderProfitPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); map.put("orderProfitContSum", orderProfitContSum.toString()); + + // 退还各自食堂金额 + map.put("walletReturnCanteenPriceSum", walletReturnCanteenPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + map.put("walletReturnCanteenCountSum", walletReturnCanteenCountSum.toString()); } } excelWriter.fill(map, writeSheet); 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 36fd5dda5..cb53ab33b 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 @@ -9,11 +9,13 @@ 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.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 com.bsd.pjcloud.thirdparty.dto.ks.KsSkuSubmitCallbackDto; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; @@ -42,6 +44,18 @@ public class HardSpuController { private final HardSpuService hardSpuService; + /* ************************************* start callback start ************************************* */ + + @Inner + @Operation(summary = "商品审核回调", description = "商品审核回调") + @PostMapping("/sku-check-callback") + public R skuCheckCallback(@RequestBody KsSkuSubmitCallbackDto dto) { + hardSpuService.skuCheckCallback(dto); + return R.ok(); + } + + /* ************************************* end callback end ************************************* */ + /* ************************************* start APP start ************************************* */ @Operation(summary = "app上架", description = "上架") @@ -88,6 +102,13 @@ public class HardSpuController { return R.ok(); } + @Operation(summary = "更新旷世商品审核进度", description = "更新旷世商品审核进度") + @GetMapping("/progress") + public R progress(@RequestParam Long id) { + hardSpuService.progress(id); + return R.ok(); + } + @Operation(summary = "根据设备id智能柜编号查询商品", description = "根据设备id智能柜编号查询商品") @GetMapping("/get-by-cabinet-no") public R>>> getByCabinetNo(@RequestParam Long hardId, @RequestParam String cabinetNo) { @@ -108,7 +129,6 @@ public class HardSpuController { 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/third/HardThirdPayController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdPayController.java new file mode 100644 index 000000000..39b389e82 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdPayController.java @@ -0,0 +1,66 @@ +package com.bsd.pjcloud.hard.controller.third; + +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.hard.service.HardThirdPayService; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPaySoureBizTypeEnum; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDetailDto; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.dto.pay.WaterDto; +import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayWaterVo; +import com.bsd.pjcloud.thirdparty.vo.pay.RefundVo; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-third-pay") +@Tag(description = "hard-third-pay", name = "第三方支付调用") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class HardThirdPayController { + + private final HardThirdPayService hardThirdPayService; + + @Inner + @PostMapping("/wallet-pay") + @SysLog("第三方支付") + @Operation(summary = "第三方支付") + public PayBaseVo walletPay(@RequestBody PayDto dto, @RequestParam WalletTypeEnum walletType, @RequestParam ThirdPaySoureBizTypeEnum soureType) { + return hardThirdPayService.walletPay(dto, walletType, soureType); + } + + @Inner + @PostMapping("/wallet-refund") + @SysLog("第三方退款") + @Operation(summary = "第三方退款") + public PayBaseVo walletRefund(@RequestBody RefundDto dto, @RequestParam ThirdPaySoureBizTypeEnum soureType) { + return hardThirdPayService.walletRefund(dto, soureType); + } + + @Inner + @PostMapping("/water") + @SysLog("获取流水") + @Operation(summary = "获取流水") + public PayBaseVo> waterList(@RequestBody WaterDto dto, @RequestParam ThirdPaySoureBizTypeEnum soureType) { + return hardThirdPayService.waterList(dto, soureType); + } + + @Inner + @PostMapping("/detail") + @SysLog("订单详情") + @Operation(summary = "订单详情") + public PayBaseVo orderDetail(@RequestBody PayDetailDto dto, @RequestParam ThirdPaySoureBizTypeEnum soureType) { + return hardThirdPayService.orderDetail(dto, soureType); + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/wechant/WechantPayController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/wechant/WechantPayController.java new file mode 100644 index 000000000..c96891b49 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/wechant/WechantPayController.java @@ -0,0 +1,40 @@ +package com.bsd.pjcloud.hard.controller.wechant; + +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.hard.service.WechatPayService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/hard-wechant-pay") +@Tag(description = "hard-wechant", name = "微信相关") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +@Validated +public class WechantPayController { + + private final WechatPayService wechatPayService; + + /* ************************************* start callback start ************************************* */ + + @Inner(value = false) + @PostMapping("/callback/refund") + @Operation(summary = "微信退款回调") + public String refundCallback(HttpEntity httpEntity, @RequestHeader Map headers) { + return wechatPayService.refundCallback(httpEntity, headers); + } + + /* ************************************* end callback end ************************************* */ + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardAfterSaleLogMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardAfterSaleLogMapper.java index cddab1e9b..701fe9c35 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardAfterSaleLogMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardAfterSaleLogMapper.java @@ -7,6 +7,7 @@ import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.hard.api.dto.order.HardAfterSaleLogDto; import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleLogEntity; import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleLogVo; +import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleVo; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java index 0fd86ffde..80dbcb8b0 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardCarMapper.java @@ -1,12 +1,16 @@ package com.bsd.pjcloud.hard.mapper.order; 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.vo.order.HardCanteenProductTotalVo; import com.bsd.pjcloud.hard.api.dto.order.HardCarDto; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface HardCarMapper extends PjcloudBaseMapper { @@ -17,4 +21,8 @@ public interface HardCarMapper extends PjcloudBaseMapper { .eqIfExists(HardCarEntity::getParentCarId, dto.getParentCarId()); return selectJoinPage(page, HardCarVo.class, wrapper); } + + Page productTotal(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope); + + Page proudctQuery(Page page, @Param("dto") HardCarDto dto); } \ 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 20535d003..30dc645af 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 @@ -4,15 +4,15 @@ 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.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; -import com.bsd.pjcloud.hard.api.dto.order.HardChartLatitudeVo; +import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderSumAndCountDto; import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; import com.bsd.pjcloud.hard.api.vo.order.*; -import com.bsd.pjcloud.wallet.api.entity.WalletTransactionEntity; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; @@ -89,24 +89,47 @@ public interface HardOrderMapper extends PjcloudBaseMapper { return selectJoinOne(HardOrderVo.class, wrapper); } + /** + * 查询离线订单 + */ + default List getOfflineOrderList(List orderIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .in(HardOrderEntity::getId, orderIds) + .eq(HardOrderEntity::getOrderStatus, HardOrderStatusEnum.OFFLINE_CREATE.getType()) + .eq(HardOrderEntity::getIsOfflineOrder, YesNoEnum.YES.getCode()) + .orderByDesc(HardOrderEntity::getCreateTime) + .orderByDesc(HardOrderEntity::getId); + return selectList(wrapper); + } + default List list(HardOrderDto dto) { return selectListByScope(commonWrapper(dto), DataScope.of()); } Page scopePageList(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope); + List scopeList(@Param("dto") HardOrderDto dto, DataScope dataScope); + List listSb(@Param("dto") HardOrderDto dto, DataScope dataScope); + List listRefundSb(@Param("dto") HardOrderDto refundDto, @Param("refundDataScope") DataScope refundDataScope); + List listCs(@Param("dto") HardOrderDto dto, DataScope dataScope); + List listRefundCs(@Param("dto") HardOrderDto refundDto, DataScope refundDataScope); + List listCsByDay(@Param("dto") HardOrderDto totalDto); HardOrderCsVo listCsTotal(@Param("dto") HardOrderDto totalDto); List listOrerPayType(@Param("dto") HardOrderDto dto); + List listOrerRefundPayType(@Param("dto") HardOrderDto refundDto); + List sumAndCount(@Param("dto") HardOrderSumAndCountDto dto); + List refundSumAndCount(@Param("dto") HardOrderSumAndCountDto refundDto); + List sumAndCountTotalByHourType(@Param("dto") HardOrderSumAndCountDto dto); HardZyCardSyncVo totalYearMonthDay(@Param("dto") HardOrderDto hardOrderDto); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java new file mode 100644 index 000000000..d2c04b392 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/AlipayService.java @@ -0,0 +1,42 @@ +package com.bsd.pjcloud.hard.service; + + +import com.alipay.api.response.*; +import com.bsd.pjcloud.hard.api.dto.ali.*; +import org.springframework.http.HttpEntity; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.util.Map; + +public interface AlipayService { + + /** + * 付款码支付 + */ + AlipayTradePayResponse micropay(AliMicropayDto dto); + + /** + * 查询订单 + */ + AlipayTradeQueryResponse query(AliQueryDto dto); + + /** + * 撤销订单 + */ + AlipayTradeCancelResponse reverse(AliReverseDto dto); + + /** + * 申请退款 + */ + AlipayTradeRefundResponse refund(AliRefundDto dto); + + /** + * 查询退款 + */ + AlipayTradeFastpayRefundQueryResponse refundQuery(AliRefundQueryDto dto); + + /** + * 退款回调 + */ + String refundCallback(Map params); +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java index 6c61cd715..19b9fc66f 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleEntity; import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleLogEntity; import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleVo; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; +import com.bsd.pjcloud.hard.api.vo.wechat.WechantRefunCallbackVo; import java.util.List; @@ -23,51 +24,38 @@ public interface HardAfterSaleService extends IService { /** * 申请售后 - * - * @param dto - * @return */ Long create(HardAfterSaleDto dto); /** * 取消售后 - * - * @param userId 用户id - * @param afterSaleId 售后id - * @return */ Boolean cancelAfterSale(Long userId, Long afterSaleId); /** * 获取售后进度 - * - * @param id 售后id */ List getHistory(Long id); /** * 退款 - * - * @param afterSaleId 售后id */ void refund(Long afterSaleId); void refund(Long afterSaleId, String prefixStr); + /** + * 微信退款回调通知 + */ + boolean wechatRefundCallback(WechantRefunCallbackVo decrypt); + /** * 同意售后 - * - * @param userId 用户id - * @param id 售后id */ Boolean agreeAfterSale(Long userId, Long id); /** * 拒绝售后 - * - * @param userId 用户id - * @param dto - * @return */ Boolean disagreeRefund(Long userId, HardDisagreeDto dto); @@ -78,9 +66,11 @@ public interface HardAfterSaleService extends IService { /** * 后台退款 - * - * @param dto - * @return */ Boolean adminRefund(HardAdminRefundDto dto, PjcloudUser user); + + /** + * 消费机限时退款 + */ + Boolean adTimeLintRefund(Long orderId, String reason, PjcloudUser user); } \ 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 240de46e7..162427d93 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.dto.HardAdBroadcastDto; 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; @@ -21,5 +22,10 @@ public interface HardBroadcastService extends IService { /** * 完成硬件广播 */ - void doneBroadcast(HardOrderEntity orderdetail); + void doneBroadcast(HardOrderEntity orderdetail, UserInfo userInfo); + + /** + * android完成一轮广播 + */ + void androidDoneBroadcast(HardAdBroadcastDto dto); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java new file mode 100644 index 000000000..38136834f --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardCanteenTotalService.java @@ -0,0 +1,22 @@ +package com.bsd.pjcloud.hard.service; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.dto.order.HardCarDto; +import com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; +import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; + +public interface HardCanteenTotalService { + + /** + * 食堂菜品购买统计 + */ + Page productTotal(Page page, HardOrderDto dto, DataScope dataScope); + + /** + * 菜品出售统计 + */ + Page proudctQuery(Page page, HardCarDto dto); +} 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 7ed95232c..42e8e6dfc 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 @@ -10,6 +10,7 @@ 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.vo.order.HardCarVo; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -39,6 +40,10 @@ public interface HardCarService extends IService { */ Long createCard(Long userId, Long merchantId, HardTypeEnum sysType, HardOrderTypeEnum orderTYpe, List list); + /** + * 创建第三方支付购物车 + */ + Long createThiredPayCard(Long userId, Long merchantId, List list); /** * 生成购买商品的描述 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 index f4aabea87..1e3903aaa 100644 --- 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 @@ -21,5 +21,5 @@ public interface HardDoorCabinetService extends IService /** * 刷新智能柜货柜二维码 */ - String refreshQrCode(Long hardDoorId, Integer cabinetNo); + void 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/HardOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java index d1ef932a7..51336d73e 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 @@ -3,9 +3,12 @@ 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.admin.api.entity.SysUser; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto; import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto; import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto; @@ -14,6 +17,7 @@ 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 com.bsd.pjcloud.wallet.api.vo.MchManageVo; import jakarta.validation.Valid; import java.util.List; @@ -29,17 +33,25 @@ public interface HardOrderService extends IService { Page scopePageList(Page page, HardOrderDto dto, DataScope dataScope); - List scopeList(HardOrderDto dto); + List scopeList(HardOrderDto dto, DataScope dataScope); HardOrderVo join(Long id); + /** + * 创建订单 + */ Long createOrder(HardCreateOrderDto dto); /** - * 创建app订单 + * app创建食堂预定订单 */ Long appCreateOrder(@Valid HardAppCreateOrderDto dto); + /** + * app创建线上超市预定订单 + */ + Long appCreateSupermarketReserveOrder(HardAppCreateOrderDto dto); + /** * 创建app订单 */ @@ -61,19 +73,26 @@ public interface HardOrderService extends IService { Long cancelHardDoorOrder(Long orderId); /** - * 快速扣款,离线订单使用 + * 快速扣款 */ void fastReduceBalance(HardOrderEntity order); + /** + * 订单成功 + */ + void orderSuccess(HardOrderEntity order, Boolean isPay); + /** * 计算额外金额 */ Integer computeExtraPrice(Integer price); + Integer computeExtraPrice(Integer price, MchManageVo mch, SysUser sysUser); + /** * 核销二维码 */ - void cancelCode(HardOrderEntity order); + void cancelCode(HardOrderEntity order, UserInfo userInfo); /** * 生成二维码 @@ -94,4 +113,9 @@ public interface HardOrderService extends IService { * 创建订单后发送mq消息 */ void createOrderAfterSendMqMsg(Long orderId, UserInfo userInfo); + + /** + * 是否需要支付 + */ + boolean isPay(HardOrderTypeEnum type, HardPayTypeEnum payType); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderSyncService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderSyncService.java index 843c40226..745cc5d3f 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderSyncService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderSyncService.java @@ -14,4 +14,8 @@ public interface HardOrderSyncService { */ List syncOfflineOrder(@Valid SyncOfflineReqVo dto); + /** + * 离线订单手动支付 + */ + void offlinePay(List orderIds); } 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 e4d8cfc9c..9d394fc15 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 @@ -10,6 +10,7 @@ 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; +import com.bsd.pjcloud.thirdparty.dto.ks.KsSkuSubmitCallbackDto; import java.util.ArrayList; import java.util.List; @@ -36,6 +37,16 @@ public interface HardSpuService extends IService { */ Long edit(HardSpuEntity entity); + /** + * 更新旷世商品审核进度 + */ + void progress(Long id); + + /** + * 商品审核回调 + */ + void skuCheckCallback(KsSkuSubmitCallbackDto dto); + /** * 删除 */ @@ -75,4 +86,5 @@ public interface HardSpuService extends IService { * 扣减库存 */ 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/HardThirdPayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdPayService.java new file mode 100644 index 000000000..58f73840f --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdPayService.java @@ -0,0 +1,37 @@ +package com.bsd.pjcloud.hard.service; + + +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPaySoureBizTypeEnum; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDetailDto; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.dto.pay.WaterDto; +import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayWaterVo; +import com.bsd.pjcloud.thirdparty.vo.pay.RefundVo; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; + +import java.util.List; + +public interface HardThirdPayService { + /** + * 第三方支付 + */ + PayBaseVo walletPay(PayDto dto, WalletTypeEnum walletType, ThirdPaySoureBizTypeEnum soureType); + + /** + * 第三方退款 + */ + PayBaseVo walletRefund(RefundDto dto, ThirdPaySoureBizTypeEnum soureType); + + /** + * 获取流水 + */ + PayBaseVo> waterList(WaterDto dto, ThirdPaySoureBizTypeEnum soureType); + + /** + * 订单详情 + */ + PayBaseVo orderDetail(PayDetailDto dto, ThirdPaySoureBizTypeEnum soureType); +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/WechatPayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/WechatPayService.java new file mode 100644 index 000000000..f2f85f0a6 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/WechatPayService.java @@ -0,0 +1,45 @@ +package com.bsd.pjcloud.hard.service; + + +import com.bsd.pjcloud.hard.api.dto.wechat.*; +import com.bsd.pjcloud.hard.api.vo.wechat.*; +import org.springframework.http.HttpEntity; +import org.springframework.web.bind.annotation.RequestHeader; + +import java.util.Map; + +/** + * 微信支付 + */ +public interface WechatPayService { + + /** + * 付款码支付 + */ + WechatMicropayVo micropay(WechatMicropayDto dto); + + /** + * 查询订单 + */ + WechatQueryVo query(WechatQueryDto dto); + + /** + * 撤销订单 + */ + WechantReverseVo reverse(WechantReverseDto dto); + + /** + * 申请退款 + */ + WechatRefundVo refund(WechatRefundDto dto); + + /** + * 查询退款 + */ + WechatRefundQueryVo refundQuery(WechatRefundQueryDto dto); + + /** + * 退款回调 + */ + String refundCallback(HttpEntity httpEntity, @RequestHeader Map headers); +} 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 43ad89152..c2d999f15 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 @@ -4,12 +4,16 @@ import cn.hutool.core.util.ObjectUtil; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.vo.android.HardAdUserVo; import com.bsd.pjcloud.hard.service.HardApiService; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -23,6 +27,7 @@ public class HardApiServiceImpl implements HardApiService { private final RemoteUserService userService; private final RemoteWalletService remoteWalletService; + private final RemoteMchService remoteMchService; @Override public HardAdUserVo getUserById(Long userId, HardTypeEnum type) { @@ -31,10 +36,7 @@ public class HardApiServiceImpl implements HardApiService { UserInfo user = userService.getInnerByUserId(userId).getData(); if (ObjectUtil.isEmpty(user)) return null; // 查询钱包 - // WalletTypeEnum walletType = ObjectUtil.equals(HardTypeEnum.CANTEEN, type) ? WalletTypeEnum.EAT : WalletTypeEnum.PAY; - // 默认都使用饭卡钱包 - WalletTypeEnum walletType = WalletTypeEnum.EAT; - + WalletTypeEnum walletType = ObjectUtil.equals(HardTypeEnum.CANTEEN, type) ? WalletTypeEnum.EAT : WalletTypeEnum.PAY; WalletManageEntity wallet = remoteWalletService.getWallet(userId, walletType).getData(); if (ObjectUtil.isEmpty(wallet)) return null; SysUser sysUser = user.getSysUser(); @@ -48,6 +50,11 @@ public class HardApiServiceImpl implements HardApiService { result.setWalletTypeId(wallet.getWalletTypeId()); result.setWalletBalance(wallet.getBalance()); result.setWalletIsFreeze(wallet.getIsFreeze()); + // 查询用户食堂信息 + MchManageVo mchDetail = remoteMchService.getFirstMchByDeptId(user.getSysUser().getDeptId(), MerchantTypeEnum.CANTEEN).getData(); + if (ObjectUtil.isNotEmpty(mchDetail)) { + result.setCanteenId(mchDetail.getId()); + } return result; } @@ -58,6 +65,10 @@ public class HardApiServiceImpl implements HardApiService { // 查询钱包 WalletManageEntity wallet = remoteWalletService.getWalletByCardNumber(card).getData(); if (ObjectUtil.isEmpty(wallet)) return null; + // 判断钱包是否冻结 + if (ObjectUtil.equals(wallet.getIsFreeze(), YesNoEnum.YES.getCode())) { + throw new RuntimeException("钱包已冻结"); + } // 查询用户 UserInfo user = userService.getInnerByUserId(wallet.getUserId()).getData(); if (ObjectUtil.isEmpty(user)) return null; @@ -72,6 +83,11 @@ public class HardApiServiceImpl implements HardApiService { result.setWalletTypeId(wallet.getWalletTypeId()); result.setWalletBalance(wallet.getBalance()); result.setWalletIsFreeze(wallet.getIsFreeze()); + // 查询用户食堂信息 + MchManageVo mchDetail = remoteMchService.getFirstMchByDeptId(user.getSysUser().getDeptId(), MerchantTypeEnum.CANTEEN).getData(); + if (ObjectUtil.isNotEmpty(mchDetail)) { + result.setCanteenId(mchDetail.getId()); + } return result; } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardBroadcastServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardBroadcastServiceImpl.java index 6c5eb19ab..1c1008282 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardBroadcastServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardBroadcastServiceImpl.java @@ -2,6 +2,8 @@ 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.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.dto.UserInfo; @@ -15,6 +17,7 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.hard.api.constant.HardBroadcastEnum; import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; +import com.bsd.pjcloud.hard.api.dto.HardAdBroadcastDto; import com.bsd.pjcloud.hard.api.dto.HardBroadcastDto; import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; import com.bsd.pjcloud.hard.api.entity.HardBroadcastEntity; @@ -79,19 +82,19 @@ public class HardBroadcastServiceImpl extends ServiceImpl() + Long broadcastCount = baseMapper.selectCount(new LambdaQueryWrapper() .eq(HardBroadcastEntity::getBizId, orderdetail.getId()) ); - if (ObjectUtil.isNotEmpty(broadcastDetail)) { + if (broadcastCount >= 1) { log.error("|{}|发送线下订餐mq消息失败,广播已存在|{}|", TAG, orderdetail.getId()); return; } // 查询设备 - HardManagerEntity hardDetail = hardManagerMapper.selectOne(new LambdaQueryWrapper() + List hardList = hardManagerMapper.selectList(new LambdaQueryWrapper() .eq(HardManagerEntity::getMerchantId, orderdetail.getMerchantId()) .eq(HardManagerEntity::getIsTakeFood, YesNoEnum.YES.getCode()) ); - if (ObjectUtil.isEmpty(hardDetail)) { + if (ObjectUtil.isEmpty(hardList)) { log.error("|{}|发送线下订餐mq消息失败,默认订餐设备不存在|{}|", TAG, orderdetail.getId()); return; } @@ -104,43 +107,49 @@ public class HardBroadcastServiceImpl extends ServiceImpl() .eq(HardBroadcastEntity::getBizId, orderdetail.getId()) + .orderByDesc(HardBroadcastEntity::getCreateTime) + .orderByDesc(HardBroadcastEntity::getId) + .last("limit 1") ); 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); + // 查询设备 + List hardList = hardManagerMapper.selectList(new LambdaQueryWrapper() + .eq(HardManagerEntity::getMerchantId, orderdetail.getMerchantId()) + .eq(HardManagerEntity::getIsTakeFood, YesNoEnum.YES.getCode()) + ); + if (ObjectUtil.isEmpty(hardList)) { + log.error("|{}|发送线下订餐完成mq消息失败,默认订餐设备不存在|{}|", TAG, orderdetail.getId()); + return; + } + baseMapper.update(new LambdaUpdateWrapper().set(HardBroadcastEntity::getIsBroadcast, YesNoEnum.NO.getCode()) + .set(HardBroadcastEntity::getIsDone, YesNoEnum.YES.getCode()) + .set(HardBroadcastEntity::getIsDoneTime, orderdetail.getCreateTime()) + .eq(HardBroadcastEntity::getBizId, orderdetail.getId()) + .eq(HardBroadcastEntity::getIsDone, YesNoEnum.NO.getCode()) + ); + // 发送mq + for (HardManagerEntity v : hardList) { + String topic = v.getMainTopic().replaceAll("/#", ""); + HardTakeFoodBroadcastMsg msg = new HardTakeFoodBroadcastMsg(); + msg.setTopic(topic); + msg.setMchDeptId(v.getDeptId()); + msg.setHardwareId(v.getId()); + 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(v.getId())); + msg.setOrderId(String.valueOf(orderdetail.getId())); + msg.setTitle(broadcastDetail.getTitle()); + msg.setContent(broadcastDetail.getContent()); + msg.setBroadcastMaxCount(broadcastDetail.getBroadcastMaxCount()); + msg.setProductDesc(orderdetail.getProductDesc()); + msg.setPayPrice(orderdetail.getPayPrice()); + msg.setHourType(orderdetail.getHourType()); + msg.setIsDone(YesNoEnum.YES.getCode()); + remoteMqttEventService.sendTakeFoodBroadcast(msg); + } + } + + /** + * android完成一轮广播 + */ + @Override + public void androidDoneBroadcast(HardAdBroadcastDto dto) { + if (ObjectUtil.isEmpty(dto.getIds())) return; + if (ObjectUtil.isEmpty(dto.getCount())) dto.setCount(1); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper(); + if (ObjectUtil.equals(dto.getCount(), -1)) { + updateWrapper.setSql(" broadcast_count = 0 "); + } else { + updateWrapper.setSql(" broadcast_count = broadcast_count + " + dto.getCount()); + } + updateWrapper.in(HardBroadcastEntity::getId, dto.getIds()); + baseMapper.update(updateWrapper); } private void disposeList(List list, HardBroadcastDto dto) { 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 index 89f717fa3..8cab898ea 100644 --- 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 @@ -349,7 +349,7 @@ public class HardDoorFlowServiceImpl extends ServiceImpl new RuntimeException("用户不存在")); - SysUser sysUser = user.getSysUser(); + String username = "外部用户-未知用户"; + String userPhone = "外部用户-未知手机号"; + UserInfo user = userService.getInnerByUserId(order.getUserId()).getData(); + if (ObjectUtil.isNotEmpty(user)) { + if (ObjectUtil.isNotEmpty(user.getSysUser())) { + username = user.getSysUser().getName(); + userPhone = user.getSysUser().getPhone(); + } + } // 查询商户 MchManageVo mch = Optional.of(remoteMchService.getById(order.getMerchantId())).map(R::getData).orElseThrow(() -> new RuntimeException("商户不存在")); // 订单类型 @@ -154,12 +161,14 @@ public class HardInvoiceServiceImpl extends ServiceImpl params) { + if (ObjectUtil.isEmpty(params)) return "fail"; + try { + boolean checkSignature = AlipaySignature.rsaCheckV1(params, conf.getAlipayPublicKey(), "UTF-8", "RSA2"); + if (!checkSignature) { + log.error("支付宝回调校验失败"); + return "fail"; + } + log.debug("支付宝回调参数:{}", params); + return "success"; + } catch (Exception e) { + log.error("退款回调", e); + return "fail"; + } + } +} 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 6ef26efcb..1b5300589 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 @@ -6,6 +6,7 @@ import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.BeanUtils; +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; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; @@ -26,7 +27,7 @@ import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleLogMapper; import com.bsd.pjcloud.hard.service.HardAfterSaleService; import com.bsd.pjcloud.hard.service.HardOrderService; import com.bsd.pjcloud.hard.service.HardThirdSelfZyService; -import com.bsd.pjcloud.hard.zy.config.ZyCallbackConfig; +import com.bsd.pjcloud.hard.config.ZyCallbackConfig; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; @@ -68,13 +69,10 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { try { // 查询用户 UserInfo userDetail = remoteUserService.getInnerByUserId(dto.getUserId()).getData(); - if (ObjectUtil.isEmpty(userDetail)) throw new RuntimeException("用户不存在不存在"); + 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.getInnerByUserId(wallet.getUserId()).getData(); - if (ObjectUtil.isEmpty(user)) throw new RuntimeException("用户不存在"); // 查询正元默认商户 MchManageVo zyDefaultMch = getZyDefaultMch(); if (ObjectUtil.isEmpty(zyDefaultMch)) throw new RuntimeException("默认商户不存在"); @@ -95,7 +93,7 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { .merchantDeptId(zyDefaultMch.getDeptId()) .userDeptId(userDetail.getSysUser().getDeptId()) .parentCarId(null) - .sysType(null) + .sysType(HardTypeEnum.OTHER.getType()) .orderStatus(HardOrderStatusEnum.CREATE.getType()) .orderType(HardOrderTypeEnum.ZY.getType()) .payType(HardPayTypeEnum.WALLET_CARD.getType()) @@ -114,8 +112,8 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { HardCallbackPayVo result = new HardCallbackPayVo(); result.setCode(HardCallbackPayStatus.SUCCESS); result.setOrderId(orderObj.getId()); - result.setUserId(user.getSysUser().getUserId()); - result.setUsername(user.getSysUser().getName()); + result.setUserId(userDetail.getSysUser().getUserId()); + result.setUsername(userDetail.getSysUser().getName()); result.setPayTime(LocalDateTime.now()); return result; } catch (Exception e) { diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorCabinetServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorCabinetServiceImpl.java index 01974dd53..6e8d677b1 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorCabinetServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/manager/HardDoorCabinetServiceImpl.java @@ -38,6 +38,8 @@ import java.util.Map; @Service public class HardDoorCabinetServiceImpl extends ServiceImpl implements HardDoorCabinetService { + private static final String TAG = "智能柜货柜"; + private final RemoteFileService remoteFileService; @Override @@ -89,33 +91,56 @@ public class HardDoorCabinetServiceImpl extends ServiceImpl() .eq(HardDoorCabinetEntity::getHardDoorId, hardDoorId) .eq(HardDoorCabinetEntity::getCabinetNo, cabinetNo) ); if (ObjectUtil.isEmpty(cabinetDetail)) throw new RuntimeException("货柜不存在"); + String qrCode = generateQrCode(cabinetDetail); + String urlQrCode = generateUrlQrCode(cabinetDetail); + // 更新 + HardDoorCabinetEntity updateObj = new HardDoorCabinetEntity(); + updateObj.setId(cabinetDetail.getId()); + updateObj.setQrCode(qrCode); + updateObj.setUrlQrCode(urlQrCode); + baseMapper.updateById(updateObj); + } + + // 生成二维码 + private String generateQrCode(HardDoorCabinetEntity detail) { HardDoorCabinetCodeVo cabinetCodeVo = new HardDoorCabinetCodeVo(); - cabinetCodeVo.setHardDoorId(String.valueOf(hardDoorId)); - cabinetCodeVo.setCabinetNo(String.valueOf(cabinetNo)); - // 生成二维码 + cabinetCodeVo.setHardDoorId(String.valueOf(detail.getHardDoorId())); + cabinetCodeVo.setCabinetNo(String.valueOf(detail.getCabinetNo())); + String fileName = String.format("%s-%s.png", detail.getHardDoorId(), System.currentTimeMillis()); 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)); + MultipartFile multipartFile = new MockMultipartFile("file", fileName, "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; + return (String) data.get("url"); } catch (Exception e) { - log.error("refreshQrCode刷新智能柜货柜二维码,hardDoorId:{},cabinetNo:{}", hardDoorId, cabinetNo, e); - throw new RuntimeException("刷新二维码失败"); + log.error("|{}|生成url二维码,dto:|{}|error:|{}|", TAG, JSONUtil.toJsonStr(detail), e.getMessage()); + return null; + } + } + + // 生成url二维码 + private String generateUrlQrCode(HardDoorCabinetEntity detail) { + HardDoorCabinetCodeVo cabinetCodeVo = new HardDoorCabinetCodeVo(); + String fileName = String.format("%s-%s.png", detail.getHardDoorId(), System.currentTimeMillis()); + String coeContent = String.format("https://stgl.pj.gov.cn/h5/#/pages/cabinet/buy?hardDoorId=%s&cabinetNo=%s", detail.getHardDoorId(), detail.getCabinetNo()); + try { + byte[] bytes = QRCodeImageGenerator.generateQrCodeImage(coeContent, 300); + MultipartFile multipartFile = new MockMultipartFile("file", fileName, "image/png", new ByteArrayInputStream(bytes)); + R upload = remoteFileService.innerUpload(multipartFile, null, null, null); + Map data = (Map) upload.getData(); + return (String) data.get("url"); + } catch (Exception e) { + log.error("|{}|生成url二维码,dto:|{}|error:|{}|", TAG, JSONUtil.toJsonStr(detail), e.getMessage()); + return null; } } } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java index 3ca2d74de..cd257b370 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java @@ -2,6 +2,8 @@ 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.alipay.api.response.AlipayTradeRefundResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -20,25 +22,32 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardAfterSaleOperateTypeEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardRefundStatusEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardSaleTypeEnum; +import com.bsd.pjcloud.hard.api.dto.ali.AliRefundDto; import com.bsd.pjcloud.hard.api.dto.order.HardAdminRefundDto; import com.bsd.pjcloud.hard.api.dto.order.HardAfterSaleDto; import com.bsd.pjcloud.hard.api.dto.order.HardDisagreeDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; +import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundDto; import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleEntity; import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleLogEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; import com.bsd.pjcloud.hard.api.utils.HardUtil; import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleVo; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; +import com.bsd.pjcloud.hard.api.vo.wechat.WechantRefunCallbackVo; +import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo; import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleLogMapper; import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; +import com.bsd.pjcloud.hard.service.AlipayService; import com.bsd.pjcloud.hard.service.HardAfterSaleService; import com.bsd.pjcloud.hard.service.HardOrderService; +import com.bsd.pjcloud.hard.service.WechatPayService; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundDto; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargeService; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeVo; @@ -55,9 +64,6 @@ import java.util.Map; /** * 售后订单 - * - * @author dzc - * @date 2025-01-07 17:23:08 */ @Validated @Slf4j @@ -65,8 +71,12 @@ import java.util.Map; @Service public class HardAfterSaleServiceImpl extends ServiceImpl implements HardAfterSaleService { + static private final String TAG = "售后订单"; + private final HardAfterSaleLogMapper hardAfterSaleLogMapper; private final HardOrderService hardOrderService; + private final WechatPayService wechatPayService; + private final AlipayService alipayService; private final HardOrderMapper hardOrderMapper; @@ -221,21 +231,101 @@ public class HardAfterSaleServiceImpl extends ServiceImpl walletRefundResult = walletRechargeService.refund(hardRefundDto); - if (walletRefundResult.getCode() != 0 || ObjectUtil.isEmpty(walletRefundResult.getData())) { - throw new RuntimeException("钱包退款错误"); + Integer refundPrice = afterSale.getRefundPrice(); + if (ObjectUtil.isEmpty(refundPrice)) { + refundPrice = order.getPayPrice(); + } + // 总的退款金额 + Integer refundTotalPrice = order.getRefundPrice(); + if (ObjectUtil.isEmpty(refundTotalPrice)) { + refundTotalPrice = 0; + } + HardOrderTypeEnum hardOrderType = HardOrderTypeEnum.valueOfByType(order.getOrderType()); + HardPayTypeEnum hardPayType = HardPayTypeEnum.valueOfByType(order.getPayType()); + // 是否钱包支付 + boolean isWalletPay = hardOrderService.isPay(hardOrderType, hardPayType); + // 是否微信支付 + boolean isWeChatPay = ObjectUtil.equals(order.getPayType(), HardPayTypeEnum.WECHANT_SELF_QR_CODE_PAY.getType()); + // 是否支付宝支付 + boolean isAliPay = ObjectUtil.equals(order.getPayType(), HardPayTypeEnum.ALI_SELF_QR_CODE_PAY.getType()); + if (isWalletPay) { + WalletRechargeRefundDto hardRefundDto = WalletRechargeRefundDto.builder().walletId(order.getWalletId()).orderId(order.getId()).afterSaleId(afterSale.getId()).refundCode(refundCode).reason("订单退款").price(refundPrice).build(); + R walletRefundResult = walletRechargeService.refund(hardRefundDto); + if (walletRefundResult.getCode() != 0 || ObjectUtil.isEmpty(walletRefundResult.getData())) { + throw new RuntimeException("钱包退款错误"); + } + WalletRechargeVo walletRefund = walletRefundResult.getData(); + HardOrderEntity updateObj = HardOrderEntity.builder() + .id(order.getId()) + .orderStatus(HardOrderStatusEnum.REFUND.getType()) + .refundStatus(HardRefundStatusEnum.SUCCESS.getStatus()) + .payRefundId(walletRefund.getId()) + .refundPrice(refundTotalPrice + refundPrice) + .refundTime(LocalDateTime.now()) + .build(); + hardOrderService.updateById(updateObj); + } else if (isWeChatPay) { + WechatRefundDto refundDto = WechatRefundDto.builder().orderId(order.getId()).refundId(afterSale.getId()).orderPrice(refundPrice).refundPrice(refundPrice).build(); + WechatRefundVo refundVo = wechatPayService.refund(refundDto); + if (ObjectUtil.isEmpty(refundVo)) { + throw new RuntimeException("微信退款错误"); + } + if (!refundVo.isAllSuccess()) { + throw new RuntimeException(refundVo.getErr_code_des()); + } + } else if (isAliPay) { + AliRefundDto refundDto = AliRefundDto.builder().orderId(order.getId()).refundId(afterSale.getId()).refundPrice(refundPrice).build(); + AlipayTradeRefundResponse refundVo = alipayService.refund(refundDto); + if (ObjectUtil.isEmpty(refundVo) || !refundVo.isSuccess()) { + throw new RuntimeException("支付宝退款错误"); + } + // 售后成功 + HardOrderEntity updateObj = HardOrderEntity.builder() + .id(order.getId()) + .orderStatus(HardOrderStatusEnum.REFUND.getType()) + .refundStatus(HardRefundStatusEnum.SUCCESS.getStatus()) + .payRefundId(order.getId()) + .refundPrice(order.getPayPrice()) + .refundTime(LocalDateTime.now()) + .build(); + hardOrderService.updateById(updateObj); + } + } + + /** + * 微信退款回调通知 + */ + @Override + public boolean wechatRefundCallback(WechantRefunCallbackVo decrypt) { + try { + Long orderId = Long.valueOf(decrypt.getOut_trade_no()); + Long refunId = Long.valueOf(decrypt.getOut_refund_no()); + // 查询订单 + HardOrderEntity order = hardOrderService.getById(orderId); + if (ObjectUtil.isEmpty(order)) { + log.error("微信退款回调通知,订单不存在orderId:{}", orderId); + return false; + } + // 查询售后单 + HardAfterSaleEntity afterSale = baseMapper.selectById(refunId); + if (ObjectUtil.isEmpty(afterSale)) { + log.error("微信退款回调通知,售后单不存在refunId:{}", refunId); + return false; + } + HardOrderEntity updateObj = HardOrderEntity.builder() + .id(order.getId()) + .orderStatus(HardOrderStatusEnum.REFUND.getType()) + .refundStatus(HardRefundStatusEnum.SUCCESS.getStatus()) + .payRefundId(orderId) + .refundPrice(Integer.valueOf(decrypt.getRefund_fee())) + .refundTime(LocalDateTime.now()) + .build(); + hardOrderService.updateById(updateObj); + return true; + } catch (Exception e) { + log.error("微信退款回调通知失败", e); + return false; } - WalletRechargeVo walletRefund = walletRefundResult.getData(); - HardOrderEntity updateObj = HardOrderEntity.builder() - .id(order.getId()) - .orderStatus(HardOrderStatusEnum.REFUND.getType()) - .refundStatus(HardRefundStatusEnum.SUCCESS.getStatus()) - .payRefundId(walletRefund.getId()) - .refundPrice(order.getPayPrice()) - .refundTime(LocalDateTime.now()) - .build(); - hardOrderService.updateById(updateObj); } @Override @@ -312,8 +402,19 @@ public class HardAfterSaleServiceImpl extends ServiceImpl afterList = baseMapper.selectList(new LambdaQueryWrapper() + .eq(HardAfterSaleEntity::getOrderId, order.getId()) + .eq(HardAfterSaleEntity::getType, HardSaleTypeEnum.AFTER_SALE.getType()) + .in(HardAfterSaleEntity::getStatus, List.of(HardSaleStatusEnum.APPLY.getStatus(), HardSaleStatusEnum.COMPLETE.getStatus())) + ); + // 退款金额 + int totalPrice = afterList.stream().filter(v -> ObjectUtil.isNotEmpty(v.getRefundPrice())).map(HardAfterSaleEntity::getRefundPrice).reduce(0, Integer::sum); + if (totalPrice > order.getPayPrice()) { + throw new RuntimeException("退款总金额大于支付总金额"); } return orderVo; } @@ -399,6 +500,62 @@ public class HardAfterSaleServiceImpl extends ServiceImpl productTotal(Page page, HardOrderDto dto, DataScope dataScope) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + return hardCarMapper.productTotal(page, dto, dataScope); + } + + /** + * 菜品出售统计 + */ + @Override + public Page proudctQuery(Page page, HardCarDto dto) { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); + return hardCarMapper.proudctQuery(page, dto); + } +} 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 646cc5511..cfe417b73 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 @@ -11,6 +11,7 @@ import com.bsd.pjcloud.canteen.api.feign.RemoteOnlineCanteenSpuService; import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; import com.bsd.pjcloud.canteen.vo.app.CanteenOnlineSpuAppVO; import com.bsd.pjcloud.common.core.util.BeanUtils; +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,6 +30,7 @@ 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 com.bsd.pjcloud.thirdparty.dto.pay.PayDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -140,8 +142,8 @@ public class HardCarServiceImpl extends ServiceImpl { // 查询食堂商品 AtomicInteger canteenTotalPrice = new AtomicInteger(); - // 线上 if (ObjectUtil.equals(HardOrderTypeEnum.RESERVE, orderType)) { + // 线上 List supList = onlineCanteenSpuService.getSpuListByIds(productIds).getData(); for (HardCreateCarDto v : list) { supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> { @@ -149,9 +151,8 @@ public class HardCarServiceImpl extends ServiceImpl supList = canteenSpuService.getSpuListByIds(productIds).getData(); for (HardCreateCarDto v : list) { supList.stream().filter(i -> ObjectUtil.equals(i.getId(), v.getProductId())).findFirst().ifPresent(spu -> { @@ -208,6 +209,9 @@ public class HardCarServiceImpl extends ServiceImpl list) { @@ -218,6 +222,25 @@ public class HardCarServiceImpl extends ServiceImpl list) { + // 创建父订单 + HardParentCarEntity parentCarObj = HardParentCarEntity.builder().userId(userId).merchantId(merchantId).hardType(HardTypeEnum.OTHER.getType()).orderStatus(HardOrderStatusEnum.PAY.getType()).build(); + hardParentCarMapper.insert(parentCarObj); + List carObjectList = new ArrayList<>(); + for (PayDto.Product v : list) { + Long totalPrice = BigDecimal.valueOf(v.getCount()).multiply(BigDecimal.valueOf(v.getPrice())).setScale(0, RoundingMode.CEILING).longValue(); + HardCarEntity item = HardCarEntity.builder().parentCarId(parentCarObj.getId()).productName(v.getName()).productPic(v.getPic()).productPrice(v.getPrice()).productNature(HardProductNatureEnum.DEFAULT.getType()).productCount(v.getCount()).totalPrice(totalPrice).build(); + carObjectList.add(item); + } + baseMapper.insert(carObjectList); + return parentCarObj.getId(); + } + @Transactional(rollbackFor = Exception.class) public void appCreateCard(Long parentCarId, HardTypeEnum sysType, HardOrderTypeEnum orderType, List productList) { List productIds = productList.stream().map(HardCreateCarDto::getProductId).toList(); 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 869c1be6f..264151c03 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 @@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; +import com.alipay.api.response.AlipayTradePayResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -27,6 +28,8 @@ 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; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; +import com.bsd.pjcloud.hard.api.dto.ali.AliMicropayDto; +import com.bsd.pjcloud.hard.api.dto.ali.AliReverseDto; import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto; import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto; @@ -34,6 +37,8 @@ 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.dto.wechat.WechantReverseDto; +import com.bsd.pjcloud.hard.api.dto.wechat.WechatMicropayDto; import com.bsd.pjcloud.hard.api.entity.HardApptEntity; import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity; import com.bsd.pjcloud.hard.api.entity.order.HardCarEntity; @@ -45,6 +50,7 @@ import com.bsd.pjcloud.hard.api.vo.HardDoorFlowVo; import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; +import com.bsd.pjcloud.hard.api.vo.wechat.WechatMicropayVo; import com.bsd.pjcloud.hard.mapper.manager.HardManagerMapper; import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.*; @@ -54,6 +60,8 @@ 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; +import com.bsd.pjcloud.wallet.api.constant.mch.WalletMchRulePriceTypeEnum; +import com.bsd.pjcloud.wallet.api.constant.mch.WalletMchSupType; import com.bsd.pjcloud.wallet.api.dto.WalletBalanceTransactionDto; import com.bsd.pjcloud.wallet.api.entity.WalletCodeUseEntity; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; @@ -62,6 +70,7 @@ import com.bsd.pjcloud.wallet.api.feign.*; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; +import com.bsd.pjcloud.wallet.api.vo.mch.MchRuleJoinDtoVo; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -73,6 +82,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -102,6 +112,8 @@ public class HardOrderServiceImpl extends ServiceImpl scopeList(HardOrderDto dto) { - List list = baseMapper.list(dto); - List resultList = BeanUtils.toBean(list, HardOrderVo.class); - disposeList(resultList, dto); - return resultList; + public List scopeList(HardOrderDto dto, DataScope dataScope) { + List list = baseMapper.scopeList(dto, dataScope); + disposeList(list, dto); + return list; } /** @@ -142,40 +154,7 @@ public class HardOrderServiceImpl extends ServiceImpl scopePageList(Page page, HardOrderDto dto, DataScope dataScope) { Page list = baseMapper.scopePageList(page, dto, dataScope); - if (ObjectUtil.isNotEmpty(list.getRecords())) { - // 用户 - List userIds = list.getRecords().stream().map(HardOrderVo::getUserId).filter(ObjectUtil::isNotEmpty).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> userList = userService.getUserById(new ArrayList<>(userIds)); - if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(list.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); - } - } - // 部门 - List deptIds = list.getRecords().stream().map(HardOrderVo::getDeptId).filter(ObjectUtil::isNotEmpty).distinct().toList(); - if (ObjectUtil.isNotEmpty(deptIds)) { - R> deptList = deptService.getDeptByDeptIds(deptIds); - if (ObjectUtil.isNotEmpty(deptList.getData())) { - DataUtil.convertDeptList(list.getRecords(), deptList.getData()); - } - } - // 商户 - List mchIds = list.getRecords().stream().map(HardOrderVo::getMerchantId).filter(ObjectUtil::isNotEmpty).distinct().toList(); - if (ObjectUtil.isNotEmpty(mchIds)) { - R> mchList = remoteMchService.getByIds(mchIds); - if (ObjectUtil.isNotEmpty(mchList.getData())) { - WalletDataUtil.convertMchList(list.getRecords(), CollectionUtils.convertMap(mchList.getData(), MchManageVo::getId)); - } - } - // 购物车 - if (dto.getIsFindCarList()) { - for (HardOrderVo v : list.getRecords()) { - List carList = hardCarService.getByParentCarId(v.getParentCarId()); - List carVoList = BeanUtils.toBean(carList, HardCarVo.class); - v.setCarList(carVoList); - } - } - } + disposeList(list.getRecords(), dto); return list; } @@ -226,19 +205,37 @@ public class HardOrderServiceImpl extends ServiceImpl walletResult = remoteWalletService.getWallet(dto.getUserId(), WalletTypeEnum.EAT); - wallet = Optional.of(walletResult).map(R::getData).orElseThrow(() -> new RuntimeException("用户钱包不存在")); + if (isWalletPay) { + if (ObjectUtil.isEmpty(mch.getDefaultWalletTypeId())) { + if (dto.getSysType().equals(HardTypeEnum.CANTEEN)) { + R walletResult = remoteWalletService.getWallet(dto.getUserId(), WalletTypeEnum.EAT); + wallet = Optional.of(walletResult).map(R::getData).orElseThrow(() -> new RuntimeException("用户钱包不存在")); + } else { + R walletResult = remoteWalletService.getWallet(dto.getUserId(), WalletTypeEnum.PAY); + wallet = Optional.of(walletResult).map(R::getData).orElseThrow(() -> new RuntimeException("用户钱包不存在")); + } } else { R walletResult = remoteWalletService.getWalletByWalletTypeId(dto.getUserId(), mch.getDefaultWalletTypeId()); wallet = Optional.of(walletResult).map(R::getData).orElseThrow(() -> new RuntimeException("用户钱包不存在")); @@ -246,12 +243,16 @@ public class HardOrderServiceImpl extends ServiceImpl 100) throw new RuntimeException("您有" + reserveCount + "笔未核销的预约订单,请先核销"); + if (reserveCount > 3) throw new RuntimeException("您有" + reserveCount + "笔未核销的预约订单,请先核销"); // 钱包 WalletManageEntity wallet = remoteWalletService.getWallet(dto.getUserId(), dto.getWalletType()).getData(); if (ObjectUtil.isEmpty(wallet)) throw new RuntimeException("用户钱包不存在"); @@ -374,12 +423,87 @@ public class HardOrderServiceImpl extends ServiceImpl carList = hardCarService.getByParentCarId(dto.getCarParentId()); + if (ObjectUtil.isEmpty(carList)) throw new RuntimeException("购物车不存在"); + Integer balance = wallet.getBalance(); + int totalPrice = (int) carList.stream().mapToLong(HardCarEntity::getTotalPrice).sum(); + if (balance < totalPrice) { + throw new RuntimeException("钱包余额不足"); + } + // 获取商品描述 + List carListDto = carList.stream().map(v -> { + HardCreateCarDto entity = new HardCreateCarDto(); + entity.setParentCarId(dto.getCarParentId()); + entity.setProductId(v.getProductId()); + entity.setProductWeight(v.getProductWeight()); + entity.setProductCount(v.getProductCount()); + return entity; + }).toList(); + HardTypeEnum hardType = ObjectUtil.equals(dto.getWalletType(), WalletTypeEnum.EAT) ? HardTypeEnum.CANTEEN : HardTypeEnum.SUPERMARKET; + String subject = hardCarService.computerCarSubject(hardType, dto.getOrderType(), carListDto); + // 添加硬件订单 + HardOrderEntity orderObj = HardOrderEntity.builder() + .userId(dto.getUserId()) + .userDeptId(userDetail.getSysUser().getDeptId()) + .parentCarId(dto.getCarParentId()) + .sysType(dto.getHardType().getType()) + .orderStatus(HardOrderStatusEnum.CREATE.getType()) + .merchantId(parentCar.getMerchantId()) + .merchantType(hardManager.getTypes()) + .merchantDeptId(hardManager.getDeptId()) + .orderType(dto.getOrderType().getType()) + .payType(dto.getPayType().getType()) + .orderSourceTypeId(dto.getOrderSourceTypeId()) + .totalPrice(totalPrice) + .extraPrice(0) + .payPrice(totalPrice) + .isOfflineOrder(YesNoEnum.NO.getCode()) + .productDesc(subject) + .walletId(wallet.getId()) + .build(); + baseMapper.insert(orderObj); + // 钱包扣款 + getSelf().fastReduceBalance(orderObj); + // 创建二维码 + getSelf().generateCode(orderObj); + // 发送mq消息 + getSelf().createOrderAfterSendMqMsg(orderObj.getId(), userDetail); + // 扣减库存 + getSelf().fastenerInventory(orderObj, YesNoEnum.YES); + return orderObj.getId(); + } + @Override // @GlobalTransactional @Transactional(rollbackFor = Exception.class) public Long appCreateOrderScancode(HardAppCreateOrderDto dto) { MchManageVo mch = remoteMchService.getById(dto.getMerchantId()).getData(); if (ObjectUtil.isEmpty(mch)) throw new RuntimeException("商户不存在"); + // 判断商户合作状态 + if (ObjectUtil.equals(mch.getTypes(), MerchantTypeEnum.SUPERMARKET.getType()) && ObjectUtil.equals(mch.getSupType(), WalletMchSupType.MCH.getCode())) { + if (ObjectUtil.equals(mch.getCooperationStatus(), YesNoEnum.NO.getCode())) { + throw new RuntimeException("改商家未合作"); + } + } // 查询用户 UserInfo userDetail = userService.getInnerByUserId(dto.getUserId()).getData(); if (ObjectUtil.isEmpty(userDetail)) throw new RuntimeException("用户不存在不存在"); @@ -542,28 +666,50 @@ public class HardOrderServiceImpl extends ServiceImpl reduceRes = walletTransactionService.reduceWalletBalance(reduceBuild); - if (reduceRes.getCode() != 0 || ObjectUtil.isEmpty(reduceRes.getData())) { - throw new RuntimeException("钱包扣款错误"); - } - WalletTransactionEntity walletTransaction = reduceRes.getData(); - if (ObjectUtil.isNotEmpty(walletTransaction)) { - // 订单表订单状态 - Integer payPrice = isPay ? order.getTotalPrice() + order.getExtraPrice() : 0; - HardOrderEntity update = HardOrderEntity.builder().id(order.getId()).payTime(LocalDateTime.now()).orderStatus(HardOrderStatusEnum.PAY.getType()).payPrice(payPrice).build(); - baseMapper.updateById(update); - // 父购物车订单表订单状态 - if (ObjectUtil.isNotEmpty(order.getParentCarId())) { - HardParentCarEntity updateParentCar = HardParentCarEntity.builder().id(order.getParentCarId()).orderStatus(HardOrderStatusEnum.PAY.getType()).build(); - hardParentCarServiceImpl.updateById(updateParentCar); + HardOrderTypeEnum hardOrderType = HardOrderTypeEnum.valueOfByType(order.getOrderType()); + HardPayTypeEnum hardPayType = HardPayTypeEnum.valueOfByType(order.getPayType()); + boolean isWalletPay = isPay(hardOrderType, hardPayType); + // 是否需要核销 + boolean isVerify = isVerify(hardPayType); + if (isWalletPay) { + WalletBalanceTransactionDto reduceBuild = new WalletBalanceTransactionDto(); + reduceBuild.setWalletId(order.getWalletId()); + reduceBuild.setPrice(order.getPayPrice()); + reduceBuild.setBizId(String.valueOf(order.getId())); + reduceBuild.setBizType(WalletBizEnum.PAYMENT); + reduceBuild.setForce(true); + R reduceRes = walletTransactionService.reduceWalletBalance(reduceBuild); + if (reduceRes.getCode() != 0 || ObjectUtil.isEmpty(reduceRes.getData())) { + throw new RuntimeException("钱包扣款错误"); } } + // 订单成功 + if (isWalletPay || isVerify) { + getSelf().orderSuccess(order, isWalletPay); + } + } + + /** + * 订单成功 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void orderSuccess(HardOrderEntity order, Boolean isWalletPay) { + if (ObjectUtil.isEmpty(isWalletPay)) { + isWalletPay = isPay(HardOrderTypeEnum.valueOfByType(order.getOrderType()), HardPayTypeEnum.valueOfByType(order.getPayType())); + } + // 订单表订单状态 + Integer payPrice = isWalletPay ? order.getTotalPrice() + order.getExtraPrice() : 0; + HardOrderEntity update = HardOrderEntity.builder().id(order.getId()).payTime(LocalDateTime.now()).orderStatus(HardOrderStatusEnum.PAY.getType()).payPrice(payPrice).build(); + if (ObjectUtil.isNotEmpty(order.getOrderNo())) { + update.setOrderNo(order.getOrderNo()); + } + baseMapper.updateById(update); + // 父购物车订单表订单状态 + if (ObjectUtil.isNotEmpty(order.getParentCarId())) { + HardParentCarEntity updateParentCar = HardParentCarEntity.builder().id(order.getParentCarId()).orderStatus(HardOrderStatusEnum.PAY.getType()).build(); + hardParentCarServiceImpl.updateById(updateParentCar); + } } @Override @@ -586,18 +732,62 @@ public class HardOrderServiceImpl extends ServiceImpl list = mchRuleJoinService.innerMchRoleList(mch.getId()).getData(); + if (ObjectUtil.isEmpty(list)) return extraPrice; + // 查询用户食堂 + MchManageVo userMch = remoteMchService.getFirstMchByDeptId(sysUser.getDeptId(), MerchantTypeEnum.CANTEEN).getData(); + for (MchRuleJoinDtoVo v : list) { + Long basePrice = v.getBasePrice(); + Long multiple = v.getMultiple(); + String rulePriceType = v.getRulePriceType(); + if (!ObjectUtil.isAllNotEmpty(price, mch, sysUser)) continue; + if (price < basePrice) continue; + Long surplus = price - basePrice; + BigDecimal extraPriceBD = BigDecimal.valueOf(surplus).multiply(BigDecimal.valueOf(multiple)).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); + // 10 跨单位额外支付 + if (ObjectUtil.equals(rulePriceType, WalletMchRulePriceTypeEnum.STRIDE_LIMIT.getCode())) { + if (ObjectUtil.isEmpty(userMch) || ObjectUtil.notEqual(userMch.getId(), v.getSourceMchId())) { + continue; + } + extraPrice += extraPriceBD.setScale(0, RoundingMode.HALF_UP).intValueExact(); + continue; + } + // 20 每餐额外支付 + if (ObjectUtil.equals(rulePriceType, WalletMchRulePriceTypeEnum.EVERY_LIMIT.getCode())) { + extraPrice += extraPriceBD.setScale(0, RoundingMode.HALF_UP).intValueExact(); + continue; + } + } + } catch (Exception e) { + log.error("|{}|计算额外金额错误", TAG, e); + } + return extraPrice; + } + @Override @Transactional(rollbackFor = Exception.class) public Boolean handCancelCode(HandCancelCodeDto dto) { // 查询订单 HardOrderEntity order = baseMapper.selectById(dto.getOrderId()); if (ObjectUtil.isEmpty(order)) throw new RuntimeException("订单不存在"); + // 查询用户 + UserInfo userInfo = userService.getByUserId(order.getUserId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) throw new RuntimeException("用户不存在"); // 判断是否被核销过 HardOrderTypeEnum orderType = HardOrderTypeEnum.valueOfByType(order.getOrderType()); boolean isCancel = validateCodeIsCancel(orderType, order.getId()); if (isCancel) throw new RuntimeException("该二维码已被核销"); // 核销二维码 - getSelf().cancelCode(order); + getSelf().cancelCode(order, userInfo); HardOrderEntity updateObj = HardOrderEntity.builder().id(order.getId()).androidOrderCode(dto.getAndroidOrderCode()).hardId(dto.getHardwareId()).orderStatus(HardOrderStatusEnum.CANCEL.getType()).build(); return baseMapper.updateById(updateObj) > 0; } @@ -605,20 +795,29 @@ public class HardOrderServiceImpl extends ServiceImpl { } // 外来人员 | 跨单位 | 线上订餐 case FOREIGN_TICKET, STRIDE_DEPT, RESERVE -> { + // 核销二维码 R result = remoteCodeUseService.cancelCode(id); if (ObjectUtil.isEmpty(result) || result.getCode() != 0 || !result.getData()) { throw new RuntimeException("核销二维码错误"); } + // 发送mq + if (ObjectUtil.equals(orderTypeEnum, HardOrderTypeEnum.RESERVE)) { + hardBroadcastService.doneBroadcast(order, userInfo); + } break; } } @@ -771,6 +970,23 @@ public class HardOrderServiceImpl extends ServiceImpl userIds = list.stream().map(HardOrderVo::getUserId).filter(ObjectUtil::isNotEmpty).distinct().toList(); if (ObjectUtil.isNotEmpty(userIds)) { - R> userList = userService.getUserById(new ArrayList<>(userIds)); + R> userList = userService.getInnerUserById(new ArrayList<>(userIds)); if (ObjectUtil.isNotEmpty(userList.getData())) { DataUtil.convertUserList(list, CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderSyncServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderSyncServiceImpl.java index ec838985a..442e08873 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderSyncServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderSyncServiceImpl.java @@ -4,7 +4,11 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.hard.api.constant.HardTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.dto.async.OfflineCar; import com.bsd.pjcloud.hard.api.dto.async.OfflineOrder; @@ -12,11 +16,15 @@ import com.bsd.pjcloud.hard.api.dto.async.SyncOfflineReqVo; 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.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.HardCarService; import com.bsd.pjcloud.hard.service.HardOrderSyncService; import com.bsd.pjcloud.hard.service.HardOrderService; import com.bsd.pjcloud.hard.service.HardParentCarService; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletSettingService; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; @@ -27,7 +35,9 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; /** * 订单同步 @@ -40,12 +50,17 @@ public class HardOrderSyncServiceImpl implements HardOrderSyncService { static private final String TAG = "订单同步"; - private final RemoteMchService remoteMchService; - private final RemoteWalletSettingService walletSettingService; private final HardCarService hardCarService; private final HardParentCarService hardParentCarService; private final HardOrderService orderService; + private final HardOrderMapper hardOrderMapper; + + private final RemoteMchService remoteMchService; + private final RemoteWalletSettingService walletSettingService; + private final RemoteWalletService walletService; + private final RemoteUserService userService; + @Override @Transactional(rollbackFor = Exception.class) public List syncOfflineOrder(SyncOfflineReqVo body) { @@ -58,7 +73,7 @@ public class HardOrderSyncServiceImpl implements HardOrderSyncService { if (ObjectUtil.isNotEmpty(setting) && ObjectUtil.isNotEmpty(setting.getOffLineOrderApplyEnable())) { offLineOrderApplyEnable = ObjectUtil.equals(setting.getOffLineOrderApplyEnable(), YesNoEnum.YES.getCode()); } - List createIdList = List.of(); + List createIdList = new ArrayList<>(); List list = body.getList(); for (OfflineOrder i : list) { if (ObjectUtil.isEmpty(i.getCarList())) { @@ -72,9 +87,28 @@ public class HardOrderSyncServiceImpl implements HardOrderSyncService { createIdList.add(findOrder.getAndroidOrderCode()); continue; } - HardOrderEntity order = parseOrder(i, body.getHardwareId(), body.getMerchantId(), merchant.getDeptId()); + // 查询用户 + UserInfo userInfo = userService.getByUserId(i.getUserCode()).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + log.error("|{}|同步安卓机离线订单,用户不存在:{}", TAG, JSON.toJSONString(i)); + continue; + } + HardOrderEntity order = parseOrder(i, body.getHardwareId(), merchant, merchant.getDeptId(), userInfo); HardParentCarEntity parentCar = parseParentCar(i, body.getMerchantId()); List carList = i.getCarList().stream().map(this::parseCar).toList(); + + // 查询钱包 + WalletManageEntity wallet = null; + if (ObjectUtil.isNotEmpty(merchant.getDefaultWalletTypeId())) { + wallet = walletService.getWallet(order.getUserId(), WalletTypeEnum.EAT).getData(); + } else { + wallet = walletService.getWalletByWalletTypeId(order.getUserId(), merchant.getDefaultWalletTypeId()).getData(); + } + if (ObjectUtil.isEmpty(wallet)) { + log.error("|{}|同步安卓机离线订单,钱包不存在order:{}", TAG, JSON.toJSONString(i)); + continue; + } + order.setWalletId(wallet.getId()); if (!ObjectUtil.isAllNotEmpty(order, parentCar, carList)) { log.error("|{}|同步安卓机离线订单,order、parentCar、carList任意一个为空order:{}", TAG, JSON.toJSONString(i)); continue; @@ -85,6 +119,31 @@ public class HardOrderSyncServiceImpl implements HardOrderSyncService { return createIdList; } + /** + * 离线订单手动支付 + */ + @Override + public void offlinePay(List orderIds) { + // 查询离线订单 + List list = hardOrderMapper.getOfflineOrderList(orderIds); + if (ObjectUtil.isEmpty(list)) return; + for (HardOrderEntity v : list) { + getSelf().offlinePay(v); + } + } + + /** + * 离线订单手动支付 + */ + @Transactional(rollbackFor = Exception.class) + public void offlinePay(HardOrderEntity order) { + // 支付 + orderService.fastReduceBalance(order); + // 标记离线支付成功 + HardOrderEntity updateObj = HardOrderEntity.builder().id(order.getId()).offlinePaySuccess(YesNoEnum.YES.getCode()).build(); + orderService.updateById(updateObj); + } + // 同步安卓机单个离线订单 TODO 允许把金额扣为负数 @Transactional(rollbackFor = Exception.class) public Boolean createOfflineOrder(HardOrderEntity order, HardParentCarEntity parentCar, List list, OfflineOrder offlineOrder, boolean offLineOrderApplyEnable) { @@ -118,12 +177,15 @@ public class HardOrderSyncServiceImpl implements HardOrderSyncService { return false; } - public HardOrderEntity parseOrder(OfflineOrder order, Long hardwareId, Long merchantId, Long merchantDeptId) { + public HardOrderEntity parseOrder(OfflineOrder order, Long hardwareId, MchManageVo mchDetail, Long merchantDeptId, UserInfo userInfo) { HardOrderEntity res = new HardOrderEntity(); res.setAndroidOrderCode(order.getUniqueCode()); res.setUserId(order.getUserCode()); + res.setUserDeptId(userInfo.getSysUser().getDeptId()); res.setHardId(hardwareId); - res.setMerchantId(merchantId); + res.setMerchantId(mchDetail.getId()); + res.setMerchantDeptId(mchDetail.getDeptId()); + res.setMerchantType(mchDetail.getTypes()); res.setDeptId(merchantDeptId); res.setSysType(order.getSysType().getType()); res.setWalletId(order.getWalletId()); @@ -144,6 +206,7 @@ public class HardOrderSyncServiceImpl implements HardOrderSyncService { HardParentCarEntity res = new HardParentCarEntity(); res.setUserId(order.getUserCode()); res.setMerchantId(merchantId); + res.setHardType(order.getSysType().getType()); res.setOrderStatus(HardOrderStatusEnum.OFFLINE_CREATE.getType()); return res; } 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 5aee99170..ce26a67e7 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderTotalServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderTotalServiceImpl.java @@ -15,6 +15,8 @@ import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardRefundStatusEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum; import com.bsd.pjcloud.hard.api.dto.manager.HardManagerDto; import com.bsd.pjcloud.hard.api.dto.hard.CurrentUserHardTypeInfoDto; import com.bsd.pjcloud.hard.api.dto.order.HardChartLatitudeVo; @@ -40,6 +42,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.math.BigDecimal; import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; @@ -48,6 +51,7 @@ import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; @Validated @@ -83,16 +87,13 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { List totalList = hardOrderMapper.listSb(totalDto, totalDataScope); // 扣款总流水 HardOrderDto refundDto = BeanUtil.toBean(dto, HardOrderDto.class); + refundDto.setPayTimeList(null); + refundDto.setRefundTimeList(dto.getPayTimeList()); + refundDto.setRefundStatusCodes(List.of(HardSaleStatusEnum.COMPLETE.getStatus())); refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); 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); - profitDataScope.setScopeDeptName("merchant_dept_id"); - List profitList = hardOrderMapper.listSb(profitDto, profitDataScope); + List refundList = hardOrderMapper.listRefundSb(refundDto, refundDataScope); // 聚合一下数据 for (HardOrderSbVo v : totalList) { // 退款 @@ -102,12 +103,21 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { v.setTotalRefundCount(i.getTotalPayCount()); }); } + // 消费净金额 + if (ObjectUtil.isNotEmpty(v.getTotalPayPrice())) { + BigDecimal refundPrice = BigDecimal.ZERO; + if (ObjectUtil.isNotEmpty(v.getTotalRefundPrice())) { + refundPrice = v.getTotalRefundPrice(); + } + v.setTotalProfitPrice(v.getTotalPayPrice().subtract(refundPrice)); + } // 消费净次数 - if (ObjectUtil.isNotEmpty(profitList)) { - profitList.stream().filter(i -> ObjectUtil.equals(i.getHardId(), v.getHardId())).findFirst().ifPresent(i -> { - v.setTotalProfitPrice(i.getTotalPayPrice()); - v.setTotalProfitCount(i.getTotalPayCount()); - }); + if (ObjectUtil.isNotEmpty(v.getTotalPayCount())) { + BigDecimal refundCount = BigDecimal.ZERO; + if (ObjectUtil.isNotEmpty(v.getTotalRefundCount())) { + refundCount = v.getTotalRefundCount(); + } + v.setTotalProfitCount(v.getTotalPayCount().subtract(refundCount)); } } if (ObjectUtil.isNotEmpty(totalList)) { @@ -149,16 +159,13 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { List totalList = hardOrderMapper.listCs(totalDto, totalDataScope); // 扣款总流水 HardOrderDto refundDto = BeanUtil.toBean(dto, HardOrderDto.class); + refundDto.setPayTimeList(null); + refundDto.setRefundTimeList(dto.getPayTimeList()); refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); + refundDto.setRefundStatusCodes(List.of(HardSaleStatusEnum.COMPLETE.getStatus())); DataScope refundDataScope = DataScope.of(); refundDataScope.setScopeDeptName("merchant_dept_id"); - List refundList = hardOrderMapper.listCs(refundDto, refundDataScope); - // 消费净次数 - HardOrderDto profitDto = BeanUtil.toBean(dto, HardOrderDto.class); - profitDto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); - DataScope profitDataScope = DataScope.of(); - profitDataScope.setScopeDeptName("merchant_dept_id"); - List profitList = hardOrderMapper.listCs(profitDto, profitDataScope); + List refundList = hardOrderMapper.listRefundCs(refundDto, refundDataScope); for (HardOrderCsVo v : totalList) { // 退款 if (ObjectUtil.isNotEmpty(refundList)) { @@ -167,12 +174,21 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { v.setTotalRefundCount(i.getTotalPayCount()); }); } + // 消费净金额 + if (ObjectUtil.isNotEmpty(v.getTotalPayPrice())) { + BigDecimal refundPrice = BigDecimal.ZERO; + if (ObjectUtil.isNotEmpty(v.getTotalRefundPrice())) { + refundPrice = v.getTotalRefundPrice(); + } + v.setTotalProfitPrice(v.getTotalPayPrice().subtract(refundPrice)); + } // 消费净次数 - if (ObjectUtil.isNotEmpty(profitList)) { - profitList.stream().filter(i -> ObjectUtil.equals(i.getMerchantId(), v.getMerchantId())).findFirst().ifPresent(i -> { - v.setTotalProfitPrice(i.getTotalPayPrice()); - v.setTotalProfitCount(i.getTotalPayCount()); - }); + if (ObjectUtil.isNotEmpty(v.getTotalPayCount())) { + BigDecimal refundCount = BigDecimal.ZERO; + if (ObjectUtil.isNotEmpty(v.getTotalRefundCount())) { + refundCount = v.getTotalRefundCount(); + } + v.setTotalProfitCount(v.getTotalPayCount().subtract(refundCount)); } } // 聚合一下数据 @@ -185,6 +201,17 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { WalletDataUtil.convertMchList(totalList, CollectionUtils.convertMap(mchList, MchManageVo::getId)); } } + // 商户部门 + List mchDeptIds = totalList.stream().map(HardOrderCsVo::getMerchantDeptId).distinct().toList(); + if (ObjectUtil.isNotEmpty(mchDeptIds)) { + Map deptMap = remoteDeptService.getDeptByDeptIds(mchDeptIds).getData(); + if (ObjectUtil.isNotEmpty(deptMap)) { + for (HardOrderCsVo v : totalList) { + if (ObjectUtil.isEmpty(v.getMerchantDeptId())) continue; + v.setMerchantDeptName(deptMap.get(v.getMerchantDeptId()).getName()); + } + } + } } return totalList; } @@ -350,6 +377,20 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { } return remoteWalletTransactionService.sumAndCount(walletDto).getData(); }); + // 查询钱包退还各自食堂 + CompletableFuture> walletRetrunCanteenFuture = CompletableFuture.supplyAsync(() -> { + WalletTransactionSumAndCountDto walletDto = new WalletTransactionSumAndCountDto(); + walletDto.setDeptIds(deptIds); + walletDto.setBizTypes(List.of(WalletBizEnum.RETURN_CANTEEN.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(); @@ -396,36 +437,24 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { HardOrderSumAndCountDto refundDto = new HardOrderSumAndCountDto(); refundDto.setUserDeptIds(deptIds); refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); + refundDto.setRefundStatusCodes(List.of(HardSaleStatusEnum.COMPLETE.getStatus())); if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { - refundDto.setCreateTimeList(dto.getCreateTimeList()); + refundDto.setRefundTimeList(dto.getCreateTimeList()); } if (ObjectUtil.isNotEmpty(dto.getWalletTypeId())) { refundDto.setWalletTypeId(dto.getWalletTypeId()); } - return hardOrderMapper.sumAndCount(refundDto); + return hardOrderMapper.refundSumAndCount(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); + CompletableFuture allFutures = CompletableFuture.allOf(walletBatchFuture, walletReduceFuture, payFuture, refundFuture, walletOnceBatchFuture, walletOnceReduceFuture); allFutures.join(); List walletBatchList = walletBatchFuture.join(); List walletReduceList = walletReduceFuture.join(); + List walletRetrunCanteenList = walletRetrunCanteenFuture.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)) { @@ -441,6 +470,13 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { v.setWalletReduceCount(i.getCount()); }); } + // 退还各自食堂 + if (ObjectUtil.isNotEmpty(walletRetrunCanteenList)) { + walletRetrunCanteenList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { + v.setWalletReturnCanteenPrice(Math.abs(i.getSum())); + v.setWalletReturnCanteenCount(i.getCount()); + }); + } if (ObjectUtil.isNotEmpty(walletOnceBatchList)) { walletOnceBatchList.stream().filter(i -> ObjectUtil.equals(i.getDeptId(), v.getDeptId())).findFirst().ifPresent(i -> { v.setWalletOncePrice(i.getSum()); @@ -466,12 +502,16 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { 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()); - }); + } + // 计算净流水 + for (HardDeptTotalVo v : resultList) { + // 流水金额 + if (ObjectUtil.isNotEmpty(v.getOrderPayPrice())) { + v.setOrderProfitPrice(v.getOrderPayPrice() - v.getOrderRefundPrice()); + } + // 流水次数 + if (ObjectUtil.isNotEmpty(v.getOrderPayCount())) { + v.setOrderProfitCont(v.getOrderPayCount() - v.getOrderRefundCont()); } } return resultList; @@ -500,14 +540,12 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { List totalList = hardOrderMapper.listOrerPayType(totalDto); // 扣款总流水 HardOrderDto refundDto = BeanUtil.toBean(dto, HardOrderDto.class); + refundDto.setPayTimeList(null); + refundDto.setRefundTimeList(dto.getPayTimeList()); refundDto.setOrderStatusCodes(HardOrderStatusEnum.getPayErrorCodes()); + refundDto.setRefundStatusCodes(List.of(HardSaleStatusEnum.COMPLETE.getStatus())); refundDto.setOrderPayTypeCodes(payTypeList); - List refundList = hardOrderMapper.listOrerPayType(refundDto); - // 盈利 - HardOrderDto profitDto = BeanUtil.toBean(dto, HardOrderDto.class); - profitDto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes()); - profitDto.setOrderPayTypeCodes(payTypeList); - List profitList = hardOrderMapper.listOrerPayType(profitDto); + List refundList = hardOrderMapper.listOrerRefundPayType(refundDto); for (HardOrderPayTypeVo v : totalList) { // 退款 if (ObjectUtil.isNotEmpty(refundList)) { @@ -516,12 +554,21 @@ public class HardOrderTotalServiceImpl implements HardOrderTotalService { v.setTotalRefundCount(i.getTotalPayCount()); }); } - // 盈利 - if (ObjectUtil.isNotEmpty(profitList)) { - profitList.stream().filter(i -> ObjectUtil.equals(i.getPayType(), v.getPayType())).findFirst().ifPresent(i -> { - v.setTotalProfitPrice(i.getTotalPayPrice()); - v.setTotalProfitCount(i.getTotalPayCount()); - }); + // 消费净金额 + if (ObjectUtil.isNotEmpty(v.getTotalPayPrice())) { + BigDecimal refundPrice = BigDecimal.ZERO; + if (ObjectUtil.isNotEmpty(v.getTotalRefundPrice())) { + refundPrice = v.getTotalRefundPrice(); + } + v.setTotalProfitPrice(v.getTotalPayPrice().subtract(refundPrice)); + } + // 消费净次数 + if (ObjectUtil.isNotEmpty(v.getTotalPayCount())) { + BigDecimal refundCount = BigDecimal.ZERO; + if (ObjectUtil.isNotEmpty(v.getTotalRefundCount())) { + refundCount = v.getTotalRefundCount(); + } + v.setTotalProfitCount(v.getTotalPayCount().subtract(refundCount)); } } return totalList; 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 3ecc61e85..69b04f9fd 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,7 +1,10 @@ package com.bsd.pjcloud.hard.service.impl.spu; +import cn.hutool.Hutool; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -9,6 +12,7 @@ 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.common.data.resolver.ParamResolver; 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; @@ -27,9 +31,8 @@ import com.bsd.pjcloud.hard.service.HardManagerService; import com.bsd.pjcloud.hard.service.HardSpuJoinService; 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.thirdparty.dto.ks.*; +import com.bsd.pjcloud.thirdparty.vo.ks.*; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -38,6 +41,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.*; +import java.util.regex.Pattern; /** * 硬件商品 @@ -82,35 +86,110 @@ public class HardSpuServiceImpl extends ServiceImpl().eq(HardSpuEntity::getKsSkuId, dto.getKs_sku_id())); + if (ObjectUtil.isEmpty(detail)) return; + KsSkuSubmitCallbackDto.Result result = dto.getResult(); + String comments = ""; + if (ObjectUtil.isEmpty(dto.getComments())) { + comments = dto.getComments(); + } + if (ObjectUtil.isNotEmpty(result)) { + HardSpuEntity update = new HardSpuEntity(); + update.setId(detail.getId()); + update.setKsStatus(result.getCode()); + update.setKsStatusTitle(result.getDesc()); + update.setKsComments(comments); + baseMapper.updateById(update); + } + } + /** * 删除 */ @Override public void delByIds(ArrayList list) { if (ObjectUtil.isEmpty(list)) return; + List spuList = baseMapper.selectList(new LambdaQueryWrapper().in(HardSpuEntity::getId, list)); + for (HardSpuEntity v : spuList) { + if (ObjectUtil.notEqual(v.getSkuType(), HardKsSkuTypeEnum.SELF.getType())) continue; + if (ObjectUtil.isNotEmpty(v.getKsSkuId())) { + KsSkuDeleteDto dto = new KsSkuDeleteDto(); + dto.setKs_sku_id(v.getKsSkuId()); + KsSkuDeleteVo data = remoterThirdKsService.skuDelete(dto).getData(); + if (ObjectUtil.isEmpty(data) || !data.isSuccess()) throw new RuntimeException(data.getMessage()); + } + } baseMapper.deleteByIds(list); } @@ -388,6 +467,76 @@ public class HardSpuServiceImpl extends ServiceImpl picList = Arrays.asList(pic.split(",")); + String imageBaseUrl = ParamResolver.getStr("IMAGE_BASE_URL"); + if (ObjectUtil.isEmpty(imageBaseUrl)) throw new RuntimeException("请配置图片基础路径"); + picList = picList.stream().map(v -> { + boolean isUrl = isValidUrl(v); + if (isUrl) return v; + return String.format("%s%s", imageBaseUrl, v); + }).toList(); + // 发起旷世审核 + KsSkuSubmitDto dto = new KsSkuSubmitDto(); + dto.setSku_id(String.valueOf(entity.getId())); + dto.setSku_name(entity.getName()); + dto.setImg_urls(picList); + Map specs = new HashMap<>(); + specs.put("taste", entity.getSpecsTaste()); + specs.put("capacity", entity.getSpecsCapacity()); + specs.put("weight", entity.getSpecsWeight()); + dto.setSpecs(specs); + KsSkuSubmitVo data = remoterThirdKsService.skuSubmit(dto).getData(); + if (ObjectUtil.isEmpty(data) || !data.isSuccess()) throw new RuntimeException(data.getMessage()); + HardSpuEntity update = new HardSpuEntity(); + update.setId(entity.getId()); + update.setKsSkuId(data.getKs_sku_id()); + update.setKsStatus("0"); + update.setKsStatusTitle("待审核"); + update.setKsComments("提交审核"); + baseMapper.updateById(update); + } + + /** + * 修改旷世sku审核 + */ + @Transactional(rollbackFor = Exception.class) + public void editKsSpu(HardSpuEntity entity) { + String pic = entity.getPic(); + // pic = "https://nasa-voyager.oss-cn-beijing.aliyuncs.com/release/merchant_sku_img/watermark/202412021517-173bee3f2637499cb6b46e9b23d286c5.jpg"; + List picList = Arrays.asList(pic.split(",")); + String imageBaseUrl = ParamResolver.getStr("IMAGE_BASE_URL"); + if (ObjectUtil.isEmpty(imageBaseUrl)) throw new RuntimeException("请配置图片基础路径"); + picList = picList.stream().map(v -> { + boolean isUrl = isValidUrl(v); + if (isUrl) return v; + return String.format("%s%s", imageBaseUrl, v); + }).toList(); + // 修改旷世sku + KsSkuEditDto updateObj = new KsSkuEditDto(); + updateObj.setSku_name(entity.getName()); + updateObj.setImg_urls(picList); + Map specs = new HashMap<>(); + specs.put("taste", entity.getSpecsTaste()); + specs.put("capacity", entity.getSpecsCapacity()); + specs.put("weight", entity.getSpecsWeight()); + updateObj.setSpecs(specs); + KsSkuEditVo vo = remoterThirdKsService.skuEdit(updateObj, entity.getKsSkuId()).getData(); + if (ObjectUtil.isEmpty(vo) || !vo.isSuccess()) throw new RuntimeException(vo.getMessage()); + HardSpuEntity update = new HardSpuEntity(); + update.setId(entity.getId()); + update.setKsStatus("0"); + update.setKsStatusTitle("待审核"); + update.setKsComments("提交审核"); + baseMapper.updateById(update); + } + /** * 商品是否重复 */ @@ -402,8 +551,21 @@ public class HardSpuServiceImpl extends ServiceImpl 0; } + public boolean isValidUrl(String url) { + if (StrUtil.isBlank(url)) { + return false; + } + String URL_REGEX = "^(https?|ftp)://[\\w.-]+(?:\\/[\\w.-]*)*"; + Pattern URL_PATTERN = Pattern.compile(URL_REGEX); + return URL_PATTERN.matcher(url).matches(); + } + private void disposeList(List list, HardSpuDto dto) { if (ObjectUtil.isEmpty(list)) return; } + private HardSpuServiceImpl 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/third/HardThirdPayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java new file mode 100644 index 000000000..3fe30e23c --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/third/HardThirdPayServiceImpl.java @@ -0,0 +1,419 @@ +package com.bsd.pjcloud.hard.service.impl.third; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +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.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.common.core.util.BeanUtils; +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; +import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardAfterSaleOperateTypeEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardSaleTypeEnum; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; +import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleLogEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; +import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleVo; +import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; +import com.bsd.pjcloud.hard.config.LbCallbackConfig; +import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleLogMapper; +import com.bsd.pjcloud.hard.service.HardAfterSaleService; +import com.bsd.pjcloud.hard.service.HardCarService; +import com.bsd.pjcloud.hard.service.HardOrderService; +import com.bsd.pjcloud.hard.service.HardThirdPayService; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPaySoureBizTypeEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayVoStatusEnum; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDetailDto; +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.dto.pay.WaterDto; +import com.bsd.pjcloud.thirdparty.vo.pay.*; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; +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; + +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class HardThirdPayServiceImpl implements HardThirdPayService { + + private static final String TAG = "第三方支付"; + + private final LbCallbackConfig lbCallbackConfig; + + private final HardOrderService hardOrderService; + private final HardCarService hardCarService; + private final HardAfterSaleService hardAfterSaleService; + + private final HardAfterSaleLogMapper hardAfterSaleLogMapper; + + private final RemoteMchService mchService; + private final RemoteUserService userService; + private final RemoteWalletService walletService; + + /** + * 第三方支付 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public PayBaseVo walletPay(PayDto dto, WalletTypeEnum walletType, ThirdPaySoureBizTypeEnum soureType) { + PayBaseVo baseVo = new PayBaseVo(); + try { + String orderType = getOrderType(soureType); + // 默认商户 + MchManageVo defaultMch = getLbDefaultMch(soureType); + if (ObjectUtil.isEmpty(defaultMch)) { + baseVo.set(ThirdPayVoStatusEnum.MCH_EXIST); + return baseVo; + } + // 查询用户 + UserInfo userDetail = userService.getInnerByUserId(dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(userDetail)) { + baseVo.set(ThirdPayVoStatusEnum.USER_EXIST); + return baseVo; + } + // 钱包 + WalletManageEntity wallet = walletService.getWallet(dto.getUserId(), walletType).getData(); + if (ObjectUtil.isEmpty(wallet)) { + baseVo.set(ThirdPayVoStatusEnum.USER_EXIST); + return baseVo; + } + // 改订单号是否重复 + long orderCount = hardOrderService.count(new LambdaQueryWrapper() + .eq(HardOrderEntity::getOrderNo, dto.getThirdOrderId()) + .eq(HardOrderEntity::getOrderType, orderType) + .eq(HardOrderEntity::getOrderStatus, HardOrderStatusEnum.PAY.getType()) + ); + if (orderCount > 0) { + baseVo.set(ThirdPayVoStatusEnum.ORDER_HAVE_PAY); + return baseVo; + } + // 判断余额 + Integer balance = wallet.getBalance(); + int totalPrice = dto.getPrice(); + if (balance < totalPrice) { + baseVo.set(ThirdPayVoStatusEnum.BALANCE_NOT_ENOUGH); + return baseVo; + } + List products = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(dto.getProducts())) { + for (PayDto.Product v : dto.getProducts()) { + if (!ObjectUtil.isAllNotEmpty(v.getName(), v.getCount(), v.getPrice())) continue; + if (v.getCount() <= 0) continue; + products.add(v); + } + } + String subject = "美好生活物品*?"; + Integer orderTotalPrice = dto.getPrice(); + Long parentCarId = null; + if (ObjectUtil.isNotEmpty(products)) { + subject = generateSubDesc(products); + orderTotalPrice = computeCartTotalPrice(products); + // 添加购物车 + parentCarId = hardCarService.createThiredPayCard(dto.getUserId(), defaultMch.getId(), products); + } + // 添加硬件订单 + HardOrderEntity orderObj = HardOrderEntity.builder() + .orderNo(dto.getThirdOrderId()) + .parentCarId(parentCarId) + .userId(dto.getUserId()) + .merchantId(defaultMch.getId()) + .merchantType(defaultMch.getTypes()) + .merchantDeptId(defaultMch.getDeptId()) + .userDeptId(userDetail.getSysUser().getDeptId()) + .sysType(HardTypeEnum.OTHER.getType()) + .orderStatus(HardOrderStatusEnum.CREATE.getType()) + .orderType(orderType) + .payType(HardPayTypeEnum.WALLET_CARD.getType()) + .orderSourceTypeId(null) + .totalPrice(orderTotalPrice) + .extraPrice(dto.getPrice() - orderTotalPrice) + .payPrice(dto.getPrice()) + .isOfflineOrder(YesNoEnum.NO.getCode()) + .productDesc(subject) + .walletId(wallet.getId()) + .build(); + log.info("|{}|第三方支付订单参数|{}", TAG, JSONUtil.toJsonStr(orderObj)); + hardOrderService.save(orderObj); + hardOrderService.fastReduceBalance(orderObj); + // 返回 + baseVo.set(ThirdPayVoStatusEnum.SUCCESS); + PayVo payVo = new PayVo(); + payVo.setPayTime(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN)); + payVo.setThirdOrderId(dto.getThirdOrderId()); + payVo.setPlatformOrderId(String.valueOf(orderObj.getId())); + baseVo.setData(payVo); + return baseVo; + } catch (Exception e) { + String msg = String.format("|%s|第三方支付异常dto|%s|walletType|%s|", TAG, JSONUtil.toJsonStr(dto), walletType); + log.error(msg, e.getMessage()); + // 抛出错误 + throw new RuntimeException(msg); + } + } + + /** + * 第三方退款 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public PayBaseVo walletRefund(RefundDto dto, ThirdPaySoureBizTypeEnum soureType) { + PayBaseVo baseVo = new PayBaseVo(); + try { + String orderType = getOrderType(soureType); + // 订单是否存在 + HardOrderEntity orderEntity = hardOrderService.getOne(new LambdaQueryWrapper() + .eq(HardOrderEntity::getId, dto.getPlatformOrderId()) + .eq(HardOrderEntity::getOrderType, orderType) + ); + if (ObjectUtil.isEmpty(orderEntity)) { + baseVo.set(ThirdPayVoStatusEnum.ORDER_EXIST); + return baseVo; + } + // 查询所有成功的退款 + List afterList = hardAfterSaleService.list(new LambdaQueryWrapper() + .eq(HardAfterSaleEntity::getOrderId, orderEntity.getId()) + .eq(HardAfterSaleEntity::getType, HardSaleTypeEnum.AFTER_SALE.getType()) + .eq(HardAfterSaleEntity::getStatus, HardSaleStatusEnum.COMPLETE.getStatus()) + ); + // 退款金额 + int totalPrice = afterList.stream().filter(v -> ObjectUtil.isNotEmpty(v.getRefundPrice())).map(HardAfterSaleEntity::getRefundPrice).reduce(0, Integer::sum); + int executeTotalPrice = totalPrice + dto.getPrice(); + if (executeTotalPrice > orderEntity.getPayPrice()) { + baseVo.set(ThirdPayVoStatusEnum.REFUND_TOTAL_PRICE); + return baseVo; + } + // 退款id是否重复 + long refundCount = hardAfterSaleService.count(new LambdaQueryWrapper() + .eq(HardAfterSaleEntity::getNo, dto.getThirdRefundId()) + .eq(HardAfterSaleEntity::getType, HardSaleTypeEnum.AFTER_SALE.getType()) + .eq(HardAfterSaleEntity::getStatus, HardSaleStatusEnum.COMPLETE.getStatus()) + ); + if (refundCount > 0) { + baseVo.set(ThirdPayVoStatusEnum.ORDER_HAVE_REFUND); + return baseVo; + } + // 添加售后订单 + HardAfterSaleEntity saveObj = BeanUtils.toBean(dto, HardAfterSaleEntity.class); + saveObj.setType(HardSaleTypeEnum.AFTER_SALE.getType()); + saveObj.setStatus(HardSaleStatusEnum.COMPLETE.getStatus()); + saveObj.setNo(dto.getThirdRefundId()); + saveObj.setWay("10"); + saveObj.setOrderId(orderEntity.getId()); + saveObj.setRefundPrice(dto.getPrice()); + saveObj.setUserId(orderEntity.getUserId()); + saveObj.setAuditUserId(null); + saveObj.setAuditTime(LocalDateTime.now()); + saveObj.setApplyReason("宁波银行(美好生活)api退款"); + saveObj.setAuditReason("宁波银行(美好生活)api退款"); + saveObj.setApplyDescription("宁波银行(美好生活)api退款"); + hardAfterSaleService.save(saveObj); + // 添加售后进度 + HardAfterSaleLogEntity saveLogObj = HardAfterSaleLogEntity.builder() + .afterSaleId(saveObj.getId()) + .userId(orderEntity.getUserId()) + .operateType(HardAfterSaleOperateTypeEnum.ADMIN_REFUND.getType()) + .beforeStatus(orderEntity.getOrderStatus()) + .afterStatus(HardSaleStatusEnum.COMPLETE.getStatus()) + .content(HardSaleStatusEnum.COMPLETE.getContent()) + .build(); + hardAfterSaleLogMapper.insert(saveLogObj); + // 执行退款 + hardAfterSaleService.refund(saveObj.getId(), "zy"); + // 返回 + RefundVo refundVo = new RefundVo(); + refundVo.setRefundTime(LocalDateTimeUtil.format(LocalDateTime.now(), DatePattern.NORM_DATETIME_PATTERN)); + refundVo.setThirdOrderId(orderEntity.getOrderNo()); + refundVo.setThirdRefundId(dto.getThirdRefundId()); + refundVo.setPlatformOrderId(dto.getPlatformOrderId()); + refundVo.setPlatformRefundId(String.valueOf(saveObj.getId())); + refundVo.setPrice(dto.getPrice()); + baseVo.set(ThirdPayVoStatusEnum.SUCCESS); + baseVo.setData(refundVo); + return baseVo; + } catch (Exception e) { + String msg = String.format("|%s|第三方退款错误,dto|%s|", TAG, JSONUtil.toJsonStr(dto)); + log.error(msg, e.getMessage()); + // 抛出错误 + throw new RuntimeException(msg); + } + } + + /** + * 获取流水 + */ + @Override + public PayBaseVo> waterList(WaterDto dto, ThirdPaySoureBizTypeEnum soureType) { + String orderType = getOrderType(soureType); + Page page = new Page<>(); + page.setCurrent(dto.getCurrent()); + page.setSize(dto.getSize()); + HardOrderDto query = new HardOrderDto(); + query.setOrderType(orderType); + if (ObjectUtil.isNotEmpty(dto.getOrderStatus())) { + query.setOrderStatus(dto.getOrderStatus()); + } + Page pageList = hardOrderService.scopePageList(page, query, null); + List records = pageList.getRecords(); + List list = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(pageList.getRecords())) { + for (HardOrderVo v : records) { + PayWaterVo item = new PayWaterVo(); + item.setUserId(v.getUserId()); + item.setName(v.getUsername()); + item.setSignPhone(v.getUserMobile()); + item.setPlatformOrderId(String.valueOf(v.getId())); + item.setThirdOrderId(v.getOrderNo()); + item.setOrderStatus(v.getOrderStatus()); + item.setOrderPrice(v.getPayPrice()); + if (ObjectUtil.isNotEmpty(v.getPayTime())) { + item.setPayTime(LocalDateTimeUtil.format(v.getPayTime(), DatePattern.NORM_DATETIME_PATTERN)); + } + // 查询退款列表 + List refundList = getRefundList(v.getId()); + // 总退款金额 + Integer reduce = refundList.stream().filter(i -> ObjectUtil.isNotEmpty(i.getRefundPrice())).map(i -> i.getRefundPrice()).reduce(0, Integer::sum); + item.setRefundList(refundList); + item.setRefundTotalPrice(reduce); + list.add(item); + } + } + PayBaseVo baseVo = new PayBaseVo>(); + baseVo.set(ThirdPayVoStatusEnum.SUCCESS); + baseVo.setData(list); + return baseVo; + } + + /** + * 订单详情 + */ + @Override + public PayBaseVo orderDetail(PayDetailDto dto, ThirdPaySoureBizTypeEnum soureType) { + // 返回值 + PayBaseVo baseVo = new PayBaseVo(); + String orderType = getOrderType(soureType); + HardOrderDto query = new HardOrderDto(); + query.setOrderType(orderType); + query.setOrderNo(dto.getThirdOrderId()); + query.setAfterSaleNo(dto.getThirdRefundId()); + List hardOrderVos = hardOrderService.scopeList(query, null); + if (ObjectUtil.isEmpty(hardOrderVos)) { + baseVo.set(ThirdPayVoStatusEnum.ORDER_EXIST); + return baseVo; + } + if (hardOrderVos.size() > 1) { + baseVo.set(ThirdPayVoStatusEnum.DETAIL_ITEM_NOT_ONE); + return baseVo; + } + HardOrderVo order = hardOrderVos.get(0); + // 组合返回参数 + PayWaterVo item = new PayWaterVo(); + item.setUserId(order.getUserId()); + item.setName(order.getUsername()); + item.setSignPhone(order.getUserMobile()); + item.setPlatformOrderId(String.valueOf(order.getId())); + item.setThirdOrderId(order.getOrderNo()); + item.setOrderStatus(order.getOrderStatus()); + item.setOrderPrice(order.getPayPrice()); + if (ObjectUtil.isNotEmpty(order.getPayTime())) { + item.setPayTime(LocalDateTimeUtil.format(order.getPayTime(), DatePattern.NORM_DATETIME_PATTERN)); + } + // 查询退款列表 + List refundList = getRefundList(order.getId()); + // 总退款金额 + Integer reduce = refundList.stream().filter(i -> ObjectUtil.isNotEmpty(i.getRefundPrice())).map(i -> i.getRefundPrice()).reduce(0, Integer::sum); + item.setRefundList(refundList); + item.setRefundTotalPrice(reduce); + baseVo.set(ThirdPayVoStatusEnum.SUCCESS); + baseVo.setData(item); + return baseVo; + } + + /** + * 查询美好生活默认商户信息 + */ + private MchManageVo getLbDefaultMch(ThirdPaySoureBizTypeEnum type) { + switch (type) { + case LB -> { + Long lbMchId = lbCallbackConfig.getLbMchId(); + if (ObjectUtil.isNotEmpty(lbMchId)) { + MchManageVo defaultMch = mchService.getById(lbMchId).getData(); + log.info("查询美好生活默认商户信息 mchId |{}|defaultMch{}", lbCallbackConfig.getLbMchId(), JSONUtil.toJsonStr(defaultMch)); + return defaultMch; + } + } + } + return null; + } + + // 查询退款列表 + private List getRefundList(Long orderId) { + List afterList = hardAfterSaleService.list(new LambdaQueryWrapper() + .eq(HardAfterSaleEntity::getOrderId, orderId) + .eq(HardAfterSaleEntity::getType, HardSaleTypeEnum.AFTER_SALE.getType()) + .eq(HardAfterSaleEntity::getStatus, HardSaleStatusEnum.COMPLETE.getStatus()) + ); + if (ObjectUtil.isEmpty(afterList)) { + return null; + } + return afterList.stream().map(v -> { + PayRefundVo item = new PayRefundVo(); + item.setPlatformRefundId(String.valueOf(v.getId())); + item.setThirdRefundId(v.getNo()); + item.setRefundPrice(v.getRefundPrice()); + item.setRefundTime(LocalDateTimeUtil.format(v.getRefundTime(), DatePattern.NORM_DATETIME_PATTERN)); + return item; + }).toList(); + } + + private String getOrderType(ThirdPaySoureBizTypeEnum type) { + switch (type) { + case LB -> { + return HardOrderTypeEnum.LB.getType(); + } + } + return null; + } + + /** + * 生成商品简介 + */ + private String generateSubDesc(List list) { + StringBuilder str = new StringBuilder(); + for (PayDto.Product v : list) { + str.append(v.getName()).append("x").append(v.getCount()).append(";"); + } + return str.toString(); + } + + /** + * 计算购物车总价 + */ + private int computeCartTotalPrice(List list) { + int totalPrice = 0; + for (PayDto.Product v : list) { + totalPrice += v.getPrice() * v.getCount(); + } + return totalPrice; + } +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/wechat/WechatPayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/wechat/WechatPayServiceImpl.java new file mode 100644 index 000000000..7363ed6c6 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/wechat/WechatPayServiceImpl.java @@ -0,0 +1,377 @@ +package com.bsd.pjcloud.hard.service.impl.wechat; + + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.XmlUtil; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.hard.api.dto.wechat.*; +import com.bsd.pjcloud.hard.api.vo.wechat.*; +import com.bsd.pjcloud.hard.config.WechatPay; +import com.bsd.pjcloud.hard.service.HardAfterSaleService; +import com.bsd.pjcloud.hard.service.WechatPayService; +import com.bsd.pjcloud.hard.utils.constant.WechantPayConstant; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.HttpEntity; +import org.springframework.stereotype.Service; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import javax.net.ssl.*; +import java.io.FileInputStream; +import java.nio.charset.StandardCharsets; +import java.security.KeyStore; +import java.security.SecureRandom; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +/** + * 微信支付 + */ +@Service +@AllArgsConstructor +@Slf4j +public class WechatPayServiceImpl implements WechatPayService { + + private final WechatPay wechatPay; + + @Lazy + private final HardAfterSaleService hardAfterSaleService; + + /** + * 生成微信支付签名 + */ + public String generateSign(Map params) { + String apiKey = wechatPay.getApiV2Key(); + Map filtered = new TreeMap<>(); + for (Map.Entry entry : params.entrySet()) { + if (ObjectUtil.isEmpty(entry.getValue()) || ObjectUtil.equals("sign", entry.getKey())) { + continue; + } + filtered.put(entry.getKey(), String.valueOf(entry.getValue())); + } + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : filtered.entrySet()) { + sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); + } + sb.append("key=").append(apiKey); + try { + String sign = DigestUtils.md5Hex(String.valueOf(sb)); + return sign.toUpperCase(); + } catch (Exception e) { + log.error("微信支付签名生成失败", e); + } + return ""; + } + + private WechantPayConstant.Api initApi(WechantPayConstant.Api api) { + api.setBaseUrl(wechatPay.getBaseUrl()); + return api; + } + + private String getNonceStr() { + int length = 32; + return RandomUtil.randomString(length); + } + + private SSLSocketFactory createSSLSocketFactory() throws Exception { + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + FileInputStream certStream = new FileInputStream(wechatPay.getMerchantSerialPath()); + keyStore.load(certStream, wechatPay.getMerchantId().toCharArray()); + certStream.close(); + // 创建KeyManagerFactory + KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + keyManagerFactory.init(keyStore, wechatPay.getMerchantId().toCharArray()); + // 创建TrustManagerFactory(信任所有证书) + TrustManager[] trustManagers = new TrustManager[]{ + new X509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + + public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { + } + } + }; + // 创建SSLContext + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(keyManagerFactory.getKeyManagers(), trustManagers, new SecureRandom()); + return sslContext.getSocketFactory(); + } + + /** + * 解密回调信息解密 + */ + private WechantRefunCallbackVo decrypt(String xml) { + try { + WechantRefunCallbackSoureVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(xml)), WechantRefunCallbackSoureVo.class); + String reqInfo = vo.getReq_info(); + // 1 对加密串A做base64解码,得到加密串B + byte[] encryptedBytes = Base64.decode(reqInfo); + // 2 对商户key做md5,得到32位小写key + String md5Key = DigestUtils.md5Hex(wechatPay.getApiV2Key()).toLowerCase(); + // 3. AES-256-ECB 解密 + SecretKeySpec secretKey = new SecretKeySpec(md5Key.getBytes(StandardCharsets.UTF_8), "AES"); + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKey); + byte[] decryptedBytes = cipher.doFinal(encryptedBytes); + String json = new String(decryptedBytes, StandardCharsets.UTF_8); + WechantRefunCallbackVo entity = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(json)), WechantRefunCallbackVo.class); + log.debug("解密回调信息,json|{}", JSONUtil.toJsonStr(entity)); + return entity; + } catch (Exception e) { + e.printStackTrace(); + log.error("解密回调信息解密异常", e); + return null; + } + } + + /** + * 付款码支付 + */ + @Override + public WechatMicropayVo micropay(WechatMicropayDto dto) { + try { + Map params = new HashMap<>(); + // 公众账号ID + params.put("appid", wechatPay.getAppId()); + // 商户号 + params.put("mch_id", wechatPay.getMerchantId()); + // 设备号-终端设备号(商户自定义,如门店编号) + params.put("device_info", dto.getMerId()); + // 随机字符串 + params.put("nonce_str", getNonceStr()); + // 签名 + params.put("sign", ""); + // 签名类型 + params.put("sign_type", "MD5"); + // 商品描述 + params.put("body", "小铺故事超市-超市"); + // 商户单号 + params.put("out_trade_no", dto.getOrderId()); + // 订单金额(分) + params.put("total_fee", dto.getPrice()); + // 终端IP + params.put("spbill_create_ip", wechatPay.getSpbillCreateIp()); + // 付款码 + params.put("auth_code", dto.getWechatQrCode()); + // 生成签名 + params.put("sign", generateSign(params)); + WechantPayConstant.Api api = initApi(WechantPayConstant.APY); + String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body(); + log.debug("付款码支付,json,xml|{}", res); + if (ObjectUtil.isEmpty(res)) { + log.error("付款码支付,res为空"); + return null; + } + WechatMicropayVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), WechatMicropayVo.class); + log.debug("付款码支付,json,res|{}", JSONUtil.toJsonStr(vo)); + if (!vo.isHttpSucess()) { + return null; + } + return vo; + } catch (Exception e) { + log.error("付款码支付,异常", e); + return null; + } + } + + /** + * 查询订单 + */ + @Override + public WechatQueryVo query(WechatQueryDto dto) { + try { + Map params = new HashMap<>(); + // 公众账号ID + params.put("appid", wechatPay.getAppId()); + // 商户号 + params.put("mch_id", wechatPay.getMerchantId()); + // 微信订单号 + params.put("transaction_id", dto.getWechantOrderId()); + // 商户订单号 + params.put("out_trade_no", dto.getOrderId()); + // 随机字符串 + params.put("nonce_str", getNonceStr()); + // 签名 + params.put("sign", ""); + // 签名类型 + params.put("sign_type", "MD5"); + // 生成签名 + params.put("sign", generateSign(params)); + WechantPayConstant.Api api = initApi(WechantPayConstant.QUERY); + String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body(); + log.debug("查询订单,json,xml|{}", res); + if (ObjectUtil.isEmpty(res)) { + log.error("查询订单,res为空"); + return null; + } + WechatQueryVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), WechatQueryVo.class); + log.debug("查询订单,json,res|{}", JSONUtil.toJsonStr(vo)); + if (!vo.isHttpSucess()) { + return null; + } + return vo; + } catch (Exception e) { + log.error("查询订单,异常", e); + return null; + } + } + + /** + * 撤销订单 + */ + @Override + public WechantReverseVo reverse(WechantReverseDto dto) { + try { + Map params = new HashMap<>(); + // 公众账号ID + params.put("appid", wechatPay.getAppId()); + // 商户号 + params.put("mch_id", wechatPay.getMerchantId()); + // 微信订单号 + params.put("transaction_id", dto.getWechantOrderId()); + // 商户订单号 + params.put("out_trade_no", dto.getOrderId()); + // 随机字符串 + params.put("nonce_str", getNonceStr()); + // 签名 + params.put("sign", ""); + // 签名类型 + params.put("sign_type", "MD5"); + // 生成签名 + params.put("sign", generateSign(params)); + WechantPayConstant.Api api = initApi(WechantPayConstant.REVERSE); + api.setSslSocketFactory(createSSLSocketFactory()); + String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body(); + log.debug("撤销订单,json,xml|{}", res); + if (ObjectUtil.isEmpty(res)) { + log.error("撤销订单,res为空"); + return null; + } + WechantReverseVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), WechantReverseVo.class); + log.debug("撤销订单,json,res|{}", JSONUtil.toJsonStr(vo)); + if (!vo.isHttpSucess()) { + return null; + } + return vo; + } catch (Exception e) { + log.error("撤销订单,异常", e); + return null; + } + } + + /** + * 申请退款 + */ + @Override + public WechatRefundVo refund(WechatRefundDto dto) { + try { + Map params = new HashMap<>(); + // 公众账号ID + params.put("appid", wechatPay.getAppId()); + // 商户号 + params.put("mch_id", wechatPay.getMerchantId()); + // 随机字符串 + params.put("nonce_str", getNonceStr()); + // 签名 + params.put("sign", ""); + // 签名类型 + params.put("sign_type", "MD5"); + // 微信支付订单号 + params.put("transaction_id", dto.getWechantOrderId()); + // 商户订单号 + params.put("out_trade_no", dto.getOrderId()); + // 商户退款单号 + params.put("out_refund_no", dto.getRefundId()); + // 订单金额 + params.put("total_fee", dto.getOrderPrice()); + // 退款金额 + params.put("refund_fee", dto.getRefundPrice()); + // 退款结果通知url + params.put("notify_url", wechatPay.getRefundCallbackUrl()); + // 生成签名 + params.put("sign", generateSign(params)); + WechantPayConstant.Api api = initApi(WechantPayConstant.REFUND); + api.setSslSocketFactory(createSSLSocketFactory()); + String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body(); + log.debug("申请退款,json,xml|{}", res); + if (ObjectUtil.isEmpty(res)) { + log.error("申请退款,res为空"); + return null; + } + WechatRefundVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), WechatRefundVo.class); + log.debug("申请退款,json,res|{}", JSONUtil.toJsonStr(vo)); + if (!vo.isHttpSucess()) { + return null; + } + return vo; + } catch (Exception e) { + log.error("申请退款,异常", e); + return null; + } + } + + /** + * 查询退款 + */ + @Override + public WechatRefundQueryVo refundQuery(WechatRefundQueryDto dto) { + try { + Map params = new HashMap<>(); + // 公众账号ID + params.put("appid", wechatPay.getAppId()); + // 商户号 + params.put("mch_id", wechatPay.getMerchantId()); + // 随机字符串 + params.put("nonce_str", getNonceStr()); + // 签名 + params.put("sign", ""); + // 签名类型 + params.put("sign_type", "MD5"); + // 签名类型 + params.put("out_refund_no", dto.getRefundId()); + // 生成签名 + params.put("sign", generateSign(params)); + WechantPayConstant.Api api = initApi(WechantPayConstant.REFUND_QUERY); + String res = api.getHttpRequest().body(XmlUtil.mapToXmlStr(params)).execute().body(); + log.debug("查询退款,json,xml|{}", res); + if (ObjectUtil.isEmpty(res)) { + log.error("查询退款,res为空"); + return null; + } + WechatRefundQueryVo vo = JSONUtil.toBean(JSONUtil.toJsonStr(XmlUtil.xmlToMap(res)), WechatRefundQueryVo.class); + log.debug("查询退款,json,res|{}", JSONUtil.toJsonStr(vo)); + if (!vo.isHttpSucess()) { + return null; + } + return vo; + } catch (Exception e) { + log.error("查询退款,异常", e); + return null; + } + } + + /** + * 退款回调 + */ + @Override + public String refundCallback(HttpEntity httpEntity, Map headers) { + String body = httpEntity.getBody(); + WechantRefunCallbackVo decrypt = decrypt(body); + if (ObjectUtil.isEmpty(decrypt)) { + // 告诉微信错误 + return WechantRefunCallbackVo.wechantError(); + } + boolean isSuccess = hardAfterSaleService.wechatRefundCallback(decrypt); + return isSuccess ? WechantRefunCallbackVo.wechantSuccess() : WechantRefunCallbackVo.wechantError(); + } +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/utils/constant/WechantPayConstant.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/utils/constant/WechantPayConstant.java new file mode 100644 index 000000000..551b87bca --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/utils/constant/WechantPayConstant.java @@ -0,0 +1,63 @@ +package com.bsd.pjcloud.hard.utils.constant; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpMethod; + +import javax.net.ssl.SSLSocketFactory; + +/** + * 微信支付api + */ +public class WechantPayConstant { + + public static final Api APY = Api.builder().summary("付款码支付").url("/pay/micropay").method(HttpMethod.POST).isNeedCertificate(false).build(); + + public static final Api QUERY = Api.builder().summary("查询订单").url("/pay/orderquery").method(HttpMethod.POST).isNeedCertificate(false).build(); + + public static final Api REVERSE = Api.builder().summary("撤销订单").url("/secapi/pay/reverse").method(HttpMethod.POST).isNeedCertificate(true).build(); + + public static final Api REFUND = Api.builder().summary("申请退款").url("/secapi/pay/refund").method(HttpMethod.POST).isNeedCertificate(true).build(); + + public static final Api REFUND_QUERY = Api.builder().summary("查询退款").url("/pay/refundquery").method(HttpMethod.POST).isNeedCertificate(false).build(); + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + static public class Api { + + private String summary; + + private String baseUrl; + + private String url; + + private String fullUrl; + + private HttpMethod method; + + private boolean isNeedCertificate = false; + + private SSLSocketFactory sslSocketFactory; + + public HttpRequest getHttpRequest() { + String fullUrl = baseUrl + url; + HttpRequest req = switch (method.name()) { + case "GET" -> HttpRequest.get(fullUrl); + case "POST" -> HttpRequest.post(fullUrl); + default -> null; + }; + if (ObjectUtil.isNotEmpty(req) && ObjectUtil.isNotEmpty(sslSocketFactory) && isNeedCertificate) { + req.setSSLSocketFactory(sslSocketFactory); + } + return req; + } + + } + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/application.yml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/application.yml index ff9086dc1..57aba3f9b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/application.yml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/application.yml @@ -18,5 +18,26 @@ spring: - optional:nacos:${spring.application.name}-@profiles.active@.yml # 正源回调配置 -#zy-callback: -# mch-id: 1909168994551459842 \ No newline at end of file +# zy-callback: +# mch-id: 1909168994551459842 + +# 第三方回调配置 +# pay-callback: +# lb-mch-id: 1919673632357584898 + +#wechat-pay: +# merchant-id: 1718803142 +# api-v2-key: EDn3OfIZZFwyS9Obx73XgQ8NHt01piUa +# app-id: wx4ec0210f4bf42f9f +# base-url: https://api.mch.weixin.qq.com +# refund-callback-url: https://rj4jv5rwqs.by.takin.cc/hard/hard-wechant-pay/callback/refund +# merchant-serial-path: /Users/dengzhangchen/Desktop/backups/pay/cert/apiclient_cert.p12 +# spbill-create-ip: 59.202.170.152 + +#ali-pay: +# app-id: 2021005157648588 +# private-key: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDa2GemYsE0HExDX8tEu7kt3cVPkPyJPgZklkyMmpI1uTBsA8qcKBoS88feD/Q+f3s6etGoBxTiln3vBVZBMGGwpL8bcxGu1ILcea8PBOsKfdRFF6wN4DsLtVL+6O2kK9SDOqZkQt/bEVE3tXljxtQ+igU0raZWISQXWCwekyzg4CQLfMBoJj0/JF4Zpiw2dYvBRKgEnR8H7pzCARJuN7B3G4NWrfyRyFn6+i+oDmFcwD2ewwQ8gX9He7mqgn+/ciLRgm/yh0orKKfECFfQUH3tZVW59QU7YAXtyPdpTGCptZkM5prh9bCGVKoOn7S05FRyUJxRD9dEen8pyVMOhSMRAgMBAAECggEAfrHsB7qCaZ28VQD/V9JqGXCbiz2/xeB/qPoOZRQTc0C8FLx5LsBUoAY7/oYz+36oI6n4+JLo92jyjU8EqYbN94rZDJYodZOYEvXrcAGD5TYFjt5ugDYBWPzniKXm9jVduX9Z1w+UM2oqH9tS5H22YGJdMysY8iILl+w21piT0bc+yHPhaKuEVbeTVtf3F7F4MXDgfF1NQ5GEpUpSW0oqkEloVSZ1mpecnJ+AwfUUdogYgW91qxxGVY9+SapEFFoK1TnUwRFMXIC+aBLT8RQZA2t+0oCbvz1r95Vu115bZYWpqWCLs3y/0LeVpC7KeL6evN/s27FA96zPJ/fd4azrdQKBgQD+AC3szrCiq2kYGn5OEbrp6l4K8F7UuY8HCWiYisIZf3524r4sBXkeKSHkaRDXvKiu6CuznSHamZiR9L28KFxQDUFvX5aZ8tmN5UXDmY7BdeLjpFz8mkyndY02fox8A4D4TtTgwJUYjFRG0Mnraoi7adEmwl6xocxJokFLkltDnwKBgQDckWLagUcKYOlNocAkQ4973bxC2+sLWsNPC1FlQEdWfJ+g8bAdaAxHVfae3Mp/gBDDPolJW8yyeockmTQW+eKp9P+x8QETH5zzxO++0ucn/RUxAajOTLZ6MAcUxiTgBzRiPeVSi5qjiBV2v+Z2FDQFgalougCUKDKscFxlNVabTwKBgQD75G+m9b9EQxtBFR0HDRxBV/SVgpV4/uBxyQnapVkickaXXfvcqjzYBVCgNPXIDUd31bVpNb5aDJK6xGzZSWlq1gp7id9Pov/PcX0DIqjpAKDWwqyYseis9a3qSgvF/K+NEJian0H9C0WUyQBGH+ujeKg7eOzx2hQ/PdLlQCqT3wKBgHl3SyQfy3qIshKBgCm4Vv0UuEdtirwfCK2wAuwqgN69FL9yOdWH5jMmwQDtgErEwPZ0qvAOMOUdGu1pvUjl5hBIjsN0gG4Cm9GW45yH0qqv8gqh6k9p6ZfSeSPUlpwU+6Eaiv5xSQDDwWY6+fSO3bMmm5/DxuvQU0+pNQi7Xe17AoGADeD3zYf1/XtlmwsVEdA/UhsXitntvB9fRlOcjE0LYif6liHrwo1AG+8taMZ3wQ7E834/plM92ZBnrgwFWc5yAqr5b9RJ72cTOVcnMpLD5w83C+SuUtU71awfBuZ7KPTGzV1coa/JTGKlIAlgCJEPktC90cGuPFLHq993UDSkzrA= +# public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2thnpmLBNBxMQ1/LRLu5Ld3FT5D8iT4GZJZMjJqSNbkwbAPKnCgaEvPH3g/0Pn97OnrRqAcU4pZ97wVWQTBhsKS/G3MRrtSC3HmvDwTrCn3URResDeA7C7VS/ujtpCvUgzqmZELf2xFRN7V5Y8bUPooFNK2mViEkF1gsHpMs4OAkC3zAaCY9PyReGaYsNnWLwUSoBJ0fB+6cwgESbjewdxuDVq38kchZ+vovqA5hXMA9nsMEPIF/R3u5qoJ/v3Ii0YJv8odKKyinxAhX0FB97WVVufUFO2AF7cj3aUxgqbWZDOaa4fWwhlSqDp+0tORUclCcUQ/XRHp/KclTDoUjEQIDAQAB +# alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnCB+N172m5gxf1Rolfx5LErSiVwQCh0XQdDrVy6aTuVF5EtdqahSHtADyEPsBWudMBhzCfqpoZvfnvH7a+PED6uZ3DoXt7ETh8TmNM5yc+WTnD8pSphQvuHDJ3zMks489KNxiX6sXag71k9H1MXklJGPOUaljHqy/QlRn2ZLT7pFgaFH9LEcVoQBPIOurUn95078h848RFD30jZFW3fakxUGAGVVZaHH62z5OEWOmcA+CwxsEDMa1XMt02RGXgAAq4WOj+BqOGiFmhM8rnrUMchTyvx4umOzGvbF2Y9irN3aBZ5lfg+bzYcJpIOMzlM/V00LnEWzCblJzXNyH4hJQIDAQAB +# callback-url: https://rj4jv5rwqs.by.takin.cc/hard/hard-ali-pay/callback +# # callback-url: https://stgl.pj.gov.cn/api/hard/hard-ali-pay/callback \ No newline at end of file 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 557541e5c..41c27a79e 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 923260b8f..8901e6a61 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/HardBroadcastMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/HardBroadcastMapper.xml index ff348dcc2..80964a436 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 @@ -49,7 +49,7 @@ a.del_flag = '0' - and a.userId = #{dto.userId} + and a.user_id = #{dto.userId} and a.hard_id = #{dto.hardId} @@ -76,10 +76,15 @@ \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml index a3e941afe..3d0169def 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardCarMapper.xml @@ -2,8 +2,7 @@ - - + @@ -19,5 +18,132 @@ - + + + + select a.id, + a.parent_car_id, + a.product_id, + a.product_name, + a.product_pic, + a.product_price, + a.product_nature, + a.product_count, + a.product_weight, + a.total_price, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id, + + + + a.del_flag = '0' + + and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr} + + + and o.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} + + + + + + \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml index 16788db46..58e3972f6 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml @@ -82,6 +82,9 @@ a.del_flag = '0' + + and a.order_no = #{dto.orderNo} + and a.order_status = #{dto.orderStatus} @@ -100,6 +103,9 @@ and a.merchant_id = #{dto.merchantId} + + and a.is_offline_order = #{dto.isOfflineOrder} + @@ -176,13 +182,16 @@ - + + + + + + + + + + + + + SELECT * FROM meeting_booking WHERE room_id = #{roomId} AND start_time >= #{date} AND start_time <= #{date} + + \ No newline at end of file diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/NoticeMapper.xml b/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/NoticeMapper.xml new file mode 100644 index 000000000..cafa90cef --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/resources/mapper/NoticeMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-mqtt/pjcloud-mqtt-api/src/main/java/com/bsd/pjcloud/mqtt/dto/hard/HardTakeFoodBroadcastMsg.java b/pjcloud-mqtt/pjcloud-mqtt-api/src/main/java/com/bsd/pjcloud/mqtt/dto/hard/HardTakeFoodBroadcastMsg.java index ade86a1a9..07621f7c9 100644 --- a/pjcloud-mqtt/pjcloud-mqtt-api/src/main/java/com/bsd/pjcloud/mqtt/dto/hard/HardTakeFoodBroadcastMsg.java +++ b/pjcloud-mqtt/pjcloud-mqtt-api/src/main/java/com/bsd/pjcloud/mqtt/dto/hard/HardTakeFoodBroadcastMsg.java @@ -6,6 +6,16 @@ import lombok.Data; @Data public class HardTakeFoodBroadcastMsg extends MqttHardBaseMsg { + /** + * 商户部门id + */ + private Long mchDeptId; + + /** + * 硬件id + */ + private Long hardwareId; + /** * 发送硬件的topic */ @@ -31,6 +41,11 @@ public class HardTakeFoodBroadcastMsg extends MqttHardBaseMsg { */ private String id; + /** + * 订单id + */ + private String orderId; + /** * 预定标题 */ @@ -61,4 +76,9 @@ public class HardTakeFoodBroadcastMsg extends MqttHardBaseMsg { */ private String hourType; + /** + * 是否完成 + */ + private String isDone; + } diff --git a/pjcloud-mqtt/pjcloud-mqtt-biz/src/main/java/com/bsd/pjcloud/mqtt/controller/MqttEventController.java b/pjcloud-mqtt/pjcloud-mqtt-biz/src/main/java/com/bsd/pjcloud/mqtt/controller/MqttEventController.java index 358e6a5d7..0b3d298e5 100644 --- a/pjcloud-mqtt/pjcloud-mqtt-biz/src/main/java/com/bsd/pjcloud/mqtt/controller/MqttEventController.java +++ b/pjcloud-mqtt/pjcloud-mqtt-biz/src/main/java/com/bsd/pjcloud/mqtt/controller/MqttEventController.java @@ -141,8 +141,11 @@ public class MqttEventController { @PostMapping("/send-take-food-broadcast") public R sendTakeFoodBroadcast(@RequestBody HardTakeFoodBroadcastMsg dto) { MqttBaseDto mqttBaseDto = new MqttBaseDto(); + mqttEventService.getTopicParamsByUserDeptId(mqttBaseDto, dto.getMchDeptId()); + mqttBaseDto.setMerchantDeptId(dto.getMchDeptId()); + mqttBaseDto.setHardwareId(dto.getHardwareId()); mqttBaseDto.setAction(dto.getAction()); mqttBaseDto.setData(dto); - return R.ok(mqttEventService.sendTakeFoodBroadcast(mqttBaseDto, dto.getTopic())); + return R.ok(mqttEventService.sendTakeFoodBroadcast(mqttBaseDto, mqttBaseDto.getTopic())); } } diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/api/feign/RemoteSupermarketSpuService.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/api/feign/RemoteSupermarketSpuService.java index 70eb729ed..036bf3bb3 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/api/feign/RemoteSupermarketSpuService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/api/feign/RemoteSupermarketSpuService.java @@ -25,6 +25,7 @@ import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.feign.annotation.NoToken; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuQueryDTO; +import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockByCodeReqDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockReqDTO; import com.bsd.pjcloud.supermarket.vo.ad.SmErpSpuDetailsVo; import com.bsd.pjcloud.supermarket.vo.ad.SpuVo; @@ -70,6 +71,13 @@ public interface RemoteSupermarketSpuService { + /** + * 更新库存根据货号和条码 + * @param updateStockReqDTO + * @return + */ + @PostMapping("/supermarketSpu/ad/updateSpuStockByCode") + R updateSpuStockByCode(@RequestBody SupermarketSpuUpdateStockByCodeReqDTO updateStockReqDTO); /** diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SmSpuPageDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SmSpuPageDTO.java new file mode 100644 index 000000000..fcf3506a4 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SmSpuPageDTO.java @@ -0,0 +1,10 @@ +package com.bsd.pjcloud.supermarket.dto; + + +import lombok.Data; + +@Data +public class SmSpuPageDTO { + + private String productName; +} diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockByCodeReqDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockByCodeReqDTO.java new file mode 100644 index 000000000..02e480659 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockByCodeReqDTO.java @@ -0,0 +1,60 @@ +package com.bsd.pjcloud.supermarket.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 商品 SKU 更新库存 Request DTO + * + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SupermarketSpuUpdateStockByCodeReqDTO { + + /** + * 商品 SKU + */ + @NotNull(message = "商品 SPU 不能为空") + private List items; + + + @Schema(description = "下单设备类型,0默认安卓机,1移动端") + private int deviceType; + + @Data + public static class Item { + +// /** +// * 商品 SKU 编号 +// */ + @NotNull(message = "商品货号") + private String productCode ; + + + @NotNull(message = "商品条码") + private String barCode; + /** + * 库存变化数量 + * + * 正数:增加库存 + * 负数:扣减库存 + */ + @NotNull(message = "库存变化数量不能为空") + private Double incrCount; + + + /** + * 需要扣减库存商品所属的商户部门id + */ + @NotNull(message = "部门不能为空") + private Long deptId; + + } + +} diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockReqDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockReqDTO.java index 17b864c1d..59ebda356 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockReqDTO.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/SupermarketSpuUpdateStockReqDTO.java @@ -10,9 +10,6 @@ import java.util.List; /** * 商品 SKU 更新库存 Request DTO - * - * @author LeeYan9 - * @since 2022-08-26 */ @Data @NoArgsConstructor diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordSaveDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordSaveDTO.java index 6b14a2366..b8a0d899e 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordSaveDTO.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordSaveDTO.java @@ -14,7 +14,7 @@ import java.util.List; */ @Data @Schema(description = "采购保存对象") -public class InventoryRecordSaveDTO { +public class InventoryRecordSaveDTO { /** diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordSaveItemDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordSaveItemDTO.java index d45ee8992..a79f63cc6 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordSaveItemDTO.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryRecordSaveItemDTO.java @@ -52,4 +52,8 @@ public class InventoryRecordSaveItemDTO { private Long unitId; + @Schema(description="实际进价") + private Integer realPrice; + + } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopCategoryEntity.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopCategoryEntity.java new file mode 100644 index 000000000..6d06287ac --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopCategoryEntity.java @@ -0,0 +1,115 @@ +package com.bsd.pjcloud.supermarket.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; + +/** + * 在线商品分类 + * + * @author zjf + * @date 2025-06-18 16:49:20 + */ +@Data +@TenantTable +@TableName("shop_category") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "在线商品分类") +public class ShopCategoryEntity extends Model { + + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="id") + private Long id; + + /** + * 父级分类ID,0为顶级 + */ + @Schema(description="父级分类ID,0为顶级") + private Long parentId; + + /** + * 分类名称 + */ + @Schema(description="分类名称") + private String name; + + /** + * 层级(1/2/3) + */ + @Schema(description="层级(1/2/3)") + private Integer level; + + /** + * 排序 + */ + @Schema(description="排序") + private Integer sort; + + /** + * 状态(0正常,1下架) + */ + @Schema(description="状态(0正常,1下架)") + private Integer status; + + /** + * 分类图片 + */ + @Schema(description="分类图片") + private String picUrl; + + /** + * 部门ID + */ + @Schema(description="部门ID") + private Long deptId; + + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建者") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建时间") + private LocalDateTime createTime; + + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description="更新者") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description="更新时间") + private LocalDateTime updateTime; + + /** + * 是否删除(0=正常 1=删除) + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description="是否删除(0=正常 1=删除)") + private String delFlag; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSkuEntity.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSkuEntity.java new file mode 100644 index 000000000..11407bd29 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSkuEntity.java @@ -0,0 +1,119 @@ +package com.bsd.pjcloud.supermarket.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import com.bsd.pjcloud.common.core.util.TenantTable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + +/** + * 商品spu + * + * @author zjf + * @date 2025-06-19 12:58:05 + */ +@Data +@TenantTable +@TableName("shop_sku") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "shop_sku") +public class ShopSkuEntity extends Model { + + /** + * 包装单位id + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="包装单位id") + private Long id; + /** + * 条码 + */ + @Schema(description="条码") + private String barCode; + /** + * 规格 + */ + @Schema(description="规格") + private String spec; + /** + * 单位 + */ + @Schema(description="单位") + private String unit; + /** + * 状态(0正常,1停销) + */ + @Schema(description="状态(0正常,1停销)") + private Integer status; + /** + * 创建者 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建者") + private String createBy; + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description="创建时间") + private LocalDateTime createTime; + /** + * 更新者 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description="更新者") + private String updateBy; + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description="更新时间") + private LocalDateTime updateTime; + /** + * 是否删除 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description="是否删除") + private String delFlag; + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; + /** + * 进价/单位分 + */ + @Schema(description="进价/单位分") + private Integer purchasePrice; + /** + * 零售价/单位分 + */ + @Schema(description="零售价/单位分") + private Integer retailPrice; + /** + * spuID + */ + @Schema(description="spuID") + private Long spuId; + /** + * 促销价 + */ + @Schema(description="促销价") + private Integer promotionPrice; + /** + * 库存 + */ + @Schema(description="库存") + private Double stock; + /** + * sku属性 + */ + @Schema(description="sku属性") + private String attribute; + + @Schema(description="版本号") + private Integer version; +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSpuEntity.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSpuEntity.java new file mode 100644 index 000000000..9b613b07a --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopSpuEntity.java @@ -0,0 +1,179 @@ +package com.bsd.pjcloud.supermarket.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 com.alibaba.excel.annotation.ExcelIgnore; +import com.github.yulichang.annotation.EntityMapping; +import java.util.List; + +/** + * 商品spu + * + * @author zjf + * @date 2025-06-19 12:58:05 + */ +@Data +@TenantTable +@TableName("shop_spu") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "商品spu") +public class ShopSpuEntity extends Model { + + + /** + * 商品 SPU 编号,自增 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="商品 SPU 编号,自增") + private Long id; + + /** + * 货号 + */ + @Schema(description="货号") + private String productCode; + + /** + * 商品名称 + */ + @Schema(description="商品名称") + private String productName; + + /** + * 商品简介 + */ + @Schema(description="商品简介") + private String introduction; + + /** + * 商品详情 + */ + @Schema(description="商品详情") + private String description; + + /** + * 商品分类编号 + */ + @Schema(description="商品分类编号") + private Long categoryId; + + /** + * 商品封面图 + */ + @Schema(description="商品封面图") + private String picUrl; + + /** + * 商品轮播图地址 + 数组,以逗号分隔 + 最多上传15张 + */ + @Schema(description="商品轮播图地址") + private String sliderPicUrls; + + /** + * 排序字段 + */ + @Schema(description="排序字段") + private Integer sort; + + /** + * 商品状态: 1 上架(开启) 0 下架(禁用) -1 回收 + */ + @Schema(description="商品状态: 1 上架(开启) 0 下架(禁用) -1 回收") + private String status; + + /** + * 库存 + */ + @Schema(description="库存") + private Integer stock; + + /** + * 赠送积分 + */ + @Schema(description="赠送积分") + private Integer giveIntegral; + + /** + * 商户关系表 + */ + @Schema(description="商户关系表") + private String merchantIds; + + /** + * 部门id + */ + @Schema(description="部门id") + private Long deptId; + + /** + * skuid + */ + @Schema(description="skuid") + private Long shopSkuId; + + /** + * 销量 + */ + @Schema(description="销量") + private Integer salesCount; + + /** + * 单人限购数量 + */ + @Schema(description="单人限购数量") + private Integer limitNum; + + /** + * 创建人 + */ + @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; + + /** + * 租户编号 + */ + @Schema(description="租户编号") + private Long tenantId; + @ExcelIgnore + @TableField(exist = false) + @EntityMapping(thisField = "id", joinField = "spuId") + private List skuList; + +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpAuxiliaryCodeEntity.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpAuxiliaryCodeEntity.java index d83d8b48b..07b48301a 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpAuxiliaryCodeEntity.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpAuxiliaryCodeEntity.java @@ -85,4 +85,14 @@ public class SmErpAuxiliaryCodeEntity extends Model { @Schema(description="包装单位id") private Long unitId; + + + @Schema(description="包装单位") + @TableField(exist = false) + private String unit; + + + @Schema(description="口味") + @TableField(exist = false) + private String taste; } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpSpuEntity.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpSpuEntity.java index c8818225b..07e30b04b 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpSpuEntity.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpSpuEntity.java @@ -45,7 +45,7 @@ public class SmErpSpuEntity extends Model { * 自编码/条码 */ @Schema(description="自编码/条码") - private String barcode; + private String barCode; /** * 商品名称 @@ -109,7 +109,7 @@ public class SmErpSpuEntity extends Model { @Schema(description="成本单价,单位: 分") // @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 // @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 - private Integer costPrice; + private Double costPrice; /** * 库存 @@ -335,4 +335,5 @@ public class SmErpSpuEntity extends Model { @TableField(exist = false) private Integer inventoryLowerLimit; + } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpUnitEntity.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpUnitEntity.java index 8a88a3a73..40fd1764a 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpUnitEntity.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/entity/SmErpUnitEntity.java @@ -146,4 +146,8 @@ public class SmErpUnitEntity extends Model { @Schema(description = "是否是基础库存,默认0否,1是") private Boolean isBase; + + @Schema(description = "口味") + private String taste; + } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/validarot/ErpSpuValidator.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/validarot/ErpSpuValidator.java index a3ea4514e..1f53d232f 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/validarot/ErpSpuValidator.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/validarot/ErpSpuValidator.java @@ -13,31 +13,34 @@ public class ErpSpuValidator { List errors = new ArrayList<>(); if (StringUtils.isEmpty(entity.getProductCode())) { - errors.add("第" + (rowIndex + 1) + "行: 货号不能为空"); + errors.add("第" + (rowIndex ) + "行: 货号不能为空"); } if (StringUtils.isEmpty(entity.getProductName())) { - errors.add("第" + (rowIndex + 1) + "行: 商品名称不能为空"); + errors.add("第" + (rowIndex ) + "行: 商品名称不能为空"); } if (StringUtils.isEmpty(entity.getUnit())) { - errors.add("第" + (rowIndex + 1) + "行: 单位不能为空"); + errors.add("第" + (rowIndex ) + "行: 单位不能为空"); } // if (StringUtils.isEmpty(entity.getSpec())) { -// errors.add("第" + (rowIndex + 1) + "行: 规格不能为空"); -// } -// if (StringUtils.isEmpty(entity.getClassification())) { -// errors.add("第" + (rowIndex + 1) + "行: 分类不能为空"); -// } -// if (StringUtils.isEmpty(entity.getCommodityNature())) { -// errors.add("第" + (rowIndex + 1) + "行: 商品性质不能为空"); -// } -// if (StringUtils.isEmpty(entity.getSupplier())) { -// errors.add("第" + (rowIndex + 1) + "行: 货商不能为空"); +// errors.add("第" + (rowIndex ) + "行: 规格不能为空"); // } + if (null==entity.getStock()) { + errors.add("第" + (rowIndex ) + "行: 商品库存不能为空"); + } + if (StringUtils.isEmpty(entity.getClassification())) { + errors.add("第" + (rowIndex ) + "行: 分类不能为空"); + } + if (StringUtils.isEmpty(entity.getCommodityNature())) { + errors.add("第" + (rowIndex ) + "行: 商品性质不能为空"); + } + if (StringUtils.isEmpty(entity.getSupplier())) { + errors.add("第" + (rowIndex ) + "行: 货商不能为空"); + } if (null==entity.getPurchasePrice()) { - errors.add("第" + (rowIndex + 1) + "行: 进价不能为空"); + errors.add("第" + (rowIndex ) + "行: 进价不能为空"); } if (null==entity.getRetailPrice()) { - errors.add("第" + (rowIndex + 1) + "行: 零售价不能为空"); + errors.add("第" + (rowIndex ) + "行: 零售价不能为空"); } return errors; diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/OnlineShopVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/OnlineShopVo.java new file mode 100644 index 000000000..9ecf0a2bd --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/OnlineShopVo.java @@ -0,0 +1,118 @@ +package com.bsd.pjcloud.supermarket.vo; + + +import com.baomidou.mybatisplus.annotation.*; +import com.bsd.pjcloud.supermarket.entity.SmErpAuxiliaryCodeEntity; +import com.bsd.pjcloud.supermarket.entity.SmErpUnitEntity; +import com.bsd.pjcloud.supermarket.vo.sm.smspu.app.SmErpUnitAppVo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + + +/** + * app在线商城 商品列表数据 + */ +@Data +public class OnlineShopVo { + + + + @Schema(description="线上SPU 编号,自增") + private Long id; + + /** + * 库存商品id + */ + @Schema(description="库存商品id") + private Long erpSpuId; + + /** + * 商品详情 + */ + @Schema(description="商品详情") + private String description; + + /** + * 商品轮播图地址 + 数组,以逗号分隔 + 最多上传15张 + */ + @Schema(description="商品轮播图地址") + private String sliderPicUrls; + + + /** + * 销量 + */ + @Schema(description="销量") + private Integer salesCount; + + + + /** + * 货号 + */ + @Schema(description="货号") + private String productCode; + + /** + * 自编码/条码 + */ + @Schema(description="自编码/条码") + private String barCode; + + /** + * 商品名称 + */ + @Schema(description="商品名称") + private String productName; + + + /** + * 商品简介 + */ + @Schema(description="商品简介") + private String introduction; + + + /** + * 商品封面图 + */ + @Schema(description="商品封面图") + private String picUrl; + + + /** + * 库存 + */ + @Schema(description="库存") + private Double stock; + + + /** + * 商品性质(字典) + */ + @Schema(description="商品性质(字典)") + private String productNature; + + + /** + * 货商id + */ + @Schema(description="货商id") + private Long supplierName; + + + + + @Schema(description = "包装对象集合对象") + private List smErpUnitEntityList; + + + + +} diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopCategoryTreeVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopCategoryTreeVo.java new file mode 100644 index 000000000..297b90e7d --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopCategoryTreeVo.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.supermarket.vo; + +import lombok.Data; +import java.util.List; + +@Data +public class ShopCategoryTreeVo { + private Long id; + private String name; + private Long parentId; + private Integer level; + private Integer sort; + private Integer status; + private String picUrl; + private List children; +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSkuAppVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSkuAppVo.java new file mode 100644 index 000000000..b6d27b7d9 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSkuAppVo.java @@ -0,0 +1,53 @@ +package com.bsd.pjcloud.supermarket.vo.app; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class ShopSkuAppVo { + /** + * 包装单位id + */ + @Schema(description="包装单位id") + private Long id; + /** + * 条码 + */ + @Schema(description="条码") + private String barCode; + /** + * 规格 + */ + @Schema(description="规格") + private String spec; + /** + * 单位 + */ + @Schema(description="单位") + private String unit; + + /** + * 零售价/单位分 + */ + @Schema(description="零售价/单位分") + private Integer retailPrice; + + /** + * 促销价 + */ + @Schema(description="促销价") + private Integer promotionPrice; + /** + * 库存 + */ + @Schema(description="库存") + private Double stock; + /** + * sku属性 + */ + @Schema(description="sku属性") + private String attribute; +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuDetailAppVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuDetailAppVo.java new file mode 100644 index 000000000..a4cbe538b --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuDetailAppVo.java @@ -0,0 +1,80 @@ +package com.bsd.pjcloud.supermarket.vo.app; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.baomidou.mybatisplus.annotation.*; +import com.github.yulichang.annotation.EntityMapping; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class ShopSpuDetailAppVo { + /** + * 商品 SPU 编号,自增 + */ + @Schema(description="商品 SPU 编号,自增") + private Long id; + + /** + * 货号 + */ + @Schema(description="货号") + private String productCode; + + /** + * 商品名称 + */ + @Schema(description="商品名称") + private String productName; + + + /** + * 商品详情 + */ + @Schema(description="商品详情") + private String description; + + /** + * 商品分类编号 + */ + @Schema(description="商品分类编号") + private Long categoryId; + + /** + * 商品封面图 + */ + @Schema(description="商品封面图") + private String picUrl; + + /** + * 商品轮播图地址 + 数组,以逗号分隔 + 最多上传15张 + */ + @Schema(description="商品轮播图地址") + private String sliderPicUrls; + + + /** + * 商户关系表 + */ + @Schema(description="商户关系表") + private String merchantIds; + + /** + * 销量 + */ + @Schema(description="销量") + private Integer salesCount; + + /** + * 单人限购数量 + */ + @Schema(description="单人限购数量") + private Integer limitNum; + + + private List skuList; +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java new file mode 100644 index 000000000..fe6e1b535 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java @@ -0,0 +1,40 @@ +package com.bsd.pjcloud.supermarket.vo.app; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class ShopSpuListAppVo { + /** + * 商品 SPU 编号,自增 + */ + @Schema(description="商品 SPU 编号,自增") + private Long id; + + /** + * 货号 + */ + @Schema(description="货号") + private String productCode; + + /** + * 商品名称 + */ + @Schema(description="商品名称") + private String productName; + + /** + * 商品封面图 + */ + @Schema(description="商品封面图") + private String picUrl; + + /** + * 商品分类编号 + */ + @Schema(description="商品分类编号") + private Long categoryId; + +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/erp/SmErpUnitWithSpuVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/erp/SmErpUnitWithSpuVo.java index 4e142d15a..83b784612 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/erp/SmErpUnitWithSpuVo.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/erp/SmErpUnitWithSpuVo.java @@ -21,7 +21,7 @@ public class SmErpUnitWithSpuVo { * 自编码/条码 */ @Schema(description = "自编码/条码") - private String barcode; + private String barCode; /** * 商品封面图 @@ -63,8 +63,8 @@ public class SmErpUnitWithSpuVo { /** * 条码 */ - @Schema(description = "条码") - private String barCode; +// @Schema(description = "条码") +// private String barCode; /** * 规格 diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/erpspu/SmErpSpuStockExcel.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/erpspu/SmErpSpuStockExcel.java new file mode 100644 index 000000000..e698cb134 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/erpspu/SmErpSpuStockExcel.java @@ -0,0 +1,80 @@ +package com.bsd.pjcloud.supermarket.vo.erpspu; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.bsd.pjcloud.common.core.util.MoneyDeserializer; +import com.bsd.pjcloud.common.core.util.MoneySerializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SmErpSpuStockExcel implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 货号 + */ + @Schema(description="货号") + @ExcelProperty("货号") + private String productCode; + + /** + * 商品名称 + */ + @Schema(description="商品名称") + @ExcelProperty("商品名称") + private String productName; + + + /** + * 库存 + */ + @Schema(description="库存") + @ExcelProperty("库存") + private Double stock; + + + /** + * 单位 + */ + @Schema(description="单位") + @ExcelProperty("单位") + private String unit; + + + /** + * 条码 + */ + @Schema(description="条码") + @ExcelProperty("条码") + private String barCode; + + /** + * 规格 + */ + @Schema(description="规格") + @ExcelProperty("规格") + private String spec; + + + /** + * 内装数量 + */ + @Schema(description="内装") + @ExcelProperty("内装") + private Integer packageNum; + + + /** + * 零售价/单位分 + */ + @Schema(description="零售价/单位分") + @ExcelProperty("零售价/元") + private Double retailPrice; + + +} diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/inventoryrecord/InventoryRecordItemVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/inventoryrecord/InventoryRecordItemVo.java index c9f294d7b..999089648 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/inventoryrecord/InventoryRecordItemVo.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/inventoryrecord/InventoryRecordItemVo.java @@ -44,16 +44,16 @@ public class InventoryRecordItemVo { * 进价 */ @Schema(description="进价") - @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 - @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 +// @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 +// @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 private Integer unitPrice; /** * 累计总金额 */ @Schema(description="累计总金额") - @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 - @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 +// @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 +// @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 private Integer totalAmount; /** @@ -87,12 +87,16 @@ public class InventoryRecordItemVo { @Schema(description="装数") private Integer packageNum; + + @Schema(description="实际进价") + private Integer realPrice; + /** * 进价(分为单位) */ @Schema(description="进价(分为单位)") - @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 - @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 +// @JsonSerialize(using = MoneySerializer.class) // 分 -> 元 +// @JsonDeserialize(using = MoneyDeserializer.class) // 元 -> 分 private Integer purchasePrice; @Schema(description = "包装对象集合对象") diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmErpCostPriceVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmErpCostPriceVo.java new file mode 100644 index 000000000..2a794a64d --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmErpCostPriceVo.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.supermarket.vo.sm.smspu; + +import lombok.Data; + +@Data +public class SmErpCostPriceVo { + + private Long erpSpuId; + + private Double quantity; + + private Integer realPrice; + + private String inventoryType; + + private Integer packageNum; + + private String unit; + + private Integer totalAmount; +} diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmErpPageScopeVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmErpPageScopeVo.java index 7b9a03cb3..26ab7851d 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmErpPageScopeVo.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmErpPageScopeVo.java @@ -24,7 +24,7 @@ public class SmErpPageScopeVo { * 自编码/条码 */ @Schema(description="自编码/条码") - private String barcode; + private String barCode; /** * 商品名称 diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmSpuEditVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmSpuEditVo.java index cb69a3a5d..2b390a2f2 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmSpuEditVo.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/SmSpuEditVo.java @@ -112,4 +112,7 @@ public class SmSpuEditVo { */ @Schema(description="租户编号") private Long tenantId; + + @Schema(description="商户id") + private Long merchantId; } diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/app/SmErpUnitAppVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/app/SmErpUnitAppVo.java new file mode 100644 index 000000000..a084ec00c --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/sm/smspu/app/SmErpUnitAppVo.java @@ -0,0 +1,74 @@ +package com.bsd.pjcloud.supermarket.vo.sm.smspu.app; + + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Schema(description = "移动端商品列表包装对象vo") +public class SmErpUnitAppVo { + /** + * 包装单位id + */ + @Schema(description="包装单位id") + private Long id; + + /** + * 条码 + */ + @Schema(description="条码") + private String barCode; + + /** + * 规格 + */ + @Schema(description="规格") + private String spec; + + /** + * 单位 + */ + @Schema(description="单位") + private String unit; + + /** + * 状态(0正常,1停销) + */ + @Schema(description="状态(0正常,1停销)") + private Integer status; + + /** + * 内装数量 + */ + @Schema(description="内装数量") + private Integer packageNum; + + /** + * 零售价/单位分 + */ + @Schema(description="零售价/单位分") + private Integer retailPrice; + + /** + * spuID + */ + @Schema(description="spuID") + private Long spuId; + + /** + * 促销价 + */ + @Schema(description="促销价") + private Integer promotionPrice; + + + + + + + @Schema(description = "是否是基础库存,默认0否,1是") + private Boolean isBase; +} diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/stockwarn/StockWarnVO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/stockwarn/StockWarnVO.java index fa5a659eb..a8cd0bb03 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/stockwarn/StockWarnVO.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/stockwarn/StockWarnVO.java @@ -34,7 +34,7 @@ public class StockWarnVO { * 自编码/条码 */ @Schema(description="自编码/条码") - private String barcode; + private String barCode; /** * 商品名称 diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/pom.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/pom.xml index 5792285a1..6dded74c2 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/pom.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/pom.xml @@ -13,6 +13,13 @@ pjcloud-supermarket-biz + + + + com.bsd + pjcloud-common-idempotent + + org.springframework.boot diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopCategoryController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopCategoryController.java new file mode 100644 index 000000000..7b87f02d5 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopCategoryController.java @@ -0,0 +1,44 @@ +package com.bsd.pjcloud.supermarket.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.supermarket.entity.ShopCategoryEntity; +import com.bsd.pjcloud.supermarket.service.ShopCategoryService; +import com.bsd.pjcloud.supermarket.vo.ShopCategoryTreeVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; +import java.util.Objects; + +@RestController +@RequestMapping("/app/shopCategory") +@Tag(name = "App分类", description = "移动端分类接口") +@RequiredArgsConstructor +public class AppShopCategoryController { + private final ShopCategoryService shopCategoryService; + + @GetMapping("/list") + @Operation(summary = "APP分类列表", description = "移动端分类树") + public R> appCategoryList() { + List all = shopCategoryService.list(Wrappers.lambdaQuery() + .eq(ShopCategoryEntity::getStatus, 0)); // 只查启用 + List tree = buildCategoryTree(all, 0L); + return R.ok(tree); + } + + private List buildCategoryTree(List all, Long parentId) { + List result = new java.util.ArrayList<>(); + for (ShopCategoryEntity cat : all) { + if (Objects.equals(cat.getParentId(), parentId)) { + ShopCategoryTreeVo vo = com.bsd.pjcloud.common.core.util.BeanUtils.toBean(cat, ShopCategoryTreeVo.class); + vo.setChildren(buildCategoryTree(all, cat.getId())); + result.add(vo); + } + } + return result; + } +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java new file mode 100644 index 000000000..7af325a39 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java @@ -0,0 +1,67 @@ +package com.bsd.pjcloud.supermarket.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; +import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; +import com.bsd.pjcloud.supermarket.service.ShopSpuService; +import com.bsd.pjcloud.supermarket.service.ShopSkuService; +import com.bsd.pjcloud.supermarket.vo.app.ShopSpuListAppVo; +import com.bsd.pjcloud.supermarket.vo.app.ShopSpuDetailAppVo; +import com.bsd.pjcloud.supermarket.vo.app.ShopSkuAppVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/app/shopSpu") +@Tag(name = "App商品", description = "移动端商品接口") +@RequiredArgsConstructor +public class AppShopSpuController { + private final ShopSpuService shopSpuService; + private final ShopSkuService shopSkuService; + + @GetMapping("/page") + @Operation(summary = "APP商品分页", description = "移动端商品分页") + public R> page( + @ParameterObject Page page, + @RequestParam(required = false) Integer categoryId, + @RequestParam(required = false) String keyword + ) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(categoryId != null, ShopSpuEntity::getCategoryId, categoryId); + wrapper.like(StrUtil.isNotBlank(keyword), ShopSpuEntity::getProductName, keyword); + wrapper.eq(ShopSpuEntity::getStatus, 0); // 只查上架 + IPage spuPage = shopSpuService.page(page, wrapper); + IPage voPage = spuPage.convert(spu -> BeanUtils.toBean(spu, ShopSpuListAppVo.class)); + return R.ok(voPage); + } + + @GetMapping("/detail/{id}") + @Operation(summary = "APP商品详情", description = "移动端商品详情") + public R detail(@PathVariable("id") Long id) { + ShopSpuEntity spu = shopSpuService.getByIdDeep(id); + if (spu == null) return R.failed("商品不存在"); + ShopSpuDetailAppVo vo = BeanUtils.toBean(spu, ShopSpuDetailAppVo.class); + // 查询sku列表 + List skuList = shopSkuService.list(Wrappers.lambdaQuery().eq(ShopSkuEntity::getSpuId, id)); + vo.setSkuList(skuList.stream().map(sku -> BeanUtils.toBean(sku, ShopSkuAppVo.class)).collect(Collectors.toList())); + return R.ok(vo); + } + + @PostMapping("/deductStock") + @Operation(summary = "扣减库存", description = "根据skuId和数量扣减库存") + public R deductStock(@RequestParam Long skuId, @RequestParam Integer num) { + boolean result = shopSkuService.deductStock(skuId, num); + return result ? R.ok(true) : R.failed("库存不足或扣减失败"); + } +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopCategoryController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopCategoryController.java new file mode 100644 index 000000000..451758518 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopCategoryController.java @@ -0,0 +1,161 @@ +package com.bsd.pjcloud.supermarket.controller; + +import cn.hutool.core.util.StrUtil; +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.BeanUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.supermarket.entity.ShopCategoryEntity; +import com.bsd.pjcloud.supermarket.entity.SmErpSupplierEntity; +import com.bsd.pjcloud.supermarket.service.ShopCategoryService; +import com.bsd.pjcloud.supermarket.vo.ShopCategoryTreeVo; +import com.bsd.pjcloud.supermarket.vo.erp.SmErpSupplierSimpleVo; +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; + +/** + * 在线商品分类 + * + * @author zjf + * @date 2025-06-18 16:49:20 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/shopCategory" ) +@Tag(description = "shopCategory" , name = "在线商品分类管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ShopCategoryController { + + private final ShopCategoryService shopCategoryService; + + /** + * 分页查询 + * @param page 分页对象 + * @param shopCategory 在线商品分类 + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('supermarket_shopCategory_view')" ) + public R getShopCategoryPage(@ParameterObject Page page, @ParameterObject ShopCategoryEntity shopCategory) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(StrUtil.isNotBlank(shopCategory.getName()),ShopCategoryEntity::getName,shopCategory.getName()); + return R.ok(shopCategoryService.pageScope(page, wrapper)); + } + + + /** + * 通过id查询在线商品分类 + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('supermarket_shopCategory_view')" ) + public R getById(@PathVariable("id" ) Integer id) { + return R.ok(shopCategoryService.getById(id)); + } + + /** + * 新增在线商品分类 + * @param shopCategory 在线商品分类 + * @return R + */ + @Operation(summary = "新增在线商品分类" , description = "新增在线商品分类" ) + @SysLog("新增在线商品分类" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('supermarket_shopCategory_add')" ) + public R save(@RequestBody ShopCategoryEntity shopCategory) { + shopCategory.setDeptId(SecurityUtils.getUser().getDeptId()); + return R.ok(shopCategoryService.save(shopCategory)); + } + + /** + * 修改在线商品分类 + * @param shopCategory 在线商品分类 + * @return R + */ + @Operation(summary = "修改在线商品分类" , description = "修改在线商品分类" ) + @SysLog("修改在线商品分类" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('supermarket_shopCategory_edit')" ) + public R updateById(@RequestBody ShopCategoryEntity shopCategory) { + return R.ok(shopCategoryService.updateById(shopCategory)); + } + + /** + * 通过id删除在线商品分类 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除在线商品分类" , description = "通过id删除在线商品分类" ) + @SysLog("通过id删除在线商品分类" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('supermarket_shopCategory_del')" ) + public R removeById(@RequestBody Integer[] ids) { + return R.ok(shopCategoryService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param shopCategory 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('supermarket_shopCategory_export')" ) + public List export(ShopCategoryEntity shopCategory,Integer[] ids) { + return shopCategoryService.list(Wrappers.lambdaQuery(shopCategory).in(ArrayUtil.isNotEmpty(ids), ShopCategoryEntity::getId, ids)); + } + + /** + * 分类树结构 + */ + @GetMapping("/tree") + @Operation(summary = "分类树", description = "获取所有分类的树结构") + public R> tree() { + List all = shopCategoryService.listScope(); + List tree = buildCategoryTree(all, 0L); + return R.ok(tree); + } + + private List buildCategoryTree(List all, Long parentId) { + List result = new java.util.ArrayList<>(); + for (ShopCategoryEntity cat : all) { + if (Objects.equals(cat.getParentId(), parentId)) { + ShopCategoryTreeVo vo = com.bsd.pjcloud.common.core.util.BeanUtils.toBean(cat, ShopCategoryTreeVo.class); + vo.setChildren(buildCategoryTree(all, cat.getId())); + result.add(vo); + } + } + return result; + } + + /** + * 根据父级ID查子分类 + */ + @GetMapping("/listByParent/{parentId}") + @Operation(summary = "根据父级ID查子分类", description = "根据父级ID查子分类") + public R> listByParent(@PathVariable("parentId") Integer parentId) { + List list = shopCategoryService.list(Wrappers.lambdaQuery().eq(ShopCategoryEntity::getParentId, parentId)); + return R.ok(list); + } + +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSkuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSkuController.java new file mode 100644 index 000000000..4e65c00eb --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSkuController.java @@ -0,0 +1,119 @@ +package com.bsd.pjcloud.supermarket.controller; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; +import com.bsd.pjcloud.supermarket.service.ShopSkuService; +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; + +/** + * sku + * + * @author zjf + * @date 2025-06-19 12:43:40 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/shopSku" ) +@Tag(description = "shopSku" , name = "sku管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ShopSkuController { + + private final ShopSkuService shopSkuService; + + /** + * 分页查询 + * @param page 分页对象 + * @param shopSku sku + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('supermarket_shopSku_view')" ) + public R getShopSkuPage(@ParameterObject Page page, @ParameterObject ShopSkuEntity shopSku) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + return R.ok(shopSkuService.page(page, wrapper)); + } + + + /** + * 通过id查询sku + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('supermarket_shopSku_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(shopSkuService.getById(id)); + } + + /** + * 新增sku + * @param shopSku sku + * @return R + */ + @Operation(summary = "新增sku" , description = "新增sku" ) + @SysLog("新增sku" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('supermarket_shopSku_add')" ) + public R save(@RequestBody ShopSkuEntity shopSku) { + return R.ok(shopSkuService.save(shopSku)); + } + + /** + * 修改sku + * @param shopSku sku + * @return R + */ + @Operation(summary = "修改sku" , description = "修改sku" ) + @SysLog("修改sku" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('supermarket_shopSku_edit')" ) + public R updateById(@RequestBody ShopSkuEntity shopSku) { + return R.ok(shopSkuService.updateById(shopSku)); + } + + /** + * 通过id删除sku + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除sku" , description = "通过id删除sku" ) + @SysLog("通过id删除sku" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('supermarket_shopSku_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(shopSkuService.removeBatchByIds(CollUtil.toList(ids))); + } + + + /** + * 导出excel 表格 + * @param shopSku 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('supermarket_shopSku_export')" ) + public List export(ShopSkuEntity shopSku,Long[] ids) { + return shopSkuService.list(Wrappers.lambdaQuery(shopSku).in(ArrayUtil.isNotEmpty(ids), ShopSkuEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java new file mode 100644 index 000000000..21c825b48 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java @@ -0,0 +1,134 @@ +package com.bsd.pjcloud.supermarket.controller; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ArrayUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; +import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; +import com.bsd.pjcloud.supermarket.service.ShopSpuService; +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; + +/** + * 商品spu + * + * @author zjf + * @date 2025-06-19 12:58:05 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/shopSpu" ) +@Tag(description = "shopSpu" , name = "商品spu管理" ) +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ShopSpuController { + + private final ShopSpuService shopSpuService; + + /** + * 分页查询 + * @param page 分页对象 + * @param shopSpu 商品spu + * @return + */ + @Operation(summary = "分页查询" , description = "分页查询" ) + @GetMapping("/page" ) + @PreAuthorize("@pms.hasPermission('supermarket_shopSpu_view')" ) + public R getShopSpuPage(@ParameterObject Page page, @ParameterObject ShopSpuEntity shopSpu) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StrUtil.isNotBlank(shopSpu.getProductName()),ShopSpuEntity::getProductName,shopSpu.getProductName()); + return R.ok(shopSpuService.pageScope(page, wrapper)); + } + + /** + * 通过id查询商品spu + * @param id id + * @return R + */ + @Operation(summary = "通过id查询" , description = "通过id查询" ) + @GetMapping("/{id}" ) + @PreAuthorize("@pms.hasPermission('supermarket_shopSpu_view')" ) + public R getById(@PathVariable("id" ) Long id) { + return R.ok(shopSpuService.getByIdDeep(id)); + } + + /** + * 新增商品spu + * @param shopSpu 商品spu + * @return R + */ + @Operation(summary = "新增商品spu" , description = "新增商品spu" ) + @SysLog("新增商品spu" ) + @PostMapping + @PreAuthorize("@pms.hasPermission('supermarket_shopSpu_add')" ) + public R save(@RequestBody ShopSpuEntity shopSpu) { + shopSpu.setDeptId(SecurityUtils.getUser().getDeptId()); + return R.ok(shopSpuService.saveDeep(shopSpu)); + } + + /** + * 修改商品spu + * @param shopSpu 商品spu + * @return R + */ + @Operation(summary = "修改商品spu" , description = "修改商品spu" ) + @SysLog("修改商品spu" ) + @PutMapping + @PreAuthorize("@pms.hasPermission('supermarket_shopSpu_edit')" ) + public R updateById(@RequestBody ShopSpuEntity shopSpu) { + return R.ok(shopSpuService.updateDeep(shopSpu)); + } + + /** + * 通过id删除商品spu + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除商品spu" , description = "通过id删除商品spu" ) + @SysLog("通过id删除商品spu" ) + @DeleteMapping + @PreAuthorize("@pms.hasPermission('supermarket_shopSpu_del')" ) + public R removeById(@RequestBody Long[] ids) { + return R.ok(shopSpuService.removeDeep(ids)); + } + + /** + * 通过id删除商品spu子表数据 + * @param ids id列表 + * @return R + */ + @Operation(summary = "通过id删除商品spu子表数据" , description = "通过id删除商品spu子表数据" ) + @SysLog("通过id删除商品spu子表数据" ) + @DeleteMapping("/child") + @PreAuthorize("@pms.hasPermission('supermarket_shopSpu_del')" ) + public R removeChild(@RequestBody Long[] ids) { + return R.ok(shopSpuService.removeChild(ids)); + } + + /** + * 导出excel 表格 + * @param shopSpu 查询条件 + * @param ids 导出指定ID + * @return excel 文件流 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('supermarket_shopSpu_export')" ) + public List export(ShopSpuEntity shopSpu,Long[] ids) { + return shopSpuService.list(Wrappers.lambdaQuery(shopSpu).in(ArrayUtil.isNotEmpty(ids), ShopSpuEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpCgPlanController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpCgPlanController.java index a39074795..f9745b723 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpCgPlanController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpCgPlanController.java @@ -94,7 +94,6 @@ public class SmErpCgPlanController { */ @Operation(summary = "选择商品分页数据" , description = "选择商品分页数据" ) @GetMapping("/erpSpuPage" ) - @PreAuthorize("@pms.hasPermission('supermarket_smErpInventoryRecords_view')" ) public R getErpSpuPage(@ParameterObject Page page, @ParameterObject ErpCgPlanDTO erpCgPlanDTO) { return R.ok(smErpSpuService.getErpSpuPage(page, erpCgPlanDTO)); } diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpInventoryRecordsController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpInventoryRecordsController.java index d12e8d0c0..68a0cdb93 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpInventoryRecordsController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpInventoryRecordsController.java @@ -87,6 +87,7 @@ public class SmErpInventoryRecordsController { wrapper.eq(SmErpInventoryRecordsEntity::getInventoryType, smErpInventoryRecords.getInventoryType()); wrapper.eq(StrUtil.isNotBlank(smErpInventoryRecords.getInventoryCode()),SmErpInventoryRecordsEntity::getInventoryCode,smErpInventoryRecords.getInventoryCode()); wrapper.eq(null!=smErpInventoryRecords.getInventoryDate(),SmErpInventoryRecordsEntity::getInventoryDate,smErpInventoryRecords.getInventoryDate()); + wrapper.orderByDesc(SmErpInventoryRecordsEntity::getCreateTime); return R.ok(smErpInventoryRecordsService.pageScope(page, wrapper)); } diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java index d98721af0..164295a08 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java @@ -9,10 +9,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.excel.annotation.RequestExcel; +import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuQueryDTO; +import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockByCodeReqDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockReqDTO; import com.bsd.pjcloud.supermarket.dto.erpspu.SmErpSpuImportDto; import com.bsd.pjcloud.supermarket.entity.SmErpAuxiliaryCodeEntity; @@ -20,10 +22,10 @@ import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity; import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity; import com.bsd.pjcloud.supermarket.entity.SmErpUnitEntity; import com.bsd.pjcloud.supermarket.service.*; -import com.bsd.pjcloud.supermarket.task.TaskStoreService; import com.bsd.pjcloud.supermarket.vo.ad.SmErpSpuDetailsVo; import com.bsd.pjcloud.supermarket.vo.ad.SpuVo; import com.bsd.pjcloud.supermarket.vo.erpspu.SmErpSpuSimpleVo; +import com.bsd.pjcloud.supermarket.vo.erpspu.SmErpSpuStockExcel; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Qualifier; @@ -38,11 +40,10 @@ import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -70,9 +71,6 @@ public class SmErpSpuController { private final SmErpStockService smErpStockService; - private final TaskStoreService taskStoreService; - - /** @@ -87,8 +85,9 @@ public class SmErpSpuController { public R getSupermarketSpuPage(@ParameterObject Page page, @ParameterObject SmErpSpuEntity supermarketSpu) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(StringUtils.isNotBlank(supermarketSpu.getProductCode()), SmErpSpuEntity::getProductCode,supermarketSpu.getProductCode()); - wrapper.eq(StringUtils.isNotBlank(supermarketSpu.getBarcode()), SmErpSpuEntity::getBarcode,supermarketSpu.getBarcode()); + wrapper.eq(StringUtils.isNotBlank(supermarketSpu.getBarCode()), SmErpSpuEntity::getBarCode,supermarketSpu.getBarCode()); wrapper.like(StringUtils.isNotBlank(supermarketSpu.getProductName()), SmErpSpuEntity::getProductName,supermarketSpu.getProductName()); + wrapper.orderByDesc(SmErpSpuEntity::getCreateTime); return R.ok(smErpSpuService.pageScope(page, wrapper)); } @@ -105,7 +104,7 @@ public class SmErpSpuController { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(SmErpSpuEntity::getStatus,"0"); wrapper.eq(StringUtils.isNotBlank(supermarketSpu.getProductCode()), SmErpSpuEntity::getProductCode,supermarketSpu.getProductCode()); - wrapper.eq(StringUtils.isNotBlank(supermarketSpu.getBarcode()), SmErpSpuEntity::getBarcode,supermarketSpu.getBarcode()); + wrapper.eq(StringUtils.isNotBlank(supermarketSpu.getBarCode()), SmErpSpuEntity::getBarCode,supermarketSpu.getBarCode()); wrapper.eq(StringUtils.isNotBlank(supermarketSpu.getProductName()), SmErpSpuEntity::getProductName,supermarketSpu.getProductName()); wrapper.eq(null!=supermarketSpu.getCategoryId(), SmErpSpuEntity::getCategoryId,supermarketSpu.getCategoryId()); return R.ok(smErpSpuService.OnlineSpuPageScope(page, wrapper)); @@ -125,9 +124,11 @@ public class SmErpSpuController { LambdaQueryWrapper smErpStockEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); smErpStockEntityLambdaQueryWrapper.eq(SmErpStockEntity::getErpSpuId, id); SmErpStockEntity smErpStockEntity = smErpStockService.getOne(smErpStockEntityLambdaQueryWrapper); - smErpSpuEntity.setStock(smErpStockEntity.getBaseStock()); - smErpSpuEntity.setInventoryLowerLimit(smErpStockEntity.getInventoryLowerLimit()); - smErpSpuEntity.setInventoryUpperLimit(smErpStockEntity.getInventoryUpperLimit()); + if (null != smErpStockEntity){ + smErpSpuEntity.setStock(smErpStockEntity.getBaseStock()); + smErpSpuEntity.setInventoryLowerLimit(smErpStockEntity.getInventoryLowerLimit()); + smErpSpuEntity.setInventoryUpperLimit(smErpStockEntity.getInventoryUpperLimit()); + } List list = smErpUnitService.list(new LambdaQueryWrapper().eq(SmErpUnitEntity::getSpuId, id)); smErpSpuEntity.setSmErpUnitEntityList(list); @@ -188,8 +189,8 @@ public class SmErpSpuController { @ResponseExcel @GetMapping("/export") @PreAuthorize("@pms.hasPermission('supermarket_supermarketSpu_export')" ) - public List export(SmErpSpuEntity supermarketSpu, Long[] ids) { - return smErpSpuService.list(Wrappers.lambdaQuery(supermarketSpu).in(ArrayUtil.isNotEmpty(ids), SmErpSpuEntity::getId, ids)); + public List export(SmErpSpuEntity supermarketSpu, Long[] ids) { + return smErpSpuService.exportSupermarketSpuStockExcel(supermarketSpu, ids); } @@ -223,16 +224,16 @@ public class SmErpSpuController { } - /** * 导入 * - * @param + * @param dtos 导入数据列表 * @param bindingResult 错误信息列表 * @return R */ @PostMapping("/import") @PreAuthorize("@pms.hasPermission('supermarket_supermarketSpu_import')" ) + @Idempotent(expireTime = 10, info = "请勿重复导入,10秒后再重新尝试") public R importErpSpu(@RequestExcel List dtos, BindingResult bindingResult) { List collect = dtos.stream().filter(smErpSpuImportDto -> smErpSpuImportDto.getProductCode() != null).collect(Collectors.toList()); if (CollectionUtils.isEmpty(collect)) { @@ -241,10 +242,6 @@ public class SmErpSpuController { return smErpSpuService.importErpSpu(collect, bindingResult); } - -// --------APP----------------- - - /** * 条件查询spu单表 列表信息 * @param supermarketSpuQueryDTO 商品spu @@ -277,6 +274,19 @@ public class SmErpSpuController { } + /** + * 在线商城核销扣减实际商品库存,根据货号/条码 + * @param updateStockReqDTO + * @return + */ + @PostMapping("/ad/updateSpuStockByCode") + @Operation(summary = "更新库存" , description = "app和安卓公用" ) + @SysLog("更新商品库存根据在线商城的编码") + public R updateSpuStockByCode(@RequestBody SupermarketSpuUpdateStockByCodeReqDTO updateStockReqDTO){ + return smErpSpuService.updateSpuStockByCode(updateStockReqDTO); + } + + //-------------------APP----------------- @@ -285,24 +295,12 @@ public class SmErpSpuController { * 条件查询spu单表 列表信息 * @param supermarketSpuQueryDTO 商品spu * @return - *///todo 待完善,返回的参数不全,有问题 + */ @Operation(summary = "APP根据条件查询分页SPU" , description = "APP条件分页查询" ) @PostMapping("/app/selectListAll" ) @PreAuthorize("@pms.hasPermission('supermarket_supermarketSpu_view')" ) public R getSupermarketSpu(@RequestBody SupermarketSpuAppQueryDTO supermarketSpuQueryDTO,@ParameterObject Page page) { return R.ok(smSpuService.getAppPage(page,supermarketSpuQueryDTO)); - -// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); -// wrapper.eq(supermarketSpuQueryDTO.getMerchantId() != null, SmErpSpuEntity::getMerchantId, supermarketSpuQueryDTO.getMerchantId()); -// wrapper.eq(supermarketSpuQueryDTO.getCategoryId() != null, SmErpSpuEntity::getCategoryId, supermarketSpuQueryDTO.getCategoryId()); -//// wrapper.eq(StrUtil.isNotBlank(supermarketSpuQueryDTO.getProductCode()), SupermarketSpuEntity::getProductCode, supermarketSpuQueryDTO.getProductCode()); -//// wrapper.eq(StrUtil.isNotBlank(supermarketSpuQueryDTO.getBarcode()), SupermarketSpuEntity::getBarcode, supermarketSpuQueryDTO.getBarcode()); -// wrapper.like(StrUtil.isNotBlank(supermarketSpuQueryDTO.getProductName()), SmErpSpuEntity::getProductName, supermarketSpuQueryDTO.getProductName()); -// Page pageDate = smErpSpuService.page(page, wrapper); -// List list = pageDate.getRecords(); -// List bean = BeanUtils.toBean(list, SupermarketAppSpuVo.class); -// pageDate.setRecords(bean); -// return R.ok(pageDate); } /** diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSupplierController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSupplierController.java index e6ddc228d..4eff8fd2c 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSupplierController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSupplierController.java @@ -135,8 +135,9 @@ public class SmErpSupplierController { */ @Operation(summary = "通过id查询" , description = "通过id查询" ) @GetMapping("/selectSimpleAll" ) - public R selectSimpleAll(@RequestParam(value = "name",required = false)String name) { - List list = smErpSupplierService.selectSimpleAllScope(name); + public R selectSimpleAll(@RequestParam(value = "name",required = false)String name, + @RequestParam(value = "supplierId",required = false)Long supplierId) { + List list = smErpSupplierService.selectSimpleAllScope(name,supplierId); List bean = BeanUtils.toBean(list, SmErpSupplierSimpleVo.class); return R.ok(bean); } diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSupplierTypeController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSupplierTypeController.java index c58737e89..6662305cf 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSupplierTypeController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSupplierTypeController.java @@ -129,7 +129,7 @@ public class SmErpSupplierTypeController { @Operation(summary = "下拉查询" ) @GetMapping("/simpleAll") public R getSimpleAll() { - List list = smErpSupplierTypeService.list(); + List list = smErpSupplierTypeService.selectSimpleAllScope(); List bean = BeanUtils.toBean(list, SmErpSupplierTypeSimpleVo.class); return R.ok(bean); } diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmSpuController.java index e819b1f23..f59e9be36 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmSpuController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmSpuController.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil; 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.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; @@ -11,11 +12,16 @@ import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.supermarket.dto.SmSpuPageDTO; +import com.bsd.pjcloud.supermarket.entity.SmErpCategoryEntity; import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity; import com.bsd.pjcloud.supermarket.entity.SmSpuEntity; import com.bsd.pjcloud.supermarket.mapper.SmErpSpuMapper; +import com.bsd.pjcloud.supermarket.service.SmErpCategoryService; import com.bsd.pjcloud.supermarket.service.SmErpSpuService; import com.bsd.pjcloud.supermarket.service.SmSpuService; +import com.bsd.pjcloud.supermarket.vo.OnlineShopVo; +import com.bsd.pjcloud.supermarket.vo.erp.SmErpCategorySimpleVo; import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmSpuEditVo; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; @@ -31,6 +37,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * 线上超市 @@ -50,6 +57,10 @@ public class SmSpuController { private final SmErpSpuService smErpSpuService; private final RemoteMchService remoteMchService; + + private final SmErpCategoryService smErpCategoryService; + + /** * 分页查询 * @param page 分页对象 @@ -59,7 +70,7 @@ public class SmSpuController { @Operation(summary = "分页查询" , description = "分页查询" ) @GetMapping("/page" ) @PreAuthorize("@pms.hasPermission('supermarket_smSpu_view')" ) - public R getSmSpuPage(@ParameterObject Page page, @ParameterObject SmSpuEntity smSpu) { + public R getSmSpuPage(@ParameterObject Page page, @ParameterObject SmSpuPageDTO smSpu) { return R.ok(smSpuService.pageScope(page, smSpu)); } @@ -93,13 +104,13 @@ public class SmSpuController { public R save(@RequestBody SmSpuEntity smSpu) { Long deptId = SecurityUtils.getUser().getDeptId(); //查询商户,设置商户id - R byDeptId = remoteMchService.getByDeptId(deptId, MerchantTypeEnum.SELF_SUPERMARKET); - MchManageVo data = byDeptId.getData(); - if (Objects.isNull(data) || !data.getTypes().contains("2")){ - return R.failed("当前用户未绑定超市商户"); - } +// R byDeptId = remoteMchService.getByDeptId(deptId, MerchantTypeEnum.SELF_SUPERMARKET); +// MchManageVo data = byDeptId.getData(); +// if (Objects.isNull(data) || !data.getTypes().contains("2")){ +// return R.failed("当前用户未绑定超市商户"); +// } smSpu.setDeptId(deptId); - smSpu.setMerchantId(data.getId()); +// smSpu.setMerchantId(data.getId()); return R.ok(smSpuService.save(smSpu)); } @@ -145,5 +156,56 @@ public class SmSpuController { + /** + * 获取商户下所有的在线商品,并且获取分类 + * @return + */ + @Operation(summary = "APP在线商城数据查询",description = "通过商户id获取该商户下的在线商品数据") + @GetMapping("/app/onlineShopList") + public R> getOnlineShopList(@RequestParam("categoryId")Long categoryId,@ParameterObject Page page) { + + IPage onlineShopList = smSpuService.getOnlineShopList(categoryId, page); + + return R.ok(onlineShopList); + } + + + + /** + * 获取商户下所有获取分类 + * @return + */ + @Operation(summary = "APP在线商城分类数据查询",description = "获取商户下所有获取分类通过商户id") + @GetMapping("/app/onlineCategoryList") + public R> getOnlineCategoryList(@RequestParam("merchantId")Long merchantId) { + +// R byId = remoteMchService.getById(merchantId); +// MchManageVo data = byId.getData(); +// if (Objects.isNull(data)){ +// return R.failed("商户不存在"); +// } +// Long deptId = data.getDeptId(); +// +// List categoryEntities = smErpCategoryService.list(Wrappers.lambdaQuery().eq(SmErpCategoryEntity::getDeptId, deptId)); +// List bean = BeanUtils.toBean(categoryEntities, SmErpCategorySimpleVo.class); + LambdaQueryWrapper eq = new LambdaQueryWrapper() + .eq(SmSpuEntity::getMerchantId, merchantId) + //上架数据 0 + .eq(SmSpuEntity::getStatus, "0"); + List list = smSpuService.list(eq); + List erpSpuIds = list.stream().map(smSpuEntity -> smSpuEntity.getErpSpuId()).collect(Collectors.toList()); + + LambdaQueryWrapper smErpSpuEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + smErpSpuEntityLambdaQueryWrapper.in(SmErpSpuEntity::getId, erpSpuIds); + List erpSpuEntities = smErpSpuService.list(smErpSpuEntityLambdaQueryWrapper); + + List categoryIds= erpSpuEntities.stream().map(smErpSpuEntity -> smErpSpuEntity.getCategoryId()).collect(Collectors.toList()); + + LambdaQueryWrapper smErpCategoryEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); + smErpCategoryEntityLambdaQueryWrapper.in(SmErpCategoryEntity::getId, categoryIds); + List categoryEntities = smErpCategoryService.list(smErpCategoryEntityLambdaQueryWrapper); + List bean = BeanUtils.toBean(categoryEntities, SmErpCategorySimpleVo.class); + return R.ok(bean); + } } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/ShopCategoryMapper.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/ShopCategoryMapper.java new file mode 100644 index 000000000..2d4836d2a --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/ShopCategoryMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.supermarket.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.supermarket.entity.ShopCategoryEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ShopCategoryMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/ShopSkuMapper.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/ShopSkuMapper.java new file mode 100644 index 000000000..a746ed325 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/ShopSkuMapper.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.supermarket.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ShopSkuMapper extends PjcloudBaseMapper { + + /** + * 修改库存(乐观锁) + * 正数:增加库存,负数:扣减库存 + * @param skuId sku主键 + * @param num 增减数量(正数加,负数减) + * @param version 当前版本号 + * @return 影响行数 + */ + int deductStock(Long skuId, Integer num, Integer version); + +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/ShopSpuMapper.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/ShopSpuMapper.java new file mode 100644 index 000000000..01abd2060 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/ShopSpuMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.supermarket.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ShopSpuMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpInventoryRecordsItemMapper.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpInventoryRecordsItemMapper.java index e7210f517..773e8cb9a 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpInventoryRecordsItemMapper.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpInventoryRecordsItemMapper.java @@ -6,9 +6,13 @@ import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryDetailQueryDTO; import com.bsd.pjcloud.supermarket.entity.SmErpInventoryRecordsItemEntity; import com.bsd.pjcloud.supermarket.vo.inventoryrecord.InventoryRecordSumVo; +import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmErpCostPriceVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; +import java.util.Map; + @Mapper public interface SmErpInventoryRecordsItemMapper extends PjcloudBaseMapper { @@ -21,4 +25,8 @@ public interface SmErpInventoryRecordsItemMapper extends PjcloudBaseMapper selectInventoryTypeSumPageByScope(Page page, @Param("inventoryDetailQueryDTO") InventoryDetailQueryDTO inventoryDetailQueryDTO, DataScope of); + + + + List getRecordsItemListBySpuIdsAndInventoryType(@Param("currentSpuIds")List currentSpuIds); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpSpuMapper.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpSpuMapper.java index 7848bc318..5d7c0c7be 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpSpuMapper.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpSpuMapper.java @@ -7,6 +7,7 @@ import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuQueryDTO; import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity; import com.bsd.pjcloud.supermarket.vo.ad.SpuVo; +import com.bsd.pjcloud.supermarket.vo.erpspu.SmErpSpuStockExcel; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springdoc.core.annotations.ParameterObject; @@ -43,4 +44,7 @@ public interface SmErpSpuMapper extends PjcloudBaseMapper { Page selectListAllScope(@ParameterObject Page page, @Param("supermarketSpuQueryDTO") SupermarketSpuQueryDTO supermarketSpuQueryDTO , DataScope dataScope); + + + List exportSupermarketSpuStockExcel(@Param("supermarketSpu") SmErpSpuEntity supermarketSpu, @Param("ids") Long[] ids,DataScope dataScope); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpUnitMapper.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpUnitMapper.java index fa59215a2..4a6605dbc 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpUnitMapper.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpUnitMapper.java @@ -23,5 +23,12 @@ public interface SmErpUnitMapper extends PjcloudBaseMapper { List getSupermarketUnitsWithSpu(List ids); - + /** + * 根据商品编码和条码获取超市包装单位信息 + * @param productCode + * @param barCode + * @param deptId + * @return + */ + SmErpUnitEntity getOneByProductCodeAndBarCode(String productCode, String barCode, Long deptId); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmSpuMapper.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmSpuMapper.java index b40f9faf1..fc02839ec 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmSpuMapper.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmSpuMapper.java @@ -5,13 +5,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage; 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.supermarket.dto.SmSpuPageDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO; import com.bsd.pjcloud.supermarket.entity.SmSpuEntity; +import com.bsd.pjcloud.supermarket.vo.OnlineShopVo; import com.bsd.pjcloud.supermarket.vo.app.SupermarketAppSpuVo; import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmErpPageScopeVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + @Mapper public interface SmSpuMapper extends PjcloudBaseMapper { @@ -23,7 +27,7 @@ public interface SmSpuMapper extends PjcloudBaseMapper { * @param of * @return */ - IPage selectSmErpPageScopeVo(Page page, @Param("smspu") SmSpuEntity smSpu, DataScope of); + IPage selectSmErpPageScopeVo(Page page, @Param("smspu") SmSpuPageDTO smSpu, DataScope of); /** @@ -33,4 +37,13 @@ public interface SmSpuMapper extends PjcloudBaseMapper { * @return */ IPage getAppPage(Page page, @Param("supermarketSpuQueryDTO")SupermarketSpuAppQueryDTO supermarketSpuQueryDTO); + + + /** + * 移动端分页获取线上商品数据 + * @param categoryId + * @param page + * @return + */ + IPage getOnlineShopList(@Param("categoryId") Long categoryId, Page page); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopCategoryService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopCategoryService.java new file mode 100644 index 000000000..0a83bda43 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopCategoryService.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.supermarket.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.supermarket.entity.ShopCategoryEntity; + +import java.util.List; + +public interface ShopCategoryService extends IService { + + + /** + * 列表,条件当前权限 + * @return + */ + List listScope(); + + + /** + * 分页,条件当前权限 + * @param page + * @param wrapper + * @return + */ + Object pageScope(Page page, LambdaQueryWrapper wrapper); +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSkuService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSkuService.java new file mode 100644 index 000000000..4510992fd --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSkuService.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.supermarket.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; + +public interface ShopSkuService extends IService { + + /** + * 修改库存(乐观锁) + * 正数:增加库存,负数:扣减库存 + * @param skuId sku主键 + * @param num 增减数量(正数加,负数减) + * @return 是否成功 + */ + boolean deductStock(Long skuId, Integer num); +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java new file mode 100644 index 000000000..328973233 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java @@ -0,0 +1,25 @@ +package com.bsd.pjcloud.supermarket.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.extension.mapping.base.MPJDeepService; +import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; +import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; + +public interface ShopSpuService extends MPJDeepService { + Boolean saveDeep(ShopSpuEntity shopSpu); + + Boolean updateDeep(ShopSpuEntity shopSpu); + + Boolean removeDeep(Long[] ids); + + Boolean removeChild(Long[] ids); + + /** + * 分页查询 + * @param page + * @param wrapper + * @return + */ + Object pageScope(Page page, LambdaQueryWrapper wrapper); +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSpuService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSpuService.java index ecf22cce7..348006929 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSpuService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSpuService.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuQueryDTO; +import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockByCodeReqDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockReqDTO; import com.bsd.pjcloud.supermarket.dto.cgplan.ErpCgPlanDTO; import com.bsd.pjcloud.supermarket.dto.erpspu.SmErpSpuImportDto; @@ -13,6 +14,7 @@ import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity; import com.bsd.pjcloud.supermarket.vo.ad.SmErpSpuDetailsVo; import com.bsd.pjcloud.supermarket.vo.ad.SpuVo; import com.bsd.pjcloud.supermarket.vo.cgplan.ErpSpuWithUnitPageVo; +import com.bsd.pjcloud.supermarket.vo.erpspu.SmErpSpuStockExcel; import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmErpPageScopeVo; import org.springdoc.core.annotations.ParameterObject; import org.springframework.validation.BindingResult; @@ -41,6 +43,13 @@ public interface SmErpSpuService extends IService { R updateSpuStock(SupermarketSpuUpdateStockReqDTO updateStockReqDTO); + /** + * 根据商品编码更新库存 + * @param updateStockReqDTO + * @return + */ + R updateSpuStockByCode(SupermarketSpuUpdateStockByCodeReqDTO updateStockReqDTO); + /** * 分页查询 * @param page @@ -103,8 +112,15 @@ public interface SmErpSpuService extends IService { R importErpSpu(List smErpSupplierImportDtos, BindingResult bindingResult); + /** + * 导出 + * @param supermarketSpu + * @param ids + * @return + */ + List exportSupermarketSpuStockExcel(SmErpSpuEntity supermarketSpu, Long[] ids); +// R calculateCostPrice(); - void asyncExecuteImport(String taskId, List dtos); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSupplierService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSupplierService.java index f353436a5..bc4d33bbd 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSupplierService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSupplierService.java @@ -17,7 +17,7 @@ public interface SmErpSupplierService extends IService { * 隔离查询 * @return */ - List selectSimpleAllScope(String name); + List selectSimpleAllScope(String name,Long supplierId); /** diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSupplierTypeService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSupplierTypeService.java index f32212235..2cef9f322 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSupplierTypeService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpSupplierTypeService.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.supermarket.entity.SmErpSupplierTypeEntity; +import java.util.List; + public interface SmErpSupplierTypeService extends IService { @@ -16,4 +18,7 @@ public interface SmErpSupplierTypeService extends IService wrapper); + + + List selectSimpleAllScope(); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpUnitService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpUnitService.java index 990f0cce6..f2ca8832c 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpUnitService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpUnitService.java @@ -25,4 +25,13 @@ public interface SmErpUnitService extends IService { * @return */ List listScope(String barCode); + + + /** + * 根据商品编码和条形码获取商品包装单位信息 + * @param productCode + * @param barCode + * @return + */ + SmErpUnitEntity getOneByProductCodeAndBarCode(String productCode, String barCode, Long deptId); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmSpuService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmSpuService.java index 8accd737d..32f5dcca5 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmSpuService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmSpuService.java @@ -1,10 +1,13 @@ package com.bsd.pjcloud.supermarket.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.supermarket.dto.SmSpuPageDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO; import com.bsd.pjcloud.supermarket.entity.SmSpuEntity; +import com.bsd.pjcloud.supermarket.vo.OnlineShopVo; import com.bsd.pjcloud.supermarket.vo.app.SupermarketAppSpuVo; import java.util.List; @@ -13,9 +16,16 @@ public interface SmSpuService extends IService { - Object pageScope(Page page, SmSpuEntity smSpu); + Object pageScope(Page page, SmSpuPageDTO smSpu); Object getAppPage(Page page, SupermarketSpuAppQueryDTO supermarketSpuQueryDTO); + + /** + * 查询该分类下的所有在线商品数据 + * @param categoryId + * @return + */ + IPage getOnlineShopList(Long categoryId, Page page); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopCategoryServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopCategoryServiceImpl.java new file mode 100644 index 000000000..a165580a1 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopCategoryServiceImpl.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.supermarket.service.impl; + +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.data.datascope.DataScope; +import com.bsd.pjcloud.supermarket.entity.ShopCategoryEntity; +import com.bsd.pjcloud.supermarket.mapper.ShopCategoryMapper; +import com.bsd.pjcloud.supermarket.service.ShopCategoryService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 在线商品分类 + * + * @author zjf + * @date 2025-06-18 16:49:20 + */ +@Service +public class ShopCategoryServiceImpl extends ServiceImpl implements ShopCategoryService { + @Override + public List listScope() { + + return baseMapper.selectListByScope(null, DataScope.of()); + } + + @Override + public Object pageScope(Page page, LambdaQueryWrapper wrapper) { + return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + } +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSkuServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSkuServiceImpl.java new file mode 100644 index 000000000..8c799075c --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSkuServiceImpl.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.supermarket.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; +import com.bsd.pjcloud.supermarket.mapper.ShopSkuMapper; +import com.bsd.pjcloud.supermarket.service.ShopSkuService; +import org.springframework.stereotype.Service; +/** + * sku + * + * @author zjf + * @date 2025-06-19 12:43:40 + */ +@Service +public class ShopSkuServiceImpl extends ServiceImpl implements ShopSkuService { + /** + * 修改库存(乐观锁) + * 正数:增加库存,负数:扣减库存 + */ + @Override + public boolean deductStock(Long skuId, Integer num) { + for (int i = 0; i < 3; i++) { // 最多重试3次 + ShopSkuEntity sku = this.getById(skuId); + if (sku == null) return false; + // 扣减时判断库存是否足够 + if (num < 0 && sku.getStock() < -num) return false; + int updated = baseMapper.deductStock(skuId, num, sku.getVersion()); + if (updated > 0) return true; + } + return false; + } +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java new file mode 100644 index 000000000..89ed382f3 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java @@ -0,0 +1,75 @@ +package com.bsd.pjcloud.supermarket.service.impl; + +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.data.datascope.DataScope; +import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; +import com.bsd.pjcloud.supermarket.mapper.ShopSpuMapper; +import com.bsd.pjcloud.supermarket.service.ShopSpuService; +import org.springframework.stereotype.Service; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; +import com.bsd.pjcloud.supermarket.mapper.ShopSkuMapper; +import org.springframework.transaction.annotation.Transactional; +import lombok.RequiredArgsConstructor; +import java.util.Objects; +/** + * 商品spu + * + * @author zjf + * @date 2025-06-19 12:58:05 + */ +@Service +@RequiredArgsConstructor +public class ShopSpuServiceImpl extends ServiceImpl implements ShopSpuService { + private final ShopSkuMapper shopSkuMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveDeep(ShopSpuEntity shopSpu) { + baseMapper.insert(shopSpu); + for (ShopSkuEntity shopSku : shopSpu.getSkuList()) { + shopSku.setSpuId(shopSpu.getId()); + shopSkuMapper.insert( shopSku); + } + + return Boolean.TRUE; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateDeep(ShopSpuEntity shopSpu) { + baseMapper.updateById(shopSpu); + for (ShopSkuEntity shopSku : shopSpu.getSkuList()) { + if (Objects.isNull(shopSku.getId())) { + shopSku.setSpuId(shopSpu.getId()); + shopSkuMapper.insert(shopSku); + } else { + shopSkuMapper.updateById(shopSku); + } + } + return Boolean.TRUE; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean removeDeep(Long[] ids) { + baseMapper.deleteBatchIds(CollUtil.toList(ids)); + shopSkuMapper.delete(Wrappers.lambdaQuery().in(ShopSkuEntity::getSpuId, ids)); + return Boolean.TRUE; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean removeChild(Long[] ids) { + shopSkuMapper.deleteBatchIds(CollUtil.toList(ids)); + return Boolean.TRUE; + } + + @Override + public Object pageScope(Page page, LambdaQueryWrapper wrapper) { + return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + } +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java index 70cacb477..7ce471126 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java @@ -18,6 +18,7 @@ import com.bsd.pjcloud.flow.task.dto.ProcessInstanceParamDto; import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.flow.task.dto.TaskQueryParamDto; import com.bsd.pjcloud.flow.task.entity.Process; +import com.bsd.pjcloud.supermarket.constant.InventoryTypeEnum; import com.bsd.pjcloud.supermarket.constant.OrderTypeEnum; import com.bsd.pjcloud.supermarket.constant.SupermarketFlowConstant; import com.bsd.pjcloud.supermarket.dto.cgdd.SmCgDDSaveItemDTO; @@ -30,6 +31,7 @@ import com.bsd.pjcloud.supermarket.vo.cgplan.ErpUnitVo; import com.bsd.pjcloud.supermarket.vo.cgplan.SmErpCgPlanItemVo; import com.bsd.pjcloud.supermarket.vo.cgplan.SmErpCgPlanVo; import com.bsd.pjcloud.supermarket.vo.inventoryrecord.*; +import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmErpCostPriceVo; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -38,6 +40,7 @@ import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.DoubleStream; import java.util.stream.IntStream; /** @@ -72,8 +75,6 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl items = inventoryRecordSaveDTO.getItems(); //计算主表总金额 int sum = items.stream().mapToInt(InventoryRecordSaveItemDTO::getTotalAmount).sum(); @@ -129,7 +130,7 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl currentSpuIds = cgPlanItemEntities.stream() + .map(SmErpInventoryRecordsItemEntity::getErpSpuId) + .collect(Collectors.toList()); + + List itemEntityList = smErpInventoryRecordsItemMapper.getRecordsItemListBySpuIdsAndInventoryType( + currentSpuIds + ); + Map> costPriceMap = itemEntityList.stream() + .collect(Collectors.groupingBy(SmErpCostPriceVo::getErpSpuId)); + + // 计算并更新成本价 + cgPlanItemEntities.forEach(item -> { + Long erpSpuId = item.getErpSpuId(); + List smErpInventoryRecordsItemEntityList = costPriceMap.get(erpSpuId); + Double totalNum = smErpInventoryRecordsItemEntityList.stream().filter(Objects::nonNull).mapToDouble(itemEntity -> itemEntity.getPackageNum() * itemEntity.getQuantity()).sum(); + + int totalRealRrice = smErpInventoryRecordsItemEntityList.stream().filter(Objects::nonNull).mapToInt(SmErpCostPriceVo::getTotalAmount).sum(); + double costPrice = (totalRealRrice / 100) / totalNum; + + SmErpSpuEntity smErpSpuEntity = new SmErpSpuEntity(); + smErpSpuEntity.setCostPrice(costPrice); + smErpSpuEntity.setId(erpSpuId); + // 更新库存成本价 + smErpSpuMapper.updateById(smErpSpuEntity); + }); + } return insert; } @@ -202,17 +234,17 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl> pageR = remoteFlowApiFlowService.queryMineTask(taskQueryParamDto); - Page data = pageR.getData(); - - final Map processInstanceIdMap = (data != null && !ObjectUtil.isEmpty(data.getRecords())) - ? data.getRecords().stream() - .collect(Collectors.toMap(TaskDto::getProcessInstanceId, taskDto -> taskDto)) - : Collections.emptyMap(); +// TaskQueryParamDto taskQueryParamDto = new TaskQueryParamDto(); +// taskQueryParamDto.setProcessInstanceIds(processInstanceIds); +// taskQueryParamDto.setCurrent(1); +// taskQueryParamDto.setSize(processInstanceIds.size()); +// R> pageR = remoteFlowApiFlowService.queryMineTask(taskQueryParamDto); +// Page data = pageR.getData(); +// +// final Map processInstanceIdMap = (data != null && !ObjectUtil.isEmpty(data.getRecords())) +// ? data.getRecords().stream() +// .collect(Collectors.toMap(TaskDto::getProcessInstanceId, taskDto -> taskDto)) +// : Collections.emptyMap(); // 设置商品名称到主表实体 records.forEach(plan -> { @@ -226,15 +258,15 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl items = inventoryRecordEditDTO.getItems(); @@ -443,6 +476,11 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl updateItems = smErpInventoryRecordsItemEntityList.stream(). filter(smErpInventoryRecordsItemEntity -> smErpInventoryRecordsItemEntity.getId() != null).collect(Collectors.toList()); + // 为新增的项目设置inventoryId和deptId + insertItems.forEach(insertItem -> { + insertItem.setInventoryId(inventoryRecordEditDTO.getId()); + insertItem.setDeptId(deptId); + }); //更新的话,查询之前保存了哪些item,然后去库存表删掉从新计算库存 List dataBaseSmErpInventoryRecordsItemEntityList = smErpInventoryRecordsItemMapper @@ -515,10 +553,11 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl unitCollect = smErpUnitEntityList.stream().filter(smErpUnitEntity -> smErpUnitEntity.getPackageNum() <= 0).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(unitCollect)){ + return R.failed("包装类型内装数.量不能小于等于0!"); + } if (CollectionUtils.isNotEmpty(smErpUnitEntityList)) { smErpUnitEntityList.forEach(supermarketUnitEntity -> supermarketUnitEntity.setSpuId(supermarketSpu.getId())); smErpUnitService.saveBatch(smErpUnitEntityList); } else { return R.failed("包装类型不能为空"); } + Map unitMap = smErpUnitEntityList.stream().collect(Collectors.toMap(smErpUnitEntity -> smErpUnitEntity.getUnit(), smErpUnitEntity -> smErpUnitEntity)); + //辅助条码 List smErpAuxiliaryCodeEntityList = supermarketSpu.getSmErpAuxiliaryCodeEntityList(); if (CollectionUtils.isNotEmpty(smErpAuxiliaryCodeEntityList)) { - smErpAuxiliaryCodeEntityList.forEach(supermarketAuxiliaryCodeEntity -> supermarketAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId())); + for (int i = 0; i < smErpAuxiliaryCodeEntityList.size(); i++) { + SmErpAuxiliaryCodeEntity smErpAuxiliaryCodeEntity = smErpAuxiliaryCodeEntityList.get(i); + smErpAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId()); + smErpAuxiliaryCodeEntity.setUnitId(unitMap.get(smErpAuxiliaryCodeEntity.getUnit()).getId()); + } smErpAuxiliaryCodeService.saveBatch(smErpAuxiliaryCodeEntityList); } @@ -165,7 +178,8 @@ public class SmErpSpuServiceImpl extends ServiceImpl smErpUnitEntityList = supermarketSpu.getSmErpUnitEntityList(); - + List insertUnits= new ArrayList<>(); + List updateUnits= new ArrayList<>(); if (CollectionUtils.isNotEmpty(smErpUnitEntityList)) { List baseUnits = smErpUnitEntityList.stream() @@ -178,10 +192,10 @@ public class SmErpSpuServiceImpl extends ServiceImpl insertUnits = smErpUnitEntityList.stream() + insertUnits = smErpUnitEntityList.stream() .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() == null).collect(Collectors.toList()); insertUnits.forEach(supermarketUnitEntity -> supermarketUnitEntity.setSpuId(supermarketSpu.getId())); - List updateUnits = smErpUnitEntityList.stream() + updateUnits = smErpUnitEntityList.stream() .filter(supermarketUnitEntity -> supermarketUnitEntity.getId() != null).collect(Collectors.toList()); smErpUnitService.updateBatchById(updateUnits); smErpUnitService.saveBatch(insertUnits); @@ -229,12 +243,67 @@ public class SmErpSpuServiceImpl extends ServiceImpl smErpAuxiliaryCodeEntityList = supermarketSpu.getSmErpAuxiliaryCodeEntityList(); if (CollectionUtils.isNotEmpty(smErpAuxiliaryCodeEntityList)) { List insertCollect = smErpAuxiliaryCodeEntityList.stream().filter(supermarketAuxiliaryCodeEntity -> supermarketAuxiliaryCodeEntity.getId() == null).collect(Collectors.toList()); List updateCollect = smErpAuxiliaryCodeEntityList.stream().filter(supermarketAuxiliaryCodeEntity -> supermarketAuxiliaryCodeEntity.getId() != null).collect(Collectors.toList()); - insertCollect.stream().forEach(supermarketAuxiliaryCodeEntity -> supermarketAuxiliaryCodeEntity.setSpuId(supermarketSpu.getId())); + + // 构建包装单位映射:根据单位名称和口味分组 + Map unitMap = new HashMap<>(); + + // 先处理已存在的包装单位 + if (CollectionUtils.isNotEmpty(updateUnits)) { + unitMap.putAll(updateUnits.stream() + .collect(Collectors.toMap( + unit -> unit.getUnit() + "_" + (unit.getTaste() != null ? unit.getTaste() : ""), + unit -> unit + ))); + } + + // 再处理新增的包装单位 + if (CollectionUtils.isNotEmpty(insertUnits)) { + unitMap.putAll(insertUnits.stream() + .collect(Collectors.toMap( + unit -> unit.getUnit() + "_" + (unit.getTaste() != null ? unit.getTaste() : ""), + unit -> unit + ))); + } + + // 为新增的辅助条码设置包装单位ID + if (CollectionUtils.isNotEmpty(insertCollect)) { + for (SmErpAuxiliaryCodeEntity auxiliaryCode : insertCollect) { + String unitKey = auxiliaryCode.getUnit() + "_" + (auxiliaryCode.getTaste() != null ? auxiliaryCode.getTaste() : ""); + SmErpUnitEntity unit = unitMap.get(unitKey); + if (unit != null) { + auxiliaryCode.setSpuId(supermarketSpu.getId()); + auxiliaryCode.setUnitId(unit.getId()); + } else { + return R.failed("找不到对应的包装单位:" + auxiliaryCode.getUnit() + ",口味:" + (auxiliaryCode.getTaste() != null ? auxiliaryCode.getTaste() : "无")); + } + } + } + + // 为更新的辅助条码设置包装单位ID(如果单位发生变化) + if (CollectionUtils.isNotEmpty(updateCollect)) { + for (SmErpAuxiliaryCodeEntity auxiliaryCode : updateCollect) { + // 优先用unitId + if (auxiliaryCode.getUnitId() != null) { + continue; // 已有unitId,直接跳过 + } + // 只有unitId为空时,才用unit+口味查找 + String unitKey = (auxiliaryCode.getUnit() != null ? auxiliaryCode.getUnit().trim() : "") + "_" + + (auxiliaryCode.getTaste() != null ? auxiliaryCode.getTaste().trim() : ""); + SmErpUnitEntity unit = unitMap.get(unitKey); + if (unit != null) { + auxiliaryCode.setUnitId(unit.getId()); + } else { + return R.failed("找不到对应的包装单位:" + auxiliaryCode.getUnit() + ",口味:" + (auxiliaryCode.getTaste() != null ? auxiliaryCode.getTaste() : "无")); + } + } + } + smErpAuxiliaryCodeService.saveBatch(insertCollect); smErpAuxiliaryCodeService.updateBatchById(updateCollect); @@ -323,7 +392,6 @@ public class SmErpSpuServiceImpl extends ServiceImpl smErpInventoryRecordsItemEntity.getUnitPrice()).mapToInt(Integer::intValue).sum(); + smErpInventoryRecordsEntity.setTotalAmount(sum); + smErpInventoryRecordsEntity.setReceiveAmount(sum); + //生成出入库记录 + smErpInventoryRecordsMapper.insert(smErpInventoryRecordsEntity); + smErpInventoryRecordsItemEntityList.forEach(smErpInventoryRecordsItemEntity -> { + smErpInventoryRecordsItemEntity.setInventoryId(smErpInventoryRecordsEntity.getId()); + }); + smErpInventoryRecordsItemMapper.insert(smErpInventoryRecordsItemEntityList); + return R.ok(); + } + + @Override + @Transactional + public R updateSpuStockByCode(SupermarketSpuUpdateStockByCodeReqDTO updateStockReqDTO) { + List updateStockDTOS = new ArrayList(); + //出库主表数据 + SmErpInventoryRecordsEntity smErpInventoryRecordsEntity = new SmErpInventoryRecordsEntity(); + String s = sequence.nextNo(); + String result = InventoryTypeEnum.LSCK.getValue() + "-" + s; + smErpInventoryRecordsEntity.setInventoryCode(result); + smErpInventoryRecordsEntity.setInventoryDate(LocalDate.now()); + smErpInventoryRecordsEntity.setInventoryType(InventoryTypeEnum.LSCK.getType()); + smErpInventoryRecordsEntity.setOrderType(OrderTypeEnum.CK.getType()); + smErpInventoryRecordsEntity.setDeviceType(updateStockReqDTO.getDeviceType()); + + List smErpInventoryRecordsItemEntityList = new ArrayList<>(); + + for (SupermarketSpuUpdateStockByCodeReqDTO.Item v : updateStockReqDTO.getItems()) { +// LambdaQueryWrapper smErpUnitEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); +// smErpUnitEntityLambdaQueryWrapper.eq(SmErpUnitEntity::getBarCode, v.getBarCode()); + SmErpUnitEntity smErpUnitEntity = smErpUnitService.getOneByProductCodeAndBarCode(v.getProductCode(), v.getBarCode(),v.getDeptId()); + + if (null==smErpUnitEntity){ + return R.failed(v.getProductCode() + "商品不存在"); + } + + //计算包装单位实际需要扣减的库存 + Double incrCount = (smErpUnitEntity.getPackageNum()) * v.getIncrCount(); + // 查询当前库存 + Long spuId = smErpUnitEntity.getSpuId(); + SmErpSpuEntity spu = baseMapper.selectById(spuId); + if (null==spu) { + return R.failed(spu.getProductName() + "商品不存在"); + } + if (v.getIncrCount() == 0) { + return R.failed("扣减不能为0"); + } + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + lambdaUpdateWrapper.eq(SmErpStockEntity::getErpSpuId, spuId); + SmErpStockEntity smErpStockEntity = smErpStockMapper.selectOne(lambdaUpdateWrapper); + + + // 检查库存是否足够 + if (incrCount < 0 && Math.abs(incrCount) > smErpStockEntity.getCurrentStock()) { + return R.failed(spu.getProductName() + "库存不足,无法完成操作"); + } + + UpdateStockDTO updateStockDTO = new UpdateStockDTO(spuId, incrCount); + updateStockDTOS.add(updateStockDTO); + + //生成出入库记录 + SmErpInventoryRecordsItemEntity smErpInventoryRecordsItemEntity = new SmErpInventoryRecordsItemEntity(); + smErpInventoryRecordsItemEntity.setInventoryId(smErpInventoryRecordsEntity.getId()); + smErpInventoryRecordsItemEntity.setErpSpuId(spuId); + smErpInventoryRecordsItemEntity.setQuantity(incrCount); + smErpInventoryRecordsItemEntity.setUnitId(smErpUnitEntity.getId()); + smErpInventoryRecordsItemEntity.setOrderType(OrderTypeEnum.CK.getType()); + // 添加收款金额字段和会员卡号,用于记录零售业务,后续扩展使用 + smErpInventoryRecordsItemEntity.setUnitPrice + (smErpUnitEntity.getPromotionPrice()==null || smErpUnitEntity.getPromotionPrice()==0 + ?smErpUnitEntity.getRetailPrice():smErpUnitEntity.getPromotionPrice()); + smErpInventoryRecordsItemEntityList.add(smErpInventoryRecordsItemEntity); + } + smErpStockService.updateStock(updateStockDTOS); int sum = smErpInventoryRecordsItemEntityList.stream().map(smErpInventoryRecordsItemEntity -> smErpInventoryRecordsItemEntity.getUnitPrice()).mapToInt(Integer::intValue).sum(); smErpInventoryRecordsEntity.setTotalAmount(sum); smErpInventoryRecordsEntity.setReceiveAmount(sum); @@ -519,6 +663,19 @@ public class SmErpSpuServiceImpl extends ServiceImpl> errorList = new ArrayList<>(); + + + //查询这一批导入的数据是否纯在货号相同,存在标记出行数 + // 1. 收集本次导入的所有货号及行号映射 + Map> importProductCodeMap = new HashMap<>(); + for (int i = 0; i < smErpSpuImportDtos.size(); i++) { + SmErpSpuImportDto dto = smErpSpuImportDtos.get(i); + int row = i + 1; + String code = dto.getProductCode(); + importProductCodeMap.computeIfAbsent(code, k -> new ArrayList<>()).add(row); + } + + //货号-商品映射 Map productCodeToSpuMap = new HashMap<>(); @@ -545,6 +702,19 @@ public class SmErpSpuServiceImpl extends ServiceImpl duplicateRows = importProductCodeMap.get(productCode); + if (duplicateRows.size() > 1) { + String duplicateInfo = duplicateRows.stream() + .filter(r -> r < rowNumber) // 只显示之前的重复行 + .map(r -> "第" + r + "行") + .collect(Collectors.joining(",")); + if (!duplicateInfo.isEmpty()) { + errorReasons.add("货号在本批导入数据中重复,重复行号:" + duplicateInfo); + } + } + // 数据校验 List validationErrors = ErpSpuValidator.validate(dto, rowNumber); //添加验证错误记录 @@ -584,19 +754,25 @@ public class SmErpSpuServiceImpl extends ServiceImpl exportSupermarketSpuStockExcel(SmErpSpuEntity supermarketSpu, Long[] ids) { + return baseMapper.exportSupermarketSpuStockExcel(supermarketSpu, ids,DataScope.of()); + } + /** * 解析供应商ID(存在则返回,不存在则创建) * @@ -753,7 +934,7 @@ public class SmErpSpuServiceImpl extends ServiceImpl 0) { return newCategory.getId(); } diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpStockServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpStockServiceImpl.java index 1ca8a0275..abf2c73ff 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpStockServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpStockServiceImpl.java @@ -51,6 +51,7 @@ public class SmErpStockServiceImpl extends ServiceImpl selectSimpleAllScope(String name) { - LambdaQueryWrapper eq = new LambdaQueryWrapper() - .eq(SmErpSupplierEntity::getStatus, "0") - .like(StringUtils.isNotBlank(name),SmErpSupplierEntity::getSupplierName,name); - return baseMapper.selectListByScope(eq, DataScope.of()); + public List selectSimpleAllScope(String name,Long supplierId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); + wrapper.eq(SmErpSupplierEntity::getStatus, "0"); + wrapper.like(StringUtils.isNotBlank(name),SmErpSupplierEntity::getSupplierName,name); + wrapper.eq(supplierId!=null,SmErpSupplierEntity::getSupplierId,supplierId); + return baseMapper.selectListByScope(wrapper, DataScope.of()); } @Override diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSupplierTypeServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSupplierTypeServiceImpl.java index 6f4d2d81f..bf703cac8 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSupplierTypeServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpSupplierTypeServiceImpl.java @@ -7,7 +7,11 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.supermarket.entity.SmErpSupplierTypeEntity; import com.bsd.pjcloud.supermarket.mapper.SmErpSupplierTypeMapper; import com.bsd.pjcloud.supermarket.service.SmErpSupplierTypeService; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; + +import java.util.List; + /** * 货商类别 * @@ -20,4 +24,9 @@ public class SmErpSupplierTypeServiceImpl extends ServiceImpl wrapper) { return baseMapper.selectPageByScope(page,wrapper, DataScope.of()); } + + @Override + public List selectSimpleAllScope() { + return baseMapper.selectListByScope(null, DataScope.of()); + } } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpUnitServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpUnitServiceImpl.java index 3d41a07c8..1d3046d7c 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpUnitServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpUnitServiceImpl.java @@ -35,4 +35,9 @@ public class SmErpUnitServiceImpl extends ServiceImpl bean = BeanUtils.toBean(smErpUnitEntities, UnitPriceInfo.class); return bean; } + + @Override + public SmErpUnitEntity getOneByProductCodeAndBarCode(String productCode, String barCode,Long deptId) { + return baseMapper.getOneByProductCodeAndBarCode(productCode,barCode,deptId); + } } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmSpuServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmSpuServiceImpl.java index 6ee833b76..85db26a6d 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmSpuServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmSpuServiceImpl.java @@ -7,12 +7,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.supermarket.dto.SmSpuPageDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO; import com.bsd.pjcloud.supermarket.entity.SmSpuEntity; import com.bsd.pjcloud.supermarket.mapper.SmErpSpuMapper; import com.bsd.pjcloud.supermarket.mapper.SmErpUnitMapper; import com.bsd.pjcloud.supermarket.mapper.SmSpuMapper; import com.bsd.pjcloud.supermarket.service.SmSpuService; +import com.bsd.pjcloud.supermarket.vo.OnlineShopVo; import com.bsd.pjcloud.supermarket.vo.app.SupermarketAppSpuVo; import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmErpPageScopeVo; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; @@ -38,7 +40,7 @@ public class SmSpuServiceImpl extends ServiceImpl impl private final SmErpUnitMapper smErpUnitMapper; @Override - public Object pageScope(Page page, SmSpuEntity smSpu) { + public Object pageScope(Page page, SmSpuPageDTO smSpu) { IPage pageData = baseMapper.selectSmErpPageScopeVo(page,smSpu, DataScope.of()); return pageData; } @@ -48,4 +50,12 @@ public class SmSpuServiceImpl extends ServiceImpl impl IPage appPage=baseMapper.getAppPage(page,supermarketSpuQueryDTO); return appPage; } + + @Override + public IPage getOnlineShopList(Long categoryId, Page page) { + + IPage list = baseMapper.getOnlineShopList(categoryId,page); + + return list; + } } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ShopCategoryMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ShopCategoryMapper.xml new file mode 100644 index 000000000..9ac6f6bd8 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ShopCategoryMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ShopSkuMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ShopSkuMapper.xml new file mode 100644 index 000000000..8e2dd37cb --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ShopSkuMapper.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE shop_sku + SET stock = stock + #{num}, version = version + 1 + WHERE id = #{skuId} AND stock + #{num} >= 0 AND version = #{version} + + \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ShopSpuMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ShopSpuMapper.xml new file mode 100644 index 000000000..977244bc3 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ShopSpuMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsItemMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsItemMapper.xml index 5a2470bfe..599f9225d 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsItemMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsItemMapper.xml @@ -37,4 +37,20 @@ GROUP BY erp_spu_id + \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpSpuMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpSpuMapper.xml index 8b42c0ea2..affbe3f7d 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpSpuMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpSpuMapper.xml @@ -98,4 +98,38 @@ ORDER BY es.sort DESC,es.id DESC + \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpStockMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpStockMapper.xml index 09f78fdbb..5a41639f5 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpStockMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpStockMapper.xml @@ -40,7 +40,7 @@ stock.current_stock as stock, spu.product_code, spu.product_name, - spu.barcode, + spu.bar_code, spu.spec, spu.unit, spu.package_num, @@ -61,7 +61,7 @@ AND spu.product_code = #{param.productCode} - AND spu.barcode = #{param.barcode} + AND spu.bar_code = #{param.barCode} AND spu.product_name LIKE CONCAT('%', #{param.productName}, '%') diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpUnitMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpUnitMapper.xml index 485516484..a47adbb78 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpUnitMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpUnitMapper.xml @@ -22,12 +22,13 @@ + - + @@ -45,7 +46,6 @@ + \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmSpuMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmSpuMapper.xml index 076a8194f..b9ce1ff03 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmSpuMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmSpuMapper.xml @@ -21,15 +21,21 @@ @@ -53,4 +59,20 @@ + \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/青少年宫.111xls.xls b/pjcloud-supermarket/pjcloud-supermarket-biz/青少年宫.111xls.xls new file mode 100644 index 000000000..7d0384b09 Binary files /dev/null and b/pjcloud-supermarket/pjcloud-supermarket-biz/青少年宫.111xls.xls differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdKsService.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdKsService.java index b1feb03d2..0c65679f4 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdKsService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdKsService.java @@ -20,6 +20,13 @@ public interface RemoterThirdKsService { @PostMapping("/third-ks/sku-submit") R skuSubmit(@RequestBody KsSkuSubmitDto dto); + /** + * 常规SKU修改 + */ + @NoToken + @PostMapping("/third-ks/sku-edit") + R skuEdit(@RequestBody KsSkuEditDto dto, @RequestParam String ks_sku_id); + /** * 集合SKU提交审核(未公开) */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdLbApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdLbApiService.java new file mode 100644 index 000000000..3757b679b --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdLbApiService.java @@ -0,0 +1,19 @@ +package com.bsd.pjcloud.thirdparty.api.feign; + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto; +import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(contextId = "remoterThirdLbApiService", value = ServiceNameConstants.THIRDPARTY_SERVICE) +public interface RemoterThirdLbApiService { + + @NoToken + @PostMapping("/third-lb/h5-login") + R h5Login(@RequestBody LbH5LoginDto dto); + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdKeyTypeEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdKeyTypeEnum.java new file mode 100644 index 000000000..a58fbcbc6 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdKeyTypeEnum.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.thirdparty.constant; + +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayApiBizTypeEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方key类型 + */ +@AllArgsConstructor +@Getter +public enum ThirdKeyTypeEnum { + + LB("10", "宁波银行"), + ; + + private final String type; + private final String description; + + public static ThirdKeyTypeEnum 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-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java new file mode 100644 index 000000000..6ac026d44 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayApiBizTypeEnum.java @@ -0,0 +1,30 @@ +package com.bsd.pjcloud.thirdparty.constant.pay; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方统一支付api类型 + */ +@AllArgsConstructor +@Getter +public enum ThirdPayApiBizTypeEnum { + PAY("10", "支付"), + REFUND("20", "退款"), + WALLET_INFO("30", "钱包详情"), + WATER("40", "流水"), + DETAIL("50", "订单详情"), + ; + + private final String type; + private final String description; + + public static ThirdPayApiBizTypeEnum 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-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPaySoureBizTypeEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPaySoureBizTypeEnum.java new file mode 100644 index 000000000..e01daa92c --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPaySoureBizTypeEnum.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.thirdparty.constant.pay; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方统一支付来源类型 + */ +@AllArgsConstructor +@Getter +public enum ThirdPaySoureBizTypeEnum { + + LB("10", "宁波银行"), + ; + + private final String type; + private final String description; + + public static ThirdPaySoureBizTypeEnum 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-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java new file mode 100644 index 000000000..280bf3279 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayVoStatusEnum.java @@ -0,0 +1,39 @@ +package com.bsd.pjcloud.thirdparty.constant.pay; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 支付状态返回枚举 + */ +@AllArgsConstructor +@Getter +public enum ThirdPayVoStatusEnum { + + SUCCESS(200, "成功"), + SIGN_ERROR(400, "签名验证失败"), + PARAMS_ERROR(500, "参数错误"), + USER_EXIST(501, "用户不存在"), + ORDER_EXIST(502, "订单不存在"), + MCH_EXIST(503, "第三方商户未配置"), + ORDER_REFUND_EXIST(504, "订单未退款"), + BALANCE_NOT_ENOUGH(505, "用户余额不足"), + ORDER_HAVE_PAY(506, "订单已支付"), + ORDER_HAVE_REFUND(507, "订单已退款"), + DETAIL_ITEM_NOT_ONE(508, "查询详情条目不为一"), + REFUND_TOTAL_PRICE(509, "退款总金额大于支付总金额"), + UNKNOWN_ERROR(599, "未知错误,请联系管理员"), + ; + + private final int type; + private final String description; + + public static ThirdPayVoStatusEnum 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-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuEditDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuEditDto.java index 875007a74..fe9d20618 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuEditDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuEditDto.java @@ -2,14 +2,12 @@ package com.bsd.pjcloud.thirdparty.dto.ks; import lombok.Data; +import java.util.List; +import java.util.Map; + @Data public class KsSkuEditDto { - /** - * 该字段为超级收银员平台的sku_id,提交SKU审核后由系统返回,作为资源ID传递,是请求地址中的一部分,不需要提交到form表单 - */ - private String ks_sku_id; - /** * 该字段为使用方系统sku_name,建议使用品牌名+商品名,如统一冰红茶 */ @@ -23,7 +21,7 @@ public class KsSkuEditDto { /** * SKU图片仅在SKU因图片原因审核不通过的情况下支持修改,一旦SKU被审核通过,SKU图片将不再允许修改,如有相关需求,请重新申请SKU */ - private String img_urls; + private List img_urls; /** * 审核结果回调地址 @@ -33,5 +31,5 @@ public class KsSkuEditDto { /** * 该字段为SKU所对应的规格,包含口味、容量、重量,taste表示口味,capacity表示容量,单位:ml,weight表示重量,单位:g */ - private String specs; + private Map specs; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java index 840194c15..600c2f8cc 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitCallbackDto.java @@ -32,7 +32,7 @@ public class KsSkuSubmitCallbackDto { * 2:审核通过 * 3:审核不通过 */ - private Integer code; + private String code; private String desc; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitDto.java index 84ff297fa..4d7f630b9 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ks/KsSkuSubmitDto.java @@ -2,6 +2,9 @@ package com.bsd.pjcloud.thirdparty.dto.ks; import lombok.Data; +import java.util.List; +import java.util.Map; + @Data public class KsSkuSubmitDto { /** @@ -22,7 +25,7 @@ public class KsSkuSubmitDto { /** * 该字段为SKU不同方位视图,所需拍摄的图片数量及角度请参考商品建模文档,参数具体值为图片资源地址,如资源为使用方所属,请确保外部可以访问,请注意图片尺寸及质量,综合质量不佳可能会导致审核不通过。图片尺寸不小于1920*1080,压缩质量不低于70%,长宽比介于16:9同1:1之间。 */ - private String img_urls; + private List img_urls; /** * 审核结果回调地址 @@ -32,6 +35,6 @@ public class KsSkuSubmitDto { /** * 该字段为SKU所对应的规格,包含口味、容量、重量,taste表示口味,capacity表示容量,单位:ml,weight表示重量,单位:g */ - private String specs; + private Map specs; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/lb/LbH5LoginDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/lb/LbH5LoginDto.java new file mode 100644 index 000000000..0aeb82cb9 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/lb/LbH5LoginDto.java @@ -0,0 +1,15 @@ +package com.bsd.pjcloud.thirdparty.dto.lb; + +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; + +@Data +public class LbH5LoginDto { + + /** + * 用户手机号 + */ + @NotEmpty(message = "手机号不能为空") + private String phone; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDetailDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDetailDto.java new file mode 100644 index 000000000..d0c7264cc --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDetailDto.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import lombok.Data; + +@Data +public class PayDetailDto { + + /** + * 第三方订单id(thirdOrderId、thirdRefundId二选一) + */ + private String thirdOrderId; + + /** + * 第三方退款(thirdOrderId、thirdRefundId二选一,有退款操作才能查询到数据,否则返回null) + */ + private String thirdRefundId; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java new file mode 100644 index 000000000..b5ad858f1 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayDto.java @@ -0,0 +1,60 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +@Data +public class PayDto { + + /** + * 用户id + */ + @NotNull(message = "用户id不能为空") + private Long userId; + + /** + * 第三方唯一流水id + */ + @NotEmpty(message = "第三方唯一流水id不能为空") + private String thirdOrderId; + + /** + * 扣款金额(分) + */ + @NotNull(message = "扣款金额不能为空") + private Integer price; + + /** + * 商品列表 + */ + private List products; + + + @Data + public static class Product { + + /** + * 商品名 + */ + private String name; + + /** + * 商品图片(网络可访问) + */ + private String pic; + + /** + * 商品价格(分) + */ + private Integer price; + + /** + * 商品数量 + */ + private Integer count; + + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayGetWalletInfoDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayGetWalletInfoDto.java new file mode 100644 index 000000000..445acbe7f --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/PayGetWalletInfoDto.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import lombok.Data; + +@Data +public class PayGetWalletInfoDto { + + /** + * sm4加密后的手机号(优先级userId>signPhone) + */ + private String signPhone; + + /** + * 用户id(优先级userId>signPhone) + */ + private Long userId; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java new file mode 100644 index 000000000..c4e9894d1 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/RefundDto.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class RefundDto { + + /** + * 平台唯一订单号 + */ + @NotEmpty(message = "平台唯一订单号不能为空") + private String platformOrderId; + + /** + * 第三方退款流水号 + */ + @NotEmpty(message = "第三方退款流水号不能为空") + private String thirdRefundId; + + /** + * 退款金额(单位分) + */ + @NotNull(message = "退款金额不能为空") + private Integer price; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdPayLogDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdPayLogDto.java new file mode 100644 index 000000000..ea1982343 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdPayLogDto.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import lombok.Data; + +import java.time.LocalDate; + +@Data +public class ThirdPayLogDto extends ThirdPayLogEntity { + + private LocalDate[] createTimeList; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/WaterDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/WaterDto.java new file mode 100644 index 000000000..b813e5652 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/WaterDto.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import lombok.Data; + +@Data +public class WaterDto { + + /** + * 当前页号(默认1) + */ + private Long current; + + /** + * 当前页数据条数(默认100,最大200) + */ + private Long size; + + /** + * 订单状态 + * 1创建订单(未支付) + * 5已经支付 + * 10退款 + */ + private String orderStatus; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdKeyManageEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdKeyManageEntity.java new file mode 100644 index 000000000..8f4c87890 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdKeyManageEntity.java @@ -0,0 +1,115 @@ +package com.bsd.pjcloud.thirdparty.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; + +/** + * 第三方密钥管理 + * + * @author dzc + * @date 2025-04-30 15:18:13 + */ +@Data +@TenantTable +@TableName("third_key_manage") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "第三方密钥管理") +public class ThirdKeyManageEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="主键") + private Long id; + + /** + * 第三方名字 + */ + @Schema(description="第三方名字") + private String name; + + /** + * 第三方类型id(常量) + */ + @Schema(description="第三方类型id(常量)") + private String bizType; + + /** + * appKey + */ + @Schema(description="appKey") + private String appKey; + + /** + * appSecret + */ + @Schema(description="appSecret") + private String appSecret; + + /** + * 字段加密key + */ + @Schema(description="字段加密key") + private String fieldKey; + + /** + * 状态 + */ + @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; + + /** + * tenantId + */ + @Schema(description="tenantId") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/api/ThirdPayLogEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/api/ThirdPayLogEntity.java new file mode 100644 index 000000000..1074554a0 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/api/ThirdPayLogEntity.java @@ -0,0 +1,127 @@ +package com.bsd.pjcloud.thirdparty.entity.api; + +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; + +/** + * 第三方支付日志 + */ +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +@TenantTable +@TableName("third_pay_log") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "第三方支付日志") +public class ThirdPayLogEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 支付发起方类型id + */ + @Schema(description = "支付发起方类型id") + private String paySourceType; + + /** + * 支付类型 + */ + @Schema(description = "支付类型") + private String bizType; + + /** + * 支付类型id + */ + @Schema(description = "支付类型id") + private String bizId; + + /** + * api-url + */ + @Schema(description = "api-url") + private String apiUrl; + + /** + * header + */ + @Schema(description = "header") + private String header; + + /** + * res + */ + @Schema(description = "res") + private String res; + + /** + * req + */ + @Schema(description = "req") + private String req; + + /** + * 调用错误 + */ + @Schema(description = "调用错误") + private String error; + + /** + * 耗时(毫秒) + */ + @Schema(description = "耗时(毫秒)") + private String timeConsuming; + + /** + * 创建人 + */ + @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; + + /** + * tenantId + */ + @Schema(description = "tenantId") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuDeleteVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuDeleteVo.java index 9547e56f9..d49569d9e 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuDeleteVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuDeleteVo.java @@ -3,7 +3,7 @@ package com.bsd.pjcloud.thirdparty.vo.ks; import lombok.Data; @Data -public class KsSkuDeleteVo { +public class KsSkuDeleteVo extends KsBaseInnerVo { /** * 该sku_id为使用方sku_id diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuEditVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuEditVo.java index 131ea763f..54c2263bc 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuEditVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuEditVo.java @@ -3,7 +3,7 @@ package com.bsd.pjcloud.thirdparty.vo.ks; import lombok.Data; @Data -public class KsSkuEditVo { +public class KsSkuEditVo extends KsBaseInnerVo { /** * 该sku_id为使用方sku_id diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuResultVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuResultVo.java index 6f417657f..1ae1db3cb 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuResultVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/ks/KsSkuResultVo.java @@ -3,24 +3,27 @@ package com.bsd.pjcloud.thirdparty.vo.ks; import lombok.Data; @Data -public class KsSkuResultVo { +public class KsSkuResultVo extends KsBaseInnerVo { /** * 该字段返回结果为字典值,不同code代表不同结果 - *

* 0:待审核 - *

* 1:审核中 - *

* 2:审核通过 - *

* 3:审核不通过 */ - private String result; + private Result result; /** * 审核不通过时该字段才有值 */ private String comments; + @Data + public static class Result { + private String code; + private String desc; + } + + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/lb/LbH5LoginVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/lb/LbH5LoginVo.java new file mode 100644 index 000000000..3a263846e --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/lb/LbH5LoginVo.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.thirdparty.vo.lb; + +import lombok.Data; + +@Data +public class LbH5LoginVo { + + private Integer code; + + private String msg; + + private String data; + + public boolean isSuccess() { + return code == 200; + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayBaseVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayBaseVo.java new file mode 100644 index 000000000..22ba74d29 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayBaseVo.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayVoStatusEnum; +import lombok.Data; + +@Data +public class PayBaseVo { + + private Integer code; + + private String message; + + private T data; + + public void set(ThirdPayVoStatusEnum type) { + code = type.getType(); + message = type.getDescription(); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java new file mode 100644 index 000000000..07e8d1bd6 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayGetWalletInfoVo.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + +@Data +public class PayGetWalletInfoVo { + + /** + * sm4加密后的手机号 + */ + private String signPhone; + + /** + * 用户真实姓名 + */ + private String name; + + /** + * 用户余额(分) + */ + private int balance; + + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayRefundVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayRefundVo.java new file mode 100644 index 000000000..82dbc5a3f --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayRefundVo.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + +@Data +public class PayRefundVo { + + /** + * 平台退款id + */ + private String platformRefundId; + + /** + * 第三方退款id + */ + private String thirdRefundId; + + /** + * 退款金额(分) + */ + private Integer refundPrice; + + /** + * 退款时间(yyyy-MM-dd HH:mm:ss格式) + */ + private String refundTime; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java new file mode 100644 index 000000000..a33f7954b --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayVo.java @@ -0,0 +1,25 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class PayVo { + + /** + * 平台唯一订单号 + */ + private String platformOrderId; + + /** + * 第三方唯一订单号 + */ + private String thirdOrderId; + + /** + * 平台支付时间(yyyy-MM-dd HH:mm:ss格式) + */ + private String payTime; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java new file mode 100644 index 000000000..b79fb9264 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWalletInfoVo.java @@ -0,0 +1,28 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + +@Data +public class PayWalletInfoVo { + + /** + * 用户id + */ + private Long userId; + + /** + * sm4加密后的手机号 + */ + private String signPhone; + + /** + * 用户真实姓名 + */ + private String name; + + /** + * 用户余额(分) + */ + private Integer balance; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWaterVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWaterVo.java new file mode 100644 index 000000000..70736683a --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/PayWaterVo.java @@ -0,0 +1,63 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + +import java.util.List; + +@Data +public class PayWaterVo { + + /** + * 用户id + */ + private Long userId; + + /** + * 用户真实姓名 + */ + private String name; + + /** + * sm4加密后的手机号 + */ + private String signPhone; + + /** + * 平台订单id + */ + private String platformOrderId; + + /** + * 第三方订单id + */ + private String thirdOrderId; + + /** + * 订单状态 + * 1创建订单(未支付) + * 5已经支付 + * 10退款 + */ + private String orderStatus; + + /** + * 订单价格(分) + */ + private Integer orderPrice; + + /** + * 支付时间(yyyy-MM-dd HH:mm:ss格式) + */ + private String payTime; + + /** + * 总退款价格(分) + */ + private Integer refundTotalPrice; + + /** + * 退款列表 + */ + private List refundList; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java new file mode 100644 index 000000000..26055eb09 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/RefundVo.java @@ -0,0 +1,39 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import lombok.Data; + + +@Data +public class RefundVo { + + /** + * 平台唯一订单号 + */ + private String platformOrderId; + + /** + * 平台唯一退款单号 + */ + private String platformRefundId; + + /** + * 第三方唯一订单号 + */ + private String thirdOrderId; + + /** + * 第三方唯一退款单号 + */ + private String thirdRefundId; + + /** + * 退款金额(单位分) + */ + private Integer price; + + /** + * 退款时间(yyyy-MM-dd HH:mm:ss格式) + */ + private String refundTime; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index f4b91d0ff..09e073709 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -1,5 +1,6 @@ com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdKsService com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdDoorApiService +com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdLbApiService com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdPartyAuthService com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdZyService com.bsd.pjcloud.thirdparty.api.feign.RemoterVisitorService diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-03/debug.2025-03-11.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-03/debug.2025-03-11.0.log.gz new file mode 100644 index 000000000..e9edc4390 Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-03/debug.2025-03-11.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml index 86b71a350..385884a42 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml @@ -121,6 +121,12 @@ jjwt 0.9.1 + + + org.bouncycastle + bcprov-jdk15to18 + 1.66 + javax.xml.bind jaxb-api @@ -131,6 +137,12 @@ com.bsd pjcloud-common-idempotent + + + com.github.wechatpay-apiv3 + wechatpay-java + 0.2.17 + com.bsd pjcloud-hardware-api @@ -145,6 +157,22 @@ true + + + src/main/resources + true + + **/*.wps + + + + src/main/resources + false + + **/*.wps + + + org.springframework.boot diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/LbConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/LbConfig.java new file mode 100644 index 000000000..7e445b4fc --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/LbConfig.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.thirdparty.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "lb") +@Data +public class LbConfig { + + /** + * 请求基础路径 + */ + private String baseUrl; + + private String appId; + + private String appSecret; + + /** + * 企业编号 + */ + private String companyNumber; + + /** + * 国密sm4密钥 + */ + private String sm4Key; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdKeyManageController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdKeyManageController.java new file mode 100644 index 000000000..c12a39071 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdKeyManageController.java @@ -0,0 +1,80 @@ +package com.bsd.pjcloud.thirdparty.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.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; +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("/third-key-manage") +@Tag(description = "third-key-manage", name = "第三方密钥管理管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdKeyManageController { + + private final ThirdKeyManageService thirdKeyManageService; + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_view')") + public R getThirdKeyManagePage(@ParameterObject Page page, @ParameterObject ThirdKeyManageEntity dto) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .like(ObjectUtil.isNotEmpty(dto.getName()), ThirdKeyManageEntity::getName, dto.getName()) + .orderByDesc(ThirdKeyManageEntity::getCreateTime) + .orderByDesc(ThirdKeyManageEntity::getId); + return R.ok(thirdKeyManageService.page(page, wrapper)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(thirdKeyManageService.getById(id)); + } + + @Operation(summary = "新增第三方密钥管理", description = "新增第三方密钥管理") + @SysLog("新增第三方密钥管理") + @PostMapping + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_add')") + public R save(@RequestBody ThirdKeyManageEntity dto) { + return R.ok(thirdKeyManageService.create(dto)); + } + + @Operation(summary = "修改第三方密钥管理", description = "修改第三方密钥管理") + @SysLog("修改第三方密钥管理") + @PutMapping + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_edit')") + public R updateById(@RequestBody ThirdKeyManageEntity dto) { + return R.ok(thirdKeyManageService.edit(dto)); + } + + @Operation(summary = "通过id删除第三方密钥管理", description = "通过id删除第三方密钥管理") + @SysLog("通过id删除第三方密钥管理") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('third_thirdKeyManage_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(thirdKeyManageService.removeBatchByIds(CollUtil.toList(ids))); + } + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java index 0b04d7fe4..f4af37895 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java @@ -218,12 +218,12 @@ public class ThirdPartyOAth2Cotroller { if(!CollectionUtils.isEmpty(sysUserList)){ SysUser sysUser = sysUserList.get(0); //判断当前用户设备是否信任 -// String md5 = DeviceFingerprintUtil.generate(httpServletRequest); -// R userTrustedDeviceR = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(sysUser.getPhone(), md5); -// UserTrustedDeviceEntity userTrustedDevice = userTrustedDeviceR.getData(); -// if (userTrustedDevice == null || userTrustedDevice.getExpireTime().isBefore(LocalDateTime.now())){ -// return R.failed(-1,"请先信任设备"); -// } + String md5 = DeviceFingerprintUtil.generate(httpServletRequest); + R userTrustedDeviceR = remoteUserTrustedDeviceService.getUserTrustedDeviceByIdAndMD5(sysUser.getPhone(), md5); + UserTrustedDeviceEntity userTrustedDevice = userTrustedDeviceR.getData(); + if (userTrustedDevice == null || userTrustedDevice.getExpireTime().isBefore(LocalDateTime.now())){ + return R.failed(-1,"请先信任设备"); + } //登录成功生成token UserTokenDTO userTokenDTO = new UserTokenDTO(); userTokenDTO.setSysUser(sysUser); @@ -285,7 +285,7 @@ public class ThirdPartyOAth2Cotroller { } // 验证成功后移除验证码(可选) -// redisTemplate.delete(redisKey); + redisTemplate.delete(redisKey); // 2. 记录信任设备 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java index 031156c6f..c34239c37 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ks/ThirdKsApiController.java @@ -49,10 +49,10 @@ public class ThirdKsApiController { } @Inner - @Operation(summary = "SKU审核结果主动获取") + @Operation(summary = "常规SKU修改") @PostMapping("/sku-edit") - public R skuEdit(@RequestBody KsSkuEditDto dto) { - return R.ok(thirdKsApiService.skuEdit(dto)); + public R skuEdit(@RequestBody KsSkuEditDto dto, @RequestParam String ks_sku_id) { + return R.ok(thirdKsApiService.skuEdit(dto, ks_sku_id)); } @Inner diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/lb/ThirdLbApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/lb/ThirdLbApiController.java new file mode 100644 index 000000000..b4141f48b --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/lb/ThirdLbApiController.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.thirdparty.controller.lb; + +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto; +import com.bsd.pjcloud.thirdparty.service.ThirdLbApiService; +import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/third-lb") +@Tag(description = "third-lb", name = "宁波银行对接") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdLbApiController { + + private final ThirdLbApiService thirdLbApiService; + + @Inner() + @Operation(summary = "美好生活登录", description = "美好生活登录") + @PostMapping("/h5-login") + public R h5Login(@Valid @RequestBody LbH5LoginDto dto) { + return R.ok(thirdLbApiService.h5Login(dto)); + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java new file mode 100644 index 000000000..761a9af82 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayApiController.java @@ -0,0 +1,71 @@ +package com.bsd.pjcloud.thirdparty.controller.pay; + + +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.thirdparty.service.ThirdPayApiService; +import com.bsd.pjcloud.thirdparty.vo.pay.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 第三方支付日志 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/third-pay-api") +@Tag(description = "third-pay-api", name = "地上方支付") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdPayApiController { + + private final ThirdPayApiService thirdPayApiService; + + @Inner(value = false) + @Operation(summary = "通过手机号查询用户钱包信息", description = "通过手机号查询用户钱包信息") + @PostMapping("/user-wallet") + public PayBaseVo getWalletInfo(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return thirdPayApiService.getWalletInfo(body, headers); + } + + @Inner(value = false) + @Operation(summary = "通过userId扣款", description = "通过userId扣款") + @PostMapping("/wallet-pay") + public PayBaseVo walletPay(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return thirdPayApiService.walletPay(body, headers); + } + + @Inner(value = false) + @Operation(summary = "退款", description = "退款") + @PostMapping("/wallet-refund") + public PayBaseVo walletRefund(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return thirdPayApiService.walletRefund(body, headers); + } + + @Inner(value = false) + @Operation(summary = "流水查询", description = "流水查询") + @PostMapping("/water") + public PayBaseVo> water(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return thirdPayApiService.water(body, headers); + } + + @Inner(value = false) + @Operation(summary = "订单详情", description = "订单详情") + @PostMapping("/detail") + public PayBaseVo detail(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return thirdPayApiService.detail(body, headers); + } + + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayLogController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayLogController.java new file mode 100644 index 000000000..74c38aa30 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayLogController.java @@ -0,0 +1,95 @@ +package com.bsd.pjcloud.thirdparty.controller.pay; + +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.log.annotation.SysLog; +import com.bsd.pjcloud.thirdparty.dto.pay.ThirdPayLogDto; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; +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("/third-pay-log") +@Tag(description = "third-pay-log", name = "第三方支付日志管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdPayLogController { + + private final ThirdPayLogService thirdPayLogService; + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_view')") + public R getThirdPayLogPage(@ParameterObject Page page, @ParameterObject ThirdPayLogDto dto) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(dto.getPaySourceType()), ThirdPayLogEntity::getPaySourceType, dto.getPaySourceType()) + .eq(ObjectUtil.isNotEmpty(dto.getBizType()), ThirdPayLogEntity::getBizType, dto.getBizType()) + .between( + ObjectUtil.isNotEmpty(dto.getCreateTimeList()), + ThirdPayLogEntity::getCreateTime, + ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[0] : null, + ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[1] : null + ) + .orderByDesc(ThirdPayLogEntity::getCreateTime) + .orderByDesc(ThirdPayLogEntity::getId); + return R.ok(thirdPayLogService.page(page, wrapper)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(thirdPayLogService.getById(id)); + } + + @Operation(summary = "新增第三方支付日志", description = "新增第三方支付日志") + @SysLog("新增第三方支付日志") + @PostMapping + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_add')") + public R save(@RequestBody ThirdPayLogEntity thirdPayLog) { + return R.ok(thirdPayLogService.save(thirdPayLog)); + } + + @Operation(summary = "修改第三方支付日志", description = "修改第三方支付日志") + @SysLog("修改第三方支付日志") + @PutMapping + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_edit')") + public R updateById(@RequestBody ThirdPayLogEntity thirdPayLog) { + return R.ok(thirdPayLogService.updateById(thirdPayLog)); + } + + @Operation(summary = "通过id删除第三方支付日志", description = "通过id删除第三方支付日志") + @SysLog("通过id删除第三方支付日志") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(thirdPayLogService.removeBatchByIds(CollUtil.toList(ids))); + } + + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('third_thirdPayLog_export')") + public List export(ThirdPayLogEntity thirdPayLog, Long[] ids) { + return thirdPayLogService.list(Wrappers.lambdaQuery(thirdPayLog).in(ArrayUtil.isNotEmpty(ids), ThirdPayLogEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdKeyManageMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdKeyManageMapper.java new file mode 100644 index 000000000..7727499e3 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdKeyManageMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.thirdparty.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ThirdKeyManageMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdPayLogMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdPayLogMapper.java new file mode 100644 index 000000000..24e85e41d --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdPayLogMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.thirdparty.mapper.pay; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ThirdPayLogMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java new file mode 100644 index 000000000..25b9ea4df --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKeyManageService.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.thirdparty.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.thirdparty.constant.ThirdKeyTypeEnum; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; + +import java.util.Map; + +public interface ThirdKeyManageService extends IService { + + /** + * 新增 + */ + Long create(ThirdKeyManageEntity dto); + + /** + * 修改 + */ + Long edit(ThirdKeyManageEntity dto); + + /** + * 获取第三方key配置 + */ + ThirdKeyManageEntity get(ThirdKeyTypeEnum type); + + /** + * 验签并且返回配置 + */ + ThirdKeyManageEntity checkSignAndReturnConfig(String json, Map headers); + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java index f118b2f62..28bd065f4 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdKsApiService.java @@ -26,9 +26,9 @@ public interface ThirdKsApiService { KsSkuResultVo skuResult(KsSkuResultDto dto); /** - * SKU审核结果主动获取 + * 常规SKU修改 */ - KsSkuEditVo skuEdit(KsSkuEditDto dto); + KsSkuEditVo skuEdit(KsSkuEditDto dto, String ks_sku_id); /** * SKU删除 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdLbApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdLbApiService.java new file mode 100644 index 000000000..0543042bb --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdLbApiService.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.thirdparty.service; + +import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto; +import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo; + +/** + * @author liusiyang_dxm + * @since 2025/4/29 + */ +public interface ThirdLbApiService { + + /** + * 美好生活登录 + */ + LbH5LoginVo h5Login(LbH5LoginDto dto); +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java new file mode 100644 index 000000000..17b4b8b32 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayApiService.java @@ -0,0 +1,38 @@ +package com.bsd.pjcloud.thirdparty.service; + + +import com.bsd.pjcloud.thirdparty.dto.pay.PayDto; +import com.bsd.pjcloud.thirdparty.dto.pay.PayGetWalletInfoDto; +import com.bsd.pjcloud.thirdparty.dto.pay.RefundDto; +import com.bsd.pjcloud.thirdparty.vo.pay.*; + +import java.util.List; +import java.util.Map; + +public interface ThirdPayApiService { + + /** + * 通过userId扣款 + */ + PayBaseVo walletPay(String json, Map headers); + + /** + * 退款 + */ + PayBaseVo walletRefund(String json, Map headers); + + /** + * 根据加密的手机号查询用户钱包信息 + */ + PayBaseVo getWalletInfo(String json, Map headers); + + /** + * 流水查询 + */ + PayBaseVo> water(String json, Map headers); + + /** + * 订单详情 + */ + PayBaseVo detail(String json, Map headers); +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayLogService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayLogService.java new file mode 100644 index 000000000..80ea9286e --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayLogService.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.thirdparty.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; + +public interface ThirdPayLogService extends IService { + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java new file mode 100644 index 000000000..d18ebc973 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdKeyManageServiceImpl.java @@ -0,0 +1,134 @@ +package com.bsd.pjcloud.thirdparty.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.thirdparty.constant.ThirdKeyTypeEnum; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import com.bsd.pjcloud.thirdparty.mapper.ThirdKeyManageMapper; +import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * 第三方密钥管理 + */ +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdKeyManageServiceImpl extends ServiceImpl implements ThirdKeyManageService { + + private static final String TAG = "第三方密钥管理"; + + /** + * 新增 + */ + @Override + public Long create(ThirdKeyManageEntity dto) { + if (existBizType(dto)) throw new RuntimeException("第三方key类型不能重复"); + if (existName(dto)) throw new RuntimeException("第三方key名称不能重复"); + baseMapper.insert(dto); + return dto.getId(); + } + + /** + * 修改 + */ + @Override + public Long edit(ThirdKeyManageEntity dto) { + if (existBizType(dto)) throw new RuntimeException("第三方key类型不能重复"); + if (existName(dto)) throw new RuntimeException("第三方key名称不能重复"); + baseMapper.updateById(dto); + return dto.getId(); + } + + /** + * 获取第三方key配置 + */ + @Override + public ThirdKeyManageEntity get(ThirdKeyTypeEnum type) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(ThirdKeyManageEntity::getBizType, type.getType())); + } + + /** + * 验签并且返回配置 + */ + @Override + public ThirdKeyManageEntity checkSignAndReturnConfig(String json, Map headers) { + try { + Map transitionHeader = new LinkedHashMap<>(); + for (Map.Entry entry : headers.entrySet()) { + transitionHeader.put(entry.getKey().toUpperCase(), entry.getValue()); + } + // 验签 + String appKey = transitionHeader.get("APP-KEY"); + String bizType = transitionHeader.get("BIZ-TYPE"); + String timestamp = transitionHeader.get("TIMESTAMP"); + String sign = transitionHeader.get("SIGN"); + if (!ObjectUtil.isAllNotEmpty(appKey, bizType, timestamp, sign)) { + return null; + } + // 判断bizType + ThirdKeyTypeEnum keyType = ThirdKeyTypeEnum.valueOfByType(bizType); + if (ObjectUtil.isEmpty(keyType)) { + return null; + } + // 查询配置 + ThirdKeyManageEntity keyManage = get(keyType); + if (ObjectUtil.isEmpty(keyManage)) { + return null; + } + if (ObjectUtil.notEqual(appKey, keyManage.getAppKey())) { + return null; + } + // 计算签名 + String signStr = String.format("%s%s%s%s%s", keyManage.getAppKey(), keyManage.getAppSecret(), keyManage.getBizType(), timestamp, json); + String successSignMd5 = DigestUtils.md5Hex(signStr); + if (ObjectUtil.notEqual(successSignMd5.toLowerCase(), sign.toLowerCase())) { + return null; + } + return keyManage; + } catch (Exception e) { + log.error("|{}|checkSign意外的错误,加密参数|{}|", TAG, JSONUtil.toJsonStr(json), e); + return null; + } + } + + /** + * 第三方类型不能重复 + */ + private boolean existBizType(ThirdKeyManageEntity dto) { + Long count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(dto.getBizType()), ThirdKeyManageEntity::getBizType, dto.getBizType()) + .ne(ObjectUtil.isNotEmpty(dto.getId()), ThirdKeyManageEntity::getId, dto.getId()) + ); + if (ObjectUtil.isNotEmpty(dto.getId())) { + return count >= 1; + } + return count > 0; + } + + /** + * 名字不能重复 + */ + private boolean existName(ThirdKeyManageEntity dto) { + Long count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(dto.getName()), ThirdKeyManageEntity::getName, dto.getName()) + .eq(ObjectUtil.isNotEmpty(dto.getBizType()), ThirdKeyManageEntity::getBizType, dto.getBizType()) + .ne(ObjectUtil.isNotEmpty(dto.getId()), ThirdKeyManageEntity::getId, dto.getId()) + ); + if (ObjectUtil.isNotEmpty(dto.getId())) { + return count >= 1; + } + return count > 0; + } + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java index 4490dde4f..0f62732fb 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ks/ThirdKsApiServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.bsd.pjcloud.hard.api.feign.RemoteHardDoorService; +import com.bsd.pjcloud.hard.api.feign.RemoteHardSpuController; import com.bsd.pjcloud.thirdparty.config.KsDiscernConfig; import com.bsd.pjcloud.thirdparty.dto.ks.*; import com.bsd.pjcloud.thirdparty.entity.door.ThirdDoorLogEntity; @@ -14,7 +15,6 @@ import com.bsd.pjcloud.thirdparty.utils.ks.tool.KsRetailSignUtils; import com.bsd.pjcloud.thirdparty.vo.ks.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpPost; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -35,19 +35,37 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { private final ThirdDoorLogService doorLogService; private final RemoteHardDoorService remoteHardDoorService; + private final RemoteHardSpuController remoteHardSpuController; /** * 常规SKU提交审核 */ @Override public KsSkuSubmitVo skuSubmit(KsSkuSubmitDto dto) { + dto.setNotify_url(ksDiscernConfig.getCallbackBaseUrl() + ksDiscernConfig.getCallbackSkuUrl()); long startTime = System.currentTimeMillis(); KsBaseVo ksBaseVo = new KsBaseVo(); - KsApi.Api api = KsApi.SKU_SUBMIT.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto)); + KsApi.Api api = KsApi.SKU_SUBMIT.setBaseUrl(ksDiscernConfig.getBaseUrl()) + .setParams(BeanUtil.beanToMap(dto)) + .setAccessKey(ksDiscernConfig.getAccessKey()) + .setSecretKey(ksDiscernConfig.getSecretKey()) + .setHost(ksDiscernConfig.getHost()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(JSONUtil.toJsonStr(dto)); try { - + String body = JSONUtil.toJsonStr(dto); + api.setBody(body); + String res = api.getHttpRequest().execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + logEntity.setRes(res); + ksBaseVo = JSONUtil.toBean(res, KsBaseVo.class); + if (!ksBaseVo.isSuccess()) { + String errorLog = String.format("请求错误res|%s|url|%s|body|%s|", res, api, body); + log.error(errorLog); + KsSkuSubmitVo errorVo = new KsSkuSubmitVo(); + errorVo.setMessage(ksBaseVo.getMsg()); + return errorVo; + } } catch (Exception e) { String error = String.format("|%s||skuSubmit|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -89,11 +107,25 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { public KsSkuResultVo skuResult(KsSkuResultDto dto) { long startTime = System.currentTimeMillis(); KsBaseVo ksBaseVo = new KsBaseVo(); - KsApi.Api api = KsApi.SKU_RESULT.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto)); + KsApi.Api api = KsApi.SKU_RESULT.setBaseUrl(ksDiscernConfig.getBaseUrl()) + .setpath(dto.getKs_sku_id()) + .setAccessKey(ksDiscernConfig.getAccessKey()) + .setSecretKey(ksDiscernConfig.getSecretKey()) + .setHost(ksDiscernConfig.getHost()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(JSONUtil.toJsonStr(dto)); try { - + String res = api.getHttpRequest().execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + logEntity.setRes(res); + ksBaseVo = JSONUtil.toBean(res, KsBaseVo.class); + if (!ksBaseVo.isSuccess()) { + String errorLog = String.format("请求错误res|%s|url|%s|", res, api); + log.error(errorLog); + KsSkuResultVo errorVo = new KsSkuResultVo(); + errorVo.setMessage(ksBaseVo.getMsg()); + return errorVo; + } } catch (Exception e) { String error = String.format("|%s||skuResult|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -106,17 +138,35 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { } /** - * SKU审核结果主动获取 + * 常规SKU修改 */ @Override - public KsSkuEditVo skuEdit(KsSkuEditDto dto) { + public KsSkuEditVo skuEdit(KsSkuEditDto dto, String ks_sku_id) { + dto.setNotify_url(ksDiscernConfig.getCallbackBaseUrl() + ksDiscernConfig.getCallbackSkuUrl()); + String body = JSONUtil.toJsonStr(dto); long startTime = System.currentTimeMillis(); KsBaseVo ksBaseVo = new KsBaseVo(); - KsApi.Api api = KsApi.SKU_EDIT.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto)); + KsApi.Api api = KsApi.SKU_EDIT.setBaseUrl(ksDiscernConfig.getBaseUrl()) + .setpath(ks_sku_id) + .setBody(body) + .setAccessKey(ksDiscernConfig.getAccessKey()) + .setSecretKey(ksDiscernConfig.getSecretKey()) + .setHost(ksDiscernConfig.getHost()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(JSONUtil.toJsonStr(dto)); try { - + api.setBody(body); + String res = api.getHttpRequest().execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + logEntity.setRes(res); + ksBaseVo = JSONUtil.toBean(res, KsBaseVo.class); + if (!ksBaseVo.isSuccess()) { + String errorLog = String.format("请求错误res|%s|url|%s|", res, api); + log.error(errorLog); + KsSkuEditVo errorVo = new KsSkuEditVo(); + errorVo.setMessage(ksBaseVo.getMsg()); + return errorVo; + } } catch (Exception e) { String error = String.format("|%s||skuEdit|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -135,11 +185,25 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { public KsSkuDeleteVo skuDelete(KsSkuDeleteDto dto) { long startTime = System.currentTimeMillis(); KsBaseVo ksBaseVo = new KsBaseVo(); - KsApi.Api api = KsApi.SKU_DELETE.setBaseUrl(ksDiscernConfig.getBaseUrl()).setParams(BeanUtil.beanToMap(dto)); + KsApi.Api api = KsApi.SKU_DELETE.setBaseUrl(ksDiscernConfig.getBaseUrl()) + .setpath(dto.getKs_sku_id()) + .setAccessKey(ksDiscernConfig.getAccessKey()) + .setSecretKey(ksDiscernConfig.getSecretKey()) + .setHost(ksDiscernConfig.getHost()); ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(JSONUtil.toJsonStr(dto)); try { - + String res = api.getHttpRequest().execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + logEntity.setRes(res); + ksBaseVo = JSONUtil.toBean(res, KsBaseVo.class); + if (!ksBaseVo.isSuccess()) { + String errorLog = String.format("请求错误res|%s|url|%s|", res, api); + log.error(errorLog); + KsSkuDeleteVo errorVo = new KsSkuDeleteVo(); + errorVo.setMessage(ksBaseVo.getMsg()); + return errorVo; + } } catch (Exception e) { String error = String.format("|%s||skuDelete|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -318,7 +382,7 @@ public class ThirdKsApiServiceImpl implements ThirdKsApiService { ThirdDoorLogEntity logEntity = api.getInitLogEntity(); logEntity.setReq(json); try { - + remoteHardSpuController.skuCheckCallback(dto); } catch (Exception e) { String error = String.format("|%s||callbackSKu|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/lb/ThirdLbApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/lb/ThirdLbApiServiceImpl.java new file mode 100644 index 000000000..6f2697d37 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/lb/ThirdLbApiServiceImpl.java @@ -0,0 +1,70 @@ +package com.bsd.pjcloud.thirdparty.service.impl.lb; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.thirdparty.config.LbConfig; +import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto; +import com.bsd.pjcloud.thirdparty.service.ThirdLbApiService; +import com.bsd.pjcloud.thirdparty.utils.door.api.DoorApi; +import com.bsd.pjcloud.thirdparty.utils.lb.api.LbApi; +import com.bsd.pjcloud.thirdparty.utils.lb.tool.LbRetailSignUtils; +import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + + +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdLbApiServiceImpl implements ThirdLbApiService { + + private static final String TAG = "宁波银行api"; + + private final LbConfig lbConfig; + + @Override + public LbH5LoginVo h5Login(LbH5LoginDto dto) { + LbH5LoginVo ksBaseVo = new LbH5LoginVo(); + String phone = dto.getPhone(); + String signPhone = LbRetailSignUtils.sm4Encrypt(phone, lbConfig.getSm4Key()); + long timeMillis = System.currentTimeMillis() / 1000; + String signature = apiCountersign(dto.getPhone(), timeMillis); + Map queryMap = new HashMap<>(); + queryMap.put("appKey", lbConfig.getAppId()); + queryMap.put("phone", signPhone); + queryMap.put("timestamp", String.valueOf(timeMillis)); + queryMap.put("signature", signature); + // 发送请求 + DoorApi.Api h5Login = LbApi.H5_LOGIN; + try { + String res = HttpRequest.post(lbConfig.getBaseUrl() + h5Login.getUrl()).contentType(h5Login.getContentType()).body(JSONUtil.toJsonStr(queryMap)).execute().body(); + if (ObjectUtil.isEmpty(res)) throw new RuntimeException("response响应为空"); + ksBaseVo = JSONUtil.toBean(res, LbH5LoginVo.class); + } catch (Exception e) { + String error = String.format("|%s||h5Login|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); + log.error(error); + } + return ksBaseVo; + } + + + // 加签 + public String apiCountersign(String phone, Long timestamp) { + // String str = "companyNumber=%s&appId=%s&phone=%s×tamp=%s&secret=%s"; + // str = String.format(str, lbConfig.getCompanyNumber(), lbConfig.getAppId(), phone, timestamp, lbConfig.getAppSecret()); + String str = "phone=%s&appKey=%s×tamp=%s&secret=%s"; + str = String.format(str, phone, lbConfig.getAppId(), timestamp, lbConfig.getAppSecret()); + // 使用 SHA-256 进行哈希计算,并返回十六进制字符串。 + String sha256 = DigestUtils.sha256Hex(str); + return sha256; + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java new file mode 100644 index 000000000..ad28adc01 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayApiServiceImpl.java @@ -0,0 +1,344 @@ +package com.bsd.pjcloud.thirdparty.service.impl.pay; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.hard.api.feign.RemoteHardOrderService; +import com.bsd.pjcloud.hard.api.feign.RemoteHardThirdPayService; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayApiBizTypeEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPaySoureBizTypeEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayVoStatusEnum; +import com.bsd.pjcloud.thirdparty.dto.pay.*; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; +import com.bsd.pjcloud.thirdparty.service.ThirdPayApiService; +import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; +import com.bsd.pjcloud.thirdparty.utils.lb.tool.LbRetailSignUtils; +import com.bsd.pjcloud.thirdparty.vo.pay.*; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 第三方支付 + */ +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdPayApiServiceImpl implements ThirdPayApiService { + + private final String TAG = "第三方支付"; + + private final ThirdKeyManageService keyManageService; + private final ThirdPayLogService payLogService; + + private final RemoteUserService userService; + private final RemoteWalletService walletService; + private final RemoteHardOrderService hardOrderService; + private final RemoteHardThirdPayService hardThirdPayService; + + /** + * 通过userId扣款 + */ + @Override + public PayBaseVo walletPay(String json, Map headers) { + long startTime = System.currentTimeMillis(); + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/third/third-pay-api/wallet-pay").bizType(ThirdPayApiBizTypeEnum.PAY.getType()).paySourceType(ThirdPaySoureBizTypeEnum.LB.getType()).header(JSONUtil.toJsonStr(headers)).req(json).build(); + // 开始处理 + PayBaseVo baseVo = new PayBaseVo(); + ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); + if (ObjectUtil.isEmpty(keySetting)) { + baseVo.set(ThirdPayVoStatusEnum.SIGN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + PayDto dto = JSONUtil.toBean(json, PayDto.class); + Set> validate = Validation.buildDefaultValidatorFactory().getValidator().validate(dto); + if (ObjectUtil.isNotEmpty(validate)) { + String firstError = validate.iterator().next().getMessage(); + baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + baseVo.setMessage(firstError); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + // 开始支付 + try { + PayBaseVo payVoPayBaseVo = hardThirdPayService.walletPay(dto, WalletTypeEnum.PAY, ThirdPaySoureBizTypeEnum.valueOfByType(keySetting.getBizType())); + if (ObjectUtil.isEmpty(payVoPayBaseVo)) { + throw new RuntimeException("支付失败"); + } + // 日志 + logObj.setRes(JSONUtil.toJsonStr(payVoPayBaseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return payVoPayBaseVo; + } catch (Exception e) { + log.error("|{}|通过userId扣款错误,json|{}|headers|{}|", TAG, json, headers, e); + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + } + + /** + * 退款 + */ + @Override + public PayBaseVo walletRefund(String json, Map headers) { + long startTime = System.currentTimeMillis(); + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/third/third-pay-api/wallet-refund").bizType(ThirdPayApiBizTypeEnum.REFUND.getType()).paySourceType(ThirdPaySoureBizTypeEnum.LB.getType()).req(json).header(JSONUtil.toJsonStr(headers)).build(); + // 开始处理 + PayBaseVo baseVo = new PayBaseVo(); + ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); + if (ObjectUtil.isEmpty(keySetting)) { + baseVo.set(ThirdPayVoStatusEnum.SIGN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + RefundDto dto = JSONUtil.toBean(json, RefundDto.class); + Set> validate = Validation.buildDefaultValidatorFactory().getValidator().validate(dto); + if (ObjectUtil.isNotEmpty(validate)) { + String firstError = validate.iterator().next().getMessage(); + baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + baseVo.setMessage(firstError); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + // 开始退款 + try { + PayBaseVo payVoPayBaseVo = hardThirdPayService.walletRefund(dto, ThirdPaySoureBizTypeEnum.valueOfByType(keySetting.getBizType())); + if (ObjectUtil.isEmpty(payVoPayBaseVo)) { + throw new RuntimeException("退款失败"); + } + // 日志 + logObj.setRes(JSONUtil.toJsonStr(payVoPayBaseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return payVoPayBaseVo; + } catch (Exception e) { + log.error("|{}|退款,json|{}|headers|{}|", TAG, json, headers, e); + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + } + + /** + * 根据加密的手机号查询用户钱包信息 + */ + @Override + public PayBaseVo getWalletInfo(String json, Map headers) { + // 日志 + long startTime = System.currentTimeMillis(); + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/third/third-pay-api/user-wallet").bizType(ThirdPayApiBizTypeEnum.WALLET_INFO.getType()).req(json).header(JSONUtil.toJsonStr(headers)).paySourceType(ThirdPaySoureBizTypeEnum.LB.getType()).build(); + // 开始处理 + PayBaseVo baseVo = new PayBaseVo(); + ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); + if (ObjectUtil.isEmpty(keySetting)) { + baseVo.set(ThirdPayVoStatusEnum.SIGN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + PayGetWalletInfoDto dto = JSONUtil.toBean(json, PayGetWalletInfoDto.class); + if (ObjectUtil.isEmpty(dto) || ObjectUtil.isAllEmpty(dto.getSignPhone(), dto.getUserId())) { + baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + String userPhone = null; + // 判断是根据手机号查询还是根据用户id查询 + if (ObjectUtil.isNotEmpty(dto.getUserId())) { + UserInfo userInfo = userService.getInnerByUserId(dto.getUserId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + baseVo.set(ThirdPayVoStatusEnum.USER_EXIST); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + userPhone = userInfo.getSysUser().getPhone(); + } + if (ObjectUtil.isNotEmpty(dto.getSignPhone()) && ObjectUtil.isEmpty(dto.getUserId())) { + // 手机号解密 + userPhone = LbRetailSignUtils.sm4Decrypt(dto.getSignPhone(), keySetting.getFieldKey()); + if (ObjectUtil.isEmpty(userPhone)) { + baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + baseVo.setMessage("手机号解析失败"); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + } + WalletManageVo userWallet = walletService.getWalletByUserPhone(userPhone, WalletTypeEnum.PAY).getData(); + if (ObjectUtil.isEmpty(userWallet)) { + baseVo.set(ThirdPayVoStatusEnum.USER_EXIST); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + PayWalletInfoVo result = new PayWalletInfoVo(); + result.setUserId(userWallet.getUserId()); + result.setSignPhone(LbRetailSignUtils.sm4Encrypt(userPhone, keySetting.getFieldKey())); + result.setBalance(userWallet.getBalance()); + result.setName(userWallet.getUsername()); + // 返回成功的参数 + baseVo.set(ThirdPayVoStatusEnum.SUCCESS); + baseVo.setData(result); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + + /** + * 流水查询 + */ + @Override + public PayBaseVo> water(String json, Map headers) { + // 日志 + long startTime = System.currentTimeMillis(); + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/third/third-pay-api/water").bizType(ThirdPayApiBizTypeEnum.WATER.getType()).req(json).header(JSONUtil.toJsonStr(headers)).paySourceType(ThirdPaySoureBizTypeEnum.LB.getType()).build(); + // 开始处理 + PayBaseVo baseVo = new PayBaseVo(); + ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); + if (ObjectUtil.isEmpty(keySetting)) { + baseVo.set(ThirdPayVoStatusEnum.SIGN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + // 处理一下查询参数 + WaterDto dto = JSONUtil.toBean(json, WaterDto.class); + if (ObjectUtil.isEmpty(dto.getCurrent())) dto.setCurrent(1L); + if (ObjectUtil.isEmpty(dto.getSize())) dto.setSize(100L); + if (dto.getSize() > 200L) dto.setSize(200L); + try { + PayBaseVo> pageList = hardThirdPayService.waterList(dto, ThirdPaySoureBizTypeEnum.valueOfByType(keySetting.getBizType())); + if (ObjectUtil.isEmpty(pageList.getData())) { + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + baseVo.setData(pageList.getData()); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + // 加密一下手机号 + for (PayWaterVo item : pageList.getData()) { + item.setSignPhone(LbRetailSignUtils.sm4Encrypt(item.getSignPhone(), keySetting.getFieldKey())); + } + return pageList; + } catch (Exception e) { + log.error("|{}|流水查询,json|{}|headers|{}|", TAG, json, headers, e); + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + } + + /** + * 订单详情 + */ + @Override + public PayBaseVo detail(String json, Map headers) { + // 日志 + long startTime = System.currentTimeMillis(); + ThirdPayLogEntity logObj = ThirdPayLogEntity.builder().apiUrl("/third/third-pay-api/detail").bizType(ThirdPayApiBizTypeEnum.DETAIL.getType()).req(json).header(JSONUtil.toJsonStr(headers)).paySourceType(ThirdPaySoureBizTypeEnum.LB.getType()).build(); + // 开始处理 + PayBaseVo baseVo = new PayBaseVo(); + ThirdKeyManageEntity keySetting = keyManageService.checkSignAndReturnConfig(json, headers); + if (ObjectUtil.isEmpty(keySetting)) { + baseVo.set(ThirdPayVoStatusEnum.SIGN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + PayDetailDto dto = JSONUtil.toBean(json, PayDetailDto.class); + if (ObjectUtil.isAllEmpty(dto.getThirdOrderId(), dto.getThirdRefundId())) { + baseVo.set(ThirdPayVoStatusEnum.PARAMS_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + try { + PayBaseVo orderDetail = hardThirdPayService.orderDetail(dto, ThirdPaySoureBizTypeEnum.valueOfByType(keySetting.getBizType())); + if (ObjectUtil.isEmpty(orderDetail)) { + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + baseVo.setData(orderDetail); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + // 加密一下手机号 + if (ObjectUtil.isNotEmpty(orderDetail.getData())) { + PayWaterVo data = orderDetail.getData(); + if (ObjectUtil.isNotEmpty(data.getSignPhone())) { + data.setSignPhone(LbRetailSignUtils.sm4Encrypt(data.getSignPhone(), keySetting.getFieldKey())); + } + } + return orderDetail; + } catch (Exception e) { + log.error("|{}|订单详情,json|{}|headers|{}|", TAG, json, headers, e); + baseVo.set(ThirdPayVoStatusEnum.UNKNOWN_ERROR); + // 日志 + logObj.setRes(JSONUtil.toJsonStr(baseVo)); + logObj.setTimeConsuming(Long.toString(System.currentTimeMillis() - startTime)); + payLogService.save(logObj); + return baseVo; + } + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayLogServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayLogServiceImpl.java new file mode 100644 index 000000000..30ad6a876 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayLogServiceImpl.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.thirdparty.service.impl.pay; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.thirdparty.entity.api.ThirdPayLogEntity; +import com.bsd.pjcloud.thirdparty.mapper.pay.ThirdPayLogMapper; +import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * 第三方支付日志 + */ +@Service +@Validated +@Slf4j +@RequiredArgsConstructor +public class ThirdPayLogServiceImpl extends ServiceImpl implements ThirdPayLogService { + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java index c53b2192f..73febe7b9 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/ks/api/KsApi.java @@ -1,6 +1,7 @@ package com.bsd.pjcloud.thirdparty.utils.ks.api; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.http.HttpRequest; @@ -35,13 +36,13 @@ public class KsApi { public static final KsApi.Api SKU_SUBMIT_COLLECTION = KsApi.Api.builder().url("/openapi/sc/v1/sku/collection").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build(); // SKU审核结果主动获取 - public static final KsApi.Api SKU_RESULT = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPost.METHOD_NAME).contentType("application/json").build(); + public static final KsApi.Api SKU_RESULT = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpGet.METHOD_NAME).contentType("application/json").build(); - // SKU识别结果回调通知 - public static final KsApi.Api SKU_EDIT = KsApi.Api.builder().url("/callback").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPatch.METHOD_NAME).contentType("application/json").build(); + // 常规SKU修改 + public static final KsApi.Api SKU_EDIT = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpPatch.METHOD_NAME).contentType("application/json").build(); // SKU审核结果回调通知 - public static final KsApi.Api SKU_SUBMIT_CALLBACK = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT_CALLBACK).method(HttpPatch.METHOD_NAME).contentType("application/json").build(); + public static final KsApi.Api SKU_SUBMIT_CALLBACK = KsApi.Api.builder().url("/callback").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT_CALLBACK).method(HttpPatch.METHOD_NAME).contentType("application/json").build(); // SKU删除 public static final KsApi.Api SKU_DELETE = KsApi.Api.builder().url("/openapi/sc/v1/sku/%s").bizType(ThirdDoorKsApiTypeEnum.SKU_SUBMIT).method(HttpDelete.METHOD_NAME).contentType("application/json").build(); @@ -75,6 +76,8 @@ public class KsApi { private Map params = new TreeMap<>(); + private List path; + private String body; private String method; @@ -91,7 +94,6 @@ public class KsApi { private String host = ""; - private String requestId; public KsApi.Api setBaseUrl(String baseUrl) { @@ -119,14 +121,17 @@ public class KsApi { return this; } + public Api setpath(Object... path) { + this.url = String.format(this.url, path); + this.path = ListUtil.of(path); + return this; + } + public KsApi.Api setBody(String body) { this.body = body; return this; } - /** - * 获取当前时间戳 - */ public Long getXRequestDate() { return System.currentTimeMillis(); } @@ -153,6 +158,7 @@ public class KsApi { // 计算签名 Long currentTime = getXRequestDate(); String queryString = getQueryString(); + if (ObjectUtil.isEmpty(queryString)) queryString = ""; String auth = KsRetailSignUtils.getSignAuth(getHost(), getUrl(), contentType, getMethod(), currentTime, getAccessKey(), getSecretKey(), getBody(), queryString); String requestId = getXRequestDate() + RandomUtil.randomString(19); setRequestId(requestId); @@ -181,7 +187,7 @@ public class KsApi { } else if (ObjectUtil.equals(method, HttpPatch.METHOD_NAME)) { return HttpRequest.patch(fullPatch).header(getHeader()).body(getBody()); } else if (ObjectUtil.equals(method, HttpDelete.METHOD_NAME)) { - return HttpRequest.delete(fullPatch).header(getHeader()).body(getBody()); + return HttpRequest.delete(fullPatch).header(getHeader()); } else { return null; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/api/LbApi.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/api/LbApi.java new file mode 100644 index 000000000..6f006dd08 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/api/LbApi.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.thirdparty.utils.lb.api; + +import com.bsd.pjcloud.thirdparty.constant.door.ThirdDoorApiTypeEnum; +import com.bsd.pjcloud.thirdparty.utils.door.api.DoorApi; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.UtilityClass; +import org.apache.http.client.methods.HttpPost; + + +@UtilityClass +public class LbApi { + + // 美好生活登录(直连模式) + public static final DoorApi.Api H5_LOGIN = DoorApi.Api.builder().url("/mall/xhr/authLogin/thirdApp").bizType(ThirdDoorApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build(); + + // 美好生活登录(分行中转模式) + public static final DoorApi.Api H5_LOGIN_OPEN = DoorApi.Api.builder().url("/mall/xhr/authLogin/thirdAppOpen").bizType(ThirdDoorApiTypeEnum.REGISTER).method(HttpPost.METHOD_NAME).contentType("application/json").build(); + + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class Api { + private String url; + + private String method; + + private String contentType; + + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/tool/LbRetailSignUtils.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/tool/LbRetailSignUtils.java new file mode 100644 index 000000000..2a3b65e13 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/lb/tool/LbRetailSignUtils.java @@ -0,0 +1,56 @@ +package com.bsd.pjcloud.thirdparty.utils.lb.tool; + +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.util.Base64; + +@Slf4j +@UtilityClass +public class LbRetailSignUtils { + + static { + // 添加安全提供者(SM2,SM3,SM4等加密算法,CBC、CFB等加密模式,PKCS7Padding等填充方式,不在Java标准库中,由BouncyCastleProvider实现) + Security.addProvider(new BouncyCastleProvider()); + } + + public static String sm4Encrypt(String plainString, String key) { + String cipherString = null; + try { + String algorithm = "SM4"; + SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm); + Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding"); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); + byte[] cipherBytes = cipher.doFinal(plainString.getBytes(StandardCharsets.UTF_8)); + cipherString = Base64.getEncoder().encodeToString(cipherBytes); + } catch (Exception e) { + e.printStackTrace(); + } + return cipherString; + } + + + /** + * SM4,商业密码(Shang Mi4)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布,相关标准为“GM/T 0002-2012《SM4分组密码算法》”。 + */ + public static String sm4Decrypt(String cipherString, String key) { + String plainString = null; + try { + String algorithm = "SM4"; + SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm); + Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); + byte[] cipherBytes = cipher.doFinal(Base64.getDecoder().decode(cipherString)); + plainString = new String(cipherBytes); + } catch (Exception e) { + e.printStackTrace(); + } + return plainString; + } + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml index f8f310ee6..1a95b9867 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -44,31 +44,31 @@ oauth2: # 正元智慧 # https://gwyc.zj.gov.cn/API/%E7%9C%81%E5%B9%B3%E5%8F%B0API%E5%AF%B9%E6%8E%A5%E6%8E%A5%E5%8F%A3.html zy: - # 测试1 - # base-url: http://60.191.37.212:18079 - # app-id: 689C8D6F5059A6F85B8BE45A49001ACB - # app-secret: BD21DA0DEB8F0FC43246B0BD2FCAE6FF +# 测试1 +# base-url: http://60.191.37.212:18079 +# app-id: 689C8D6F5059A6F85B8BE45A49001ACB +# app-secret: BD21DA0DEB8F0FC43246B0BD2FCAE6FF - # 测试2 - # base-url: http://60.191.37.212:18079 - # app-id: FC455B0A788E334AC08FB3E1D8385C75 - # app-secret: E9131D0BCC9054808675DA1E2E199023 +# 测试2 +# base-url: http://60.191.37.212:18079 +# app-id: FC455B0A788E334AC08FB3E1D8385C75 +# app-secret: E9131D0BCC9054808675DA1E2E199023 - # 正式 - # base-url: https://gwycport.zj.gov.cn - # app-id: 0BBF0D9A7F1B4BD5280E59197E259AC6 - # app-secret: 434752786ACBB37214F6617CC37AD0E9 +# 正式 +# base-url: https://gwycport.zj.gov.cn +# app-id: 0BBF0D9A7F1B4BD5280E59197E259AC6 +# app-secret: 434752786ACBB37214F6617CC37AD0E9 - # self-base-url: http://60.191.37.212:18079 - # self-app-id: xA5jF2vX4zO5mQ8tR9yE7rC7iI0fK0kI - # self-app-secret: kE3hH5gF7zN0nH1yI5yX3vP0oP1hU0jE - # 失效时间单位秒 - # self-expires-in: 7200 - # token key - # self_token_key: zy_token - # token - # self_token_secret: eV3dT0oD7iX8rK4eC3jS6fU8cU5cS6mJ +# self-base-url: http://60.191.37.212:18079 +# self-app-id: xA5jF2vX4zO5mQ8tR9yE7rC7iI0fK0kI +# self-app-secret: kE3hH5gF7zN0nH1yI5yX3vP0oP1hU0jE +# 失效时间单位秒 +# self-expires-in: 7200 +# token key +# self_token_key: zy_token +# token +# self_token_secret: eV3dT0oD7iX8rK4eC3jS6fU8cU5cS6mJ # 智能柜 # door: @@ -88,7 +88,20 @@ zy: # callback-base-url: http://h1yzkslmyx.ny.takin.cc # callback-recognition-url: /third/third-ks/callback/recognition # callback-sku-url: /third/third-ks/callback/sku +# lb: + # 测试环境 + # base-url: https://elss-sit.nbcb.com.cn + # app-id: 7da62b1a9ade473c917f573c5748081e + # app-secret: 8ffI6b+OKTmdVAt9Qo+2F/HQQMdt/d8GFia0zlJOt9I= + # company-number: 202504673472 + # sm4-key: S67157e8aQs2tFSX + # 正式环境 + # base-url: https://elss.nbcb.com.cn + # app-id: 528e3ca76ec34f5c9b3255ba18aee774 + # app-secret: tIhDZDXWhtP6bvd0J9Q0zjIZxSkmyX+uUc87xnDTgfc= + # company-number: 202504673472 + # sm4-key: 63P839eg0uxE5aoG sms: @@ -103,10 +116,10 @@ sms: templates: 20657: # 验证码模板 content: "您好,您的验证码是{code},有效时间{date}分钟,请勿转发!" - params: ["code", "date"] + params: [ "code", "date" ] 20658: content: "您的访客预约申请已通过,请通过地址{url}查看详情!" - params: ["url"] + params: [ "url" ] settings: default-ext-code: "123" timeout-seconds: 300 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps new file mode 100644 index 000000000..1b0f1b492 Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/doc/第三方支付文档.wps differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdKeyManageMapper.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdKeyManageMapper.xml new file mode 100644 index 000000000..2b4769a5c --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdKeyManageMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayLogMapper.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayLogMapper.xml new file mode 100644 index 000000000..f9c546a03 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayLogMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/PayTest.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/PayTest.java new file mode 100644 index 000000000..6a8fd2dd7 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/PayTest.java @@ -0,0 +1,215 @@ +package com.bsd.pjcloud.admin; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.thirdparty.ThirdPartyApp; +import com.bsd.pjcloud.thirdparty.constant.ThirdKeyTypeEnum; +import com.bsd.pjcloud.thirdparty.dto.lb.LbH5LoginDto; +import com.bsd.pjcloud.thirdparty.entity.ThirdKeyManageEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdKeyManageService; +import com.bsd.pjcloud.thirdparty.service.impl.lb.ThirdLbApiServiceImpl; +import com.bsd.pjcloud.thirdparty.utils.lb.tool.LbRetailSignUtils; +import com.bsd.pjcloud.thirdparty.vo.lb.LbH5LoginVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayBaseVo; +import com.bsd.pjcloud.thirdparty.vo.pay.PayWalletInfoVo; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@SpringBootTest(classes = ThirdPartyApp.class) +public class PayTest { + + // private final String baseUrl = "http://59.202.170.152:81/api"; + // private final String baseUrl = "http://127.0.0.1:9999"; + private final String baseUrl = "https://stgl.pj.gov.cn/api"; + + private final String walletInfoUrl = "/third/third-pay-api/user-wallet"; + + private final String walletPayUrl = "/third/third-pay-api/wallet-pay"; + + private final String walletRefundUrl = "/third/third-pay-api/wallet-refund"; + + private final String waterUrl = "/third/third-pay-api/water"; + + private final String detailUrl = "/third/third-pay-api/detail"; + + private final String appM4KeyProd = "4RSYZNr9bBmEeWPE"; + + @Resource + private ThirdKeyManageService keyManageService; + + @Resource + private ThirdLbApiServiceImpl thirdLbApiService; + + // 宁波银行H5登录 + @Test + public void lbH5login() throws Exception { + LbH5LoginDto dto = new LbH5LoginDto(); + dto.setPhone("17683843144"); + LbH5LoginVo loginVo = thirdLbApiService.h5Login(dto); + log.info(loginVo.toString()); + } + + // 查询钱包信息 + @Test + public void walletInfo() throws Exception { + ThirdKeyManageEntity config = getLbConfig(); + Map paramsMap = new HashMap<>(); + paramsMap.put("signPhone", LbRetailSignUtils.sm4Encrypt("17683843144", appM4KeyProd)); + // paramsMap.put("signPhone", "8KKubCKESDN5TlUl3i0HaQ=="); + // paramsMap.put("userId", 1875049673022279681L); + String body = JSONUtil.toJsonStr(paramsMap); + // 发送请求 + String res = HttpRequest.post(baseUrl + walletInfoUrl).contentType("application/json").header(apiCountersignProd(body)).body(body).execute().body(); + PayBaseVo baseVo = JSONUtil.toBean(res, PayBaseVo.class); + if (ObjectUtil.isNotEmpty(baseVo)) { + PayWalletInfoVo walletInfo = JSONUtil.toBean(String.valueOf(baseVo.getData()), PayWalletInfoVo.class); + baseVo.setData(walletInfo); + } + log.info(res); + } + + // 扣款(没有购物车) + @Test + public void walletPay() throws Exception { + Map paramsMap = new HashMap<>(); + paramsMap.put("userId", 1875049673022279681L); + paramsMap.put("thirdOrderId", System.currentTimeMillis()); + paramsMap.put("price", 900); + paramsMap.put("products", null); + String body = JSONUtil.toJsonStr(paramsMap); + // 发送请求 + String res = HttpRequest.post(baseUrl + walletPayUrl).contentType("application/json").header(apiCountersignProd(body)).body(body).execute().body(); + log.info(res); + } + + // 扣款(有购物车) + @Test + public void walletCarPay() throws Exception { + ThirdKeyManageEntity config = getLbConfig(); + // 购物车 + List> carList = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + int index = i + 1; + Map item = new HashMap<>(); + item.put("name", "商品-" + index); + item.put("pic", "https://cdn-mms.hktvmall.com/HKTV/mms/uploadProductImage/bf8b/516f/5211/mNyyBROdFu20240514003744_1200.png"); + item.put("price", index * 100); + item.put("count", index); + carList.add(item); + } + Map paramsMap = new HashMap<>(); + paramsMap.put("userId", 1875049673022279681L); + paramsMap.put("thirdOrderId", System.currentTimeMillis()); + paramsMap.put("price", 1500); + paramsMap.put("products", carList); + String body = JSONUtil.toJsonStr(paramsMap); + // 发送请求 + String res = HttpRequest.post(baseUrl + walletPayUrl).contentType("application/json").header(apiCountersignDev(body)).body(body).execute().body(); + log.info(res); + } + + // 退款 + @Test + public void walletRefund() throws Exception { + ThirdKeyManageEntity config = getLbConfig(); + Map paramsMap = new HashMap<>(); + paramsMap.put("platformOrderId", "1935235239046193154"); + paramsMap.put("thirdRefundId", System.currentTimeMillis()); + paramsMap.put("price", "100"); + String body = JSONUtil.toJsonStr(paramsMap); + // 发送请求 + String res = HttpRequest.post(baseUrl + walletRefundUrl).contentType("application/json").header(apiCountersignProd(body)).body(body).execute().body(); + log.info(res); + } + + // 查询流水 + @Test + public void water() throws Exception { + ThirdKeyManageEntity config = getLbConfig(); + Map paramsMap = new HashMap<>(); + paramsMap.put("current", 1); + paramsMap.put("size", 500); + /** + * 1创建订单(未支付) + * 5已经支付 + * 10退款 + */ + paramsMap.put("orderStatus", "10"); + String body = JSONUtil.toJsonStr(paramsMap); + // 发送请求 + String res = HttpRequest.post(baseUrl + waterUrl).contentType("application/json").header(apiCountersignProd(body)).body(body).execute().body(); + log.info(res); + } + + // 查询订单详情 + @Test + public void detail() throws Exception { + ThirdKeyManageEntity config = getLbConfig(); + Map paramsMap = new HashMap<>(); + paramsMap.put("thirdOrderId", "1750231010188"); + paramsMap.put("thirdRefundId", ""); + String body = JSONUtil.toJsonStr(paramsMap); + // 发送请求 + String res = HttpRequest.post(baseUrl + detailUrl).contentType("application/json").header(apiCountersignProd(body)).body(body).execute().body(); + log.info(res); + } + + @Test + public void test() { + String headers = "{\"X-Forwarded-Prefix\":\"/third\",\"sign\":\"c668f17f92907fed5ea62e899c1782c5\",\"User-Agent\":\"okhttp/3.14.9\",\"Accept-Encoding\":\"gzip\",\"UniqueFlowNo\":\"OPENAPI01-20250529100755-437087\",\"Content-Encoding\":\"UTF-8\",\"host\":\"192.168.0.192:6061\",\"X-B3-Sampled\":\"0\",\"X-B3-TraceId\":\"9590477961c17418\",\"Content-Length\":\"75\",\"X-Real-IP\":\"221.12.37.146\",\"timestamp\":\"1748484475\",\"Content-Type\":\"application/json\",\"Accept\":\"*/*\",\"X-B3-ParentSpanId\":\"9590477961c17418\",\"X-Forwarded-Host\":\"123.156.230.15:8089\",\"X-Forwarded-Proto\":\"http,http\",\"app-key\":\"HB0llhHmc56AW9yw\",\"X-Forwarded-Port\":\"8089\",\"x-client-token\":\"eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJqaW5oZmgtbWhzaC1zZXJ2aWNlIiwidXNlcklkIjoiNDA4MyIsIm5hbWUiOiJqaW5oZmgtbWhzaC1zZXJ2aWNlIiwiZXhwIjoyMDYzODQ0MDAwfQ.Woq4L0kiCCbVYFt8PwFj71eBx-u2S3mlX13dq7lEZwR8ILSxJNeLuK6JPoV72YLW82G9hRQHHncMZL3O4UnvmP2CWRIet3ekfW-61_PW82sgEIiKXK3bS5nBiQmk5vEChYG8VQ5Ze6lGkxL0baPujqA-CPV9KiQ0HNXLFKFec0w\",\"NEBULA-DST-SERVICE\":\"iobp-itfin-api\",\"X-B3-SpanId\":\"a9fd27f63a83ff9c\",\"biz-type\":\"10\",\"traceparent\":\"00-4f690c2f2e5c5784a6415a740b5fb80a-d33a2abbf42c407c-01\",\"Forwarded\":\"proto=http;host=\\\"123.156.230.15:8089\\\";for=\\\"127.0.0.1:52440\\\"\",\"X-Forwarded-For\":\"221.12.37.146,127.0.0.1\",\"REQUEST-START-TIME\":\"1748484466443\"}"; + String params = "{\"price\":1,\"thirdOrderId\":\"202505260000001\",\"userId\":\"1875049673022279681\"}"; + keyManageService.checkSignAndReturnConfig(params, JSONUtil.toBean(headers, Map.class)); + } + + private ThirdKeyManageEntity getLbConfig() { + return keyManageService.get(ThirdKeyTypeEnum.LB); + } + + private Map> apiCountersignProd(String body) { + ThirdKeyManageEntity config = getLbConfig(); + + String appKey = "CRLAacqYWSpKMHqO"; + String appSecret = "kwziFRmR5vnxpLpn4JhzLtoKyzsThCLi"; + + String timestamp = String.valueOf(Instant.now().getEpochSecond()); + + Map> headers = new HashMap<>(); + headers.put("timestamp", List.of(timestamp)); + headers.put("app-key", List.of(appKey)); + headers.put("biz-type", List.of(config.getBizType())); + headers.put("sign", List.of()); + String signStr = String.format("%s%s%s%s%s", appKey, appSecret, config.getBizType(), timestamp, body); + String successSignMd5 = DigestUtils.md5Hex(signStr); + headers.put("sign", List.of(successSignMd5)); + return headers; + } + + private Map> apiCountersignDev(String body) { + + ThirdKeyManageEntity config = getLbConfig(); + + String timestamp = String.valueOf(Instant.now().getEpochSecond()); + + Map> headers = new HashMap<>(); + headers.put("timestamp", List.of(timestamp)); + headers.put("app-key", List.of(config.getAppKey())); + headers.put("biz-type", List.of(config.getBizType())); + headers.put("sign", List.of()); + String signStr = String.format("%s%s%s%s%s", config.getAppKey(), config.getAppSecret(), config.getBizType(), timestamp, body); + String successSignMd5 = DigestUtils.md5Hex(signStr); + headers.put("sign", List.of(successSignMd5)); + return headers; + } + +} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserTransactionEnum.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserTransactionEnum.java new file mode 100644 index 000000000..bb8e31c4a --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/constant/UserTransactionEnum.java @@ -0,0 +1,29 @@ +package com.bsd.pjcloud.admin.api.constant; + + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户调岗类型 + */ +@AllArgsConstructor +@Getter +public enum UserTransactionEnum { + + LEAVE("10", "离职"), + RETIRE("20", "退休"), + INNER_TRANSFER("30", "调岗(内部)"), + ; + private final String type; + private final String description; + + public static UserTransactionEnum valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } + +} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java index c4d9eddc9..96b976f53 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/dto/SysUserFaceDto.java @@ -29,4 +29,11 @@ public class SysUserFaceDto extends SysUserFaceEntity implements BaseIsIncludeTr private Boolean isInclude; private Boolean isFindCheckUser = false; + + /** + * 用户相关 + */ + private String username; + + private String phone; } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserTransactionEntity.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserTransactionEntity.java index 79cc2908b..62b9a6c99 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserTransactionEntity.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUserTransactionEntity.java @@ -3,14 +3,17 @@ package com.bsd.pjcloud.admin.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("sys_user_transaction") @@ -19,112 +22,124 @@ import java.time.LocalDateTime; public class SysUserTransactionEntity extends Model { - /** - * 编号 - */ + /** + * 编号 + */ @TableId(type = IdType.ASSIGN_ID) - @Schema(description="编号") + @Schema(description = "编号") private Long id; - /** - * 用户id - */ - @Schema(description="用户id") + /** + * 申请部门用户id + */ + @Schema(description = "申请部门用户id") + private Long applyUserId; + + /** + * 用户id + */ + @Schema(description = "用户id") private Long userId; - /** - * 业务id - */ - @Schema(description="业务id") + /** + * 业务id + */ + @Schema(description = "业务id") private Long bizId; - /** - * 业务类型 - */ - @Schema(description="业务类型") + /** + * 业务类型 + */ + @Schema(description = "业务类型") private String bizType; - /** - * 源部门id - */ - @Schema(description="源部门id") + /** + * 源部门id + */ + @Schema(description = "源部门id") private Long sourceDeptId; - /** - * 目标部门id - */ - @Schema(description="目标部门id") + /** + * 目标部门id + */ + @Schema(description = "目标部门id") private Long targetDeptId; - /** - * 是否离职自动转账 - */ - @Schema(description="是否离职自动转账") + /** + * 是否离职自动转账 + */ + @Schema(description = "是否离职自动转账") private String isWalletTransaction; - /** - * 离职自动转账时间 - */ - @Schema(description="离职自动转账时间") + /** + * 离职自动转账时间 + */ + @Schema(description = "离职自动转账时间") private LocalDateTime walletTransactionTime; - /** - * 流程id - */ - @Schema(description="流程id") + /** + * 流程id + */ + @Schema(description = "流程id") private String processId; - /** - * 审核状体 - */ - @Schema(description="审核状体") + /** + * 审核状体 + */ + @Schema(description = "审核状体") private String processStatus; - /** - * 审核时间 - */ - @Schema(description="审核时间") + /** + * 审核时间 + */ + @Schema(description = "审核时间") private LocalDateTime processTime; - /** - * 创建人 - */ - @TableField(fill = FieldFill.INSERT) - @Schema(description="创建人") + /** + * 备注 + */ + @Schema(description = "备注") + private String remark; + + /** + * 创建人 + */ + @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-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java index 083605aa2..a4e15a1d7 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserService.java @@ -40,6 +40,7 @@ import java.util.Set; @FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.UPMS_SERVICE) public interface RemoteUserService { + @NoToken @PostMapping("/user/inner-page") R> getRemoteUserPage(@RequestParam Long current, @RequestParam Long size, @RequestBody UserDTO userDTO); @@ -54,6 +55,13 @@ public interface RemoteUserService { @GetMapping("/user/info/{username}") R info(@PathVariable("username") String username); + /** + * 根据手机号查询用户 + */ + @NoToken + @GetMapping("/user/inner/phone") + R getInnerByPhone(@RequestParam String phone); + /** * 通过用户id查询用户、角色信息 */ @@ -76,6 +84,10 @@ public interface RemoteUserService { @PostMapping("/user/list") R> getUserById(@RequestBody List userIds); + @NoToken + @PostMapping("/user/inner/list") + R> getInnerUserById(@RequestBody List userIds); + @PostMapping("/user/user-dept") R> getUserDeptByIds(@RequestBody List userIds); diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTransaction.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTransaction.java new file mode 100644 index 000000000..616f60b21 --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/feign/RemoteUserTransaction.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.admin.api.feign; + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + + +@FeignClient(contextId = "remoteUserTransaction", value = ServiceNameConstants.UPMS_SERVICE) +public interface RemoteUserTransaction { + + @NoToken + @PostMapping("/sys-user-transaction/wallet-transaction-callback") + void walletTransationCallback(@RequestParam(required = false) String params); + +} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserTransactionVo.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserTransactionVo.java index ae8c9385e..1cc8c7d0d 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserTransactionVo.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/SysUserTransactionVo.java @@ -26,4 +26,6 @@ public class SysUserTransactionVo extends SysUserTransactionEntity implements Ba private String userAvatar; + private String applyUsername; + } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java index 7afd2238e..efcbf9924 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/UserVO.java @@ -237,4 +237,8 @@ public class UserVO implements BaseFacesInterface, Serializable { */ private Boolean isCheckUser = false; + /** + * 商户相关 + */ + private String merchantName; } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseUserDeptInterface.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseUserDeptInterface.java index da93225a0..539623e1a 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseUserDeptInterface.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/vo/base/BaseUserDeptInterface.java @@ -41,5 +41,5 @@ public interface BaseUserDeptInterface { */ String getUserDeptName(); - void setUserDeptName(String deptName); + void setUserDeptName(String userDeptName); } diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-upms/pjcloud-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index d33bb014e..0e33e48f4 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-upms/pjcloud-upms-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -12,4 +12,5 @@ com.bsd.pjcloud.admin.api.feign.RemoteDictService com.bsd.pjcloud.admin.api.feign.RemoteAuditLogService com.bsd.pjcloud.admin.api.feign.RemoteMenuService com.bsd.pjcloud.admin.api.feign.RemoteRouteConfService +com.bsd.pjcloud.admin.api.feign.RemoteUserTransaction com.bsd.pjcloud.admin.api.feign.RemoteMessageService diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java index 6e0a79ff4..6a5c5a410 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java @@ -32,12 +32,12 @@ public class RegisterController { * @param userDto 用户信息 * @return success/false */ - @SysLog("注册用户") - @PostMapping("/user") - @ConditionalOnProperty(name = "register.user", matchIfMissing = true) - public R registerUser(@RequestBody UserDTO userDto) { - return userService.registerUser(userDto); - } +// @SysLog("注册用户") +// @PostMapping("/user") +// @ConditionalOnProperty(name = "register.user", matchIfMissing = true) +// public R registerUser(@RequestBody UserDTO userDto) { +// return userService.registerUser(userDto); +// } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysDeptController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysDeptController.java index 4fc568a35..2eb197650 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysDeptController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysDeptController.java @@ -19,22 +19,27 @@ package com.bsd.pjcloud.admin.controller; +import cn.hutool.core.util.ObjectUtil; import com.bsd.pjcloud.admin.api.dto.DeptAllListDto; import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.vo.DeptExcelVO; import com.bsd.pjcloud.admin.mapper.SysDeptMapper; import com.bsd.pjcloud.admin.service.SysDeptService; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; import com.bsd.pjcloud.common.excel.annotation.RequestExcel; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.HasPermission; import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -56,6 +61,7 @@ import java.util.Map; @RequestMapping("/dept") @Tag(description = "dept", name = "部门管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +@Slf4j public class SysDeptController { private final SysDeptService sysDeptService; @@ -83,20 +89,17 @@ public class SysDeptController { /** * 返回树形菜单集合 - * - * @param deptName 部门名称 - * @return 树形菜单 */ @GetMapping(value = "/tree") public R getTree(String deptName, Long parentId) { - return R.ok(sysDeptService.selectTree(deptName, parentId)); + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(sysDeptService.selectTree(deptName, parentId, user)); } - /** - * * 查询所有,无权限过滤 * simpleTree + * * @param deptName * @param parentId * @return diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java index 1a95f414d..6a4f23fd1 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserController.java @@ -23,7 +23,6 @@ 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.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.dto.UserDTO; @@ -127,6 +126,17 @@ public class SysUserController { return R.ok(userService.findUserInfo(user)); } + /** + * 根据手机号查询用户 + */ + @Inner + @GetMapping("/inner/phone") + R getInnerByPhone(@RequestParam String phone) { + SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getPhone, phone)); + if (user == null) return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, phone)); + return R.ok(userService.findUserInfo(user)); + } + @GetMapping("/get-by-user-id") public R getByUserId(@RequestParam Long userId) { SysUser user = userService.getOne(Wrappers.query().lambda().eq(SysUser::getUserId, userId)); @@ -374,7 +384,7 @@ public class SysUserController { // @Inner @GetMapping("/getUserIdListByDeptId") public R> getUserIdListByDeptId(@RequestParam("deptId")Long deptId, - @RequestParam(value = "name",required = false) String name) { + @RequestParam(value = "name",required = false) String name) { return R.ok(userService.listUserIdByDeptId(deptId,name)); } @@ -391,15 +401,18 @@ public class SysUserController { /** * 根据IDS获取用户列表 - * - * @param userIds ID列表 - * @return 用户列表 */ @PostMapping("/list") public R> getUserListByIds(@RequestBody List userIds) { return R.ok(userService.list(Wrappers.lambdaQuery().in(SysUser::getUserId, userIds))); } + @Inner + @PostMapping("/inner/list") + public R> getInnerUserListByIds(@RequestBody List userIds) { + return R.ok(userService.list(Wrappers.lambdaQuery().in(SysUser::getUserId, userIds))); + } + @PostMapping("/user-dept") public R> getUserDeptByIds(@RequestBody List userIds) { return R.ok(userService.getUserDeptByIds(userIds)); @@ -427,10 +440,14 @@ public class SysUserController { @GetMapping("/getSimpleUserAll") @Schema(description = "简要用户信息") - public R> getSimpleUserAllList(@RequestParam(value = "mobile", required = false) String mobile, @RequestParam(value = "name", required = false) String name) { + public R> getSimpleUserAllList( + @RequestParam(value = "mobile", required = false) String mobile, + @RequestParam(value = "name", required = false) String name, + @RequestParam(value = "userId", required = false) Long userId) { LambdaQueryWrapper sysUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); sysUserLambdaQueryWrapper.like(StringUtils.isNotBlank(mobile), SysUser::getPhone, mobile); sysUserLambdaQueryWrapper.like(StringUtils.isNotBlank(name), SysUser::getName, name); + sysUserLambdaQueryWrapper.eq(null != userId, SysUser::getUserId, userId); List list = userService.listScope(sysUserLambdaQueryWrapper); return R.ok(list); } @@ -474,27 +491,4 @@ public class SysUserController { } return R.ok(true); } - - - @PostMapping("/syncHKUser") - @Schema(description = "同步用户到海康") - public R syncHKUser() { - List list = userService.list(); - BatchAddPersonRequest batchAddPersonRequest = new BatchAddPersonRequest(); - - List personInfos = new ArrayList<>(); - - for (SysUser sysUser : list){ - PersonInfo personInfo = new PersonInfo(); - personInfo.setPersonName(sysUser.getName()); - personInfo.setPhoneNo(sysUser.getPhone()); - personInfo.setGender(1); - personInfo.setPersonId(sysUser.getUserId().toString()); - personInfos.add(personInfo); - } - batchAddPersonRequest.setPersons(personInfos); - remoterVisitorService.batchAddPersonV1(batchAddPersonRequest); - return R.ok(true); - } - } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java index bf00424f4..0bad98b75 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserFaceController.java @@ -11,6 +11,7 @@ import com.bsd.pjcloud.admin.api.entity.SysUserFaceEntity; import com.bsd.pjcloud.admin.api.vo.SysUserFaceVo; import com.bsd.pjcloud.admin.service.SysUserFaceService; 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; @@ -140,7 +141,9 @@ public class SysUserFaceController { @PostMapping("/page-check-join") public R> appPageCheckJoin(@ParameterObject Page page, @RequestBody SysUserFaceDto dto) { dto.setIsFindCheckUser(true); - return R.ok(sysUserFaceService.pageJoin(page, dto)); + DataScope dataScope = new DataScope(); + dataScope.setScopeDeptName("userDeptId"); + return R.ok(sysUserFaceService.scopePageList(page, dto, dataScope)); } @Operation(summary = "通过id查询", description = "通过id查询") diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserTransactionController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserTransactionController.java index 1a8a9b1a2..e46a699b7 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserTransactionController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/SysUserTransactionController.java @@ -11,6 +11,10 @@ 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.admin.service.SysUserTransactionService; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -36,6 +40,24 @@ public class SysUserTransactionController { private final SysUserTransactionService sysUserTransactionService; + /* ************************************* start callback start ************************************* */ + + @Inner(value = false) + @Operation(summary = "申请调岗审批回调", description = "申请调岗审批回调") + @PostMapping("/apply-callback") + public void applyCallback(@RequestBody ProcessNodeRecordAssignUserParamDto dto, @RequestParam(required = false) Long tenantId) { + sysUserTransactionService.applyCallback(dto, tenantId); + } + + @Inner + @Operation(summary = "离职退休自动转到消费钱包", description = "离职退休自动转到消费钱包") + @PostMapping("/wallet-transaction-callback") + public void walletTransationCallback(@RequestParam(required = false) String params) { + sysUserTransactionService.walletTransationCallback(params); + } + + /* ************************************* end callback end ************************************* */ + @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_view')") @@ -49,6 +71,7 @@ public class SysUserTransactionController { @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_view')") public R pageJoin(@ParameterObject Page page, @ParameterObject SysUserTransactionDto dto) { DataScope dataScope = new DataScope(); + dataScope.setScopeDeptName("applyUserDeptId"); return R.ok(sysUserTransactionService.scopePageJoin(page, dto, dataScope)); } @@ -63,16 +86,18 @@ public class SysUserTransactionController { @SysLog("新增人员调动表") @PostMapping @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_add')") - public R save(@RequestBody SysUserTransactionEntity sysUserTransaction) { - return R.ok(sysUserTransactionService.save(sysUserTransaction)); + public R save(@RequestBody SysUserTransactionDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(sysUserTransactionService.create(dto, user)); } @Operation(summary = "修改人员调动表", description = "修改人员调动表") @SysLog("修改人员调动表") @PutMapping @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_edit')") - public R updateById(@RequestBody SysUserTransactionEntity sysUserTransaction) { - return R.ok(sysUserTransactionService.updateById(sysUserTransaction)); + public R updateById(@RequestBody SysUserTransactionDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(sysUserTransactionService.edit(dto, user)); } @Operation(summary = "通过id删除人员调动表", description = "通过id删除人员调动表") @@ -80,7 +105,8 @@ public class SysUserTransactionController { @DeleteMapping @PreAuthorize("@pms.hasPermission('admin_sysUserTransaction_del')") public R removeById(@RequestBody Long[] ids) { - return R.ok(sysUserTransactionService.removeBatchByIds(CollUtil.toList(ids))); + sysUserTransactionService.delByIds(CollUtil.toList(ids)); + return R.ok(); } @ResponseExcel diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserTransactionMapper.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserTransactionMapper.java index f2b291c52..4094dfacb 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserTransactionMapper.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/mapper/SysUserTransactionMapper.java @@ -9,9 +9,14 @@ import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + @Mapper public interface SysUserTransactionMapper extends PjcloudBaseMapper { Page scopePageJoin(Page page, @Param("dto") SysUserTransactionDto dto, DataScope dataScope); + SysUserTransactionVo join(@Param("id") Long userTransactionId); + + List lastTransationList(@Param("dateStr") String dateStr); } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java index 95c27a8fa..212444e7a 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysDeptService.java @@ -26,6 +26,8 @@ import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.vo.DeptExcelVO; import com.bsd.pjcloud.admin.api.vo.OrgTreeVO; 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 jakarta.validation.Valid; import org.springframework.validation.BindingResult; @@ -48,7 +50,7 @@ public interface SysDeptService extends IService { * @param deptName 部门名称 * @return 树 */ - List> selectTree(String deptName, Long parentId); + List> selectTree(String deptName, Long parentId, PjcloudUser user); List> selectSimpleTree(String deptName, Long parentId); diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java index 79890825c..16fd28f7d 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java @@ -222,6 +222,7 @@ public interface SysUserService extends IService { /** * 根据部门id/姓名,获取用户信息 + * * @param deptId * @param name * @return diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTransactionService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTransactionService.java index 7d04cd4f4..e9d2c0bb6 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTransactionService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserTransactionService.java @@ -3,11 +3,44 @@ package com.bsd.pjcloud.admin.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.admin.api.dto.SysUserTransactionDto; +import com.bsd.pjcloud.admin.api.dto.UserDTO; +import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.entity.SysUserTransactionEntity; import com.bsd.pjcloud.admin.api.vo.SysUserTransactionVo; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; + +import java.util.ArrayList; public interface SysUserTransactionService extends IService { Page scopePageJoin(Page page, SysUserTransactionDto dto, DataScope dataScope); + + SysUserTransactionVo join(Long userTransactionId); + + /** + * 新增人员调动 + */ + Long create(SysUserTransactionDto dto, PjcloudUser applyUser); + + /** + * 新增人员调动 + */ + Long edit(SysUserTransactionDto dto, PjcloudUser applyUser); + + /** + * 删除人员调动 + */ + void delByIds(ArrayList list); + + /** + * 回调 + */ + void applyCallback(ProcessNodeRecordAssignUserParamDto dto, Long tenantId); + + /** + * 离职退休自动转到消费钱包 + */ + void walletTransationCallback(String params); } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java index e4b5ec947..aa114d5d3 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptServiceImpl.java @@ -41,6 +41,8 @@ import com.bsd.pjcloud.admin.service.SysDeptService; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; @@ -131,10 +133,10 @@ public class SysDeptServiceImpl extends ServiceImpl impl * @return 树 部门名称 */ @Override - public List> selectTree(String deptName, Long parentId) { + public List> selectTree(String deptName, Long parentId, PjcloudUser user) { // 查询全部部门 - List deptAllList = deptMapper - .selectList(Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName)); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName); + List deptAllList = deptMapper.selectList(queryWrapper); // 查询数据权限内部门 List deptOwnIdList = deptMapper .selectListByScope( @@ -157,6 +159,7 @@ public class SysDeptServiceImpl extends ServiceImpl impl // 有权限不返回标识 Map extra = new HashMap<>(8); extra.put("isLock", !deptOwnIdList.contains(dept.getDeptId())); + extra.put("visible", false); extra.put("createTime", dept.getCreateTime()); treeNode.setExtra(extra); return treeNode; @@ -172,8 +175,58 @@ public class SysDeptServiceImpl extends ServiceImpl impl return tree; }).collect(Collectors.toList()); } + List> tree = TreeUtil.build(collect, parentId == null ? 0 : parentId); + if (ObjectUtil.isNotEmpty(tree)) { + if (ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getDeptId())) { + for (Tree rootNode : tree) { + markDeptAndRelatedVisible(rootNode, user.getDeptId()); + } + } + } + return tree; + } - return TreeUtil.build(collect, parentId == null ? 0 : parentId); + /** + * 如果都是在targetDeptId这树上的visible都为true + */ + private void markDeptAndRelatedVisible(Tree node, Long targetDeptId) { + boolean shouldMarkVisible = isTargetOrAncestor(node, targetDeptId) || hasChildMatching(node, targetDeptId); + if (shouldMarkVisible) { + node.put("visible", true); + } + if (node.getChildren() != null) { + for (Tree child : node.getChildren()) { + markDeptAndRelatedVisible(child, targetDeptId); + } + } + } + + + /** + * 判断当前节点是否是目标节点,或者其父节点链上包含目标节点 + */ + private boolean isTargetOrAncestor(Tree node, Long targetDeptId) { + if (node.getId().equals(targetDeptId)) { + return true; + } + Tree parent = node.getParent(); + while (parent != null) { + if (parent.getId().equals(targetDeptId)) { + return true; + } + parent = parent.getParent(); + } + return false; + } + + /** + * 检查该节点及其子节点中是否存在目标节点 + */ + private boolean hasChildMatching(Tree node, Long targetDeptId) { + if (node.getChildren() == null) { + return false; + } + return node.getChildren().stream().anyMatch(child -> child.getId().equals(targetDeptId) || hasChildMatching(child, targetDeptId)); } @Override diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java index fb504e454..80b0a5fd3 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysRoleServiceImpl.java @@ -191,6 +191,9 @@ public class SysRoleServiceImpl extends ServiceImpl impl if (ObjectUtil.isEmpty(userRoles)) { return false; } + // 如果是管理员,直接返回false + boolean isAdmin = userRoles.stream().anyMatch(v -> ObjectUtil.equals(v.getRoleCode(), CommonRoleConstant.ROLE_ADMIN)); + if (isAdmin) return false; return userRoles.stream().anyMatch(v -> ObjectUtil.equals(v.getRoleCode(), CommonRoleConstant.DEPT_ADMIN)); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java index c5d9cb264..28129b22b 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserFaceServiceImpl.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.admin.api.dto.SysUserFaceDto; import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.entity.SysUserFaceEntity; +import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.admin.api.vo.SysUserFaceVo; import com.bsd.pjcloud.admin.api.vo.UserVO; import com.bsd.pjcloud.admin.mapper.SysUserFaceMapper; @@ -147,7 +148,32 @@ public class SysUserFaceServiceImpl extends ServiceImpl scopePageList(Page page, SysUserFaceDto dto, DataScope dataScope) { - return baseMapper.scopePageList(page, dto, DataScope.of()); + if (ObjectUtil.isNotEmpty(dto.getMerchantDeptIdOrGlobal())) { + List deptList = sysDeptService.listDescendant(dto.getMerchantDeptIdOrGlobal()); + if (ObjectUtil.isNotEmpty(deptList)) { + List deptIds = deptList.stream().map(SysDept::getDeptId).toList(); + dto.setDeptIds(deptIds); + } + } + Page list = baseMapper.scopePageList(page, dto, dataScope); + // 审批流程 + if (dto.getIsFindCheckUser()) { + List processInstanceIds = list.getRecords().stream().map(SysUserFaceVo::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.getRecords(), v -> { + TaskDto task = taskMap.get(v.getProcessId()); + if (ObjectUtil.isNotEmpty(task)) { + v.setIsCheckUser(true); + } + return v; + }); + } + } + } + return list; } @Override diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index cd35648fe..c9d2abcbe 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -53,12 +53,14 @@ import com.bsd.pjcloud.common.audit.annotation.Audit; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.CommonConstants; import com.bsd.pjcloud.common.core.constant.CommonRoleConstant; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.exception.ErrorCodes; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.MsgUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.resolver.ParamResolver; +import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; @@ -66,7 +68,11 @@ import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; +import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import cn.hutool.extra.spring.SpringUtil; @@ -86,6 +92,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; @@ -198,9 +206,15 @@ public class SysUserServiceImpl extends ServiceImpl impl if (isDeptAdmin) { getSelf().applyFlow(sysUser); } else { - // 创建用户默认钱包 - remoteWalletService.createWallet(sysUser.getUserId()); - remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); + // 创建用户默认钱包、保证线程header + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + // 创建钱包 + remoteWalletService.createWallet(sysUser.getUserId()); + // 通知钱包 + remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); + }); } return sysUser.getUserId(); @@ -380,6 +394,11 @@ public class SysUserServiceImpl extends ServiceImpl impl sysUser.setPassword(ENCODER.encode(userDto.getPassword())); } + // 判断用户username是否重复 + if (existUsername(userDto.getUserId(), userDto.getUsername())) { + throw new RuntimeException("该用户名已存在"); + } + this.updateById(sysUser); // 更新用户角色表 @@ -405,8 +424,12 @@ public class SysUserServiceImpl extends ServiceImpl impl } // 创建用户默认钱包 - remoteWalletService.createWallet(userDto.getUserId()); - remoteWalletService.userChange(userDto.getUserId(), Boolean.FALSE); + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + remoteWalletService.createWallet(userDto.getUserId()); + remoteWalletService.userChange(userDto.getUserId(), Boolean.FALSE); + }); return Boolean.TRUE; } @@ -698,6 +721,7 @@ public class SysUserServiceImpl extends ServiceImpl impl String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, userDto.getPhone()); return R.failed(message); } + saveUser(userDto); return R.ok(true); } @@ -910,18 +934,27 @@ public class SysUserServiceImpl extends ServiceImpl impl return baseMapper.selectListByScope(eq, DataScope.of()); } - @Override - public List listUserIdByDeptId(Long deptId, String name) { - List sysUsers = baseMapper.selectList(Wrappers.lambdaQuery() - .eq(SysUser::getDeptId, deptId) - .like(StrUtil.isNotBlank(name),SysUser::getName, name)); - return com.bsd.pjcloud.common.core.util.BeanUtils.toBean(sysUsers, SimpleUserListVO.class); - } - private SysUserServiceImpl getSelf() { return SpringUtil.getBean(getClass()); } + public List listUserIdByDeptId(Long deptId, String name) { + List sysUsers = baseMapper.selectList(Wrappers.lambdaQuery() + .eq(SysUser::getDeptId, deptId) + .like(StrUtil.isNotBlank(name), SysUser::getName, name)); + return com.bsd.pjcloud.common.core.util.BeanUtils.toBean(sysUsers, SimpleUserListVO.class); + } + + private boolean existUsername(Long userId, String username) { + Long count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(username), SysUser::getUsername, username) + .ne(ObjectUtil.isNotEmpty(userId), SysUser::getUserId, userId) + ); + if (ObjectUtil.isNotEmpty(userId)) { + return count >= 1; + } + return count > 0; + } } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserTransactionServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserTransactionServiceImpl.java index d396d1af8..3fb9c2beb 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserTransactionServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserTransactionServiceImpl.java @@ -1,16 +1,57 @@ package com.bsd.pjcloud.admin.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.constant.UserTransactionEnum; import com.bsd.pjcloud.admin.api.dto.SysUserTransactionDto; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.entity.SysDept; +import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.entity.SysUserTransactionEntity; import com.bsd.pjcloud.admin.api.vo.SysUserTransactionVo; import com.bsd.pjcloud.admin.mapper.SysUserTransactionMapper; +import com.bsd.pjcloud.admin.service.SysDeptService; +import com.bsd.pjcloud.admin.service.SysUserService; import com.bsd.pjcloud.admin.service.SysUserTransactionService; +import com.bsd.pjcloud.admin.utils.flow.FlowUtil; +import com.bsd.pjcloud.admin.utils.flow.dto.UserTransactionFlowDto; +import com.bsd.pjcloud.common.core.constant.CommonRoleConstant; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.resolver.ParamResolver; +import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService; +import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskParamDto; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletRuleTransactionService; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletThirdZyService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.CacheManager; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; /** * 人员调动表 @@ -20,8 +61,238 @@ import org.springframework.stereotype.Service; @AllArgsConstructor public class SysUserTransactionServiceImpl extends ServiceImpl implements SysUserTransactionService { + private static final String TAG = "员工申请调岗"; + + private final SysUserService sysUserService; + private final SysDeptService sysDeptService; + + private final OAuth2AuthorizationService authorizationService; + private final CacheManager cacheManager; + + private final RemoteFlowEngineService remoteFlowEngineService; + private final RemoteWalletThirdZyService remoteWalletThirdZyService; + private final RemoteWalletService remoteWalletService; + private final RemoteWalletRuleTransactionService walletRuleTransactionService; + + private final FlowUtil flowUtil; + @Override public Page scopePageJoin(Page page, SysUserTransactionDto dto, DataScope dataScope) { return baseMapper.scopePageJoin(page, dto, dataScope); } + + @Override + public SysUserTransactionVo join(Long userTransactionId) { + return baseMapper.join(userTransactionId); + } + + /** + * 新增人员调动 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Long create(SysUserTransactionDto dto, PjcloudUser applyUser) { + dto.setApplyUserId(applyUser.getId()); + if (ObjectUtil.notEqual(dto.getBizType(), UserTransactionEnum.INNER_TRANSFER.getType())) { + dto.setIsWalletTransaction(YesNoEnum.YES.getCode()); + } else { + dto.setIsWalletTransaction(YesNoEnum.NO.getCode()); + } + // 查询调动用户 + SysUser userDetail = sysUserService.getById(dto.getUserId()); + // 如果是离职或者调岗(外地)自动移动到指定部门 + if (ObjectUtil.equals(dto.getBizType(), UserTransactionEnum.LEAVE.getType())) { + Long deptId = null; + try { + String deptIdStr = ParamResolver.getStr("USER_TRANSACTION_LEAVE"); + deptId = Long.valueOf(deptIdStr); + } catch (Exception e) { + throw new RuntimeException("请配置离职部门参数"); + } + if (ObjectUtil.equals(userDetail.getDeptId(), deptId)) { + throw new RuntimeException("用户已在离职人员部门"); + } + dto.setTargetDeptId(deptId); + } + if (ObjectUtil.equals(dto.getBizType(), UserTransactionEnum.RETIRE.getType())) { + Long deptId = null; + try { + String deptIdStr = ParamResolver.getStr("USER_TRANSACTION_TRANSFER"); + deptId = Long.valueOf(deptIdStr); + } catch (Exception e) { + throw new RuntimeException("请配置调岗(外地)部门参数"); + } + if (ObjectUtil.equals(userDetail.getDeptId(), deptId)) { + throw new RuntimeException("用户已在退休人员部门"); + } + dto.setTargetDeptId(deptId); + } + if (ObjectUtil.equals(dto.getBizType(), UserTransactionEnum.INNER_TRANSFER.getType())) { + if (ObjectUtil.isEmpty(ObjectUtil.isEmpty(dto.getTargetDeptId()))) { + throw new RuntimeException("请选择目标部门"); + } + if (ObjectUtil.equals(userDetail.getDeptId(), dto.getTargetDeptId())) { + throw new RuntimeException("调动用户源部门和目标部门不能一致"); + } + } + // 查询发起用户 + SysUser applySysUser = sysUserService.getById(applyUser.getId()); + SysDept applySysDept = sysDeptService.getById(applyUser.getDeptId()); + baseMapper.insert(dto); + // 发起审批 + UserTransactionFlowDto flowDto = new UserTransactionFlowDto(); + flowDto.setApplyDeptName(applySysDept.getName()); + String processId = flowUtil.startFlow("USER_TRANSATION_APPLY", applySysUser, dto.getId(), flowDto); + // 更新审批信息 + SysUserTransactionEntity updateObj = new SysUserTransactionEntity(); + updateObj.setId(dto.getId()); + updateObj.setProcessId(processId); + updateObj.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); + baseMapper.updateById(updateObj); + return dto.getId(); + } + + /** + * 新增人员调动 + */ + @Override + public Long edit(SysUserTransactionDto dto, PjcloudUser applyUser) { + SysUserTransactionEntity updateObj = BeanUtil.toBean(dto, SysUserTransactionEntity.class); + if (ObjectUtil.notEqual(TaskCheckStatusEnum.PADDING.getCode(), dto.getProcessStatus())) { + throw new RuntimeException("审批中状态才可以修改"); + } + baseMapper.updateById(updateObj); + return dto.getId(); + } + + /** + * 删除人员调动 + */ + @Override + public void delByIds(ArrayList list) { + if (ObjectUtil.isEmpty(list)) return; + List userList = baseMapper.selectList(new LambdaQueryWrapper() + .in(SysUserTransactionEntity::getId, list) + ); + for (SysUserTransactionEntity v : userList) { + if (ObjectUtil.notEqual(TaskCheckStatusEnum.PADDING.getCode(), v.getProcessStatus())) { + SysUserTransactionVo detail = join(v.getId()); + throw new RuntimeException("调动人<" + detail.getUsername() + ">手机号<" + detail.getUserMobile() + ">,审批中状态才可以修改"); + } + } + // 取消审批 + TaskParamDto dto = new TaskParamDto(); + dto.setProcessInstanceIdList(userList.stream().map(SysUserTransactionEntity::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList()); + remoteFlowEngineService.stopProcessInstance(dto).getData(); + baseMapper.deleteBatchIds(list); + } + + + /** + * 回调 + */ + @Override + @Transactional(rollbackFor = Exception.class) + 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(); + SysUserTransactionEntity detail = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysUserTransactionEntity::getProcessId, processId)); + if (ObjectUtil.isEmpty(detail)) { + return; + } + if (!ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + log.error("|{}|重复的回调,dto:|{}|", TAG, JSON.toJSONString(dto)); + return; + } + try { + Boolean isConsent = flowUtil.isConsent(dto); + String processStatus = isConsent ? TaskCheckStatusEnum.RESULT.getCode() : TaskCheckStatusEnum.REJECT.getCode(); + baseMapper.updateById(SysUserTransactionEntity.builder().id(detail.getId()).processTime(LocalDateTime.now()).processStatus(processStatus).build()); + if (isConsent) { + // 修改部门 + SysUser userUpdateObj = new SysUser(); + userUpdateObj.setUserId(detail.getUserId()); + userUpdateObj.setDeptId(detail.getTargetDeptId()); + sysUserService.updateById(userUpdateObj); + // 通知正元 + if (ObjectUtil.equals(detail.getBizType(), UserTransactionEnum.INNER_TRANSFER.getType())) { + // 通知正元 + remoteWalletThirdZyService.syncUserById(detail.getUserId()); + } + // 通知钱包进行相关修改 + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + remoteWalletService.userChange(detail.getUserId(), Boolean.FALSE); + }); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage()); + throw new RuntimeException(e); + } + } + + /** + * 离职退休自动转到消费钱包 + */ + @Override + public void walletTransationCallback(String params) { + Long days = 30L; + LocalDate now = LocalDate.now(); + LocalDate localDate = now.minusDays(days); + String dateStr = LocalDateTimeUtil.format(localDate, DatePattern.NORM_DATE_PATTERN); + List list = baseMapper.lastTransationList(dateStr); + if (ObjectUtil.isEmpty(list)) { + log.info("|{}|离职退休自动转到消费钱包,没有需要处理的数据", TAG); + return; + } + // 用户转账逻辑,把饭卡钱包的钱自动转入到消费钱包 + + // 离职退休人员部门id + // List leaveDeptIds = List.of(ParamResolver.getStr("USER_TRANSACTION_LEAVE"), ParamResolver.getStr("USER_TRANSACTION_TRANSFER")); + // 离职用户 + List leaveDeptIds = List.of(ParamResolver.getStr("USER_TRANSACTION_LEAVE")); + List updateList = new ArrayList<>(); + for (SysUserTransactionEntity v : list) { + try { + // 判断用户是否有"自动创建钱包权限" + SysUser user = sysUserService.getOne(Wrappers.query().lambda().eq(SysUser::getUserId, v.getUserId())); + if (ObjectUtil.isEmpty(user)) { + log.error("|{}|离职退休自动转到消费钱包,用户<{}>不存在", TAG, v.getUserId()); + continue; + } + UserInfo userInfo = sysUserService.findUserInfo(user); + String[] roleCodes = userInfo.getRoleCodes(); + if (!ArrayUtil.contains(roleCodes, CommonRoleConstant.AUTO_CREATE_WALLET)) { + log.error("|{}|离职退休自动转到消费钱包,用户<{}>没有自动创建钱包权限", TAG, v.getUserId()); + continue; + } + // 判断用户现在是否在退休或者离职部门 + if (!ArrayUtil.contains(leaveDeptIds.toArray(), String.valueOf(user.getDeptId()))) { + log.error("|{}|离职退休自动转到消费钱包,用户<{}>不是离职或者退休部门", TAG, v.getUserId()); + continue; + } + // 执行转账逻辑 + Boolean success = walletRuleTransactionService.userAutoWalletTransation(v.getUserId()).getData(); + if (success) { + SysUserTransactionEntity updateObj = new SysUserTransactionEntity(); + updateObj.setId(v.getId()); + updateObj.setWalletTransactionTime(LocalDateTime.now()); + updateList.add(updateObj); + } + } catch (Exception e) { + log.error("|{}|离职退休自动转到消费钱包,用户<{}>自动转账失败,error:{}", TAG, v.getUserId(), e.getMessage()); + e.printStackTrace(); + } + } + if (ObjectUtil.isNotEmpty(updateList)) { + baseMapper.updateById(updateList); + } + } } \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java index e3c042dc5..020823c89 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/FlowUtil.java @@ -58,12 +58,12 @@ public class FlowUtil { log.error("|{}|请配置跨单位审批流程ID;userId:|{}|businessId:|{}|", TAG, user.getUserId(), businessId); throw new RuntimeException("请配置跨单位审批流程ID"); } - R 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(); if (ObjectUtil.isNotEmpty(dto)) { if (ObjectUtil.isNotEmpty(user.getUserId())) { diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserTransactionFlowDto.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserTransactionFlowDto.java new file mode 100644 index 000000000..57da10eab --- /dev/null +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/utils/flow/dto/UserTransactionFlowDto.java @@ -0,0 +1,8 @@ +package com.bsd.pjcloud.admin.utils.flow.dto; + +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; +import lombok.Data; + +@Data +public class UserTransactionFlowDto extends FlowBaseDto { +} diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml index d9372a10b..7057675ed 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/resources/mapper/SysUserFaceMapper.xml @@ -15,13 +15,19 @@ - select a.user_id, + select a.id, + a.auto_code, + a.user_id, + a.process_id, + a.process_status, a.face_img, a.create_by, a.create_time, + a.update_by, a.update_time, a.del_flag, a.tenant_id, + a.process_time, @@ -29,7 +35,8 @@ and a.user_id = #{pa.userId} - + + and a.process_status = #{pa.processStatus} @@ -37,12 +44,23 @@ u.name as username, u.avatar as userAvatar, - u.phone as userMobile + u.phone as userMobile, + u.dept_id as userDeptId, + u.dept_id as deptId, + d.name as deptName from sys_user_face a - left join sys_user u on u.user_id = a.user_id + left join sys_user u on u.user_id = a.user_id and u.del_flag = '0' + left join sys_dept d on d.dept_id = u.dept_id and d.del_flag = '0' + + and u.name LIKE CONCAT('%', #{pa.username}, '%') + + + and u.phone LIKE CONCAT('%', #{pa.phone}, '%') + + order by a.create_time desc , a.id desc + soureD.name as sourceDeptName, targetD.name as targetDeptName, - u.username as username, + u.name as username, u.phone as userMobile, - u.avatar as userAvatar + u.avatar as userAvatar, + applyU.name as applyUsername, + applyU.dept_id as applyUserDeptId 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 + left join sys_user applyU on applyU.user_id = a.apply_user_id + + + + + + + \ No newline at end of file diff --git a/pjcloud-visual/pjcloud-daemon-quartz/src/main/java/com/bsd/pjcloud/daemon/quartz/task/UmpsTask.java b/pjcloud-visual/pjcloud-daemon-quartz/src/main/java/com/bsd/pjcloud/daemon/quartz/task/UmpsTask.java new file mode 100644 index 000000000..22cc4a5ef --- /dev/null +++ b/pjcloud-visual/pjcloud-daemon-quartz/src/main/java/com/bsd/pjcloud/daemon/quartz/task/UmpsTask.java @@ -0,0 +1,35 @@ +package com.bsd.pjcloud.daemon.quartz.task; + + +import com.bsd.pjcloud.admin.api.feign.RemoteUserTransaction; +import com.bsd.pjcloud.daemon.quartz.constants.PjcloudQuartzEnum; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Slf4j +@Component("umps") +@AllArgsConstructor +public class UmpsTask { + + private final RemoteUserTransaction remoteUserTransaction; + + /** + * 离职退休自动转到消费钱包 + */ + @SneakyThrows + public String userWalletTransaction(String para) { + log.info("离职退休自动转到消费钱包:{},输入参数{}", LocalDateTime.now(), para); + try { + remoteUserTransaction.walletTransationCallback(para); + log.info("离职退休自动转到消费钱包成功:{}", LocalDateTime.now()); + } catch (Exception e) { + log.error("离职退休自动转到消费钱包错误error:{},时间:{}", e.getMessage(), LocalDateTime.now(), e); + } + return PjcloudQuartzEnum.JOB_LOG_STATUS_SUCCESS.getType(); + } + +} diff --git a/pjcloud-visual/pjcloud-xxl-job-admin/src/main/resources/application.yml b/pjcloud-visual/pjcloud-xxl-job-admin/src/main/resources/application.yml index bff40a709..3d9b491ae 100644 --- a/pjcloud-visual/pjcloud-xxl-job-admin/src/main/resources/application.yml +++ b/pjcloud-visual/pjcloud-xxl-job-admin/src/main/resources/application.yml @@ -21,13 +21,13 @@ spring: import: - optional:nacos:application-@profiles.active@.yml - optional:nacos:${spring.application.name}-@profiles.active@.yml - datasource: - type: com.alibaba.druid.pool.DruidDataSource - druid: - driver-class-name: com.mysql.cj.jdbc.Driver - username: ${MYSQL_USER:root} - password: ${MYSQL_PWD:root} - url: jdbc:mysql://${MYSQL_HOST:pjcloud-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pjcloudx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true +# datasource: +# type: com.alibaba.druid.pool.DruidDataSource +# druid: +# driver-class-name: com.mysql.cj.jdbc.Driver +# username: ${MYSQL_USER:root@sys} +# password: ${MYSQL_PWD:bsd.1799} +# url: jdbc:mysql://${MYSQL_HOST:pjcloud-mysql}:${MYSQL_PORT:2881}/${MYSQL_DB:pjcloudx_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true mvc: static-path-pattern: /static/** freemarker: diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizEnum.java index cb1cad37f..111e08d61 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizEnum.java @@ -17,6 +17,7 @@ public enum WalletBizEnum { REFUND("5", "退款"), TRANSFER_ACCOUNTS("6", "转账"), TRANSFER_ACCOUNTS_REFUND("7", "转账退款"), + RETURN_CANTEEN("8", "退还各自食堂"), ; private final String code; diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java index 839d4bec0..907ac832d 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java @@ -5,17 +5,24 @@ import lombok.AllArgsConstructor; import lombok.Getter; import java.util.Arrays; +import java.util.List; @Getter @AllArgsConstructor public enum WalletBizRechargeEnum { - ADD("1", "添加"), - REDUCTION("2", "减少"), + ADD("1", "充值"), + REDUCTION("2", "记账扣款"), + RETURN_CANTEEN("3", "退还各自食堂"), ; + private final String code; private final String desc; + public static List reductionCodes() { + return Arrays.asList(REDUCTION.getCode(), RETURN_CANTEEN.getCode()); + } + public static WalletBizRechargeEnum valueOfByType(String code) { return Arrays.stream(WalletBizRechargeEnum.values()) .filter(v -> ObjectUtil.equal(v.getCode(), code)) diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletInvoiceStatusCheckEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletInvoiceStatusCheckEnum.java new file mode 100644 index 000000000..d2db17c81 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletInvoiceStatusCheckEnum.java @@ -0,0 +1,35 @@ +package com.bsd.pjcloud.wallet.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 发票审核状态 + */ +@Getter +@AllArgsConstructor +public enum WalletInvoiceStatusCheckEnum { + UNCHECK("1", "未审核"), + FOREIGN("2", "审核成功"), + REFUND("3", "撤回"), + ; + private final String code; + + private final String desc; + + + public static WalletInvoiceStatusCheckEnum descOf(String description) { + return Arrays.stream(WalletInvoiceStatusCheckEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } + + public static WalletInvoiceStatusCheckEnum codeOf(String code) { + return Arrays.stream(WalletInvoiceStatusCheckEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().get(); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletRechargeInvoiceStatusEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletRechargeInvoiceStatusEnum.java new file mode 100644 index 000000000..89fc939ed --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletRechargeInvoiceStatusEnum.java @@ -0,0 +1,39 @@ +package com.bsd.pjcloud.wallet.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 充值/申请发票状态 + */ +@Getter +@AllArgsConstructor +public enum WalletRechargeInvoiceStatusEnum { + + UNBIND("1", "未绑定充值"), + BINDED("2", "已绑定充值"), + UNCHECKED("3", "未审核"), + CHECKED("4", "审核成功"), + FINANCE_CANCELLATION("5", "财务管理员作废"), + DEPT_CANCELLATION("6", "部门管理员作废"), + ; + private final String code; + + private final String desc; + + public static WalletRechargeInvoiceStatusEnum descOf(String description) { + return Arrays.stream(WalletRechargeInvoiceStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } + + public static WalletRechargeInvoiceStatusEnum codeOf(String code) { + return Arrays.stream(WalletRechargeInvoiceStatusEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().get(); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/rule/WalletRuleTransationTypeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/rule/WalletRuleTransationTypeEnum.java new file mode 100644 index 000000000..3501b0a3a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/rule/WalletRuleTransationTypeEnum.java @@ -0,0 +1,35 @@ +package com.bsd.pjcloud.wallet.api.constant.rule; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 用户转账类型 + */ +@Getter +@AllArgsConstructor +public enum WalletRuleTransationTypeEnum { + + USER_CHANGE("10", "用户手动转账"), + LEAVE_AUTO("20", "离职退休自动转账"), + ; + + private final String code; + private final String desc; + + public static WalletRuleTransationTypeEnum valueOfByType(String code) { + return Arrays.stream(WalletRuleTransationTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getCode(), code)) + .findFirst().get(); + } + + public static WalletRuleTransationTypeEnum descOf(String description) { + return Arrays.stream(WalletRuleTransationTypeEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/MchManageDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/MchManageDto.java index 4a3570483..65717433e 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/MchManageDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/MchManageDto.java @@ -20,7 +20,14 @@ public class MchManageDto extends MchManageEntity { private List notIds; + private List typesList; + private String type; private Boolean parentIsNull = true; + + /** + * 分类名 + */ + private String catgoryName; } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletBalanceTransactionDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletBalanceTransactionDto.java index c3803d2bf..2e7d0e0f8 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletBalanceTransactionDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletBalanceTransactionDto.java @@ -29,4 +29,7 @@ public class WalletBalanceTransactionDto { @JsonProperty("bizType") private WalletBizEnum bizType; + @NotNull(message = "是否暴力消费") + private Boolean force = false; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletForeignDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletForeignDto.java index 0cdc27af0..5e10aa074 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletForeignDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletForeignDto.java @@ -14,5 +14,11 @@ public class WalletForeignDto extends WalletForeignEntity { private List deptIds; + private Boolean isFindCheckUser = false; + + /** + * 是否查询已使用完的 + */ + private Boolean isFindUsed = true; } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletFreezeDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletFreezeDto.java index bd14e0adc..dc7b04ea1 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletFreezeDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletFreezeDto.java @@ -14,4 +14,6 @@ public class WalletFreezeDto extends WalletFreezeEntity { private List userIds; + private Boolean isFindCheckUser = false; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletStrideDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletStrideDto.java index 9e307d801..032900d95 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletStrideDto.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletStrideDto.java @@ -12,4 +12,11 @@ public class WalletStrideDto extends WalletStrideEntity { private List deptIds; + private Boolean isFindCheckUser = false; + + /** + * 是否查询已使用完的 + */ + private Boolean isFindUsed = true; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTopupActionDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTopupActionDto.java new file mode 100644 index 000000000..b63a56124 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/WalletTopupActionDto.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud.wallet.api.dto; + +import com.bsd.pjcloud.admin.api.vo.base.BaseIsIncludeTreeInterface; +import lombok.Data; + +import java.util.List; + +@Data +public class WalletTopupActionDto implements BaseIsIncludeTreeInterface { + + /** + * 用户id + */ + private Long userId; + + /** + * 不活跃天数 + */ + private Long unactiveMonthsNumber; + + /** + * 部门ids + */ + private List deptIds; + + /** + * 是否包含部门ids + */ + private Boolean isInclude; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/MchCheckoutDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/MchCheckoutDto.java new file mode 100644 index 000000000..fca50405b --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/mch/MchCheckoutDto.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.wallet.api.dto.mch; + +import com.bsd.pjcloud.wallet.api.entity.mch.MchCheckoutEntity; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +public class MchCheckoutDto extends MchCheckoutEntity { + + private LocalDate[] checkoutTimeList; + + private LocalDate[] createTimeList; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeBindInvoiceDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeBindInvoiceDto.java new file mode 100644 index 000000000..99c7f91bb --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeBindInvoiceDto.java @@ -0,0 +1,41 @@ +package com.bsd.pjcloud.wallet.api.dto.recharge; + +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeInvoiceEntity; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 充值记录绑定发票 + */ +@Data +public class WalletRechargeBindInvoiceDto extends WalletRechargeInvoiceEntity { + + /** + * 充值/扣款申请id + */ + private Long applyId; + + /** + * 申请人 + */ + private List userIds; + + /** + * 创建时间 + */ + private LocalDateTime[] createTimeList; + + /** + * 申请时间 + */ + private LocalDateTime[] applyTimeList; + + /** + * 审核时间 + */ + private LocalDateTime[] processTimeList; + + private Boolean isFindUserCheck = false; +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeInvoiceApplyDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeInvoiceApplyDto.java new file mode 100644 index 000000000..c6d339d9a --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeInvoiceApplyDto.java @@ -0,0 +1,15 @@ +package com.bsd.pjcloud.wallet.api.dto.recharge; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class WalletRechargeInvoiceApplyDto { + + @NotNull(message = "发票id不能为空") + private Long id; + + @NotNull(message = "发票图片不能为空") + private String picUrl; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeSaveTopupDto.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeSaveTopupDto.java new file mode 100644 index 000000000..30e26fe50 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/dto/recharge/WalletRechargeSaveTopupDto.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.wallet.api.dto.recharge; + +import lombok.Data; + +@Data +public class WalletRechargeSaveTopupDto { + + /** + * 充值类型 + */ + private String bizType; + + /** + * 发票id + */ + private Long invoiceId; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java index ad61d279d..ce49532a0 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletManageEntity.java @@ -82,7 +82,6 @@ public class WalletManageEntity extends Model { private Integer freezePrice; /** - * @deprecated 已废弃 * 是否冻结饭卡 */ @Schema(description = "是否冻结饭卡") diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletSettingEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletSettingEntity.java index fc3095b1e..4148c909e 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletSettingEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletSettingEntity.java @@ -81,6 +81,16 @@ public class WalletSettingEntity extends Model { @Schema(description = "退货理由") private String afterSaleReturnReasons; + /** + * 充值收款单位 + */ + private String topupDeptStr; + + /** + * 充值收款人 + */ + private Long topupUserId; + /** * 创建人 */ diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchCatgoryEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchCatgoryEntity.java new file mode 100644 index 000000000..f4017ad56 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchCatgoryEntity.java @@ -0,0 +1,94 @@ +package com.bsd.pjcloud.wallet.api.entity.mch; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; +import java.time.LocalDateTime; + +/** + * 商户分类 + */ +@Data +@TenantTable +@TableName("mch_catgory") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "商户分类") +public class MchCatgoryEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description="主键") + private Long id; + + /** + * 分类名 + */ + @Schema(description="分类名") + private String name; + + /** + * 分类名类型 + */ + @Schema(description="分类名类型") + private String bizType; + + /** + * 排序 + */ + @Schema(description="排序") + private Integer sort; + + /** + * 备注 + */ + @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-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchCheckoutEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchCheckoutEntity.java new file mode 100644 index 000000000..d0f05802d --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchCheckoutEntity.java @@ -0,0 +1,108 @@ +package com.bsd.pjcloud.wallet.api.entity.mch; + +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.LocalDate; +import java.time.LocalDateTime; + +/** + * 商户结账 + */ +@Data +@TenantTable +@TableName("mch_checkout") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "商户结账") +public class MchCheckoutEntity extends Model { + + + /** + * 创建者 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "创建者") + private Long id; + + /** + * 结账年月日(存入年月就行) + */ + @Schema(description = "结账年月日(存入年月就行)") + private LocalDate checkoutTime; + + /** + * 结账人 + */ + @Schema(description = "结账人") + private Long checkoutUserId; + + /** + * 商户id + */ + @Schema(description = "商户id") + private Long merchantId; + + /** + * 结账价格 + */ + @Schema(description = "结账价格") + private Long price; + + /** + * 结账凭证图片 + */ + @Schema(description = "结账凭证图片") + private String pic; + + /** + * 结账备注 + */ + @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-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchManageEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchManageEntity.java index d522105d8..d18f5feb5 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchManageEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/mch/MchManageEntity.java @@ -60,6 +60,18 @@ public class MchManageEntity extends Model { @Schema(description = "店铺类型,逗号分隔") private String types; + /** + * 食堂是否对外营业 + */ + @Schema(description = "食堂是否对外营业") + private String canteenIsOpen; + + /** + * 分类id + */ + @Schema(description = "分类id") + private Long catgoryId; + /** * 商户logo图片 */ @@ -72,6 +84,12 @@ public class MchManageEntity extends Model { @Schema(description = "商户收款码,自动生成") private String collectionCode; + /** + * 商户收款码(url形式),自动生成 + */ + @Schema(description = "商户收款码(url形式),自动生成") + private String collectionUrlCode; + /** * 商户轮播图,逗号分隔 */ @@ -118,7 +136,7 @@ public class MchManageEntity extends Model { private Long sort; /** - * 创建人 + * 超市类型 */ @Schema(description = "超市类型") private String supType; diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeApplyEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeApplyEntity.java index 4f46ebf51..b42e97e22 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeApplyEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeApplyEntity.java @@ -40,6 +40,12 @@ public class WalletRechargeApplyEntity extends Model @Schema(description = "流程id") private String processId; + /** + * 绑定发票id + */ + @Schema(description = "绑定发票id") + private Long invoiceId; + /** * 流程状态 */ @@ -83,6 +89,18 @@ public class WalletRechargeApplyEntity extends Model @JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN) private LocalDate importTime; + /** + * 申请时间 + */ + @Schema(description = "申请时间") + private LocalDateTime applyTime; + + /** + * 是否授权(退还各自食堂) + */ + @Schema(description = "是否授权") + private String isAuthorization; + /** * 备注 */ diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeImportEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeImportEntity.java index 74c8715a5..fc35e52fc 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeImportEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/recharge/WalletRechargeImportEntity.java @@ -49,6 +49,12 @@ public class WalletRechargeImportEntity extends Model { + + + /** + * 主键ID + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键ID") + private Long id; + + /** + * 申请id + */ + @Schema(description = "申请id") + private Long applyUserId; + + /** + * 申请id + */ + @Schema(description = "申请id") + private Long applyDeptId; + + /** + * 申请id + */ + @Schema(description = "申请id") + private Long applyId; + + /** + * 发票代码(七位数) + */ + @Schema(description = "发票代码(七位数)") + private String code; + + /** + * 发票日期 + */ + @Schema(description = "发票日期") + private LocalDateTime time; + + /** + * 交款单位或个人 + */ + @Schema(description = "交款单位或个人") + private String deptOrUser; + + /** + * 合计人民币(分) + */ + @Schema(description = "合计人民币(分)") + private Integer totalPrice; + + /** + * 收款单位 + */ + @Schema(description = "收款单位") + private String payeeDept; + + /** + * 收款人 + */ + @Schema(description = "收款人") + private String payeeUser; + + /** + * 备注 + */ + @Schema(description = "备注") + private String remark; + + /** + * 款项json + */ + @Schema(description = "款项json") + private String itemJson; + + /** + * 状态 + */ + @Schema(description = "状态") + private String status; + + /** + * 发票图片地址(不盖章) + */ + @Schema(description = "发票图片地址(不盖章)") + private String picUrl; + + /** + * 发票图片地址(盖章) + */ + @Schema(description = "发票图片地址(盖章)") + private String stampPicUrl; + + /** + * 流程id + */ + @Schema(description = "流程id") + private String processId; + + /** + * 流程状态 + */ + @Schema(description = "流程状态") + private String processStatus; + + /** + * 申请时间 + */ + @Schema(description = "申请时间") + private LocalDateTime applyTime; + + /** + * 审核时间 + */ + @Schema(description = "审核时间") + private LocalDateTime processTime; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 修改人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改人") + private String updateBy; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "修改时间") + private LocalDateTime updateTime; + + /** + * 删除标记 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除标记") + private String delFlag; + + /** + * 租户ID + */ + @Schema(description = "租户ID") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/rule/WalletRuleTransactionEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/rule/WalletRuleTransactionEntity.java index 3f4f83dbf..2e0e899bb 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/rule/WalletRuleTransactionEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/rule/WalletRuleTransactionEntity.java @@ -27,6 +27,12 @@ public class WalletRuleTransactionEntity extends Model> innerMchRoleList(@RequestParam Long targetMchId); + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java index 1bffd0ada..c46548a55 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteMchService.java @@ -36,9 +36,9 @@ public interface RemoteMchService { @NoToken @GetMapping("/mch-manage/get-first-mch") - R getFirstMch(@RequestParam List deptIds); + R getFirstMch(@RequestParam List deptIds, @RequestParam MerchantTypeEnum mchType); @NoToken @GetMapping("/mch-manage/get-first-mch-by-dept-id") - R getFirstMchByDeptId(@RequestParam Long deptId); + R getFirstMchByDeptId(@RequestParam Long deptId, @RequestParam MerchantTypeEnum mchType); } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRuleTransactionService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRuleTransactionService.java new file mode 100644 index 000000000..b13a8b20f --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRuleTransactionService.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.wallet.api.feign; + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + + +@FeignClient(contextId = "remoteWalletRuleTransactionService", value = ServiceNameConstants.WALLET_SERVICE) +public interface RemoteWalletRuleTransactionService { + + /** + * 离职退休自动转到消费钱包 + */ + @NoToken + @PostMapping("/wallet-rule-transaction/inner/auto-transation") + R userAutoWalletTransation(@RequestParam Long userId); + +} 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 759d5730a..efa1c8c18 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 @@ -32,10 +32,15 @@ public interface RemoteWalletService { @GetMapping("/wallet-manage/get-wallet-by-id") R getWalletById(@RequestParam Long walletId); + @NoToken + @GetMapping("/wallet-manage/get-wallet-by-phone") + R getWalletByUserPhone(@RequestParam String phone, @RequestParam WalletTypeEnum walletTypeCode); + @NoToken @GetMapping("/wallet-manage/get-wallet-by-card-number") R getWalletByCardNumber(@RequestParam String cardNumber); + @NoToken @GetMapping("/wallet-manage/create-wallet") R createWallet(@RequestParam Long userId); @@ -43,6 +48,7 @@ public interface RemoteWalletService { @GetMapping("/wallet-manage/del-wallet") R delWallet(@RequestParam("userIds") List userIds); + @NoToken @GetMapping("/wallet-manage/user-change") R userChange(@RequestParam Long userId, @RequestParam Boolean isDel); diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletThirdZyService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletThirdZyService.java new file mode 100644 index 000000000..e4a5c484b --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletThirdZyService.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.wallet.api.feign; + +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(contextId = "remoteWalletThirdZyService", value = ServiceNameConstants.WALLET_SERVICE) +public interface RemoteWalletThirdZyService { + + @NoToken + @PostMapping("/mch-third-zy/sync-user") + R syncUserById(@RequestParam Long userId); + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/utils/WalletDataUtil.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/utils/WalletDataUtil.java index dce22c0cc..d8ac80645 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/utils/WalletDataUtil.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/utils/WalletDataUtil.java @@ -24,6 +24,7 @@ public class WalletDataUtil { if (ObjectUtil.isEmpty(vo)) return v; v.setMerchantName(vo.getName()); v.setLogoPic(vo.getLogoPic()); + v.setMerchantType(vo.getTypes()); return v; } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java index 1cd54e0c5..96f1e0fd1 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/MchManageVo.java @@ -27,4 +27,9 @@ public class MchManageVo extends MchManageEntity implements BaseDeptInterface, B private List children; + /** + * 分类名 + */ + private String catgoryName; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletActiveVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletActiveVo.java index 45615fecd..9fe4c4cca 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletActiveVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletActiveVo.java @@ -43,4 +43,6 @@ public class WalletActiveVo extends WalletActiveEntity implements BaseUserInterf private String walletTypeIcon; private String isRule; + + private String merchantType; } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletForeignVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletForeignVo.java index a0b132ed8..36e4eddb6 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletForeignVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletForeignVo.java @@ -22,4 +22,9 @@ public class WalletForeignVo extends WalletForeignEntity implements BaseUserInte */ private String deptName; + /** + * 当前用户是否为审批用户 + */ + private Boolean isCheckUser = false; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletFreezeVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletFreezeVo.java index aedb922e6..45d3b4d40 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletFreezeVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletFreezeVo.java @@ -29,4 +29,9 @@ public class WalletFreezeVo extends WalletFreezeEntity implements BaseUserInterf private Long walletTypeId; private String cardNumber; + + /** + * 当前用户是否为审批用户 + */ + private Boolean isCheckUser = false; } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletSettingVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletSettingVo.java index 08f12170a..890542a07 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletSettingVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletSettingVo.java @@ -1,8 +1,24 @@ package com.bsd.pjcloud.wallet.api.vo; import com.bsd.pjcloud.wallet.api.entity.WalletSettingEntity; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.math.BigDecimal; + @Data public class WalletSettingVo extends WalletSettingEntity { + + /** + * (跨单位)每一餐的上限(分) + */ + @Schema(description = "(跨单位)每一餐的上限(分)") + private Integer deptPayAmountMealLimit; + + /** + * (跨单位)每一餐的倍数 + */ + @Schema(description = "(跨单位)每一餐的倍数") + private BigDecimal deptPayAmountMealTimes; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletStrideVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletStrideVo.java index 5ee79a699..f4223a94f 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletStrideVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletStrideVo.java @@ -21,4 +21,9 @@ public class WalletStrideVo extends WalletStrideEntity implements BaseUserInterf * 部门相关 */ private String deptName; + + /** + * 当前用户是否为审批用户 + */ + private Boolean isCheckUser = false; } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/base/BaseMchInterface.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/base/BaseMchInterface.java index f11cd242f..d8dbdc62a 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/base/BaseMchInterface.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/base/BaseMchInterface.java @@ -7,14 +7,14 @@ public interface BaseMchInterface { */ Long getMerchantId(); - void setMerchantId(Long dchId); + void setMerchantId(Long merchantId); /** * 商户名 */ String getMerchantName(); - void setMerchantName(String dchName); + void setMerchantName(String merchantName); /** * 商户logo @@ -23,5 +23,12 @@ public interface BaseMchInterface { void setLogoPic(String logoPic); + /** + * 商户类型 + */ + String getMerchantType(); + + void setMerchantType(String merchantType); + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchCheckoutVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchCheckoutVo.java new file mode 100644 index 000000000..ff822a15c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchCheckoutVo.java @@ -0,0 +1,41 @@ +package com.bsd.pjcloud.wallet.api.vo.mch; + +import com.bsd.pjcloud.admin.api.vo.base.BaseUserDeptInterface; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCheckoutEntity; +import com.bsd.pjcloud.wallet.api.vo.base.BaseMchInterface; +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Data +public class MchCheckoutVo extends MchCheckoutEntity implements BaseMchInterface, BaseUserDeptInterface { + + /** + * 店铺相关 + */ + private Long merchantId; + + private String merchantName; + + private String logoPic; + + /** + * 用户部门相关 + */ + private Long userId; + + private String username; + + private String userMobile; + + private String userAvatar; + + private Long userDeptId; + + private String userDeptName; + + private String merchantType; + + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchDeptVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchDeptVo.java index 01384af27..411111876 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchDeptVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/mch/MchDeptVo.java @@ -17,6 +17,8 @@ public class MchDeptVo extends MchDeptEntity implements BaseMchInterface, BaseDe private String logoPic; + private String merchantType; + /** * 部门相关 */ diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyVo.java index 929716217..76197174a 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeApplyVo.java @@ -40,4 +40,9 @@ public class WalletRechargeApplyVo extends WalletRechargeApplyEntity implements */ private Boolean isCheckUser = false; + /** + * 总金额 + */ + private Integer totalPrice; + } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceItemVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceItemVo.java new file mode 100644 index 000000000..f7dfd76a1 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceItemVo.java @@ -0,0 +1,21 @@ +package com.bsd.pjcloud.wallet.api.vo.recharge; + +import lombok.Data; + +/** + * 充值/扣款申请发票记录款项 + */ +@Data +public class WalletRechargeInvoiceItemVo { + + /** + * 款项内容 + */ + private String name; + + /** + * 款项金额 + */ + private double price; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java new file mode 100644 index 000000000..8db67ff71 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java @@ -0,0 +1,14 @@ +package com.bsd.pjcloud.wallet.api.vo.recharge; + +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeInvoiceEntity; +import lombok.Data; + +@Data +public class WalletRechargeInvoiceVo extends WalletRechargeInvoiceEntity { + + private String totalPriceCnStr; + + + private Boolean isCheckUser; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/transaction/WalletTransactionVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/transaction/WalletTransactionVo.java index 64fea7535..51e6c6b62 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/transaction/WalletTransactionVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/transaction/WalletTransactionVo.java @@ -20,7 +20,6 @@ public class WalletTransactionVo extends WalletTransactionEntity implements Base /** * 用户相关 */ - private Long userId; private String username; @@ -32,7 +31,6 @@ public class WalletTransactionVo extends WalletTransactionEntity implements Base /** * 部门相关 */ - private Long deptId; private String deptName; @@ -40,7 +38,6 @@ public class WalletTransactionVo extends WalletTransactionEntity implements Base /** * 钱包相关 */ - private Long walletId; private String walletCardNumber; @@ -99,4 +96,9 @@ public class WalletTransactionVo extends WalletTransactionEntity implements Base */ private Long lineNumber; + + /** + * 审批相关 + */ + private String processId; } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index a79583531..340953b8b 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -1,6 +1,9 @@ com.bsd.pjcloud.wallet.api.feign.RemoteWalletService +com.bsd.pjcloud.wallet.api.feign.RemoteMchRuleJoinService com.bsd.pjcloud.wallet.api.feign.RemoteCodeUseService com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargeService +com.bsd.pjcloud.wallet.api.feign.RemoteWalletRuleTransactionService com.bsd.pjcloud.wallet.api.feign.RemoteMchService com.bsd.pjcloud.wallet.api.feign.RemoteWalletSettingService +com.bsd.pjcloud.wallet.api.feign.RemoteWalletThirdZyService com.bsd.pjcloud.wallet.api.feign.RemoteWalletTransactionService \ No newline at end of file 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 8cabfb93f..c0ef1047b 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 @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum; import com.bsd.pjcloud.wallet.api.dto.WalletCodeUseDto; import com.bsd.pjcloud.wallet.api.entity.WalletCodeUseEntity; @@ -86,9 +88,11 @@ public class WalletCodeUseController { /* ************************************* end 远程调用 end ************************************* */ /* ************************************* start app start ************************************* */ - @Operation(summary = "app二维码列表", description = "app二维码列表") + @Operation(summary = "app二维码列表(查询自己的用户)", description = "app二维码列表(查询自己的用户)") @GetMapping("/app/code-list") public R appCodeList(@ParameterObject Page page, @ParameterObject WalletCodeUseDto dto) { + PjcloudUser user = SecurityUtils.getUser(); + dto.setUserId(user.getId()); return R.ok(walletCodeUseService.pageJoin(page, dto)); } /* ************************************* end app end ************************************* */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletForeignController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletForeignController.java index cfb56fd98..857e5f776 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletForeignController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletForeignController.java @@ -62,6 +62,7 @@ public class WalletForeignController { public R> appPageJoin(@ParameterObject Page page, @ParameterObject WalletForeignDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setUserId(user.getId()); + dto.setIsFindUsed(false); return R.ok(walletForeignService.pageJoin(page, dto)); } @@ -74,7 +75,7 @@ public class WalletForeignController { @Operation(summary = "app申请外来人员电子餐券表", description = "app申请外来人员电子餐券表") @SysLog("app申请外来人员电子餐券") @PostMapping("/app/apply") - @Idempotent(expireTime = 10, info = "正在申请中,请勿重复操作") + @Idempotent(expireTime = 3, info = "正在申请中,请勿重复操作") public R appSave(@RequestBody WalletForeignDto dto) { PjcloudUser loginUser = SecurityUtils.getUser(); dto.setUserId(loginUser.getId()); @@ -94,6 +95,7 @@ public class WalletForeignController { @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('wallet_walletForeign_view')") public R getWalletForeignPageJoin(@ParameterObject Page page, @ParameterObject WalletForeignDto dto) { + dto.setIsFindCheckUser(true); return R.ok(walletForeignService.scopePageList(page, dto)); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletFreezeController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletFreezeController.java index 1cea25205..d8d4d8adf 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletFreezeController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletFreezeController.java @@ -54,13 +54,14 @@ public class WalletFreezeController { @PostMapping("/app/apply-freeze") @Operation(summary = "申请冻结") public R appApplyFreeze(@RequestBody WalletFreezeDto dto) { - if (ObjectUtil.isEmpty(dto.getWalletId())) { - throw new RuntimeException("钱包id不能为空"); + if (ObjectUtil.isEmpty(dto.getWalletTypeId())) { + throw new RuntimeException("钱包类型id不能为空"); } if (ObjectUtil.isEmpty(dto.getRemark())) { throw new RuntimeException("备注不能为空"); } PjcloudUser user = SecurityUtils.getUser(); + dto.setUserId(user.getId()); walletFreezeService.applyFreeze(dto, user); return R.ok(true); } @@ -78,6 +79,7 @@ public class WalletFreezeController { @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('wallet_walletFreeze_view')") public R getWalletFreezePage(@ParameterObject Page page, @ParameterObject WalletFreezeDto dto) { + dto.setIsFindCheckUser(true); return R.ok(walletFreezeService.scopePageList(page, dto)); } @@ -93,7 +95,9 @@ public class WalletFreezeController { @PostMapping @PreAuthorize("@pms.hasPermission('wallet_walletFreeze_add')") public R save(@RequestBody WalletFreezeDto dto) { - return R.ok(walletFreezeService.create(dto)); + PjcloudUser user = SecurityUtils.getUser(); + walletFreezeService.applyFreeze(dto, user); + return R.ok(); } @Operation(summary = "新增饭卡冻结记录表", description = "新增饭卡冻结记录表") @@ -103,7 +107,8 @@ public class WalletFreezeController { public R appSave(@RequestBody WalletFreezeDto dto) { PjcloudUser loginUser = SecurityUtils.getUser(); dto.setUserId(loginUser.getId()); - return R.ok(walletFreezeService.create(dto)); + walletFreezeService.applyFreeze(dto, loginUser); + return R.ok(); } @Operation(summary = "修改饭卡冻结记录表", description = "修改饭卡冻结记录表") 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 0ec0aea09..ec4fc31d3 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 @@ -15,6 +15,7 @@ import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto; import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTopupActionDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; import com.bsd.pjcloud.wallet.mapper.WalletManageMapper; @@ -71,6 +72,7 @@ public class WalletManageController { return R.ok(wallet); } + @Inner @GetMapping("/create-wallet") public R getWallet(@RequestParam Long userId) { walletManageService.createWallet(userId); @@ -87,12 +89,18 @@ public class WalletManageController { @Inner @GetMapping("/get-wallet-by-id") - public R getWalletById(@RequestParam Long walletId) { + public R getWalletById(@RequestParam Long walletId) { WalletManageVo wallet = walletManageMapper.join(walletId); if (ObjectUtil.isEmpty(wallet)) return R.failed("用户钱包不存在"); return R.ok(wallet); } + @Inner + @GetMapping("/get-wallet-by-phone") + public R getWalletByUserPhone(@RequestParam String phone, @RequestParam WalletTypeEnum walletTypeCode) { + return R.ok(walletManageService.getWalletByPhone(phone, walletTypeCode)); + } + @Inner @GetMapping("/get-wallet-by-card-number") public R getWalletByCardNumber(@RequestParam String cardNumber) { @@ -113,6 +121,7 @@ public class WalletManageController { return R.ok(walletManageService.delWalletByUserIds(userIds)); } + @Inner @GetMapping("/user-change") public R userChange(@RequestParam Long userId, @RequestParam Boolean isDel) { walletManageService.userChange(userId, isDel); @@ -151,8 +160,7 @@ public class WalletManageController { PjcloudUser user = SecurityUtils.getUser(); WalletManageDto dto = new WalletManageDto(); dto.setUserId(user.getId()); - DataScope dataScope = new DataScope(); - dataScope.func(DataScopeFuncEnum.ALL); + DataScope dataScope = null; return R.ok(walletManageService.scopePageList(page, dto, dataScope)); } @@ -195,11 +203,25 @@ public class WalletManageController { @Operation(summary = "钱包记录分页", description = "钱包记录分页") @PostMapping("/page-join-qb") - public R pageJoinQb(@ParameterObject Page page, @RequestBody WalletManageBalanceDto dto) { + public R> pageJoinQb(@ParameterObject Page page, @RequestBody WalletManageBalanceDto dto) { DataScope dataScope = new DataScope(); return R.ok(walletManageService.scopeQbPage(page, dto, dataScope)); } + @Operation(summary = "不活跃用户统计", description = "不活跃用户统计") + @PostMapping("/page-join-active") + public R> pageJoinActive(@ParameterObject Page page, @RequestBody WalletTopupActionDto dto) { + DataScope dataScope = new DataScope(); + return R.ok(walletManageService.pageJoinActive(page, dto, dataScope)); + } + + @Operation(summary = "不活跃用户统计list", description = "不活跃用户统计list") + @PostMapping("/list-list-active") + public R> listActive(@RequestBody WalletTopupActionDto dto) { + DataScope dataScope = new DataScope(); + return R.ok(walletManageService.pageListActive(dto, dataScope)); + } + @Operation(summary = "通过id查询", description = "通过id查询") @GetMapping("/{id}") @PreAuthorize("@pms.hasPermission('wallet_walletManage_view')") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletStrideController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletStrideController.java index bf48d5e58..5245e1065 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletStrideController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletStrideController.java @@ -58,6 +58,7 @@ public class WalletStrideController { public R appPageJoin(@ParameterObject Page page, @ParameterObject WalletStrideDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setUserId(user.getId()); + dto.setIsFindUsed(false); return R.ok(walletStrideService.pageJoin(page, dto)); } @@ -70,7 +71,7 @@ public class WalletStrideController { @Operation(summary = "app申请", description = "app申请") @SysLog("app申请跨单位就餐") @PostMapping("/app/apply") - @Idempotent(expireTime = 10, info = "正在申请中,请勿重复操作") + @Idempotent(expireTime = 3, info = "正在申请中,请勿重复操作") public R appSave(@RequestBody WalletStrideDto dto) { PjcloudUser loginUser = SecurityUtils.getUser(); dto.setUserId(loginUser.getId()); @@ -90,6 +91,7 @@ public class WalletStrideController { @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('admin_walletStride_view')") public R getWalletStrideJoin(@ParameterObject Page page, @ParameterObject WalletStrideDto dto) { + dto.setIsFindCheckUser(true); return R.ok(walletStrideService.scopePageList(page, dto)); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java index df3b21e73..6f6cbd941 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTransactionController.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; -import com.bsd.pjcloud.common.data.datascope.DataScopeFuncEnum; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.common.security.service.PjcloudUser; @@ -61,7 +60,7 @@ public class WalletTransactionController { @Inner @PostMapping("/reduce-balance") public R reduceWalletBalance(@Valid @RequestBody WalletBalanceTransactionDto dto) { - WalletTransactionEntity walletTransaction = walletTransactionService.reduceWalletBalance(dto.getWalletId(), dto.getPrice(), dto.getBizId(), dto.getBizType()); + WalletTransactionEntity walletTransaction = walletTransactionService.reduceWalletBalance(dto.getWalletId(), dto.getPrice(), dto.getBizId(), dto.getBizType(), dto.getForce()); if (ObjectUtil.isEmpty(walletTransaction)) return R.failed("扣减钱包余额"); return R.ok(walletTransaction); } @@ -79,8 +78,7 @@ public class WalletTransactionController { public R appGetAll(@ParameterObject Page page, @ParameterObject WalletTransactionDto dto) { PjcloudUser user = SecurityUtils.getUser(); dto.setUserId(user.getId()); - DataScope dataScope = new DataScope(); - dataScope.func(DataScopeFuncEnum.ALL); + DataScope dataScope = null; return R.ok(walletTransactionService.scopePageList(page, dto, dataScope)); } /* ************************************* end app end ************************************* */ @@ -96,6 +94,7 @@ public class WalletTransactionController { @PostMapping("/page-cz") public R pageCz(@ParameterObject Page page, @RequestBody WalletTransactionDto dto) { dto.setBizTypes(WalletBizEnum.getTopUpCodes()); + dto.setType(WalletTransactionDto.TYPE_INCOME); DataScope dataScope = new DataScope(); return R.ok(walletTransactionService.scopePageList(page, dto, dataScope)); } @@ -127,6 +126,16 @@ public class WalletTransactionController { return R.ok(walletTransactionService.scopePageList(page, dto, dataScope)); } + @Operation(summary = "后台退还各自食堂记录", description = "后台退还各自食堂记录") + @PostMapping("/page-th") + public R pageTh(@ParameterObject Page page, @RequestBody WalletTransactionDto dto) { + dto.setBizTypes(List.of(WalletBizEnum.RETURN_CANTEEN.getCode())); + dto.setIsFindOrder(false); + DataScope dataScope = new DataScope(); + return R.ok(walletTransactionService.scopePageList(page, dto, dataScope)); + } + + @Operation(summary = "分页查询复杂查询", description = "分页查询复杂查询") @GetMapping("/page-join") // TODO 这个比较公用先不加权限 @@ -172,6 +181,7 @@ public class WalletTransactionController { @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_export')") public void exportCz(HttpServletResponse response, @RequestBody WalletTransactionDto dto) { dto.setBizTypes(WalletBizEnum.getTopUpCodes()); + dto.setType(WalletTransactionDto.TYPE_INCOME); List list = walletTransactionService.scopeList(dto, DataScope.of()); walletTransactionService.exportByTemplate(response, dto, "file/个人充值明细.xlsx", list); } @@ -205,4 +215,14 @@ public class WalletTransactionController { List list = walletTransactionService.scopeList(dto, DataScope.of()); walletTransactionService.exportByTemplate(response, dto, "file/个人退款明细.xlsx", list); } + + @Operation(summary = "后台退还各自食堂记录导出", description = "后台退还各自食堂记录导出") + @PostMapping("/export-th") + @PreAuthorize("@pms.hasPermission('wallet_walletTransaction_export')") + public void exportTh(HttpServletResponse response, @RequestBody WalletTransactionDto dto) { + dto.setBizTypes(List.of(WalletBizEnum.RETURN_CANTEEN.getCode())); + dto.setIsFindOrder(false); + List list = walletTransactionService.scopeList(dto, DataScope.of()); + walletTransactionService.exportByTemplate(response, dto, "file/退还各自食堂明细.xlsx", list); + } } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTypeController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTypeController.java index fcd6c2f27..7fb58ad6c 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTypeController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletTypeController.java @@ -52,6 +52,7 @@ public class WalletTypeController { @GetMapping("/select") public R> walletList(@ParameterObject Page page, @ParameterObject WalletTypeDto dto) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(ObjectUtil.isNotEmpty(dto.getUniqueCode()), WalletTypeEntity::getUniqueCode, dto.getUniqueCode()); wrapper.orderByDesc(WalletTypeEntity::getCreateTime); wrapper.notIn(ObjectUtil.isNotEmpty(dto.getNotWalletTypeIds()), WalletTypeEntity::getId, dto.getNotWalletTypeIds()); return R.ok(walletTypeService.page(page, wrapper)); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java new file mode 100644 index 000000000..6f00156cb --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCatgoryController.java @@ -0,0 +1,116 @@ +package com.bsd.pjcloud.wallet.controller.mch; + +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.log.annotation.SysLog; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCatgoryEntity; +import com.bsd.pjcloud.wallet.service.MchCatgoryService; +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("/mch-catgory") +@Tag(description = "mch-catgory", name = "商户分类管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class MchCatgoryController { + + private final MchCatgoryService mchCatgoryService; + + /* ************************************* start 移动端 start ************************************* */ + + @Operation(summary = "app下拉查询", description = "app下拉查询") + @GetMapping("/app/select") + public R appSelect(@ParameterObject Page page, @ParameterObject MchCatgoryEntity mchCatgory) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(mchCatgory.getBizType()), MchCatgoryEntity::getBizType, mchCatgory.getBizType()) + .like(ObjectUtil.isNotEmpty(mchCatgory.getName()), MchCatgoryEntity::getName, mchCatgory.getName()) + .orderByDesc(MchCatgoryEntity::getSort) + .orderByDesc(MchCatgoryEntity::getCreateTime) + .orderByDesc(MchCatgoryEntity::getId); + return R.ok(mchCatgoryService.list(page, wrapper)); + } + + /* ************************************* end 移动端 end ************************************* */ + + @Operation(summary = "下拉查询(没有权限)", description = "下拉查询(没有权限)") + @GetMapping("/select") + public R select(@ParameterObject Page page, @ParameterObject MchCatgoryEntity mchCatgory) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(mchCatgory.getBizType()), MchCatgoryEntity::getBizType, mchCatgory.getBizType()) + .like(ObjectUtil.isNotEmpty(mchCatgory.getName()), MchCatgoryEntity::getName, mchCatgory.getName()) + .orderByDesc(MchCatgoryEntity::getSort) + .orderByDesc(MchCatgoryEntity::getCreateTime) + .orderByDesc(MchCatgoryEntity::getId); + return R.ok(mchCatgoryService.page(page, wrapper)); + } + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_view')") + public R getMchCatgoryPage(@ParameterObject Page page, @ParameterObject MchCatgoryEntity mchCatgory) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(mchCatgory.getBizType()), MchCatgoryEntity::getBizType, mchCatgory.getBizType()) + .like(ObjectUtil.isNotEmpty(mchCatgory.getName()), MchCatgoryEntity::getName, mchCatgory.getName()) + .orderByDesc(MchCatgoryEntity::getSort) + .orderByDesc(MchCatgoryEntity::getCreateTime) + .orderByDesc(MchCatgoryEntity::getId); + return R.ok(mchCatgoryService.page(page, wrapper)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(mchCatgoryService.getById(id)); + } + + @Operation(summary = "新增商户分类", description = "新增商户分类") + @SysLog("新增商户分类") + @PostMapping + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_add')") + public R save(@RequestBody MchCatgoryEntity dto) { + return R.ok(mchCatgoryService.create(dto)); + } + + @Operation(summary = "修改商户分类", description = "修改商户分类") + @SysLog("修改商户分类") + @PutMapping + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_edit')") + public R updateById(@RequestBody MchCatgoryEntity dto) { + return R.ok(mchCatgoryService.edit(dto)); + } + + @Operation(summary = "通过id删除商户分类", description = "通过id删除商户分类") + @SysLog("通过id删除商户分类") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(mchCatgoryService.removeBatchByIds(CollUtil.toList(ids))); + } + + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('waller_mchCatgory_export')") + public List export(MchCatgoryEntity mchCatgory, Long[] ids) { + return mchCatgoryService.list(Wrappers.lambdaQuery(mchCatgory).in(ArrayUtil.isNotEmpty(ids), MchCatgoryEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCheckoutController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCheckoutController.java new file mode 100644 index 000000000..2a82a517c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchCheckoutController.java @@ -0,0 +1,89 @@ +package com.bsd.pjcloud.wallet.controller.mch; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.wallet.api.dto.mch.MchCheckoutDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCheckoutEntity; +import com.bsd.pjcloud.wallet.api.vo.mch.MchCheckoutVo; +import com.bsd.pjcloud.wallet.service.MchCheckoutService; +import lombok.Data; +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("/mch-checkout") +@Tag(description = "mch-checkout", name = "商户结账管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class MchCheckoutController { + + private final MchCheckoutService mchCheckoutService; + + @Operation(summary = "分页查询", description = "分页查询") + @PostMapping("/page-join") + @PreAuthorize("@pms.hasPermission('wallet_mchCheckout_view')") + public R> getMchCheckoutPage(@ParameterObject Page page, @RequestBody MchCheckoutDto dto) { + DataScope dataScope = DataScope.of(); + return R.ok(mchCheckoutService.scopPageList(page, dto, dataScope)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_mchCheckout_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(mchCheckoutService.getById(id)); + } + + @Operation(summary = "新增商户结账", description = "新增商户结账") + @SysLog("新增商户结账") + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_mchCheckout_add')") + public R save(@RequestBody MchCheckoutEntity mchCheckout) { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(mchCheckoutService.create(mchCheckout, user)); + } + + @Operation(summary = "修改商户结账", description = "修改商户结账") + @SysLog("修改商户结账") + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_mchCheckout_edit')") + public R updateById(@RequestBody MchCheckoutEntity mchCheckout) { + return R.ok(mchCheckoutService.updateById(mchCheckout)); + } + + @Operation(summary = "通过id删除商户结账", description = "通过id删除商户结账") + @SysLog("通过id删除商户结账") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_mchCheckout_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(mchCheckoutService.removeBatchByIds(CollUtil.toList(ids))); + } + + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_mchCheckout_export')") + public List export(MchCheckoutEntity mchCheckout, Long[] ids) { + return mchCheckoutService.list(Wrappers.lambdaQuery(mchCheckout).in(ArrayUtil.isNotEmpty(ids), MchCheckoutEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java index e831541a6..c6654c568 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchManageController.java @@ -6,11 +6,19 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.entity.SysDept; +import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; 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.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.resolver.ParamResolver; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.wallet.api.dto.MchManageDto; import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; @@ -42,6 +50,9 @@ public class MchManageController { private final MchManageService mchManageService; + private final RemoteDeptService remoteDeptService; + private final RemoteUserService remoteUserService; + /* ************************************* start 远程调用 start ************************************* */ @Inner @GetMapping("/get-by-id") @@ -87,16 +98,16 @@ public class MchManageController { @Inner @GetMapping("/get-first-mch") - public R getFirstMch(@RequestParam List deptIds) { - MchManageVo mchManage = mchManageService.getFirstMch(deptIds); + public R getFirstMch(@RequestParam List deptIds, @RequestParam MerchantTypeEnum mchType) { + MchManageVo mchManage = mchManageService.getFirstMch(deptIds, mchType); if (ObjectUtil.isEmpty(mchManage)) return R.failed("商户不存在"); return R.ok(mchManage); } @Inner @GetMapping("/get-first-mch-by-dept-id") - public R getFirstMchByDeptId(@RequestParam Long deptId) { - MchManageVo mchManage = mchManageService.getFirstMchByDeptId(deptId); + public R getFirstMchByDeptId(@RequestParam Long deptId, @RequestParam MerchantTypeEnum mchType) { + MchManageVo mchManage = mchManageService.getFirstMchByDeptId(deptId, mchType); if (ObjectUtil.isEmpty(mchManage)) return R.failed("商户不存在"); return R.ok(mchManage); } @@ -105,9 +116,17 @@ public class MchManageController { /* ************************************* start app start ************************************* */ @Operation(summary = "app查询商铺", description = "app查询商铺") @GetMapping("/app/page-join") - @Inner(value = false) + // @Inner(value = false) public R> appPageJoin(@ParameterObject Page page, @ParameterObject MchManageDto dto) { + PjcloudUser user = SecurityUtils.getUser(); dto.setVisibleMobile(YesNoEnum.YES.getCode()); + // 如果是食堂判断用户是否能查看到所有食堂 + if (ObjectUtil.equals(dto.getType(), MerchantTypeEnum.CANTEEN.getType())) { + boolean isConsumeUser = mchManageService.getIsConsumeUser(user.getId()); + if (isConsumeUser) { + dto.setCanteenIsOpen(YesNoEnum.YES.getCode()); + } + } return R.ok(mchManageService.pageJoin(page, dto)); } @@ -126,6 +145,13 @@ public class MchManageController { public R appPageJoin(@RequestParam Long id) { return R.ok(mchManageService.join(id)); } + + @Operation(summary = "宁波银行登录", description = "宁波银行登录") + @GetMapping("/app/lb-login") + public R lbLogin() { + PjcloudUser user = SecurityUtils.getUser(); + return R.ok(mchManageService.lbLogin(user)); + } /* ************************************* end app end ************************************* */ @Operation(summary = "刷新商户二维码", description = "刷新商户二维码") @@ -148,20 +174,23 @@ public class MchManageController { @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('wallet_mchManage_view')") public R> getMchManagePageJoin(@ParameterObject Page page, @ParameterObject MchManageDto dto) { - return R.ok(mchManageService.scopePageList(page, dto)); + DataScope dataScope = null; + return R.ok(mchManageService.scopePageList(page, dto, dataScope)); } @Operation(summary = "分页级联", description = "分页级联") @GetMapping("/cascade-join") @PreAuthorize("@pms.hasPermission('wallet_mchManage_view')") public R> cascadeJoin(@ParameterObject Page page, @ParameterObject MchManageDto dto) { - return R.ok(mchManageService.cascadeJoin(page, dto)); + DataScope dataScope = null; + return R.ok(mchManageService.cascadeJoin(page, dto, dataScope)); } @Operation(summary = "分页不要权限下拉", description = "分页不要权限下拉") @GetMapping("/select") public R getSelect(@ParameterObject Page page, @ParameterObject MchManageDto dto) { - return R.ok(mchManageService.scopePageList(page, dto)); + DataScope dataScope = null; + return R.ok(mchManageService.scopePageList(page, dto, dataScope)); } @Operation(summary = "通过id查询", description = "通过id查询") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchRuleJoinController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchRuleJoinController.java index 012f26466..4a1aba4e4 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchRuleJoinController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/mch/MchRuleJoinController.java @@ -5,12 +5,15 @@ 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.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.wallet.api.dto.mch.MchRuleJoinDto; import com.bsd.pjcloud.wallet.api.entity.mch.MchRuleJoinDtoEntity; -import com.bsd.pjcloud.wallet.service.MchRuleJoinControllerService; +import com.bsd.pjcloud.wallet.api.vo.mch.MchRuleJoinDtoVo; +import com.bsd.pjcloud.wallet.service.MchRuleJoinService; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -31,35 +34,63 @@ import java.util.List; @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class MchRuleJoinController { - private final MchRuleJoinControllerService mchRuleJoinControllerService; + private final MchRuleJoinService mchRuleJoinService; + + /* ************************************* start 远程调用 start ************************************* */ + + @Inner + @Operation(summary = "获取钱包规则(android离线计算展示使用)", description = "获取钱包规则(android离线计算展示使用)") + @GetMapping("/inner/list") + public R> innerMchRoleList(@RequestParam Long targetMchId) { + DataScope dataScope = null; + MchRuleJoinDtoEntity dto = new MchRuleJoinDtoEntity(); + dto.setTargetMchId(targetMchId); + dto.setStatus(YesNoEnum.YES.getCode()); + return R.ok(mchRuleJoinService.scopeList(dto, dataScope)); + } + + /* ************************************* end 远程调用 end ************************************* */ + + + /* ************************************* start andorid start ************************************* */ + + @Operation(summary = "获取钱包规则(android离线计算展示使用)", description = "获取钱包规则(android离线计算展示使用)") + @GetMapping("/ad/list") + public R> adMchRoleList(@ParameterObject MchRuleJoinDtoEntity dto) { + DataScope dataScope = null; + dto.setStatus(YesNoEnum.YES.getCode()); + return R.ok(mchRuleJoinService.scopeList(dto, dataScope)); + } + + /* ************************************* end andorid end ************************************* */ @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('dzc_walletRuleMchConfig_view')") public R getWalletRuleMchConfigPage(@ParameterObject Page page, @ParameterObject MchRuleJoinDtoEntity walletRuleMchConfig) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - return R.ok(mchRuleJoinControllerService.page(page, wrapper)); + return R.ok(mchRuleJoinService.page(page, wrapper)); } @Operation(summary = "分页复杂查询", description = "分页复杂查询") @GetMapping("/page-join") @PreAuthorize("@pms.hasPermission('dzc_walletRuleMchConfig_view')") public R pageJoin(@ParameterObject Page page, @ParameterObject MchRuleJoinDto dto) { - return R.ok(mchRuleJoinControllerService.pageScopeList(page, dto, DataScope.of())); + return R.ok(mchRuleJoinService.pageScopeList(page, dto, DataScope.of())); } @Operation(summary = "通过id查询", description = "通过id查询") @GetMapping("/{id}") @PreAuthorize("@pms.hasPermission('dzc_walletRuleMchConfig_view')") public R getById(@PathVariable("id") Long id) { - return R.ok(mchRuleJoinControllerService.getById(id)); + return R.ok(mchRuleJoinService.getById(id)); } @Operation(summary = "通过id查询", description = "通过id查询") @GetMapping("join-detail/{id}") @PreAuthorize("@pms.hasPermission('dzc_walletRuleMchConfig_view')") public R joinDetail(@PathVariable("id") Long id) { - return R.ok(mchRuleJoinControllerService.joinDetail(id)); + return R.ok(mchRuleJoinService.joinDetail(id)); } @Operation(summary = "新增商户规格配置表", description = "新增商户规格配置表") @@ -67,7 +98,7 @@ public class MchRuleJoinController { @PostMapping @PreAuthorize("@pms.hasPermission('dzc_walletRuleMchConfig_add')") public R save(@RequestBody MchRuleJoinDtoEntity dto) { - return R.ok(mchRuleJoinControllerService.create(dto)); + return R.ok(mchRuleJoinService.create(dto)); } @Operation(summary = "修改商户规格配置表", description = "修改商户规格配置表") @@ -75,7 +106,7 @@ public class MchRuleJoinController { @PutMapping @PreAuthorize("@pms.hasPermission('dzc_walletRuleMchConfig_edit')") public R updateById(@RequestBody MchRuleJoinDtoEntity dto) { - return R.ok(mchRuleJoinControllerService.edit(dto)); + return R.ok(mchRuleJoinService.edit(dto)); } @Operation(summary = "通过id删除商户规格配置表", description = "通过id删除商户规格配置表") @@ -83,7 +114,7 @@ public class MchRuleJoinController { @DeleteMapping @PreAuthorize("@pms.hasPermission('dzc_walletRuleMchConfig_del')") public R removeById(@RequestBody Long[] ids) { - mchRuleJoinControllerService.delByIds(CollUtil.toList(ids)); + mchRuleJoinService.delByIds(CollUtil.toList(ids)); return R.ok(); } @@ -91,6 +122,6 @@ public class MchRuleJoinController { @GetMapping("/export") @PreAuthorize("@pms.hasPermission('dzc_walletRuleMchConfig_export')") public List export(MchRuleJoinDtoEntity walletRuleMchConfig, Long[] ids) { - return mchRuleJoinControllerService.list(Wrappers.lambdaQuery(walletRuleMchConfig).in(ArrayUtil.isNotEmpty(ids), MchRuleJoinDtoEntity::getId, ids)); + return mchRuleJoinService.list(Wrappers.lambdaQuery(walletRuleMchConfig).in(ArrayUtil.isNotEmpty(ids), MchRuleJoinDtoEntity::getId, ids)); } } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java index 6a48a2c5b..8790d0f48 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 @@ -6,12 +6,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.excel.annotation.RequestExcel; +import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeSaveTopupDto; import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo; @@ -48,6 +51,14 @@ public class WalletRechargeApplyController { } /* ************************************* start callback start ************************************* */ + @PostMapping("/save-topup") + @Operation(summary = "新增充值") + @Idempotent(expireTime = 3, info = "正在充值中,请勿重复操作") + public R comparePageJoin(@RequestBody WalletRechargeSaveTopupDto dto) { + walletRechargeApplyService.saveTopup(dto); + return R.ok(); + } + @GetMapping("/compare-page-join") @Operation(summary = "批量充值/扣款记录") public R comparePageJoin(@ParameterObject Page page, @ParameterObject WalletRechargeApplyDto dto) { @@ -58,6 +69,7 @@ public class WalletRechargeApplyController { @SysLog("提交申请") @GetMapping("/apply") @PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_apply')") + @Idempotent(expireTime = 5, info = "正在申请中,请勿重复操作") public R apply(@RequestParam Long id) { walletRechargeApplyService.apply(id); return R.ok(true); @@ -85,7 +97,8 @@ public class WalletRechargeApplyController { @PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_view')") public R getWalletRechargeApplyPage(@ParameterObject Page page, @ParameterObject WalletRechargeApplyDto dto) { dto.setIsFindCheckUser(true); - return R.ok(walletRechargeApplyService.scopePageList(page, dto)); + DataScope dataScope = new DataScope(); + return R.ok(walletRechargeApplyService.scopePageList(page, dto, dataScope)); } @Operation(summary = "通过id查询", description = "通过id查询") @@ -117,7 +130,8 @@ public class WalletRechargeApplyController { @DeleteMapping @PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_del')") public R removeById(@RequestBody Long[] ids) { - return R.ok(walletRechargeApplyService.removeBatchByIds(CollUtil.toList(ids))); + walletRechargeApplyService.delByIds(CollUtil.toList(ids)); + return R.ok(); } @@ -139,8 +153,15 @@ public class WalletRechargeApplyController { } @PostMapping("/read-excel") - public R readExcel(@RequestExcel List excelVOList, BindingResult bindingResult) { - return walletRechargeApplyService.readExcel(excelVOList, bindingResult); + @Idempotent(expireTime = 3, info = "正在上传中,请勿重复操作") + public R readExcel(@RequestExcel List excelVOList, BindingResult bindingResult, @RequestParam(required = false) String bizType) { + return walletRechargeApplyService.readExcel(excelVOList, bindingResult, bizType); + } + + @PostMapping("/read-topup-excel") + @Idempotent(expireTime = 3, info = "正在上传中,请勿重复操作") + public R readTopupExcel(@RequestExcel List excelVOList, BindingResult bindingResult) { + return walletRechargeApplyService.readTopupExcel(excelVOList, bindingResult); } /* ************************************* start excel start ************************************* */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeImportController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeImportController.java index f5f0f08e8..73e65d66f 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeImportController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeImportController.java @@ -3,7 +3,6 @@ package com.bsd.pjcloud.wallet.controller.recharge; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.resource.ResourceUtil; -import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.excel.EasyExcel; @@ -17,13 +16,11 @@ 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.constant.HardTypeEnum; import com.bsd.pjcloud.wallet.api.constant.WalletBizRechargeEnum; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeImportEntity; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeImportVo; -import com.bsd.pjcloud.wallet.api.vo.transaction.WalletTransactionVo; import com.bsd.pjcloud.wallet.service.WalletRechargeImportService; import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.access.prepost.PreAuthorize; @@ -42,7 +39,6 @@ import java.math.RoundingMode; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; /** * 充值导入表 @@ -134,7 +130,7 @@ public class WalletRechargeImportController { v.setLineNumber(lineNumber); lineNumber++; if (ObjectUtil.isNotEmpty(v.getPrice())) { - if (ObjectUtil.equals(v.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode()) && v.getPrice() > 0) { + if (WalletBizRechargeEnum.reductionCodes().contains(v.getBizType()) && v.getPrice() > 0) { v.setPrice(v.getPrice() * -1); } priceStrSum = priceStrSum.add(BigDecimal.valueOf(v.getPrice())); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeInvoiceController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeInvoiceController.java new file mode 100644 index 000000000..37c5cbc50 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeInvoiceController.java @@ -0,0 +1,140 @@ +package com.bsd.pjcloud.wallet.controller.recharge; + +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.admin.api.entity.SysUser; +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.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeBindInvoiceDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeInvoiceApplyDto; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeInvoiceEntity; +import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeInvoiceVo; +import com.bsd.pjcloud.wallet.service.WalletRechargeInvoiceService; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 充值/扣款申请发票记录 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/walletRechargeInvoice") +@Tag(description = "walletRechargeInvoice", name = "充值/扣款申请发票记录管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class WalletRechargeInvoiceController { + + private final WalletRechargeInvoiceService walletRechargeInvoiceService; + + /* ************************************* start callback start ************************************* */ + @Inner(value = false) + @PostMapping("/apply-callback") + public void applyCallback(@RequestBody ProcessNodeRecordAssignUserParamDto dto, @RequestParam(required = false) Long tenantId) { + walletRechargeInvoiceService.applyCallback(dto, tenantId); + } + /* ************************************* start callback start ************************************* */ + + + @Operation(summary = "提交申请", description = "提交申请") + @SysLog("提交申请") + @PostMapping("/apply") + @Idempotent(expireTime = 3, info = "正在申请中,请勿重复操作") + public R apply(@Valid @RequestBody WalletRechargeInvoiceApplyDto body) { + walletRechargeInvoiceService.apply(body); + return R.ok(true); + } + + + @GetMapping("/get-invoice") + @Operation(summary = "批量充值/扣款发票信息") + public R getInvoice(@RequestParam Long id) { + return R.ok(walletRechargeInvoiceService.getInvoice(id)); + } + + @GetMapping("/back") + @Operation(summary = "退回作废发票") + public R backInvoice(@RequestParam("id") Long id) { + walletRechargeInvoiceService.backInvoice(id); + return R.ok(); + } + + @PostMapping("/bind-invoice") + @Operation(summary = "绑定发票") + public R bindInvoice(@Valid @RequestBody WalletRechargeBindInvoiceDto dto) { + walletRechargeInvoiceService.bindInvoice(dto); + return R.ok(); + } + + @Operation(summary = "下拉", description = "下拉") + @GetMapping("/select") + public R select(@ParameterObject Page page, @ParameterObject WalletRechargeBindInvoiceDto dto) { + DataScope dataScope = null; + return R.ok(walletRechargeInvoiceService.scopePageList(page, dto, dataScope)); + } + + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('wallet_walletRechargeInvoice_view')") + public R getWalletRechargeInvoicePage(@ParameterObject Page page, @ParameterObject WalletRechargeBindInvoiceDto dto) { + DataScope dataScope = DataScope.of(); + dataScope.setScopeDeptName("apply_dept_id"); + dto.setIsFindUserCheck(true); + return R.ok(walletRechargeInvoiceService.scopePageList(page, dto, dataScope)); + } + + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('wallet_walletRechargeInvoice_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(walletRechargeInvoiceService.joinById(id)); + } + + @Operation(summary = "新增充值/扣款申请发票记录", description = "新增充值/扣款申请发票记录") + @SysLog("新增充值/扣款申请发票记录") + @PostMapping + @PreAuthorize("@pms.hasPermission('wallet_walletRechargeInvoice_add')") + public R save(@RequestBody WalletRechargeInvoiceEntity walletRechargeInvoice) { + return R.ok(walletRechargeInvoiceService.save(walletRechargeInvoice)); + } + + @Operation(summary = "修改充值/扣款申请发票记录", description = "修改充值/扣款申请发票记录") + @SysLog("修改充值/扣款申请发票记录") + @PutMapping + @PreAuthorize("@pms.hasPermission('wallet_walletRechargeInvoice_edit')") + public R updateById(@RequestBody WalletRechargeInvoiceEntity dto) { + return R.ok(walletRechargeInvoiceService.edit(dto)); + } + + @Operation(summary = "通过id删除充值/扣款申请发票记录", description = "通过id删除充值/扣款申请发票记录") + @SysLog("通过id删除充值/扣款申请发票记录") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('wallet_walletRechargeInvoice_del')") + public R removeById(@RequestBody Long[] ids) { + walletRechargeInvoiceService.delByIds(CollUtil.toList(ids)); + return R.ok(); + } + + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('wallet_walletRechargeInvoice_export')") + public List export(WalletRechargeInvoiceEntity walletRechargeInvoice, Long[] ids) { + return walletRechargeInvoiceService.list(Wrappers.lambdaQuery(walletRechargeInvoice).in(ArrayUtil.isNotEmpty(ids), WalletRechargeInvoiceEntity::getId, ids)); + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/rule/WalletRuleTransactionController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/rule/WalletRuleTransactionController.java index 16dcb7f0d..0ab63623c 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/rule/WalletRuleTransactionController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/rule/WalletRuleTransactionController.java @@ -13,6 +13,7 @@ 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; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; @@ -50,6 +51,17 @@ public class WalletRuleTransactionController { private final WalletRuleTransactionService walletRuleTransactionService; private final WalletTypeService walletTypeService; + /* ************************************* start 远程调用 start ************************************* */ + + @Inner + @Operation(summary = "离职退休自动转到消费钱包", description = "离职退休自动转到消费钱包") + @PostMapping("/inner/auto-transation") + public R userAutoWalletTransation(@RequestParam Long userId) { + return R.ok(walletRuleTransactionService.userAutoWalletTransation(userId)); + } + + /* ************************************* end 远程调用 end ************************************* */ + /* ************************************* start app start ************************************* */ @Operation(summary = "app转账", description = "app转账") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/WalletThirdZyController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/WalletThirdZyController.java index 60d452b56..5d8260727 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/WalletThirdZyController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/third/WalletThirdZyController.java @@ -1,6 +1,7 @@ package com.bsd.pjcloud.wallet.controller.third; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.service.WalletThirdZyService; import io.swagger.v3.oas.annotations.Operation; @@ -9,9 +10,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -25,6 +24,18 @@ public class WalletThirdZyController { private final WalletThirdZyService walletThirdZyService; + /* ************************************* start 远程调用 start ************************************* */ + + @Inner + @PostMapping("/sync-user") + @Operation(summary = "同步全部用户") + public R syncUserById(@RequestParam Long userId) { + walletThirdZyService.syncAllUser(userId); + return R.ok(); + } + + /* ************************************* end 远程调用 end ************************************* */ + @GetMapping("/sync-all-mch") @Operation(summary = "同步全部商户") public R syncAllMch() { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/MchManageMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/MchManageMapper.java index b8546cfed..4d32b7176 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/MchManageMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/MchManageMapper.java @@ -2,9 +2,7 @@ package com.bsd.pjcloud.wallet.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.core.util.BeanUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.wallet.api.dto.MchManageDto; @@ -14,6 +12,7 @@ import com.github.yulichang.query.MPJLambdaQueryWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -25,6 +24,8 @@ public interface MchManageMapper extends PjcloudBaseMapper { .selectAll(MchManageEntity.class) .eqIfExists(MchManageEntity::getVisibleMobile, dto.getVisibleMobile()) .eqIfExists(MchManageEntity::getParentId, dto.getParentId()) + .eqIfExists(MchManageEntity::getCatgoryId, dto.getCatgoryId()) + .eqIfExists(MchManageEntity::getCanteenIsOpen, dto.getCanteenIsOpen()) .eq(dto.getParentIsNull(), MchManageEntity::getParentId, -1L) .likeIfExists(MchManageEntity::getName, dto.getName()) .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), MchManageEntity::getDeptId, dto.getDeptIds()) @@ -42,52 +43,7 @@ public interface MchManageMapper extends PjcloudBaseMapper { return selectJoinOne(MchManageVo.class, wrapper); } - default List list(MchManageDto dto) { - MPJLambdaQueryWrapper wrapper = new MPJLambdaQueryWrapper() - .selectAll(MchManageEntity.class) - .eq(ObjectUtil.isNotEmpty(dto.getIsSyncZy()), MchManageEntity::getIsSyncZy, dto.getIsSyncZy()) - .eq(ObjectUtil.isNotEmpty(dto.getVisibleMobile()), MchManageEntity::getVisibleMobile, dto.getVisibleMobile()) - .eq(ObjectUtil.isNotEmpty(dto.getId()), MchManageEntity::getId, dto.getId()) - .eq(ObjectUtil.isNotEmpty(dto.getParentId()), MchManageEntity::getParentId, dto.getParentId()) - .eq(ObjectUtil.isNotEmpty(dto.getDeptId()), MchManageEntity::getDeptId, dto.getDeptId()) - .likeIfExists(MchManageEntity::getName, dto.getName()) - .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), MchManageEntity::getDeptId, dto.getDeptIds()) - .in(ObjectUtil.isNotEmpty(dto.getIds()), MchManageEntity::getId, dto.getIds()) - .orderByDesc(MchManageEntity::getSort) - .orderByDesc(MchManageEntity::getCreateTime) - .orderByDesc(MchManageEntity::getId); - return selectJoinList(MchManageVo.class, wrapper); - } + List scopeList(@Param("dto") MchManageDto dto, DataScope dataScope); - default Page scopePageList(Page page, MchManageDto dto) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .eq(ObjectUtil.isNotEmpty(dto.getTypes()), MchManageEntity::getTypes, dto.getTypes()) - .eq(ObjectUtil.isNotEmpty(dto.getVisibleMobile()), MchManageEntity::getVisibleMobile, dto.getVisibleMobile()) - .eq(ObjectUtil.isNotEmpty(dto.getIsSyncZy()), MchManageEntity::getIsSyncZy, dto.getIsSyncZy()) - .eq(ObjectUtil.isNotEmpty(dto.getDeptId()), MchManageEntity::getDeptId, dto.getDeptId()) - .eq(ObjectUtil.isNotEmpty(dto.getSupType()), MchManageEntity::getSupType, dto.getSupType()) - .eq(ObjectUtil.isNotEmpty(dto.getParentId()), MchManageEntity::getParentId, dto.getParentId()) - .eq(dto.getParentIsNull(), MchManageEntity::getParentId, -1L) - .like(ObjectUtil.isNotEmpty(dto.getName()), MchManageEntity::getName, dto.getName()) - .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), MchManageEntity::getDeptId, dto.getDeptIds()) - .in(ObjectUtil.isNotEmpty(dto.getIds()), MchManageEntity::getId, dto.getIds()) - .in(ObjectUtil.isNotEmpty(dto.getNotIds()), MchManageEntity::getId, dto.getNotIds()) - .orderByDesc(MchManageEntity::getSort) - .orderByDesc(MchManageEntity::getDeptId) - .orderByDesc(MchManageEntity::getCreateTime); - Page list = selectPageByScope(page, wrapper, DataScope.of()); - list.setRecords(BeanUtils.toBean(list.getRecords(), MchManageVo.class)); - return list; - } - - default List scopeList(MchManageDto dto) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .like(ObjectUtil.isNotEmpty(dto.getName()), MchManageEntity::getName, dto.getName()) - .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), MchManageEntity::getDeptId, dto.getDeptIds()) - .in(ObjectUtil.isNotEmpty(dto.getIds()), MchManageEntity::getId, dto.getIds()) - .orderByDesc(MchManageEntity::getSort) - .orderByDesc(MchManageEntity::getCreateTime) - .orderByDesc(MchManageEntity::getId); - return selectListByScope(wrapper, DataScope.of()); - } + Page scopePageList(@Param("dto") MchManageDto dto, Page page, DataScope dataScope); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletForeignMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletForeignMapper.java index 17a47b352..36b41c650 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletForeignMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletForeignMapper.java @@ -21,8 +21,10 @@ public interface WalletForeignMapper extends PjcloudBaseMapper wrapper = new MPJLambdaWrapper() .selectAll(WalletForeignEntity.class) .eqIfExists(WalletForeignEntity::getProcessStatus, dto.getProcessStatus()) + .eqIfExists(WalletForeignEntity::getUserId, dto.getUserId()) .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), WalletForeignEntity::getDeptId, dto.getDeptIds()) .in(ObjectUtil.isNotEmpty(dto.getUserIds()), WalletForeignEntity::getUserId, dto.getUserIds()) + .ne(!dto.getIsFindUsed(), WalletForeignEntity::getCount, WalletForeignEntity::getUseCount) .orderByDesc(WalletForeignEntity::getCreateTime) .orderByDesc(WalletForeignEntity::getId); return selectJoinPage(page, WalletForeignVo.class, wrapper); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java index d3944ba12..062dd060a 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletManageMapper.java @@ -10,6 +10,7 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto; import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTopupActionDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.entity.WalletTypeEntity; import com.bsd.pjcloud.wallet.api.vo.WalletManageBalanceVo; @@ -59,12 +60,15 @@ public interface WalletManageMapper extends PjcloudBaseMapper lambdaUpdateWrapper = new LambdaUpdateWrapper() .setSql(" balance = balance - " + price + ", total_expense = total_expense + " + price) - .eq(WalletManageEntity::getId, id) - .ge(WalletManageEntity::getBalance, price); + .eq(WalletManageEntity::getId, id); + if (ObjectUtil.isEmpty(force) || !force) { + lambdaUpdateWrapper.ge(WalletManageEntity::getBalance, price); + } return update(null, lambdaUpdateWrapper); } @@ -159,4 +163,8 @@ public interface WalletManageMapper extends PjcloudBaseMapper scopeUserList(@Param("dto") WalletManageDto dto, @Param("dataScope") DataScope dataScope); List selectBalance(@Param("dto") WalletManageBalanceDto walletDto); + + Page activeBalancePage(Page page, @Param("dto") WalletTopupActionDto dto, @Param("unactiveDayNumberStr") String unactiveDayNumberStr); + + List activeBalanceList(@Param("dto") WalletTopupActionDto dto, @Param("unactiveDayNumberStr") String unactiveDayNumberStr); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletStrideMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletStrideMapper.java index 4f60f2fcb..5697fed3d 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletStrideMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletStrideMapper.java @@ -8,6 +8,7 @@ import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.wallet.api.dto.WalletStrideDto; +import com.bsd.pjcloud.wallet.api.entity.WalletForeignEntity; import com.bsd.pjcloud.wallet.api.entity.WalletStrideEntity; import com.bsd.pjcloud.wallet.api.vo.WalletStrideVo; import com.github.yulichang.wrapper.MPJLambdaWrapper; @@ -21,8 +22,10 @@ public interface WalletStrideMapper extends PjcloudBaseMapper wrapper = new MPJLambdaWrapper() .selectAll(WalletStrideEntity.class) .eqIfExists(WalletStrideEntity::getProcessStatus, dto.getProcessStatus()) + .eqIfExists(WalletStrideEntity::getUserId, dto.getUserId()) .in(ObjectUtil.isNotEmpty(dto.getDeptIds()), WalletStrideEntity::getDeptId, dto.getDeptIds()) .in(ObjectUtil.isNotEmpty(dto.getUserIds()), WalletStrideEntity::getUserId, dto.getUserIds()) + .ne(!dto.getIsFindUsed(), WalletForeignEntity::getCount, WalletForeignEntity::getUseCount) .orderByDesc(WalletStrideEntity::getCreateTime) .orderByDesc(WalletStrideEntity::getId); return selectJoinPage(page, WalletStrideVo.class, wrapper); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java index dcb2c0416..b124fe95a 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/WalletTransactionMapper.java @@ -99,6 +99,8 @@ public interface WalletTransactionMapper extends PjcloudBaseMapper scopeJzPageList(Page page, @Param("dto") WalletTransactionDto dto, DataScope dataScope); + Integer getTransactionPriceCount(@Param("month") String importTimeStr, @Param("walletId") Long walletId, @Param("bizType") String bizType); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchCatgoryMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchCatgoryMapper.java new file mode 100644 index 000000000..724ce58dd --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchCatgoryMapper.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.wallet.mapper.mch; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCatgoryEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MchCatgoryMapper extends PjcloudBaseMapper { + + +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchCheckoutMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchCheckoutMapper.java new file mode 100644 index 000000000..83a2d5976 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/MchCheckoutMapper.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.wallet.mapper.mch; + +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.wallet.api.dto.mch.MchCheckoutDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCheckoutEntity; +import com.bsd.pjcloud.wallet.api.vo.mch.MchCheckoutVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface MchCheckoutMapper extends PjcloudBaseMapper { + + Page scopPageList(Page page, @Param("dto") MchCheckoutDto dto, DataScope dataScope); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/WalletRuleMchConfigMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/WalletRuleMchConfigMapper.java index 8e7b144ed..b05677408 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/WalletRuleMchConfigMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/mch/WalletRuleMchConfigMapper.java @@ -9,10 +9,14 @@ import com.bsd.pjcloud.wallet.api.vo.mch.MchRuleJoinDtoVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + @Mapper public interface WalletRuleMchConfigMapper extends PjcloudBaseMapper { Page pageScopeList(Page page, @Param("dto") MchRuleJoinDto dto, DataScope dataScope); + List scopeList(@Param("dto") MchRuleJoinDtoEntity dto, DataScope dataScope); + MchRuleJoinDtoVo joinDetail(@Param("id") Long id); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargeApplyMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargeApplyMapper.java index 667bf45bf..555fe42d0 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargeApplyMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargeApplyMapper.java @@ -16,37 +16,17 @@ import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface WalletRechargeApplyMapper extends PjcloudBaseMapper { - default Page pageJoin(Page page, WalletRechargeApplyDto dto) { - MPJLambdaWrapper wrapper = new MPJLambdaWrapper() - .selectAll(WalletRechargeApplyEntity.class) - .selectAs(WalletTypeEntity::getName, WalletRechargeApplyVo::getWalletTypeName) - .selectAs(WalletTypeEntity::getUniqueCode, WalletRechargeApplyVo::getWalletTypeUniqueCode) - .leftJoin(WalletTypeEntity.class, WalletTypeEntity::getId, WalletRechargeApplyEntity::getWalletTypeId) - .eqIfExists(WalletRechargeApplyEntity::getWalletTypeId, dto.getWalletTypeId()) - .in(ObjectUtil.isNotEmpty(dto.getUserIds()), WalletManageEntity::getUserId, dto.getUserIds()) - .in(ObjectUtil.isNotEmpty(dto.getWalletTypeIds()), WalletManageEntity::getWalletTypeId, dto.getWalletTypeIds()) - .between( - ObjectUtil.isNotEmpty(dto.getCreateTimeList()), - WalletRechargeApplyEntity::getCreateTime, - ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[0] : null, - ObjectUtil.isNotEmpty(dto.getCreateTimeList()) ? dto.getCreateTimeList()[1] : null - ) - .between( - ObjectUtil.isNotEmpty(dto.getProcessTimeList()), - WalletRechargeApplyEntity::getProcessTime, - ObjectUtil.isNotEmpty(dto.getProcessTimeList()) ? dto.getProcessTimeList()[0] : null, - ObjectUtil.isNotEmpty(dto.getProcessTimeList()) ? dto.getProcessTimeList()[1] : null - ) - .orderByDesc(WalletRechargeApplyEntity::getCreateTime) - .orderByDesc(WalletRechargeApplyEntity::getId); - return selectJoinPage(page, WalletRechargeApplyVo.class, wrapper); - } + + Page scopePageList(Page page, @Param("dto") WalletRechargeApplyDto dto, DataScope dataScope); + + Page pageJoin(Page page, @Param("dto") WalletRechargeApplyDto dto, DataScope dataScope); default Page scopePageList(Page page, WalletRechargeApplyDto dto) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper() @@ -71,8 +51,9 @@ public interface WalletRechargeApplyMapper extends PjcloudBaseMapper { + + /** + * 查询所有数量包括删除 + */ + Long selectAllCount(); + + /** + * 分页权限查询 + */ + Page scopePageList(Page page, @Param("dto") WalletRechargeBindInvoiceDto dto, DataScope dataScope); + + /** + * 查询详情 + */ + WalletRechargeInvoiceVo joinById(@Param("id") Long id); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargePackageMapper.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargePackageMapper.java index 4696e6b29..61a972cba 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargePackageMapper.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/mapper/recharge/WalletRechargePackageMapper.java @@ -3,9 +3,7 @@ package com.bsd.pjcloud.wallet.mapper.recharge; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargePackageDto; -import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargePackageEntity; -import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargePackageVo; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.ibatis.annotations.Mapper; diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchCatgoryService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchCatgoryService.java new file mode 100644 index 000000000..c25357784 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchCatgoryService.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCatgoryEntity; + +public interface MchCatgoryService extends IService { + + /** + * 新增 + */ + Long create(MchCatgoryEntity dto); + + /** + * 编辑 + */ + Long edit(MchCatgoryEntity dto); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchCheckoutService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchCheckoutService.java new file mode 100644 index 000000000..b11308fee --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchCheckoutService.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.wallet.api.dto.mch.MchCheckoutDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCheckoutEntity; +import com.bsd.pjcloud.wallet.api.vo.mch.MchCheckoutVo; + +public interface MchCheckoutService extends IService { + + Page scopPageList(Page page, MchCheckoutDto dto, DataScope dataScope); + + Long create(MchCheckoutEntity mchCheckout, PjcloudUser user); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java index 0717bb805..c758cb761 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchManageService.java @@ -3,6 +3,8 @@ package com.bsd.pjcloud.wallet.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.wallet.api.dto.MchManageDto; import com.bsd.pjcloud.wallet.api.entity.mch.MchManageEntity; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; @@ -25,9 +27,9 @@ public interface MchManageService extends IService { /** * 分页级联 */ - Page cascadeJoin(Page page, MchManageDto dto); + Page cascadeJoin(Page page, MchManageDto dto, DataScope dataScope); - Page scopePageList(Page page, MchManageDto dto); + Page scopePageList(Page page, MchManageDto dto, DataScope dataScope); MchManageVo join(Long id); @@ -35,12 +37,22 @@ public interface MchManageService extends IService { MchManageVo getByDeptId(Long deptId, MerchantTypeEnum type); - MchManageVo getFirstMch(List deptIds); + MchManageVo getFirstMch(List deptIds, MerchantTypeEnum mchType); - MchManageVo getFirstMchByDeptId(Long deptId); + MchManageVo getFirstMchByDeptId(Long deptId, MerchantTypeEnum mchType); /** * 刷新商户二维码 */ void refreshQrcode(Long mchId); + + /** + * 宁波银行登录 + */ + String lbLogin(PjcloudUser user); + + /** + * 判断用户是否能查看到所有食堂 + */ + boolean getIsConsumeUser(Long id); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchRuleJoinControllerService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchRuleJoinService.java similarity index 82% rename from pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchRuleJoinControllerService.java rename to pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchRuleJoinService.java index de57848ad..332c0f5cf 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchRuleJoinControllerService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/MchRuleJoinService.java @@ -8,14 +8,17 @@ import com.bsd.pjcloud.wallet.api.entity.mch.MchRuleJoinDtoEntity; import com.bsd.pjcloud.wallet.api.vo.mch.MchRuleJoinDtoVo; import java.util.ArrayList; +import java.util.List; -public interface MchRuleJoinControllerService extends IService { +public interface MchRuleJoinService extends IService { /** * 权限分页查询 */ Page pageScopeList(Page page, MchRuleJoinDto dto, DataScope dataScope); + List scopeList(MchRuleJoinDtoEntity dto, DataScope dataScope); + /** * 新增 */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletFreezeService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletFreezeService.java index 8e1fcd4a4..0b5af045b 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletFreezeService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletFreezeService.java @@ -16,8 +16,6 @@ public interface WalletFreezeService extends IService { Page scopePageList(Page page, WalletFreezeDto dto); - Long create(WalletFreezeDto dto); - void applyCallback(ProcessNodeRecordAssignUserParamDto dto); void applyFreeze(WalletFreezeDto dto, PjcloudUser user); 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 7d5524869..11a6bbfec 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 @@ -6,6 +6,7 @@ import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto; import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTopupActionDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; import jakarta.servlet.http.HttpServletResponse; @@ -51,6 +52,11 @@ public interface WalletManageService extends IService { */ WalletManageEntity getWallet(@NotNull Long walletId); + /** + * 根据手机号获取钱包 + */ + WalletManageVo getWalletByPhone(String phone, WalletTypeEnum walletTypeCode); + /** * 根据用户id删除用户钱包 */ @@ -62,6 +68,16 @@ public interface WalletManageService extends IService { Page scopeQbPage(Page page, WalletManageBalanceDto dto, DataScope dataScope); + /** + * 不活跃用户钱包 + */ + Page pageJoinActive(Page page, WalletTopupActionDto dto, DataScope dataScope); + + /** + * 不活跃用户钱包 + */ + List pageListActive(WalletTopupActionDto dto, DataScope dataScope); + List scopeQbList(WalletManageBalanceDto dto, DataScope dataScope); WalletManageVo join(Long walletId); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyComposeService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyComposeService.java index 1b0298d92..c25cc80e5 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyComposeService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyComposeService.java @@ -2,10 +2,10 @@ package com.bsd.pjcloud.wallet.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeSaveTopupDto; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyCompareAceVo; public interface WalletRechargeApplyComposeService { WalletRechargeApplyCompareAceVo pageJoin(Page page, WalletRechargeApplyDto dto); - } 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 dabffccd0..580910a24 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 @@ -3,48 +3,59 @@ package com.bsd.pjcloud.wallet.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeSaveTopupDto; import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo; import org.springframework.validation.BindingResult; +import java.util.ArrayList; import java.util.List; public interface WalletRechargeApplyService extends IService { + /** + * 新增充值 + */ + void saveTopup(WalletRechargeSaveTopupDto dto); + void create(WalletRechargeApplyEntity dto); Boolean edit(WalletRechargeApplyDto dto); - Page pageJoin(Page page, WalletRechargeApplyDto dto); + /** + * 通过id删除充值/扣款申请 + */ + void delByIds(ArrayList list); - Page scopePageList(Page page, WalletRechargeApplyDto dto); + Page pageJoin(Page page, WalletRechargeApplyDto dto, DataScope dataScope); + + Page scopePageList(Page page, WalletRechargeApplyDto dto, DataScope dataScope); /** * 提交申请 - * - * @param id */ void apply(Long id); /** * 取消申请 - * - * @param dto */ void cancelApply(WalletRechargeApplyDto dto); /** - * 读取excel内容 - * - * @param excelVOList - * @param bindingResult + * 读取记账扣款、退回各自食堂excel内容 */ - R readExcel(List excelVOList, BindingResult bindingResult); + R readExcel(List excelVOList, BindingResult bindingResult, String bizType); + + /** + * 读取充值excel内容 + */ + R readTopupExcel(List excelVOList, BindingResult bindingResult); /** * 审批回调 diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeInvoiceService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeInvoiceService.java new file mode 100644 index 000000000..43b5155ae --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeInvoiceService.java @@ -0,0 +1,77 @@ +package com.bsd.pjcloud.wallet.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeBindInvoiceDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeInvoiceApplyDto; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeInvoiceEntity; +import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeInvoiceVo; +import jakarta.validation.Valid; + +import java.util.ArrayList; + +public interface WalletRechargeInvoiceService extends IService { + + /** + * 退回作废发票 + */ + void backInvoice(Long id); + + /** + * 分页查询 + */ + Page scopePageList(Page page, WalletRechargeBindInvoiceDto dto, DataScope dataScope); + + /** + * 查询详情 + */ + WalletRechargeInvoiceVo joinById(Long id); + + /** + * 批量充值/扣款发票信息 + */ + WalletRechargeInvoiceVo getInvoice(Long id); + + /** + * 获取发票代码 + */ + String getInvoiceCode(); + + /** + * 绑定发票 + */ + void bindInvoice(@Valid WalletRechargeBindInvoiceDto dto); + + /** + * 创建基础发票 + */ + WalletRechargeInvoiceEntity createBaseInvoice(PjcloudUser loginUser, Integer totalPrice); + + /** + * 编辑发票 + */ + Long edit(WalletRechargeInvoiceEntity dto); + + /** + * 批量删除发票 + */ + void delByIds(ArrayList list); + + /** + * 发票申请回调 + */ + void applyCallback(ProcessNodeRecordAssignUserParamDto dto, Long tenantId); + + /** + * 发票申请 + */ + void apply(@Valid WalletRechargeInvoiceApplyDto body); + + /** + * 生成盖章图片 + */ + String stamp(WalletRechargeInvoiceEntity invoice); +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRuleTransactionService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRuleTransactionService.java index 354858a87..dc5298f9f 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRuleTransactionService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRuleTransactionService.java @@ -16,6 +16,11 @@ public interface WalletRuleTransactionService extends IService scopePageList(Page page, WalletRuleTransactionDto dto, DataScope dataScope); + /** + * 离职退休自动转到消费钱包 + */ + Boolean userAutoWalletTransation(Long userId); + /** * 转账 */ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java index 03b90d82b..62ceb1eb8 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletTransactionService.java @@ -16,6 +16,11 @@ public interface WalletTransactionService extends IService scopePageList(Page page, WalletTransactionDto dto, DataScope dataScope); + /** + * 记账列表 + */ + Page scopeJzPageList(Page page, WalletTransactionDto dto, DataScope dataScope); + List scopeList(WalletTransactionDto dto, DataScope dataScope); /** @@ -27,7 +32,7 @@ public interface WalletTransactionService extends IService wrapper = new LambdaQueryWrapper() .isNull(WalletActiveEntity::getUserId) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java index 358d20d18..1c473ed77 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletCodeUseServiceImpl.java @@ -21,17 +21,17 @@ import com.bsd.pjcloud.hard.api.dto.code.QRCodeExtraDto; 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.entity.WalletForeignEntity; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.entity.WalletStrideEntity; import com.bsd.pjcloud.wallet.api.vo.WalletCodeUseVo; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; import com.bsd.pjcloud.wallet.mapper.WalletCodeUseMapper; -import com.bsd.pjcloud.wallet.service.WalletCodeUseService; +import com.bsd.pjcloud.wallet.service.*; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.hard.api.dto.code.QRCodeDto; import com.bsd.pjcloud.hard.api.utils.HardUtil; -import com.bsd.pjcloud.wallet.service.WalletManageService; -import com.bsd.pjcloud.wallet.service.WalletSettingService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; @@ -67,6 +67,10 @@ public class WalletCodeUseServiceImpl extends ServiceImpl code = HardUtil.generate(dto); - byte[] bytes = QRCodeImageGenerator.generateQrCodeImage(code.getRight(), 1024); + // 生成短码 + String shortCode = generateShortCode(code.getRight()); + byte[] bytes = QRCodeImageGenerator.generateQrCodeImage(shortCode, 1024); MultipartFile multipartFile = new MockMultipartFile("file", code.getLeft() + ".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"); - // 生成短码 - String shortCode = generateShortCode(code.getRight()); // 更新 WalletCodeUseEntity updateObj = WalletCodeUseEntity.builder().id(item.getId()).code(url).codeContent(code.getRight()).shortCode(shortCode).build(); baseMapper.updateById(updateObj); @@ -184,21 +200,43 @@ public class WalletCodeUseServiceImpl extends ServiceImpl() .eq(WalletCodeUseEntity::getBizId, id) + .eq(WalletCodeUseEntity::getStatus, YesNoEnum.NO.getCode()) + .last(" limit 1") + .orderByDesc(WalletCodeUseEntity::getCreateTime) + .orderByDesc(WalletCodeUseEntity::getId) ); if (ObjectUtil.isEmpty(codeUse)) return null; if (ObjectUtil.equals(codeUse.getStatus(), YesNoEnum.YES.getCode())) return false; WalletCodeUseEntity updateObj = WalletCodeUseEntity.builder().id(codeUse.getId()).status(YesNoEnum.YES.getCode()).useTime(LocalDateTime.now()).build(); + // 如果是跨单位或者外来人员增加使用数量 + // 跨单位 + if (ObjectUtil.equals(codeUse.getBizType(), WalletCodeBizEnum.STRIDE.getCode())) { + WalletStrideEntity strideDetail = walletStrideService.getById(codeUse.getBizId()); + if (ObjectUtil.isNotEmpty(strideDetail)) { + WalletStrideEntity useUpdateObj = WalletStrideEntity.builder().id(strideDetail.getId()).useCount(strideDetail.getUseCount() + 1).build(); + walletStrideService.updateById(useUpdateObj); + } + } + // 外来人员 + if (ObjectUtil.equals(codeUse.getBizType(), WalletCodeBizEnum.FOREIGN.getCode())) { + WalletForeignEntity foreignDetail = walletForeignService.getById(codeUse.getBizId()); + if (ObjectUtil.isNotEmpty(foreignDetail)) { + WalletForeignEntity useUpdateObj = WalletForeignEntity.builder().id(foreignDetail.getId()).useCount(foreignDetail.getUseCount() + 1).build(); + walletForeignService.updateById(useUpdateObj); + } + } return baseMapper.updateById(updateObj) > 0; } @Override @Transactional(rollbackFor = Exception.class) public Boolean isCancelCode(Long id) { - WalletCodeUseEntity codeUse = baseMapper.selectOne(new LambdaQueryWrapper() + // 跨单位和外来人员有多张二维码 + Long count = baseMapper.selectCount(new LambdaQueryWrapper() .eq(WalletCodeUseEntity::getBizId, id) + .eq(WalletCodeUseEntity::getStatus, YesNoEnum.NO.getCode()) ); - if (ObjectUtil.isEmpty(codeUse)) return null; - return ObjectUtil.equals(codeUse.getStatus(), YesNoEnum.YES.getCode()); + return count <= 0; } /** 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 aa67676a0..19ca7c999 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 @@ -15,9 +15,10 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.R; -import com.bsd.pjcloud.flow.task.constant.NodeStatusEnum; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum; import com.bsd.pjcloud.wallet.api.dto.WalletForeignDto; import com.bsd.pjcloud.wallet.api.entity.WalletForeignEntity; @@ -59,6 +60,7 @@ public class WalletForeignServiceImpl extends ServiceImpl pageJoin(Page page, WalletForeignDto dto) { Page list = baseMapper.pageJoin(page, dto); - if (ObjectUtil.isNotEmpty(list.getRecords())) { - // 用户 - List userIds = list.getRecords().stream().map(WalletForeignVo::getUserId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> userList = userService.getUserById(new ArrayList<>(userIds)); - if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(list.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); - } - } - // 部门 - List deptIds = list.getRecords().stream().map(WalletForeignVo::getDeptId).distinct().toList(); - if (ObjectUtil.isNotEmpty(deptIds)) { - R> deptList = deptService.getDeptByDeptIds(deptIds); - if (ObjectUtil.isNotEmpty(deptList.getData())) { - DataUtil.convertDeptList(list.getRecords(), deptList.getData()); - } - } - } + disposeList(list.getRecords(), dto); return list; } @Override public Page scopePageList(Page page, WalletForeignDto dto) { Page list = baseMapper.scopePageList(page, dto); - if (ObjectUtil.isNotEmpty(list.getRecords())) { - // 用户 - List userIds = list.getRecords().stream().map(WalletForeignVo::getUserId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> userList = userService.getUserById(new ArrayList<>(userIds)); - if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(list.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); - } - } - // 部门 - List deptIds = list.getRecords().stream().map(WalletForeignVo::getDeptId).distinct().toList(); - if (ObjectUtil.isNotEmpty(deptIds)) { - R> deptList = deptService.getDeptByDeptIds(deptIds); - if (ObjectUtil.isNotEmpty(deptList.getData())) { - DataUtil.convertDeptList(list.getRecords(), deptList.getData()); - } - } - } + disposeList(list.getRecords(), dto); return list; } @@ -173,8 +141,45 @@ public class WalletForeignServiceImpl extends ServiceImpl() .eq(WalletForeignEntity::getUserId, walletId) - .eq(WalletForeignEntity::getProcessStatus, NodeStatusEnum.JXZ.getCode()) + .eq(WalletForeignEntity::getProcessStatus, TaskCheckStatusEnum.PADDING.getCode()) ); return count > 0; } + + private void disposeList(List list, WalletForeignDto dto) { + if (ObjectUtil.isEmpty(list)) return; + // 用户 + List userIds = list.stream().map(WalletForeignVo::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)); + } + } + // 部门 + List deptIds = list.stream().map(WalletForeignVo::getDeptId).distinct().toList(); + if (ObjectUtil.isNotEmpty(deptIds)) { + R> deptList = deptService.getDeptByDeptIds(deptIds); + if (ObjectUtil.isNotEmpty(deptList.getData())) { + DataUtil.convertDeptList(list, deptList.getData()); + } + } + // 审批 + if (dto.getIsFindCheckUser()) { + List processInstanceIds = list.stream().map(WalletForeignVo::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; + }); + } + } + } + } } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletFreezeServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletFreezeServiceImpl.java index b58b9750a..6b54d5dae 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletFreezeServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletFreezeServiceImpl.java @@ -19,10 +19,11 @@ 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.common.security.util.SecurityUtils; import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService; -import com.bsd.pjcloud.flow.task.constant.NodeStatusEnum; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.flow.task.dto.TaskParamDto; import com.bsd.pjcloud.wallet.api.constant.WalleCardStatusEnum; import com.bsd.pjcloud.wallet.api.dto.WalletFreezeDto; @@ -71,24 +72,7 @@ public class WalletFreezeServiceImpl extends ServiceImpl pageJoin(Page page, WalletFreezeDto dto) { Page list = baseMapper.pageJoin(page, dto); - if (ObjectUtil.isNotEmpty(list.getRecords())) { - // 用户 - List userIds = list.getRecords().stream().map(WalletFreezeVo::getUserId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> userList = userService.getUserById(new ArrayList<>(userIds)); - if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(page.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); - } - } - // 部门 - List deptIds = list.getRecords().stream().map(WalletFreezeVo::getDeptId).distinct().toList(); - if (ObjectUtil.isNotEmpty(deptIds)) { - R> deptList = deptService.getDeptByDeptIds(deptIds); - if (ObjectUtil.isNotEmpty(deptList.getData())) { - DataUtil.convertDeptList(page.getRecords(), deptList.getData()); - } - } - } + disposeList(list.getRecords(), dto); return list; } @@ -97,51 +81,10 @@ public class WalletFreezeServiceImpl extends ServiceImpl list = baseMapper.scopePageList(page, dto, dataScope); - if (ObjectUtil.isNotEmpty(list.getRecords())) { - // 用户 - List userIds = list.getRecords().stream().map(WalletFreezeVo::getUserId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> userList = userService.getUserById(new ArrayList<>(userIds)); - if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(page.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); - } - } - // 部门 - List deptIds = list.getRecords().stream().map(WalletFreezeVo::getDeptId).distinct().toList(); - if (ObjectUtil.isNotEmpty(deptIds)) { - R> deptList = deptService.getDeptByDeptIds(deptIds); - if (ObjectUtil.isNotEmpty(deptList.getData())) { - DataUtil.convertDeptList(page.getRecords(), deptList.getData()); - } - } - } + disposeList(list.getRecords(), dto); return list; } - @Override - @Transactional(rollbackFor = Exception.class) - public Long create(WalletFreezeDto dto) { - // 查询发起人 - UserInfo userData = userService.getInnerByUserId(dto.getUserId()).getData(); - if (ObjectUtil.isEmpty(userData)) throw new RuntimeException("发起人不存在"); - // 判断之前有没有在审核的 - if (isCheckData(dto.getUserId())) throw new RuntimeException("已提交申请,请勿重复提交"); - // 查询钱包 - WalletManageEntity wallet = walletManageService.getWallet(dto.getUserId(), dto.getWalletTypeId()); - if (ObjectUtil.isEmpty(wallet)) throw new RuntimeException("用户钱包不存在"); - dto.setDeptId(userData.getSysUser().getDeptId()); - dto.setFreeStatus(YesNoEnum.NO.getCode()); - dto.setWalletId(wallet.getId()); - dto.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); - // 查询部门 - SysDept dept = deptService.getDeptByDeptId(dto.getDeptId()).getData(); - if (ObjectUtil.isEmpty(dept)) throw new RuntimeException("发起人部门不存在"); - baseMapper.insert(dto); - // 发起审批 - getSelf().applyFlow(userData, dept, wallet, dto); - return dto.getId(); - } - @Override @Transactional(rollbackFor = Exception.class) public void applyCallback(ProcessNodeRecordAssignUserParamDto dto) { @@ -173,7 +116,7 @@ public class WalletFreezeServiceImpl extends ServiceImpl() .eq(WalletFreezeEntity::getUserId, walletId) - .eq(WalletFreezeEntity::getProcessStatus, NodeStatusEnum.JXZ.getCode()) + .eq(WalletFreezeEntity::getProcessStatus, TaskCheckStatusEnum.PADDING.getCode()) ); return count > 0; } + private void disposeList(List list, WalletFreezeDto dto) { + if (ObjectUtil.isEmpty(list)) return; + // 用户 + List userIds = list.stream().map(WalletFreezeVo::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)); + } + } + // 部门 + List deptIds = list.stream().map(WalletFreezeVo::getDeptId).distinct().toList(); + if (ObjectUtil.isNotEmpty(deptIds)) { + R> deptList = deptService.getDeptByDeptIds(deptIds); + if (ObjectUtil.isNotEmpty(deptList.getData())) { + DataUtil.convertDeptList(list, deptList.getData()); + } + } + // 审批 + if (dto.getIsFindCheckUser()) { + List processInstanceIds = list.stream().map(WalletFreezeVo::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; + }); + } + } + } + } + private WalletFreezeServiceImpl getSelf() { return SpringUtil.getBean(getClass()); } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java index e3b91f3e1..303ad5262 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletManageServiceImpl.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.wallet.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.resource.ResourceUtil; @@ -22,14 +23,17 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.CommonRoleConstant; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.resolver.ParamResolver; +import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; import com.bsd.pjcloud.wallet.api.dto.WalletManageBalanceDto; import com.bsd.pjcloud.wallet.api.dto.WalletManageDto; +import com.bsd.pjcloud.wallet.api.dto.WalletTopupActionDto; import com.bsd.pjcloud.wallet.api.dto.WalletTypeDto; import com.bsd.pjcloud.wallet.api.entity.*; import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; @@ -47,6 +51,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -177,6 +182,25 @@ public class WalletManageServiceImpl extends ServiceImpl userIds) { if (ObjectUtil.isEmpty(userIds)) return false; @@ -201,14 +225,14 @@ public class WalletManageServiceImpl extends ServiceImpl scopeList(WalletManageDto dto, DataScope dataScope) { List list = baseMapper.scopeList(dto, dataScope); - disposeList(list, dto); + disposeList(list); return list; } @Override public Page scopePageList(Page page, WalletManageDto dto, DataScope dataScope) { Page list = baseMapper.scopePage(page, dto, dataScope); - disposeList(list.getRecords(), dto); + disposeList(list.getRecords()); return list; } @@ -278,10 +302,38 @@ public class WalletManageServiceImpl extends ServiceImpl pageJoinActive(Page page, WalletTopupActionDto dto, DataScope dataScope) { + if (ObjectUtil.isEmpty(dto.getUnactiveMonthsNumber())) { + dto.setUnactiveMonthsNumber(3L); + } + String unactiveDayNumberStr = LocalDateTimeUtil.format(LocalDateTimeUtil.now().minusMonths(dto.getUnactiveMonthsNumber()), DatePattern.NORM_DATE_PATTERN); + Page pageList = baseMapper.activeBalancePage(page, dto, unactiveDayNumberStr); + disposeList(pageList.getRecords()); + return pageList; + } + + /** + * 不活跃用户钱包 + */ + @Override + public List pageListActive(WalletTopupActionDto dto, DataScope dataScope) { + if (ObjectUtil.isEmpty(dto.getUnactiveMonthsNumber())) { + dto.setUnactiveMonthsNumber(3L); + } + String unactiveDayNumberStr = LocalDateTimeUtil.format(LocalDateTimeUtil.now().minusMonths(dto.getUnactiveMonthsNumber()), DatePattern.NORM_DATE_PATTERN); + List list = baseMapper.activeBalanceList(dto, unactiveDayNumberStr); + disposeList(list); + return list; + } + @Override public List scopeQbList(WalletManageBalanceDto dto, DataScope dataScope) { WalletManageDto walletDto = BeanUtils.toBean(dto, WalletManageDto.class); @@ -314,7 +366,7 @@ public class WalletManageServiceImpl extends ServiceImpl() .set(WalletActiveEntity::getMerchantId, mch.getId()) @@ -470,7 +522,7 @@ public class WalletManageServiceImpl extends ServiceImpl list, WalletManageDto dto) { + private void disposeList(List list) { if (ObjectUtil.isNotEmpty(list)) { // 用户 List userIds = list.stream().map(WalletManageVo::getUserId).distinct().toList(); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletSettingServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletSettingServiceImpl.java index 897b7d639..7347045ee 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletSettingServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletSettingServiceImpl.java @@ -3,22 +3,22 @@ package com.bsd.pjcloud.wallet.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.wallet.api.dto.WalletSettingDto; import com.bsd.pjcloud.wallet.api.entity.WalletSettingEntity; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; import com.bsd.pjcloud.wallet.mapper.WalletSettingMapper; +import com.bsd.pjcloud.wallet.service.MchRuleJoinService; +import com.bsd.pjcloud.wallet.service.WalletRuleJoinService; import com.bsd.pjcloud.wallet.service.WalletSettingService; import lombok.Data; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.CachePut; -import org.springframework.cache.annotation.Cacheable; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; -import java.util.List; /** * 支付设置 @@ -26,6 +26,9 @@ import java.util.List; * @author dzc * @date 2025-01-06 10:52:31 */ +@Validated +@Slf4j +@RequiredArgsConstructor @Service public class WalletSettingServiceImpl extends ServiceImpl implements WalletSettingService { 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 8b777a5ac..ba84cd513 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 @@ -15,10 +15,11 @@ import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.admin.api.utils.DataUtil; import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowApiFlowService; -import com.bsd.pjcloud.flow.task.constant.NodeStatusEnum; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.wallet.api.constant.WalletCodeBizEnum; import com.bsd.pjcloud.wallet.api.dto.WalletStrideDto; import com.bsd.pjcloud.wallet.api.entity.WalletStrideEntity; @@ -98,48 +99,14 @@ public class WalletStrideServiceImpl extends ServiceImpl pageJoin(Page page, WalletStrideDto dto) { Page list = baseMapper.pageJoin(page, dto); - if (ObjectUtil.isNotEmpty(list.getRecords())) { - // 用户 - List userIds = list.getRecords().stream().map(WalletStrideVo::getUserId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> userList = userService.getUserById(new ArrayList<>(userIds)); - if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(list.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); - } - } - // 部门 - List deptIds = list.getRecords().stream().map(WalletStrideVo::getDeptId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> deptList = deptService.getDeptByDeptIds(deptIds); - if (ObjectUtil.isNotEmpty(deptList.getData())) { - DataUtil.convertDeptList(list.getRecords(), deptList.getData()); - } - } - } + disposeList(list.getRecords(), dto); return list; } @Override public Page scopePageList(Page page, WalletStrideDto dto) { Page list = baseMapper.scopePageList(page, dto); - if (ObjectUtil.isNotEmpty(list.getRecords())) { - // 用户 - List userIds = list.getRecords().stream().map(WalletStrideVo::getUserId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> userList = userService.getUserById(new ArrayList<>(userIds)); - if (ObjectUtil.isNotEmpty(userList.getData())) { - DataUtil.convertUserList(list.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId)); - } - } - // 部门 - List deptIds = list.getRecords().stream().map(WalletStrideVo::getDeptId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - R> deptList = deptService.getDeptByDeptIds(deptIds); - if (ObjectUtil.isNotEmpty(deptList.getData())) { - DataUtil.convertDeptList(list.getRecords(), deptList.getData()); - } - } - } + disposeList(list.getRecords(), dto); return list; } @@ -179,10 +146,47 @@ public class WalletStrideServiceImpl extends ServiceImpl list, WalletStrideDto dto) { + if (ObjectUtil.isEmpty(list)) return; + // 用户 + List userIds = list.stream().map(WalletStrideVo::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)); + } + } + // 部门 + List deptIds = list.stream().map(WalletStrideVo::getDeptId).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + R> deptList = deptService.getDeptByDeptIds(deptIds); + if (ObjectUtil.isNotEmpty(deptList.getData())) { + DataUtil.convertDeptList(list, deptList.getData()); + } + } + // 审批 + if (dto.getIsFindCheckUser()) { + List processInstanceIds = list.stream().map(WalletStrideVo::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; + }); + } + } + } + } + private boolean isCheckData(Long walletId) { Long count = baseMapper.selectCount(new LambdaQueryWrapper() .eq(WalletStrideEntity::getUserId, walletId) - .eq(WalletStrideEntity::getProcessStatus, NodeStatusEnum.JXZ.getCode()) + .eq(WalletStrideEntity::getProcessStatus, TaskCheckStatusEnum.PADDING.getCode()) ); return count > 0; } diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java index aa3417573..528cb48d9 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletTransactionServiceImpl.java @@ -84,13 +84,14 @@ public class WalletTransactionServiceImpl extends ServiceImpl scopeJzPageList(Page page, WalletTransactionDto dto, DataScope dataScope) { + Page list = baseMapper.scopeJzPageList(page, dto, dataScope); + disposeList(list.getRecords(), dto); + return list; + } + @Override public List scopeList(WalletTransactionDto dto, DataScope dataScope) { List list = baseMapper.scopeList(dto, dataScope); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchCatgoryServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchCatgoryServiceImpl.java new file mode 100644 index 000000000..c210f287c --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchCatgoryServiceImpl.java @@ -0,0 +1,61 @@ +package com.bsd.pjcloud.wallet.service.impl.mch; + +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.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCatgoryEntity; +import com.bsd.pjcloud.wallet.mapper.mch.MchCatgoryMapper; +import com.bsd.pjcloud.wallet.service.MchCatgoryService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +/** + * 商户分类 + */ +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class MchCatgoryServiceImpl extends ServiceImpl implements MchCatgoryService { + + /** + * 新增 + */ + @Override + public Long create(MchCatgoryEntity dto) { + if (existName(dto)) throw new RuntimeException("分类名不能重复"); + if (ObjectUtil.isEmpty(dto.getBizType())) { + dto.setBizType(MerchantTypeEnum.SUPERMARKET.getType()); + } + baseMapper.insert(dto); + return dto.getId(); + } + + /** + * 编辑 + */ + @Override + public Long edit(MchCatgoryEntity dto) { + if (existName(dto)) throw new RuntimeException("分类名不能重复"); + baseMapper.updateById(dto); + return dto.getId(); + } + + /** + * 判断分类名是否重复 + */ + private boolean existName(MchCatgoryEntity dto) { + Long count = baseMapper.selectCount(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(dto.getName()), MchCatgoryEntity::getName, dto.getName()) + .eq(ObjectUtil.isNotEmpty(dto.getBizType()), MchCatgoryEntity::getBizType, dto.getBizType()) + .ne(ObjectUtil.isNotEmpty(dto.getId()), MchCatgoryEntity::getId, dto.getId()) + ); + if (ObjectUtil.isNotEmpty(dto.getId())) { + return count >= 1; + } + return count > 0; + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchCheckoutServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchCheckoutServiceImpl.java new file mode 100644 index 000000000..e45ccd532 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchCheckoutServiceImpl.java @@ -0,0 +1,62 @@ +package com.bsd.pjcloud.wallet.service.impl.mch; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.admin.api.utils.DataUtil; +import com.bsd.pjcloud.admin.api.vo.UserVO; +import com.bsd.pjcloud.common.core.util.CollectionUtils; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.wallet.api.dto.mch.MchCheckoutDto; +import com.bsd.pjcloud.wallet.api.entity.mch.MchCheckoutEntity; +import com.bsd.pjcloud.wallet.api.vo.mch.MchCheckoutVo; +import com.bsd.pjcloud.wallet.mapper.mch.MchCheckoutMapper; +import com.bsd.pjcloud.wallet.service.MchCheckoutService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; +import java.util.Objects; + +/** + * 商户结账 + */ +@Validated +@Slf4j +@RequiredArgsConstructor +@Service +public class MchCheckoutServiceImpl extends ServiceImpl implements MchCheckoutService { + + private final RemoteUserService remoteUserService; + + @Override + public Page scopPageList(Page page, MchCheckoutDto dto, DataScope dataScope) { + Page pageList = baseMapper.scopPageList(page, dto, dataScope); + disposeList(pageList.getRecords(), dto); + return pageList; + } + + @Override + public Long create(MchCheckoutEntity mchCheckout, PjcloudUser user) { + mchCheckout.setCheckoutUserId(user.getId()); + baseMapper.insert(mchCheckout); + return mchCheckout.getId(); + } + + private void disposeList(List list, MchCheckoutDto dto) { + if (ObjectUtil.isEmpty(list)) return; + // 用户部门 + list.forEach(v -> v.setUserId(v.getCheckoutUserId())); + List userIds = list.stream().map(MchCheckoutVo::getCheckoutUserId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + List userDeptList = remoteUserService.getUserDeptByIds(userIds).getData(); + if (ObjectUtil.isNotEmpty(userDeptList)) { + DataUtil.convertUserDeptList(list, CollectionUtils.convertMap(userDeptList, UserVO::getUserId)); + } + } + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchDeptServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchDeptServiceImpl.java index 559acd902..f47a06fb9 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchDeptServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchDeptServiceImpl.java @@ -8,6 +8,7 @@ import com.bsd.pjcloud.admin.api.dto.DeptAllListDto; import com.bsd.pjcloud.admin.api.entity.SysDept; import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; import com.bsd.pjcloud.admin.api.utils.DataUtil; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.wallet.api.dto.mch.MchDeptDto; import com.bsd.pjcloud.wallet.api.entity.mch.MchDeptEntity; @@ -57,7 +58,7 @@ public class MchDeptServiceImpl extends ServiceImpl list) { if (ObjectUtil.isEmpty(list)) return; // 判断下面是否有订单 - List mchList = baseMapper.list(MchManageDto.builder().ids(list).build()); + List mchList = baseMapper.scopeList(MchManageDto.builder().ids(list).build(), null); for (MchManageVo v : mchList) { Long count = remoteHardOrderService.getMchCountById(v.getId()).getData(); if (ObjectUtil.isNotEmpty(count) && count > 0) { @@ -190,12 +199,13 @@ public class MchManageServiceImpl extends ServiceImpl cascadeJoin(Page page, MchManageDto dto) { - Page pageList = scopePageList(page, dto); + public Page cascadeJoin(Page page, MchManageDto dto, DataScope dataScope) { + Page pageList = scopePageList(page, dto, dataScope); if (ObjectUtil.isEmpty(pageList.getRecords())) return pageList; for (MchManageVo v : pageList.getRecords()) { MchManageDto childrenDto = new MchManageDto(); childrenDto.setParentId(v.getId()); + childrenDto.setParentIsNull(false); List list = list(childrenDto); if (ObjectUtil.isEmpty(list)) continue; v.setChildren(list); @@ -204,8 +214,8 @@ public class MchManageServiceImpl extends ServiceImpl scopePageList(Page page, MchManageDto dto) { - Page list = baseMapper.scopePageList(page, dto); + public Page scopePageList(Page page, MchManageDto dto, DataScope dataScope) { + Page list = baseMapper.scopePageList(dto, page, dataScope); if (ObjectUtil.isNotEmpty(list.getRecords())) { // 部门 List deptIds = list.getRecords().stream().map(MchManageVo::getDeptId).distinct().toList(); @@ -245,7 +255,7 @@ public class MchManageServiceImpl extends ServiceImpl list(MchManageDto dto) { - List list = baseMapper.list(dto); + List list = baseMapper.scopeList(dto, null); if (ObjectUtil.isEmpty(list)) return null; // 部门 List deptIds = list.stream().map(MchManageVo::getDeptId).distinct().toList(); @@ -268,13 +278,21 @@ public class MchManageServiceImpl extends ServiceImpl deptIds) { - List merchantList = baseMapper.selectList(new LambdaQueryWrapper()); + public MchManageVo getFirstMch(List deptIds, MerchantTypeEnum mchType) { + List merchantList = baseMapper.selectList(new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(mchType), MchManageEntity::getTypes, mchType.getType()) + ); if (ObjectUtil.isEmpty(merchantList)) return null; for (Long id : deptIds) { for (MchManageEntity merchant : merchantList) { if (ObjectUtil.equals(merchant.getDeptId(), id)) { - return BeanUtils.toBean(merchant, MchManageVo.class); + if (ObjectUtil.isNotEmpty(mchType)) { + if (ObjectUtil.equals(merchant.getTypes(), mchType.getType())) { + return BeanUtils.toBean(merchant, MchManageVo.class); + } + } else { + return BeanUtils.toBean(merchant, MchManageVo.class); + } } } } @@ -282,13 +300,13 @@ public class MchManageServiceImpl extends ServiceImpl parentDeptIdList = remoteDeptService.getParentDeptList(deptId).getData(); if (ObjectUtil.isEmpty(parentDeptIdList)) { return null; } List deptIds = parentDeptIdList.stream().map(SysDept::getDeptId).toList(); - return getFirstMch(deptIds); + return getFirstMch(deptIds, mchType); } /** @@ -300,10 +318,12 @@ public class MchManageServiceImpl extends ServiceImpl parentDeptList = remoteDeptService.getParentDeptList(userInfo.getSysUser().getDeptId()).getData(); + if (ObjectUtil.isEmpty(parentDeptList)) { + return false; + } + String consumeDpetId = ParamResolver.getStr("CONSUME_DEPT_ID"); + if (ObjectUtil.isEmpty(consumeDpetId)) { + return false; + } + List parentDeptIds = parentDeptList.stream().map(SysDept::getDeptId).map(String::valueOf).toList(); + return parentDeptIds.contains(consumeDpetId); + } + /** * 更新分店数量 */ @@ -327,7 +380,8 @@ public class MchManageServiceImpl extends ServiceImpl() .eq(ObjectUtil.isNotEmpty(name), MchManageEntity::getName, name) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchRuleJoinControllerServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchRuleJoinControllerServiceImpl.java index 1ecd6ae92..10458c5ac 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchRuleJoinControllerServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/mch/MchRuleJoinControllerServiceImpl.java @@ -13,7 +13,7 @@ import com.bsd.pjcloud.wallet.api.entity.mch.MchRulePriceConfigEntity; import com.bsd.pjcloud.wallet.api.vo.mch.MchRuleJoinDtoVo; import com.bsd.pjcloud.wallet.mapper.mch.WalletRuleMchConfigMapper; import com.bsd.pjcloud.wallet.service.MchManageService; -import com.bsd.pjcloud.wallet.service.MchRuleJoinControllerService; +import com.bsd.pjcloud.wallet.service.MchRuleJoinService; import com.bsd.pjcloud.wallet.service.WalletRulePriceConfigService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,13 +21,14 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.ArrayList; +import java.util.List; @Validated @Slf4j @RequiredArgsConstructor @Service -public class MchRuleJoinControllerServiceImpl extends ServiceImpl implements MchRuleJoinControllerService { +public class MchRuleJoinControllerServiceImpl extends ServiceImpl implements MchRuleJoinService { private final MchManageService mchManageService; private final WalletRulePriceConfigService rulePriceConfigService; @@ -58,8 +59,12 @@ public class MchRuleJoinControllerServiceImpl extends ServiceImpl scopeList(MchRuleJoinDtoEntity dto, DataScope dataScope) { + return baseMapper.scopeList(dto, dataScope); + } + /** * 是否重复 */ 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 3ae2f4f98..638fdf59a 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 @@ -17,9 +17,11 @@ 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.admin.api.vo.UserVO; +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.data.tenant.TenantContextHolder; import com.bsd.pjcloud.common.excel.vo.ErrorMessage; import com.bsd.pjcloud.common.security.service.PjcloudUser; @@ -29,18 +31,22 @@ import com.bsd.pjcloud.flow.task.constant.NodeStatusEnum; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.flow.task.dto.TaskDto; +import com.bsd.pjcloud.flow.task.dto.TaskParamDto; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletBizRechargeEnum; +import com.bsd.pjcloud.wallet.api.constant.WalletRechargeInvoiceStatusEnum; 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; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeSaveTopupDto; import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; 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.entity.recharge.WalletRechargeInvoiceEntity; 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; @@ -50,6 +56,7 @@ 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; +import com.bsd.pjcloud.wallet.mapper.recharge.WalletRechargeInvoiceMapper; import com.bsd.pjcloud.wallet.service.*; import com.bsd.pjcloud.wallet.utils.flow.FlowUtil; import com.bsd.pjcloud.wallet.utils.flow.dto.WalletRechargeApplyFlowDto; @@ -57,6 +64,8 @@ import com.bsd.pjcloud.wallet.utils.flow.dto.WalletRechargeApplyFlowDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; @@ -90,6 +99,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl list = rechargeImportService.list(new LambdaQueryWrapper().eq(WalletRechargeImportEntity::getInvoiceId, invoice.getId()).isNull(WalletRechargeImportEntity::getApplyId)); + if (ObjectUtil.isNotEmpty(list)) { + List updateObjList = list.stream().map(v -> { + WalletRechargeImportEntity item = new WalletRechargeImportEntity(); + item.setId(v.getId()); + item.setApplyId(apply.getId()); + return item; + }).toList(); + rechargeImportService.updateBatchById(updateObjList); + } + // 更新发票状态 + WalletRechargeInvoiceEntity updateObj = new WalletRechargeInvoiceEntity(); + updateObj.setId(invoice.getId()); + updateObj.setStatus(WalletRechargeInvoiceStatusEnum.BINDED.getCode()); + updateObj.setApplyId(apply.getId()); + walletRechargeInvoiceService.updateById(updateObj); + } + @Override public void create(WalletRechargeApplyEntity dto) { PjcloudUser loginUser = SecurityUtils.getUser(); @@ -112,15 +162,54 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl pageJoin(Page page, WalletRechargeApplyDto dto) { - Page list = baseMapper.pageJoin(page, dto); + @Transactional(rollbackFor = Exception.class) + public void delByIds(ArrayList list) { + if (ObjectUtil.isEmpty(list)) return; + for (Long v : list) { + // 只有未审批和审核中能删除 + WalletRechargeApplyEntity detail = baseMapper.selectById(v); + if (ObjectUtil.isEmpty(detail)) continue; + if (ObjectUtil.isNotEmpty(detail.getProcessStatus()) && ObjectUtil.notEqual(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + UserInfo userInfo = userService.getByUserId(detail.getUserId()).getData(); + throw new RuntimeException("用户<" + userInfo.getSysUser().getName() + ">发起的审批不能删除"); + } + // 如果是审批中就取消审批 + if (ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + TaskParamDto dto = new TaskParamDto(); + dto.setProcessInstanceIdList(List.of(detail.getProcessId())); + flowEngineService.stopProcessInstance(dto).getData(); + } + // 如果有发票要改一下状态 + if (ObjectUtil.isNotEmpty(detail.getInvoiceId())) { + WalletRechargeInvoiceEntity updateObj = new WalletRechargeInvoiceEntity(); + updateObj.setId(detail.getInvoiceId()); + updateObj.setStatus(WalletRechargeInvoiceStatusEnum.DEPT_CANCELLATION.getCode()); + walletRechargeInvoiceService.updateById(updateObj); + } + // 删除申请记录 + baseMapper.deleteById(v); + // 删除申请记录条目 + rechargeImportService.remove(new LambdaQueryWrapper().eq(WalletRechargeImportEntity::getApplyId, v)); + } + } + + @Override + public Page pageJoin(Page page, WalletRechargeApplyDto dto, DataScope dataScope) { + Page list = baseMapper.pageJoin(page, dto, dataScope); if (ObjectUtil.isNotEmpty(list.getRecords())) { // 用户 List userIds = list.getRecords().stream().map(WalletRechargeApplyVo::getUserId).distinct().toList(); @@ -144,8 +233,8 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl scopePageList(Page page, WalletRechargeApplyDto dto) { - Page list = baseMapper.scopePageList(page, dto); + public Page scopePageList(Page page, WalletRechargeApplyDto dto, DataScope dataScope) { + Page list = baseMapper.scopePageList(page, dto, dataScope); disposeList(list.getRecords(), dto); return list; } @@ -163,7 +252,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl list, BindingResult bindingResult) { + public R readExcel(List excelVOList, BindingResult bindingResult, String bizType) { + ImmutablePair, List> pair = validateExcelData(excelVOList, bindingResult); + List errorMessages = pair.getLeft(); + List list = pair.getRight(); + if (ObjectUtil.isNotEmpty(errorMessages)) return R.failed(errorMessages); + PjcloudUser loginUser = SecurityUtils.getUser(); + WalletRechargeApplyEntity insertObj = new WalletRechargeApplyEntity(); + insertObj.setDeptId(loginUser.getDeptId()); + insertObj.setUserId(loginUser.getId()); + insertObj.setBizType(bizType); + int i = baseMapper.insert(insertObj); + if (i <= 0) { + throw new RuntimeException("导入失败"); + } + List 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, "导入成功"); + } + + /** + * 读取充值excel内容 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R readTopupExcel(List excelVOList, BindingResult bindingResult) { + ImmutablePair, List> pair = validateExcelData(excelVOList, bindingResult); + List errorMessages = pair.getLeft(); + List list = pair.getRight(); + if (ObjectUtil.isNotEmpty(errorMessages)) return R.failed(errorMessages); + PjcloudUser loginUser = SecurityUtils.getUser(); + // 先创建发票 + Integer totalPrice = list.stream().map(WalletRechargeExcelDto::getPriceNumber).reduce(Integer::sum).orElse(0); + WalletRechargeInvoiceEntity invoice = walletRechargeInvoiceService.createBaseInvoice(loginUser, totalPrice); + if (ObjectUtil.isEmpty(invoice)) throw new RuntimeException("导入失败"); + // 导入数据 + List batchSaveList = list.stream().map(v -> WalletRechargeImportEntity.builder().price(v.getPriceNumber()).userId(v.getUserId()).userDeptId(v.getUserDeptId()).invoiceId(invoice.getId()).build()).toList(); + rechargeImportService.saveBatch(batchSaveList); + return R.ok(null, "导入成功"); + } + + /** + * 校验充值/扣款excel的数据 + */ + public ImmutablePair, List> validateExcelData(List list, BindingResult bindingResult) { if (ObjectUtil.isEmpty(list)) { - return R.failed(); + throw new RuntimeException("读取excel数据错误"); } list = list.stream().filter(v -> !ObjectUtil.isAllEmpty(v.getUsername(), v.getUserMobile(), v.getPrice())).toList(); if (ObjectUtil.isEmpty(list)) { - return R.failed(); + throw new RuntimeException("读取excel数据错误"); } List errorMessageList = (List) bindingResult.getTarget(); List usernameList = list.stream().map(WalletRechargeExcelDto::getUsername).toList(); @@ -271,20 +412,9 @@ 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, "导入成功"); + return ImmutablePair.of(null, list); } /* ************************************* end excel end ************************************* */ @@ -311,13 +441,22 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl importList = rechargeImportService.list(new LambdaQueryWrapper().eq(WalletRechargeImportEntity::getApplyId, detail.getId())); if (ObjectUtil.isEmpty(importList)) { return; } getSelf().updateBeforePrice(detail); - if (ObjectUtil.equals(detail.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) { + if (WalletBizRechargeEnum.reductionCodes().contains(detail.getBizType())) { importList.forEach(v -> v.setPrice(-1 * Math.abs(v.getPrice()))); } for (WalletRechargeImportEntity v : importList) { @@ -326,7 +465,9 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl userIds = importList.stream().map(WalletRechargeImportEntity::getUserId).distinct().toList(); @@ -450,14 +591,14 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl().eq(WalletRechargeApplyEntity::getUserId, walletId).eq(WalletRechargeApplyEntity::getProcessStatus, NodeStatusEnum.JXZ.getCode())); - return count >= 3; + return count >= 10; } /** * 判断申请下如果类型为记账扣款,余额是否够扣款 */ private void validateWalletBalance(WalletRechargeApplyEntity applyDto) { - if (ObjectUtil.notEqual(applyDto.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) return; + if (!WalletBizRechargeEnum.reductionCodes().contains(applyDto.getBizType())) return; List importList = rechargeImportService.list(new LambdaQueryWrapper() .eq(WalletRechargeImportEntity::getApplyId, applyDto.getId()) ); @@ -497,7 +638,8 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl importList = rechargeImportService.list(new LambdaQueryWrapper() .eq(WalletRechargeImportEntity::getApplyId, applyDto.getId()) ); @@ -522,7 +664,8 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl"); } - errorMsg.append("记账扣款失败,"); + errorMsg.append(bizTypeEnum.getDesc()); + errorMsg.append("失败,"); errorMsg.append("操作前的金额<").append(wallet.getBalance() / 100).append(">,"); errorMsg.append("记账扣款的金额<").append(i.getPrice() / 100).append(">,"); errorMsg.append("记账扣款后的金额<").append(discountPrice / 100).append(">\n"); @@ -534,7 +677,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl importList) { - if (ObjectUtil.notEqual(applyDto.getBizType(), WalletBizRechargeEnum.REDUCTION.getCode())) return; + if (!WalletBizRechargeEnum.reductionCodes().contains(applyDto.getBizType())) return; List importUserIds = importList.stream().map(WalletRechargeImportEntity::getUserId).distinct().toList(); // 查询用户钱包 WalletManageDto userWalletDto = new WalletManageDto(); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java new file mode 100644 index 000000000..5fe8f9a63 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java @@ -0,0 +1,472 @@ +package com.bsd.pjcloud.wallet.service.impl.recharge; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +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.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.entity.SysDept; +import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; +import com.bsd.pjcloud.admin.api.feign.RemoteFileService; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +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.data.resolver.ParamResolver; +import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; +import com.bsd.pjcloud.common.security.service.PjcloudUser; +import com.bsd.pjcloud.common.security.util.SecurityUtils; +import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService; +import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; +import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.flow.task.dto.TaskDto; +import com.bsd.pjcloud.flow.task.dto.TaskParamDto; +import com.bsd.pjcloud.wallet.api.constant.WalletBizRechargeEnum; +import com.bsd.pjcloud.wallet.api.constant.WalletRechargeInvoiceStatusEnum; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeBindInvoiceDto; +import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeInvoiceApplyDto; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeImportEntity; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeInvoiceEntity; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletSettingService; +import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; +import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeInvoiceItemVo; +import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeInvoiceVo; +import com.bsd.pjcloud.wallet.mapper.recharge.WalletRechargeApplyMapper; +import com.bsd.pjcloud.wallet.mapper.recharge.WalletRechargeImportMapper; +import com.bsd.pjcloud.wallet.mapper.recharge.WalletRechargeInvoiceMapper; +import com.bsd.pjcloud.wallet.service.WalletRechargeInvoiceService; +import com.bsd.pjcloud.wallet.utils.ConvertCnPriceUtil; +import com.bsd.pjcloud.wallet.utils.flow.FlowUtil; +import com.bsd.pjcloud.wallet.utils.flow.dto.WalletRechargeInvoiceFlowDto; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.transaction.annotation.Transactional; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URL; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 充值/扣款申请发票记录 + */ +@Slf4j +@Service +@AllArgsConstructor +public class WalletRechargeInvoiceServiceImpl extends ServiceImpl implements WalletRechargeInvoiceService { + + static private final String TAG = "充值/扣款发票"; + + private final FlowUtil flowUtil; + + private final WalletRechargeImportMapper importMapper; + private final WalletRechargeApplyMapper applyMapper; + + private final RemoteUserService remoteUserService; + private final RemoteDeptService remoteDeptService; + private final RemoteFileService remoteFileService; + private final RemoteFlowEngineService flowEngineService; + private final RemoteWalletSettingService remoteWalletSettingService; + + /** + * 退回作废发票 + */ + @Override + public void backInvoice(Long id) { + WalletRechargeInvoiceVo detail = baseMapper.joinById(id); + if (ObjectUtil.isEmpty(detail)) throw new RuntimeException("查询不到发票"); + baseMapper.update(new LambdaUpdateWrapper() + .set(WalletRechargeInvoiceEntity::getPicUrl, null) + .set(WalletRechargeInvoiceEntity::getApplyTime, null) + .set(WalletRechargeInvoiceEntity::getProcessId, null) + .set(WalletRechargeInvoiceEntity::getProcessStatus, null) + .set(WalletRechargeInvoiceEntity::getProcessTime, null) + .set(WalletRechargeInvoiceEntity::getStampPicUrl, null) + .set(WalletRechargeInvoiceEntity::getStatus, WalletRechargeInvoiceStatusEnum.FINANCE_CANCELLATION.getCode()) + .eq(WalletRechargeInvoiceEntity::getId, id) + ); + } + + /** + * 分页查询 + */ + @Override + public Page scopePageList(Page page, WalletRechargeBindInvoiceDto dto, DataScope dataScope) { + Page pageList = baseMapper.scopePageList(page, dto, dataScope); + disposeList(pageList.getRecords(), dto); + return pageList; + } + + /** + * 查询详情 + */ + @Override + public WalletRechargeInvoiceVo joinById(Long id) { + WalletRechargeInvoiceVo detail = baseMapper.joinById(id); + if (ObjectUtil.isEmpty(detail)) return detail; + // 转换为元 + Double price = BigDecimal.valueOf(detail.getTotalPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + detail.setTotalPriceCnStr(ConvertCnPriceUtil.convert(String.valueOf(price))); + // 生成款项 + WalletRechargeInvoiceItemVo item = new WalletRechargeInvoiceItemVo(); + item.setName("伙食费充值"); + item.setPrice(price); + detail.setItemJson(JSONUtil.toJsonStr(List.of(item))); + return detail; + } + + /** + * 批量充值/扣款发票信息 + */ + @Override + public WalletRechargeInvoiceVo getInvoice(Long id) { + // 查询申请记录 + WalletRechargeApplyEntity applyDetail = applyMapper.selectById(id); + WalletBizRechargeEnum bizEnum = WalletBizRechargeEnum.valueOfByType(applyDetail.getBizType()); + if (ObjectUtil.isEmpty(applyDetail)) { + throw new RuntimeException("批量充值/扣款申请不存在"); + } + // 查询申请记录有没有编辑过 + if (!ObjectUtil.isAllNotEmpty(applyDetail.getImportTime(), applyDetail.getWalletTypeId())) { + throw new RuntimeException("请先编辑导入时间等信息"); + } + // 只有申请中才能获取发票 + if (ObjectUtil.notEqual(applyDetail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + throw new RuntimeException("只有申请中才能获取发票"); + } + + // 先去查询有没有已经生产的发票 + WalletRechargeInvoiceVo result = new WalletRechargeInvoiceVo(); + WalletRechargeInvoiceEntity InvoiceEntity = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(WalletRechargeInvoiceEntity::getApplyId, id) + .eq(WalletRechargeInvoiceEntity::getStatus, WalletRechargeInvoiceStatusEnum.UNBIND.getCode()) + ); + if (ObjectUtil.isNotEmpty(InvoiceEntity)) { + result = BeanUtil.copyProperties(InvoiceEntity, WalletRechargeInvoiceVo.class); + Double price = BigDecimal.valueOf(result.getTotalPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + result.setTotalPriceCnStr(ConvertCnPriceUtil.convert(String.valueOf(price))); + return result; + } + + // 获取配置 + WalletSettingVo walletSetting = remoteWalletSettingService.get().getData(); + // 查询申请人 + UserInfo userInfo = remoteUserService.getByUserId(applyDetail.getUserId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) { + throw new RuntimeException("申请用户不存在"); + } + // 查询收款人 + String payeeUser = ""; + if (ObjectUtil.isNotEmpty(walletSetting.getTopupUserId())) { + UserInfo payeeUserDetail = remoteUserService.getByUserId(walletSetting.getTopupUserId()).getData(); + if (ObjectUtil.isNotEmpty(payeeUserDetail)) { + payeeUser = payeeUserDetail.getSysUser().getName(); + } + } + // 查询总金额 + List importList = importMapper.selectList(new LambdaQueryWrapper().eq(WalletRechargeImportEntity::getApplyId, id)); + Integer totalPrice = importList.stream().map(WalletRechargeImportEntity::getPrice).reduce(Integer::sum).orElse(0); + // 转换为元 + Double price = BigDecimal.valueOf(totalPrice).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).doubleValue(); + // 生成款项 + WalletRechargeInvoiceItemVo item = new WalletRechargeInvoiceItemVo(); + item.setName("伙食费充值"); + item.setPrice(price); + + result.setApplyId(applyDetail.getId()); + result.setCode(getInvoiceCode()); + result.setTime(applyDetail.getApplyTime()); + result.setDeptOrUser(userInfo.getSysUser().getName()); + result.setTotalPrice(totalPrice); + result.setTotalPriceCnStr(ConvertCnPriceUtil.convert(String.valueOf(price))); + result.setPayeeDept(walletSetting.getTopupDeptStr()); + result.setPayeeUser(payeeUser); + result.setStatus(WalletRechargeInvoiceStatusEnum.UNBIND.getCode()); + result.setItemJson(JSONUtil.toJsonStr(List.of(item))); + result.setRemark(""); + return result; + } + + /** + * 创建基础发票 + */ + @Override + public WalletRechargeInvoiceEntity createBaseInvoice(PjcloudUser loginUser, Integer totalPrice) { + // 查询当前用户 + UserInfo userInfo = remoteUserService.getByUserId(loginUser.getId()).getData(); + if (ObjectUtil.isEmpty(userInfo)) throw new RuntimeException("获取当前用户失败"); + // 获取配置 + WalletSettingVo walletSetting = remoteWalletSettingService.get().getData(); + WalletRechargeInvoiceEntity saveObj = new WalletRechargeInvoiceEntity(); + saveObj.setApplyUserId(userInfo.getSysUser().getUserId()); + saveObj.setApplyDeptId(userInfo.getSysUser().getDeptId()); + saveObj.setApplyId(null); + saveObj.setCode(getInvoiceCode()); + saveObj.setTime(LocalDateTime.now()); + saveObj.setDeptOrUser(userInfo.getSysUser().getName()); + saveObj.setTotalPrice(totalPrice); + if (ObjectUtil.isNotEmpty(walletSetting)) { + if (ObjectUtil.isNotEmpty(walletSetting.getTopupUserId())) { + // 查询收款人 + UserInfo payeeUser = remoteUserService.getByUserId(walletSetting.getTopupUserId()).getData(); + if (ObjectUtil.isNotEmpty(payeeUser)) { + saveObj.setPayeeUser(payeeUser.getSysUser().getName()); + } + } + if (ObjectUtil.isNotEmpty(walletSetting.getTopupDeptStr())) { + saveObj.setPayeeDept(walletSetting.getTopupDeptStr()); + } + } + saveObj.setStatus(WalletRechargeInvoiceStatusEnum.UNBIND.getCode()); + baseMapper.insert(saveObj); + return saveObj; + } + + /** + * 编辑发票 + */ + @Override + public Long edit(WalletRechargeInvoiceEntity dto) { + // 查询发票是否存在 + WalletRechargeInvoiceEntity detail = baseMapper.selectById(dto.getId()); + if (ObjectUtil.isEmpty(detail)) throw new RuntimeException("发票不存在"); + baseMapper.updateById(dto); + return dto.getId(); + } + + /** + * 批量删除发票 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void delByIds(ArrayList list) { + if (ObjectUtil.isEmpty(list)) return; + for (Long v : list) { + WalletRechargeInvoiceEntity detail = baseMapper.selectById(v); + if (ObjectUtil.isEmpty(detail)) continue; + if (ObjectUtil.isNotEmpty(detail.getStatus()) && ObjectUtil.notEqual(detail.getStatus(), WalletRechargeInvoiceStatusEnum.UNBIND.getCode())) { + UserInfo userInfo = remoteUserService.getByUserId(detail.getApplyUserId()).getData(); + throw new RuntimeException("用户<" + userInfo.getSysUser().getName() + ">创建的发票已经<" + WalletRechargeInvoiceStatusEnum.codeOf(detail.getStatus()).getDesc() + ">不能删除"); + } + // 如果是审批中就取消审批 + if (ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + TaskParamDto dto = new TaskParamDto(); + dto.setProcessInstanceIdList(List.of(detail.getProcessId())); + flowEngineService.stopProcessInstance(dto).getData(); + } + // 删除申请记录 + baseMapper.deleteById(v); + // 删除申请记录条目 + importMapper.delete(new LambdaQueryWrapper().eq(WalletRechargeImportEntity::getInvoiceId, v)); + } + } + + /** + * 获取发票代码 + */ + @Override + public String getInvoiceCode() { + Long count = baseMapper.selectAllCount(); + count += 1; + return String.format("%07d", count); + } + + /** + * 发票申请回调 + */ + @Override + @Transactional(rollbackFor = Exception.class) + 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(); + WalletRechargeInvoiceEntity detail = baseMapper.selectOne(new LambdaQueryWrapper().eq(WalletRechargeInvoiceEntity::getProcessId, processId)); + if (ObjectUtil.isEmpty(detail)) { + return; + } + if (!ObjectUtil.equals(detail.getProcessStatus(), TaskCheckStatusEnum.PADDING.getCode())) { + log.error("|{}|重复的回调,dto:|{}|", TAG, JSON.toJSONString(dto)); + return; + } + try { + Boolean isConsent = flowUtil.isConsent(dto); + String processStatus = isConsent ? TaskCheckStatusEnum.RESULT.getCode() : TaskCheckStatusEnum.REJECT.getCode(); + baseMapper.updateById(WalletRechargeInvoiceEntity.builder().id(detail.getId()).processTime(LocalDateTime.now()).processStatus(processStatus).build()); + + if (isConsent) { + // 盖章 + detail.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); + String stampPicUrl = stamp(detail); + if (ObjectUtil.isNotEmpty(stampPicUrl)) { + // 更新盖章图片 + baseMapper.updateById(WalletRechargeInvoiceEntity.builder().id(detail.getId()).stampPicUrl(stampPicUrl).build()); + } + } + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|审批回调意外的错误,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage()); + throw new RuntimeException(e); + } + } + + /** + * 发票申请 + */ + @Override + public void apply(WalletRechargeInvoiceApplyDto body) { + // 查询详情 + WalletRechargeInvoiceEntity detail = baseMapper.selectById(body.getId()); + if (ObjectUtil.isEmpty(detail)) { + throw new RuntimeException("发票申请不存在"); + } + // 查询用户 + UserInfo user = remoteUserService.getInnerByUserId(detail.getApplyUserId()).getData(); + if (ObjectUtil.isEmpty(user)) { + throw new RuntimeException("申请人不存在"); + } + // 查询部门 + SysDept dept = remoteDeptService.getDeptByDeptId(detail.getApplyDeptId()).getData(); + if (ObjectUtil.isEmpty(dept)) { + throw new RuntimeException("发起人部门不存在"); + } + // 发起审批 + WalletRechargeInvoiceFlowDto flowDto = new WalletRechargeInvoiceFlowDto(); + flowDto.setApplyUsername(user.getSysUser().getUsername()); + flowDto.setApplyUserId(user.getSysUser().getUserId()); + flowDto.setApplyDeptName(dept.getName()); + flowDto.setApplyDeptId(dept.getDeptId()); + flowDto.setApplyCreateTime(LocalDateTimeUtil.format(detail.getCreateTime(), DatePattern.NORM_DATETIME_PATTERN)); + flowDto.setPrice((double) (detail.getTotalPrice() / 100)); + flowDto.setDeptOrUser(detail.getDeptOrUser()); + flowDto.setRemark(detail.getRemark()); + String processId = flowUtil.startFlow("TASK_RECHARGE_APPLY_INVOICE_FLOW", user.getSysUser(), detail.getId(), flowDto); + // 更新 + WalletRechargeInvoiceEntity updateObj = new WalletRechargeInvoiceEntity(); + updateObj.setId(detail.getId()); + updateObj.setProcessId(processId); + updateObj.setApplyTime(LocalDateTime.now()); + updateObj.setProcessStatus(TaskCheckStatusEnum.PADDING.getCode()); + updateObj.setPicUrl(body.getPicUrl()); + baseMapper.updateById(updateObj); + } + + /** + * 生成盖章图片 + */ + @Override + public String stamp(WalletRechargeInvoiceEntity invoice) { + // 查看有没有盖章 + if (ObjectUtil.isEmpty(invoice)) { + log.error("|{}|盖章失败,发票查询为空,invoice:|{}|", TAG, JSONUtil.toJsonStr(invoice)); + return null; + } + // 审核成功才能开发票 + if (ObjectUtil.notEqual(invoice.getProcessStatus(), TaskCheckStatusEnum.RESULT.getCode())) { + log.error("|{}|盖章失败,审核成功才能开发票,invoice:|{}|", TAG, JSONUtil.toJsonStr(invoice)); + return null; + } + String imageBaseUrl = ParamResolver.getStr("IMAGE_BASE_URL"); + if (ObjectUtil.isEmpty(imageBaseUrl)) { + throw new RuntimeException("请配置图片基础路径"); + } + // 开始盖章 + String picUrl = String.format("%s%s", imageBaseUrl, invoice.getPicUrl()); + // 发票底图宽高 3969 x 2154 + int baseMapWidth = 3969, baseMapHeight = 2154; + // 盖章图片宽高 + int stampOrgWidth = 600, stampOrgHeight = 600; + int stampWidth = 500, stampHeight = 500; + try { + // 读取底图 + BufferedImage baseImage = ImageIO.read(new URL(picUrl)); + // 读取盖章图片 + BufferedImage stampImage = ImageIO.read(ResourceUtil.getResource("image/receiptStamp.png")); + stampImage.getScaledInstance(stampWidth, stampHeight, Image.SCALE_SMOOTH); + // 创建新的图像上下文 + Graphics2D g2d = baseImage.createGraphics(); + // 设置抗锯齿 + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + int x = (int) (stampWidth + baseMapWidth * 0.15 + 80); + int y = baseMapHeight - stampHeight - 50; + g2d.drawImage(stampImage, x, y, stampWidth, stampHeight, null); + g2d.dispose(); + String newPicUrl = invoice.getPicUrl().replaceFirst("(\\.\\w+)$", "_stamped$1"); + File tempFile = File.createTempFile(newPicUrl, ".png"); + ImageIO.write(baseImage, "PNG", tempFile); + // 保存到本地用于测试 + // ImageIO.write(baseImage, "PNG", new File("test.png")); + + // 上传图片 + MultipartFile multipartFile = new MockMultipartFile("file", newPicUrl, "image/png", new FileInputStream(tempFile)); + R upload = remoteFileService.innerUpload(multipartFile, null, null, null); + Map data = (Map) upload.getData(); + String url = (String) data.get("url"); + return url; + } catch (IOException e) { + e.printStackTrace(); + log.error("|{}|盖章失败,IO异常,invoice:|{}|error:|{}|", TAG, JSONUtil.toJsonStr(invoice), e.getMessage()); + return null; + } + } + + /** + * 绑定发票 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void bindInvoice(WalletRechargeBindInvoiceDto dto) { + WalletRechargeInvoiceEntity entity = BeanUtil.toBean(dto, WalletRechargeInvoiceVo.class); + entity.setApplyId(null); + baseMapper.insertOrUpdate(entity); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper() + .set(WalletRechargeApplyEntity::getInvoiceId, entity.getId()) + .eq(WalletRechargeApplyEntity::getId, entity.getApplyId()); + applyMapper.update(updateWrapper); + } + + private void disposeList(List list, WalletRechargeBindInvoiceDto dto) { + if (ObjectUtil.isEmpty(list)) return; + // 审批流程 + if (dto.getIsFindUserCheck()) { + List processInstanceIds = list.stream().map(WalletRechargeInvoiceVo::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; + }); + } + } + } + } +} \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleTransactionServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleTransactionServiceImpl.java index 1a0a2d639..4f11eeea3 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleTransactionServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/rule/WalletRuleTransactionServiceImpl.java @@ -11,8 +11,10 @@ import com.bsd.pjcloud.common.core.util.CollectionUtils; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import com.bsd.pjcloud.wallet.api.constant.rule.WalletRuleTransationTypeEnum; import com.bsd.pjcloud.wallet.api.dto.rule.WalletRuleTransactionDto; import com.bsd.pjcloud.wallet.api.dto.rule.WalletRuleTransferAccountsDto; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; import com.bsd.pjcloud.wallet.api.entity.rule.WalletRuleTransactionEntity; import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; import com.bsd.pjcloud.wallet.api.vo.rule.WalletRuleJoinUserConfigVo; @@ -41,6 +43,8 @@ import java.util.List; @Service public class WalletRuleTransactionServiceImpl extends ServiceImpl implements WalletRuleTransactionService { + static private final String TAG = "钱包转账记录"; + private final WalletRuleJoinService walletRuleJoinService; private final WalletManageService walletManageService; private final WalletTransactionService walletTransactionService; @@ -57,6 +61,58 @@ public class WalletRuleTransactionServiceImpl extends ServiceImpl userConfig.getMaxTransferBalance()) { throw new RuntimeException("已经超过最大转账金额限制"); } + entity.setBizType(WalletRuleTransationTypeEnum.USER_CHANGE.getCode()); entity.setSourceWalletId(userConfig.getSourceWalletId()); entity.setTargetWalletId(userConfig.getTargetWalletId()); entity.setSourceWalletBalance(userConfig.getSourceWalletBalance()); @@ -92,7 +149,7 @@ public class WalletRuleTransactionServiceImpl extends ServiceImpl 1) { + if (split[1].length() == 1) { + amount = amount + "0"; + } + } + + // 验证金额正确性 + if (amount.equals("0.00")) { + throw new IllegalArgumentException("金额不能为零."); + } + Matcher matcher = AMOUNT_PATTERN.matcher(amount); + if (!matcher.find()) { + throw new IllegalArgumentException("输入金额有误."); + } + + String integer = matcher.group(1); // 整数部分 + String fraction = matcher.group(2); // 小数部分 + + String result = ""; + if (!integer.equals("0")) { + result += integer2rmb(integer) + UNITS[0]; // 整数部分 + } + if (fraction.equals("00")) { + result += UNITS[3]; // 添加[整] + } else if (fraction.startsWith("0") && integer.equals("0")) { + result += fraction2rmb(fraction).substring(1); // 去掉分前面的[零] + } else { + result += fraction2rmb(fraction); // 小数部分 + } + + return result; + } + + // 将金额小数部分转换为中文大写 + private static String fraction2rmb(String fraction) { + char jiao = fraction.charAt(0); // 角 + char fen = fraction.charAt(1); // 分 + return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : "")) + + (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : ""); + } + + // 将金额整数部分转换为中文大写 + private static String integer2rmb(String integer) { + StringBuilder buffer = new StringBuilder(); + // 从个位数开始转换 + int i, j; + for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) { + char n = integer.charAt(i); + if (n == '0') { + // 当n是0且n的右边一位不是0时,插入[零] + if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') { + buffer.append(RMB_NUMS[0]); + } + // 插入[万]或者[亿] + if (j % 4 == 0) { + if (i > 0 && integer.charAt(i - 1) != '0' + || i > 1 && integer.charAt(i - 2) != '0' + || i > 2 && integer.charAt(i - 3) != '0') { + buffer.append(U2[j / 4]); + } + } + } else { + if (j % 4 == 0) { + buffer.append(U2[j / 4]); // 插入[万]或者[亿] + } + buffer.append(U1[j % 4]); // 插入[拾]、[佰]或[仟] + buffer.append(RMB_NUMS[n - '0']); // 插入数字 + } + } + return buffer.reverse().toString(); + } + + public static void main(String[] args) { + System.out.println(convert("55.00")); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletRechargeInvoiceFlowDto.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletRechargeInvoiceFlowDto.java new file mode 100644 index 000000000..bc2abd893 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/utils/flow/dto/WalletRechargeInvoiceFlowDto.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.wallet.utils.flow.dto; + +import com.bsd.pjcloud.flow.task.dto.base.FlowBaseDto; +import lombok.Data; + +@Data +public class WalletRechargeInvoiceFlowDto extends FlowBaseDto { + + /** + * 交款单位或个人 + */ + private String deptOrUser; + + /** + * 金额 + */ + private Double price; + + /** + * 备注 + */ + private String remark; + +} diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/退还各自食堂明细.xlsx b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/退还各自食堂明细.xlsx new file mode 100644 index 000000000..6303cdaad Binary files /dev/null and b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/退还各自食堂明细.xlsx differ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/image/receiptStamp.png b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/image/receiptStamp.png new file mode 100644 index 000000000..6c15885a0 Binary files /dev/null and b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/image/receiptStamp.png differ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletFreezeMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletFreezeMapper.xml index be0938e8b..dd6fc22fd 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletFreezeMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletFreezeMapper.xml @@ -59,5 +59,6 @@ and w.card_number like concat('%', #{dto.cardNumber}, '%') + order by a.create_time desc,a.id desc \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml index 5e7bc203a..ec06c85d2 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/WalletManageMapper.xml @@ -34,7 +34,7 @@ a.freeze_price, a.is_freeze, a.active_bind_time, - a.active_bind_status, + a.status, a.create_by, a.create_time, a.update_by, @@ -44,7 +44,6 @@ - - + - + + + + + \ No newline at end of file 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 8379e5bf8..e2e3700e6 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 @@ -13,11 +13,57 @@ + select a.id, + a.wallet_id, + a.user_id, + a.dept_id, + a.biz_type, + a.biz_id, + a.title, + a.price, + a.balance, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id, + a.del_flag = '0' + + and a.wallet_id = #{dto.walletId} + + + and a.user_id = #{dto.userId} + + + and a.biz_id = #{dto.bizId} + + + and a.biz_type = #{dto.bizType} + + + and a.price > 0 + + + and a.price < 0 + + + + + m.id as merchantId, + m.name as merchantName, + m.logo_pic as logoPic + from mch_checkout a + left join mch_manage m on a.merchant_id = m.id + + + + group by a.create_time,a.id + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml index 400887fe2..a536907d5 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchManageMapper.xml @@ -25,4 +25,115 @@ + + + select a.id, + a.parent_id, + a.dept_id, + a.default_wallet_type_id, + a.name, + a.types, + a.canteen_is_open, + a.catgory_id, + a.logo_pic, + a.collection_code, + a.collection_url_code, + a.swiper_pic, + a.phone, + a.address_des, + a.job_time, + a.is_sync_zy, + a.visible_mobile, + a.sort, + a.sup_type, + a.discounts_price, + a.cooperation_status, + a.mch_count, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id, + + + + a.del_flag = 0 + + and a.types = #{dto.types} + + + and a.canteen_is_open = #{dto.canteenIsOpen} + + + and a.catgory_id = #{dto.catgoryId} + + + and a.visible_mobile = #{dto.visibleMobile} + + + and a.is_sync_zy = #{dto.isSyncZy} + + + and a.dept_id = #{dto.deptId} + + + and a.sup_type = #{dto.supType} + + + and a.parent_id = #{dto.parentId} + + + and a.parent_id = -1 + + + and a.name like concat('%', #{dto.name}, '%') + + + and a.types in + + #{v} + + + + and a.dept_id in + + #{v} + + + + and a.id in + + #{v} + + + + and a.id not in + + #{v} + + + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchRuleJoinMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchRuleJoinMapper.xml index 015011d50..c0d5416ac 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchRuleJoinMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/mch/MchRuleJoinMapper.xml @@ -42,9 +42,12 @@ and a.rule_price_config_id = #{dto.rulePriceConfigId} + + and a.status = #{dto.status} + - + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeInvoiceMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeInvoiceMapper.xml new file mode 100644 index 000000000..029f31bf1 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/recharge/WalletRechargeInvoiceMapper.xml @@ -0,0 +1,88 @@ + + + + + + select a.id, + a.apply_user_id, + a.apply_dept_id, + a.apply_id, + a.code, + a.time, + a.dept_or_user, + a.total_price, + a.payee_dept, + a.payee_user, + a.item_json, + a.remark, + a.status, + a.pic_url, + a.stamp_pic_url, + a.process_id, + a.process_status, + a.apply_time, + a.process_time, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id, + + + + a.del_flag = '0' + + and a.status = #{dto.status} + + + and a.process_status = #{dto.processStatus} + + + and a.process_id is null + + + and a.dept_or_user like concat('%', #{dto.deptOrUser}, '%') + + + and a.remark like concat('%', #{dto.remark}, '%') + + + and a.apply_user_id in + + #{v} + + + + and a.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]} + + + and a.apply_time between #{dto.applyTimeList[0]} and #{dto.applyTimeList[1]} + + + and a.process_time between #{dto.processTimeList[0]} and #{dto.processTimeList[1]} + + + + + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/rule/WalletRuleTransactionMapper.xml b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/rule/WalletRuleTransactionMapper.xml index c09fe7df2..0936e2be4 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/rule/WalletRuleTransactionMapper.xml +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/mapper/rule/WalletRuleTransactionMapper.xml @@ -23,6 +23,7 @@ select a.id, + a.biz_type, a.source_wallet_id, a.target_wallet_id, a.source_wallet_balance, @@ -42,6 +43,9 @@ a.del_flag = 0 + + and a.biz_type = #{dto.bizType} + and a.source_wallet_id = #{dto.sourceWalletId} @@ -68,7 +72,7 @@ targetWalletType.name as targetWalletTypeName, targetWalletType.unique_code as targetWalletTypeCode from wallet_rule_transaction a - left join wallet_transaction t on t.biz_id = a.id and biz_type = '6' + left join wallet_transaction t on t.biz_id = a.id and t.biz_type = '6' left join wallet_manage sourceWallet on sourceWallet.id = a.source_wallet_id left join wallet_type sourceWalletType on sourceWalletType.id = sourceWallet.wallet_type_id left join wallet_manage targetWallet on targetWallet.id = a.target_wallet_id @@ -96,5 +100,6 @@ group by a.id + order by a.create_time desc,a.id desc \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/InvoiceTest.java b/pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/InvoiceTest.java new file mode 100644 index 000000000..45a54e5a2 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/test/java/com/bsd/pjcloud/InvoiceTest.java @@ -0,0 +1,31 @@ +package com.bsd.pjcloud; + +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.wallet.WalletApp; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeInvoiceEntity; +import com.bsd.pjcloud.wallet.service.WalletRechargeInvoiceService; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +/** + * @author liusiyang_dxm + * @since 2025/7/4 + */ +@SpringBootTest(classes = WalletApp.class) +public class InvoiceTest { + + @Resource + private WalletRechargeInvoiceService invoiceService; + + @Test + @Transactional + public void test() { + WalletRechargeInvoiceEntity detail = invoiceService.getById(1937849346822692865L); + if (ObjectUtil.isNotEmpty(detail)) { + invoiceService.stamp(detail); + } + } + +}