Compare commits

..

398 Commits

Author SHA1 Message Date
c5c121ec5e 校验 2026-02-08 23:36:01 +08:00
4d41da249b 校验 2026-02-08 21:17:49 +08:00
747c68686f 用户优惠券 代码优化 2026-02-05 21:15:07 +08:00
8c3e76ab1d 用户优惠券增加两个时间 2026-02-04 23:44:00 +08:00
bad0d4925c 代理商申请 逻辑增强 鉴权 2026-01-29 18:33:14 +08:00
001191b9c5 增加官网的地址到配置文件里 2026-01-29 11:43:44 +08:00
efaf2353f2 增加官网的地址到配置文件里 2026-01-29 10:25:49 +08:00
b641e06624 增加官网的地址到配置文件里 2026-01-29 08:39:49 +08:00
7ac8d00ede 增加官网的地址到配置文件里 2026-01-28 14:55:30 +08:00
fa874887a3 商家代理商登录注册优化 2026-01-27 11:14:08 +08:00
a457667dbe 商家入驻,邀请码获取,分账 内部配送费给到平台 2026-01-26 20:29:25 +08:00
33c04e83e8 商家注册增加邀请码可选参数 2026-01-25 01:09:39 +08:00
a7f2d2a02c 商家注册增加邀请码可选参数 2026-01-24 15:35:56 +08:00
c7a7e041e7 代理商入驻相关接口 2026-01-24 10:20:02 +08:00
bf74135fef 代理商入驻 2026-01-23 00:16:17 +08:00
822b9a1aec 代理商入驻 2026-01-22 14:11:38 +08:00
4e6927d2b9 商家的账号注册登录接口,增加代理商的支持。 2026-01-17 10:34:27 +08:00
fa7c4b8c4c 配送费删除问题修正 2026-01-16 10:48:22 +08:00
d4038dac85 入驻更改 银行结算类型,57 58 2026-01-15 16:25:47 +08:00
6ea9216d2c 会员升级设置 2026-01-15 12:04:03 +08:00
50dc5db025 会员升级设置 2026-01-15 12:04:03 +08:00
5cbcf2c8e6 会员升级设置 2026-01-15 12:04:02 +08:00
eb7ca3cdaa 店铺会员新增86查询判断 2026-01-15 10:40:01 +08:00
fa2b179c58 mq处理店铺会员升级策略,会员新增策略优化 2026-01-15 09:59:22 +08:00
bde0f1cc53 顺丰店铺id重建接口 2026-01-14 23:22:48 +08:00
adcb3242e1 修改购物车活动问题 2026-01-14 18:35:54 +08:00
c2f77f678c 去除多余的参数 2026-01-14 17:56:40 +08:00
bc7e359e1f 调用service会有上下文,改用mapper看看行不行 2026-01-14 17:56:29 +08:00
9c6f8c715f 回调函数去除多余功能 2026-01-14 17:01:43 +08:00
d5dc01acb9 店铺会员mq新增 2026-01-14 16:58:26 +08:00
0bd5e40487 配送费调试日志添加 2026-01-14 16:55:21 +08:00
2bfe7c48dc 店铺会员mq新增 2026-01-14 16:35:47 +08:00
9b558f2bd3 店铺会员mq新增 2026-01-14 15:24:33 +08:00
0597b03f8d 顺丰手动创建店铺,相关代码 2026-01-14 10:09:39 +08:00
d819216b4a 1、店铺会员mq新增日志
2、店铺会员新增查询条件
2026-01-14 09:52:10 +08:00
8761eec19e 店铺会员mq新增--购买时新增 2026-01-13 18:38:53 +08:00
3f729dafda 店铺会员查看 2026-01-13 18:06:01 +08:00
1671a2e1ee 思迅客户端数据库网络超时不断软件 2026-01-13 16:42:44 +08:00
ad14d4f97c 新增店铺会员功能 2026-01-13 16:30:20 +08:00
70b7790d51 新增店铺会员功能 2026-01-13 16:29:54 +08:00
c00a065030 新增店铺会员功能 2026-01-13 16:23:31 +08:00
8f6948af90 新增店铺会员功能 2026-01-13 16:23:10 +08:00
8eb8d2c48c 平台店铺列表增加分表数据集合 branch_store_list 字段 2026-01-12 21:58:30 +08:00
3891469582 分店申请列表接口增加 2026-01-12 18:22:58 +08:00
85846c6b8f 图库新增删除功能 2026-01-12 15:49:34 +08:00
25f1ade10d 商品搜索距离计算 2026-01-12 15:29:10 +08:00
c22df25f16 分店表增加两个字段 状态备注和登录手机号。 2026-01-12 14:07:29 +08:00
1ee065188f 新功能新增:批量从商品表导图片到图库 2026-01-10 17:01:02 +08:00
a8c940dce1 图库新增图片功能 2026-01-10 16:55:27 +08:00
2b1e285c6b 分店表增加两个字段 状态备注和登录手机号。 2026-01-09 20:12:50 +08:00
916ff8fe5c 优化代码 2026-01-08 17:08:33 +08:00
45d4d9905d 店铺信息获取bug修复 2026-01-06 17:29:13 +08:00
b7963b1972 店铺信息获取bug修复 2026-01-06 16:42:35 +08:00
59590ef2da 后台店铺列表接口增加自配送字段 2026-01-05 21:21:39 +08:00
f38fbf782b 合同签署增加一个 不重复配置 2026-01-05 08:38:35 +08:00
195f3476a9 地区懒加载 2026-01-04 14:53:59 +08:00
722736d084 预计收入防止负数。 2026-01-04 14:46:28 +08:00
29f80b644e 摇了筛子之后返回剩余数量 2026-01-04 12:02:10 +08:00
4fc6fb50d2 Merge remote-tracking branch 'origin/main' 2026-01-04 09:59:48 +08:00
d0a16f587f 注释 2026-01-04 09:59:39 +08:00
57e9b325be 平台的地址懒加载 2026-01-04 09:50:57 +08:00
8af7ba4748 入驻增加两个字段,收银台图片和银行开户许可证 2025-12-31 21:34:29 +08:00
77afa952d7 控制平台导入权限问题解决 2025-12-31 20:46:14 +08:00
bdc0372f49 控制平台导入权限问题解决 2025-12-31 20:37:31 +08:00
db73ca67e9 店铺详情信息fix bug 2025-12-29 20:50:51 +08:00
a929635bfc 店铺详情信息fix bug 2025-12-29 20:50:28 +08:00
b7b57d04d0 远程调用 fix 修复入参问题,导致反射循环依赖。 2025-12-29 17:28:23 +08:00
e919a934dd 控制平台导入权限 2025-12-29 09:40:15 +08:00
7f0d3e9897 分店注册,增加账号密码参数 2025-12-28 23:00:43 +08:00
d9d9efd233 分店异步通知增加关键日志2 2025-12-27 12:11:49 +08:00
3e3a8a32a3 分店异步通知增加关键日志 2025-12-27 00:04:51 +08:00
50872500b3 同步会员新增user_longin信息 2025-12-26 15:16:39 +08:00
f8ca35d20c 分店逻辑增加,逻辑编写,拉卡拉增终,收到通知,创建分店,分店周边信息、账号、入驻信息等2 2025-12-26 00:07:27 +08:00
2ff93df44b 分店逻辑增加,逻辑编写,拉卡拉增终,收到通知,创建分店,分店周边信息、账号、入驻信息等 2025-12-25 17:28:27 +08:00
1897281b38 分店逻辑增加 2025-12-25 01:24:11 +08:00
43dacf4744 去除多余代码 2025-12-23 15:42:56 +08:00
352f936318 去除多余代码 2025-12-23 15:40:22 +08:00
fc780c3513 修改生成微信推广码 2025-12-23 15:37:20 +08:00
657dc8b4e3 装修商品选择返回商品图片,新增条形码item查询字段 2025-12-23 15:35:20 +08:00
a9532a1d2e 管理端查询分类去除过滤 2025-12-23 11:22:03 +08:00
144cf92c27 更改内部配送费计算方法 2025-12-23 11:09:21 +08:00
52ff9dabe0 更改内部配送费计算方法 2025-12-22 22:31:51 +08:00
9136af8a52 购物车,新增重试 2025-12-22 16:46:33 +08:00
d2746dc5b6 更换 公密钥 2025-12-20 00:10:48 +08:00
7c3e025d76 构造空数组,防止null 2025-12-19 11:02:27 +08:00
2040b57fb6 增加店铺自配送下单保存逻辑 2025-12-19 00:18:37 +08:00
cbc47d14e4 商品条码匹配补全问题修复 2025-12-18 16:24:19 +08:00
59274f9941 解决品牌问题以及商品条码自动上架 2025-12-18 10:48:22 +08:00
1157bf3229 商家app接口,增加店铺自提字段 2025-12-17 18:11:53 +08:00
2d50db41d0 Merge remote-tracking branch 'origin/main' 2025-12-17 16:59:04 +08:00
a23801eb31 店铺配送费设置增加平台商家id字段,平台增加保存 自配送,内部配送费字段 2025-12-17 16:58:46 +08:00
01dd0687de 解决空数据导致的前端不显示问题 2025-12-17 15:23:00 +08:00
1567742f84 能编辑的模板都不是再使用中 2025-12-17 11:53:51 +08:00
0e5a378706 店铺配送费设置增加平台商家id字段 2025-12-16 17:25:36 +08:00
f6bbf99c10 空白模板默认图片,返回创建对象 2025-12-16 16:27:12 +08:00
b31aabc085 测试数据库更改了端口和密码 2025-12-16 10:59:19 +08:00
951a1f3cf7 增加重新派单接口 2025-12-15 20:50:54 +08:00
7938cad0cc 控制,未使用的模板发布,防止查询异常 2025-12-15 16:20:18 +08:00
74ba36ebd6 装修模板删除异常提示 2025-12-15 10:57:42 +08:00
23a3b1c659 修复订单原商品价格的错误 2025-12-13 21:27:05 +08:00
e8c964ddcb 装修除商品图片其他选择不变 2025-12-13 16:10:57 +08:00
6257fb29bd 预计收入fix bug 2025-12-13 13:32:11 +08:00
eae16d6957 预计收入fix bug 2025-12-13 13:25:07 +08:00
16d19d79b2 装修商品图片不变 2025-12-13 11:42:08 +08:00
cf80b869fe 图片选择不改变图标,由用户控制 2025-12-13 10:22:38 +08:00
8cdc88e00a Merge remote-tracking branch 'origin/main' 2025-12-12 17:03:50 +08:00
381ede08ba 打印模版更改动态配送方式 2025-12-12 17:03:44 +08:00
f7887e6b79 模板查询倒叙 2025-12-12 16:35:14 +08:00
3b5f48fdc6 diy空白模板权限 2025-12-12 16:30:41 +08:00
396181c62e diy模板新增创建空白模板,移除可选用的已使用的模板 2025-12-12 16:30:41 +08:00
7d2330f18f Merge remote-tracking branch 'origin/main' 2025-12-12 15:39:09 +08:00
542ce3cf16 平台内部配送费的逻辑新增。细节调整默认值 2025-12-12 15:38:47 +08:00
4c4f6db86c 发起人摇中1都不给 2025-12-12 15:34:17 +08:00
09154bcdb4 新增自动化测试砍价逻辑和控制大转盘玩法 2025-12-12 15:15:13 +08:00
390eca8b63 平台内部配送费的逻辑新增。细节调整默认值 2025-12-12 14:17:11 +08:00
3fbccbfd31 备份脚本 2025-12-12 11:10:56 +08:00
dc2c26ae74 砍价新增摇色子功能 2025-12-12 11:10:38 +08:00
1637c1bf92 平台内部配送费的逻辑新增。增加日志打印 2025-12-12 09:23:13 +08:00
b1f95f4ecf 平台内部配送费的逻辑新增。接口层面修改 2025-12-12 00:14:24 +08:00
c96983ec72 平台内部配送费的逻辑新增。日志打印 2025-12-11 17:49:16 +08:00
78dce9f77b 平台内部配送费的逻辑新增。 2025-12-11 12:06:35 +08:00
c1dc9994eb 去除多余代码 2025-12-09 17:35:39 +08:00
6185956410 模板市场新增行业查询,复制模板默认不发布 2025-12-09 17:33:42 +08:00
fe5c884427 用户勾选多个商品退款接口开发,整单取消逻辑修改 2025-12-09 00:26:05 +08:00
8bd8c49f38 用户勾选多个商品退款接口开发,整单取消逻辑修改 2025-12-09 00:25:31 +08:00
eb8fb4a4e9 用户提交取消订单流程修改 2025-12-08 17:08:08 +08:00
992f25a224 增加日志打印,e签宝相关方法 2025-12-05 21:34:47 +08:00
97ee21b5fb 编辑模板入库新增参数app_id 2025-12-05 16:04:35 +08:00
295275b3dc Merge remote-tracking branch 'origin/main' 2025-12-05 15:57:51 +08:00
f9192c74ff 修改取单号逻辑算法 2025-12-05 15:57:39 +08:00
a53ccaadc7 编辑装修js传入app_id 2025-12-05 15:55:02 +08:00
7a26bdec49 装修模板新增行业类别,补充字段 2025-12-05 14:21:29 +08:00
89a326a05b 店铺列表增加合同的状态返回,修复顺丰同城取消订单逻辑 2025-12-05 13:03:30 +08:00
def93e54fa 装修模板新增行业类别 2025-12-05 12:02:37 +08:00
48da403179 es日志打印去除,确认收货后加入去除重复日志筛选 2025-12-05 11:04:28 +08:00
ca48e78dd1 es日志打印去除,确认收货后加入去除重复日志筛选 2025-12-04 15:27:14 +08:00
76b7832908 分享图问题修复,翻译部分代码 2025-12-04 14:27:23 +08:00
87f777ca78 装修控制图片大小 2025-12-04 11:19:15 +08:00
9051b0702d 装修控制图片大小 2025-12-04 10:30:01 +08:00
fc177025a0 装修控制图片大小 2025-12-03 18:42:05 +08:00
28e5b83f6c 同城打票机打印实体类,确认收货通知记录数据 2025-12-03 17:50:55 +08:00
b1f401ff81 重要:分账计算方法做调整,拉卡拉手续费由 代理商或平台出,商家不会扣除。 2025-12-03 11:46:26 +08:00
950b7b9b32 重要:分账计算方法做调整,拉卡拉手续费由 代理商或平台出,商家不会扣除。 2025-12-03 11:38:47 +08:00
46b27539b5 拉卡拉签署入网合同,获取平台的公司名和手机号,填充合同数据 2025-12-03 10:42:03 +08:00
7326d0505f 商家预计收入无需减 拉卡拉平台费,配送费计算表增加是否平台字段 2025-12-02 23:45:46 +08:00
1684e43663 新增平台订单查询条件 2025-12-02 17:22:42 +08:00
6575858004 取消订单,同时也要取消顺丰同城的配送订单 2025-12-01 17:42:27 +08:00
cb0d5e0cc3 Merge remote-tracking branch 'origin/main' 2025-12-01 17:36:03 +08:00
2ea022091c 取消订单,同时也要取消顺丰同城的配送订单 2025-12-01 17:35:52 +08:00
2eed30bdf4 修复图片空内容默认显示问题 2025-12-01 16:09:19 +08:00
dcaf638b58 修复图片空内容无默认问题 2025-12-01 14:47:40 +08:00
e59fa56784 平台装修首页商品显示问题修复 2025-11-29 17:31:25 +08:00
d530054e03 修复错误,和添加打印流程 2025-11-29 17:18:47 +08:00
81abf15dcd Merge remote-tracking branch 'origin/main' 2025-11-29 15:34:09 +08:00
655998c805 异步非阻塞 秒数 增加。 2025-11-29 15:33:55 +08:00
24a9def012 新增接口,分类新增,校验 2025-11-29 11:35:12 +08:00
b4e2b92730 新增接口,分类新增,优化添加分类的复杂性-脚本 2025-11-29 10:39:37 +08:00
d9bb03770a 新增接口,分类新增,优化添加分类的复杂性 2025-11-29 10:39:20 +08:00
1d328b38f7 退款打印方法调试 2025-11-29 02:27:02 +08:00
a73615f350 退款打印方法调试 2025-11-29 00:44:04 +08:00
e7d8a126fc 管理员分类页面优化 2025-11-28 16:13:17 +08:00
62239d4dec 思迅总额计算 2025-11-28 11:18:27 +08:00
30b24dda04 商品图库附图新增 2025-11-28 11:08:06 +08:00
e1bd542c12 打印实体更改名称 2025-11-28 10:48:14 +08:00
7e4c2a9ccf 思迅同步问题修复,无出库也要生成记录 2025-11-27 17:55:21 +08:00
ed29dcd419 思迅同步问题修复 2025-11-27 16:26:13 +08:00
857447ae8b 思迅同步问题修复 2025-11-27 15:44:57 +08:00
c0f11aa224 思迅初始化与更新区分 2025-11-27 15:02:13 +08:00
504f03e5f6 思迅同步问题修复 2025-11-27 14:58:24 +08:00
4e2a75520c 图库图片路径问题修复 2025-11-27 10:14:15 +08:00
fb10c6e173 图库图片路径问题修复 2025-11-27 10:14:14 +08:00
45469be52d 1、客户端商品问题修改,2、客户端新增版本号9.7和商云10分开 2025-11-26 11:21:16 +08:00
71cef21472 图库查询问题修复 2025-11-25 17:18:21 +08:00
75795bad0e 图库查询问题修复 2025-11-25 17:18:20 +08:00
200f66839b 咨询列表和店铺 api 接口加入白名单,不需要登录。 2025-11-25 16:36:58 +08:00
9085dc7681 Merge remote-tracking branch 'origin/main' 2025-11-25 16:29:13 +08:00
5c6a4e985a 思迅同步商品名称调整 2025-11-25 16:27:46 +08:00
d8aadb2d47 新店铺模板问题修改 2025-11-25 16:27:35 +08:00
3bdb5d73d1 Merge remote-tracking branch 'origin/main' 2025-11-25 12:26:57 +08:00
06df245d59 模板新增删除功能,调整店铺的模板逻辑 2025-11-25 11:26:38 +08:00
d4c3bce80f Merge remote-tracking branch 'origin/main' 2025-11-24 20:05:04 +08:00
d2c9b6c492 补充文件 2025-11-24 18:08:56 +08:00
da771d42f7 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	mall-shop/src/main/java/com/suisung/mall/shop/sync/keymanage/RedisKey.java
2025-11-24 18:02:41 +08:00
f06a166693 redis key 冲突,提交合并 2025-11-24 18:02:21 +08:00
c14cdb0967 修改字段 2025-11-24 17:40:59 +08:00
b628fffca7 图库修改接口,新增装修空白模板 2025-11-24 17:31:33 +08:00
3802044eea 对话session移除问题修复 2025-11-24 15:21:16 +08:00
32bd2fab91 装修表增加 创建时间和更改时间字段 2025-11-24 00:11:34 +08:00
de19921581 新增店铺装修路由-补充代码 2025-11-22 10:51:47 +08:00
2cb58bffa3 新增店铺装修路由 2025-11-22 10:47:06 +08:00
9c8f78f3cf 店铺装修调整 2025-11-22 10:46:18 +08:00
9bc2d32c45 商品库表字段 product_short_name 改写 sname 简化 2025-11-22 01:54:00 +08:00
8f20e755fb 提示语优化 2025-11-21 15:01:01 +08:00
db5bd06c35 砍价过期逻辑 补充和优化 2025-11-20 22:13:40 +08:00
528c76a912 同步订单到思迅,取价格为最终价格 2025-11-20 15:15:18 +08:00
1022468778 同步订单到思迅,取价格为最终价格 2025-11-20 15:07:28 +08:00
9d59fbcc9c 添加活动商品时,过滤关闭活动 2025-11-20 14:40:21 +08:00
8eeee63f58 im调整sesion,解决一次性清除redis问题 2025-11-20 11:56:12 +08:00
3971c5f504 im调整sesion,解决一次性清除session问题 2025-11-20 11:35:18 +08:00
47331a5b2a im调整组的sesion,代码优化 2025-11-20 10:35:53 +08:00
0b6c87aa31 列表显示第一个规格 2025-11-20 09:37:15 +08:00
c8699f0bf2 im分布式测试方案-单机测试 2025-11-20 09:10:05 +08:00
ac3b9216d8 删除预约订单无用代码 2025-11-20 00:18:18 +08:00
a3fa5a3fa8 砍价活动,下单前检查 库存 2025-11-20 00:10:07 +08:00
3ca6dcbec9 砍价活动,库存逻辑处理。 2025-11-19 23:21:37 +08:00
1b97836bea im分布式测试方案-单机测试 2025-11-19 17:40:46 +08:00
fddd1750a1 im分布式测试方案-单机测试 2025-11-19 17:21:55 +08:00
4ce40ede17 im分布式测试方案-单机测试 2025-11-19 17:00:09 +08:00
023bd790df 店铺开业筹备状态到期转正。 2025-11-19 16:56:51 +08:00
8c9661c77c im分布式测试方案 2025-11-19 16:18:12 +08:00
928b16da60 im还原单机测试 2025-11-19 15:19:15 +08:00
7dd3822e44 im还原单机测试 2025-11-19 15:15:52 +08:00
4259a7e454 同步下单时间给思迅流水 2025-11-19 11:00:29 +08:00
da449a5921 砍价超时时间,赋值 2025-11-19 08:29:03 +08:00
a2e0854a7d im问题修复-redis统一key,保证不同服务器保存相同的客服 2025-11-18 16:53:33 +08:00
a047598703 im问题修复-rabbimq发送异常 2025-11-18 16:12:45 +08:00
485cad13ed im问题修复-获取不到用户 2025-11-18 15:56:20 +08:00
4666d9b098 砍价超时时间 2025-11-18 15:16:39 +08:00
5977cbcf80 im问题修复-获取不到用户 2025-11-18 14:55:52 +08:00
a6c1b9bf95 im问题修复 2025-11-18 11:41:43 +08:00
e79b5727b3 im问题修复 2025-11-18 11:14:04 +08:00
3d8a84126d 分类查询,不显示过期活动 2025-11-17 17:53:07 +08:00
33f83bc82d im客服错误日志打印 2025-11-17 16:32:56 +08:00
9cbf01f2ab 增加商家自主配送常量 2025-11-17 15:35:01 +08:00
d97523231d im客服问题修改 2025-11-17 15:32:34 +08:00
171cbe9ea1 商家订单增加退款数据上去。商家订单列表,完整化 2025-11-15 19:38:49 +08:00
bd8e11a663 cos 上传针对图片保真压缩。 2025-11-15 15:22:30 +08:00
c0b3b74533 增强 商家入驻通知短信(通知管理员) 2025-11-15 11:24:28 +08:00
bd6d44ebd9 装修出问题后,暂恢复 diy html js 文件 2025-11-14 23:23:29 +08:00
8c3c81d523 im客服问题修改 2025-11-13 18:47:38 +08:00
3518b927da im客服问题修改 2025-11-13 17:59:17 +08:00
8ce6c3e79f 店铺商品列表,去掉了获取计算店铺营业状态 2025-11-13 17:28:39 +08:00
5df67db07e im服务新增分布式rabbimq解决方案,pom 2025-11-13 17:24:50 +08:00
c8857caadf im服务新增分布式rabbimq解决方案 2025-11-13 17:20:03 +08:00
ff7acb1b73 确认收货通知 url 方法改成异步操作,防止微信的api时长限制 2025-11-13 15:40:25 +08:00
c5f5978b41 分账计算代码优化 2025-11-13 10:22:07 +08:00
040c6d3cb1 分账计算代码优化 2025-11-13 10:16:16 +08:00
6ca0af397b 日志级别debug 改成 info 2025-11-13 09:50:17 +08:00
ed10a03442 日志级别debug 改成 info 2025-11-13 09:47:40 +08:00
6c479e744a 增加确认收货通知 逻辑 2025-11-13 01:20:30 +08:00
ad7f89cb42 新增redisson锁和redisson锁切面,保证分布式锁,分布式id 2025-11-12 18:27:23 +08:00
b04f2d095d 修改 diy.html 获取 token 测试代码 2025-11-12 14:31:36 +08:00
b06826593a 分布式锁公共方法 2025-11-12 10:46:39 +08:00
a43df002dc 分布式锁公共方法 2025-11-12 10:44:28 +08:00
2ecfce1f2f 修改配置 2025-11-11 23:25:11 +08:00
e9c42bdb99 Merge remote-tracking branch 'origin/main' 2025-11-11 21:05:20 +08:00
af9cce0db1 店铺状态 2025-11-11 21:05:06 +08:00
645ad45d08 思迅单机改为分布式商品导入 2025-11-11 19:07:06 +08:00
41dbafffab 新增默认的库存 2025-11-11 08:50:38 +08:00
5e45474807 商品映射新增商品货号查询 2025-11-10 18:08:34 +08:00
c3414925a0 商品映射新增商品货号查询 2025-11-10 17:18:34 +08:00
615d478b4c 新增数据库存储文件内容,新增配置字段 2025-11-10 16:22:01 +08:00
cb74d80aab 砍价逻辑状态定时任务补充 2025-11-09 01:24:52 +08:00
0152518315 更新逻辑修改 2025-11-08 10:29:11 +08:00
c8a85d5119 流水逻辑修改 2025-11-08 10:28:58 +08:00
31160d4806 新增事务方案修复掉线问题导致的重复消费 2025-11-08 10:28:49 +08:00
d59096f6d3 活动同步问题修复 2025-11-08 10:28:38 +08:00
10fa6fd739 活动同步问题修复 2025-11-08 10:28:30 +08:00
accd09409d 思迅同步销售流水和支付流水,调价时间查询新增 2025-11-08 10:28:19 +08:00
eaf1a87db8 思迅同步销售流水和支付流水 2025-11-08 10:28:04 +08:00
d4a7c4b3fb 思迅设置用户名称 2025-11-08 10:27:09 +08:00
62eb843629 新增库存扣减中间表的消费,保证库存的扣减一致性 2025-11-08 10:26:51 +08:00
ef36db0b44 服务器下载路径修改 2025-11-08 10:26:07 +08:00
2d612ecc7a 商品分类逻辑,去除父类 2025-11-08 10:25:54 +08:00
2a2ec2f9b3 活动客户端代码提交 2025-11-08 10:25:28 +08:00
c587ad5532 活动客户端代码提交 2025-11-08 10:25:04 +08:00
d2cdc097f8 客户端代码提交 2025-11-08 10:24:19 +08:00
ee31d1f75d 防篡改问题修复 2025-11-08 10:23:44 +08:00
80607c8642 思迅查询去除淘汰商品 2025-11-08 10:23:29 +08:00
ce974276a8 思迅同步活动问题修复 2025-11-08 10:22:57 +08:00
da259b15e9 思迅同步品牌问题修复 2025-11-08 10:21:07 +08:00
d1ef71669e 更新逻辑修改 2025-11-08 10:14:45 +08:00
44794636f7 同步商品命名修改恢复 2025-11-08 10:12:18 +08:00
19756ee7e3 砍价逻辑修改 2025-11-08 00:46:34 +08:00
2e7612ac93 解决商品不存在时的扣减出错问题 2025-11-07 17:42:47 +08:00
38a1ce0c66 解决下载密钥解析问题 2025-11-07 17:21:59 +08:00
415bbfd4ba 砍价字段修改,补充逻辑 2025-11-07 16:57:46 +08:00
cfb8714410 打印日志,检查下载包下载失败问题 2025-11-07 16:51:28 +08:00
070c1fc625 重构shop_store_activity_base表,解决版本不兼容问题 2025-11-07 16:51:16 +08:00
eeb7f05706 退单针对商品不存在的问题处理 2025-11-07 14:37:02 +08:00
2661277bd2 砍价字段修改 2025-11-07 12:42:01 +08:00
db33dd255e 时间字段命名修复 2025-11-07 09:00:28 +08:00
d2289f2d12 砍价字段修改 2025-11-07 00:35:05 +08:00
507b65838c fix 预约订单时间槽,增加 开业筹备中的店铺逻辑 2025-11-06 22:52:59 +08:00
bb0eb917c1 退款总额取值修复 2025-11-06 18:22:47 +08:00
f3cf329f19 Merge branch 'main' of http://git.gpxscs.cn/backend/java-mall 2025-11-06 18:02:05 +08:00
3287be123e createTime和updateTime时间已有删除重复设置值 2025-11-06 18:01:52 +08:00
57ccf4f599 fix 预约订单时间槽 2025-11-06 18:01:15 +08:00
3c19ee7064 手动新增商品时新增item条码 2025-11-06 17:31:47 +08:00
3ee9eaee8d 自取更新时间 2025-11-06 17:31:34 +08:00
30bf1446d4 Merge remote-tracking branch 'origin/main' 2025-11-06 16:58:59 +08:00
45a2f7a07d 修复 实体类的 错误, 优化打包指令 2025-11-06 16:58:52 +08:00
1aea5d0281 金额取整数 2025-11-06 16:49:09 +08:00
38b674e05a 砍价活动 时间槽 修正新需求。 增加必要的字段 2025-11-06 12:38:06 +08:00
0c15b2c034 退款新增总额 2025-11-06 09:36:52 +08:00
4814ca202d 退款新增总额 2025-11-06 09:36:18 +08:00
2ab4495920 时间槽调整 2025-11-06 00:57:46 +08:00
ea0afa5bdb 白名单调整 2025-11-05 17:24:42 +08:00
3a4a8d7772 打印同步规格日志 2025-11-05 16:36:13 +08:00
12fbd15a66 Merge remote-tracking branch 'origin/main' 2025-11-05 15:13:03 +08:00
d711a70e34 项目打包配置修复 2025-11-05 15:12:53 +08:00
b9d4d8744f 更新时不再自动匹配图库,以提升服务器性能 2025-11-05 09:14:30 +08:00
5c6bf1bb3f 服务器网卡配置 2025-11-05 02:41:47 +08:00
ef4db7a0bf 活动商品字段改变逻辑修改 2025-11-04 18:12:45 +08:00
fa80c2fca3 店铺营业状态增加 开业活动筹备中 字段 2025-11-04 17:50:37 +08:00
85294f332a 规格计算单价 2025-11-04 14:39:49 +08:00
81fe3a88b8 更改 diy 装修组件 2025-11-04 14:34:20 +08:00
eb5ddd03df 新增事务方案修复掉线问题导致的重复消费 2025-11-04 11:43:01 +08:00
ddd20b825e 同步价改为订单价格 2025-11-04 11:18:35 +08:00
f7a6cecd31 活动同步问题修复 2025-11-03 18:02:43 +08:00
88e9a52071 活动同步问题修复 2025-11-03 18:02:43 +08:00
d3790fae0d 主题活动同步改同步 2025-11-03 18:02:22 +08:00
2746f11442 思迅同步销售流水和支付流水,调价时间查询新增 2025-11-03 16:12:21 +08:00
7932c2cdf7 思迅同步销售流水和支付流水 2025-11-03 16:11:59 +08:00
3b7a923109 新增单价营业员相关字段,实现思迅流水 2025-11-03 15:46:22 +08:00
98f5a160af docker 镜像打包到 registry ,改变原来的做法,未双机部署,做好准备 2025-11-03 14:16:56 +08:00
ee3437005b docker 镜像打包到 registry ,改变原来的做法,未双机部署,做好准备 2025-11-03 08:44:31 +08:00
3d31e4cd74 砍价下单验证是否达标,不达标不允许下单购买 2025-11-02 00:09:09 +08:00
2af8bc966a 砍价下单验证是否达标,不达标不允许下单购买 2025-11-01 17:48:20 +08:00
abfefb6f57 砍价详情增加 判断可以立即出手字段 2025-11-01 16:49:39 +08:00
6acf94acb5 推送消息 2025-11-01 14:39:19 +08:00
60c4df7625 内部运费的优化,增加店铺可以设置内部运费。 2025-11-01 11:00:39 +08:00
fd88f45625 思迅同步地址 2025-11-01 10:51:31 +08:00
eb268d35b3 预订单逻辑优化 2025-10-31 21:58:43 +08:00
c91fc181c9 活动逻辑处理 2025-10-31 16:05:08 +08:00
002baf3ffd Merge remote-tracking branch 'origin/main' 2025-10-31 16:04:01 +08:00
a20ca370b9 发布后更改发版时间 2025-10-31 10:23:38 +08:00
3aef824fbe Merge remote-tracking branch 'origin/main' 2025-10-31 09:41:50 +08:00
a0b92c219e 优化商品切割 2025-10-31 09:06:12 +08:00
a7f2a7ac14 调整了打票机 订单商品间距 2025-10-31 08:55:15 +08:00
621f557e34 调整了打票机 订单商品间距 2025-10-30 19:58:49 +08:00
c64c404495 店铺信息表增加 两个时间和店铺内部运费字段 2025-10-30 12:41:44 +08:00
6315b69246 重新上架,上架时间改为当前时间 2025-10-30 11:49:01 +08:00
c3997d074f 优化同步的单位判断 2025-10-30 10:48:54 +08:00
5ff094de7a 预订单时间槽列表逻辑调整,分账、提现 报文字段 保存 2025-10-30 10:47:14 +08:00
6a335ef1aa 预订单时间槽列表逻辑调整,分账、提现 报文字段 保存 2025-10-30 01:22:17 +08:00
0248a38268 预订单时间槽列表逻辑调整,分账、提现 报文字段 保存 2025-10-30 01:01:40 +08:00
7810340cde 同步数据不更新商品名称 2025-10-29 16:21:51 +08:00
975f438137 新增分类查询排序 2025-10-29 15:48:38 +08:00
32ef77830d 解决线程不安全的时间操作,防止时间溢出 2025-10-29 12:12:28 +08:00
8815fb9d94 修改商品货架号同步到base表 2025-10-29 12:12:12 +08:00
a6877b3684 思迅设置用户名称 2025-10-29 10:20:54 +08:00
0d6ca9cb59 商品价格分类同步改为更新不修改发版状态 2025-10-29 10:17:18 +08:00
bc543b30ef 商品映射市场价更改 2025-10-28 18:52:22 +08:00
ebab4a6105 商品映射市场价更改 2025-10-28 18:27:46 +08:00
dd78c70ddd 映射导入更新字段 2025-10-28 16:57:32 +08:00
f061da5fea 线上溢价率新增 2025-10-28 16:04:10 +08:00
d3500e62f1 商家注册初始密码短信,商家入驻发送短信,优化 2025-10-28 11:47:41 +08:00
0b1f7bd30e 商家注册初始密码短信,商家入驻发送短信,优化 2025-10-28 10:51:27 +08:00
e507a3cfab 修改上架时间不准确,默认库存同步问题 2025-10-28 10:47:46 +08:00
6cb3ae2eac 更新时不重新匹配图片 2025-10-28 10:11:39 +08:00
97441ca887 商家比例 完善 2025-10-28 00:27:32 +08:00
3e9688f21d 顺丰配置 商家id 2025-10-27 23:29:15 +08:00
f87242a929 下单总入口,打烊店铺限制下单 2025-10-27 17:23:52 +08:00
ff66979876 根据条形码查询商品详情,用于编辑 2025-10-27 16:15:17 +08:00
d3d5e6b5bc 根据条形码查询商品详情,用于编辑 2025-10-27 16:14:54 +08:00
f5036d7a39 下单总入口,打烊店铺限制下单 2025-10-27 16:11:30 +08:00
80ce73a168 下单总入口,打烊店铺限制下单 2025-10-27 15:54:05 +08:00
2489bd66d0 fix 提现通知 补偿 bug 2025-10-26 23:15:46 +08:00
654fd82cf6 下单增加 item_barcode 字段 2025-10-26 01:57:59 +08:00
6b7cc54b01 预约订单槽点列表 优化 2025-10-25 17:31:20 +08:00
955fe3a3ff Merge remote-tracking branch 'origin/main' 2025-10-25 16:18:23 +08:00
4ff892d09b 预约订单槽点列表 2025-10-25 16:18:15 +08:00
89b7f8f0ff 商品默认不上架,查询改为按时间倒叙 2025-10-25 16:04:21 +08:00
9b5c618c40 预约订单校验 修改逻辑 2025-10-25 14:35:21 +08:00
dfab392ed6 Merge remote-tracking branch 'origin/main' 2025-10-24 17:44:01 +08:00
dd3a25856c 优化创建顺丰店铺方法的参数 2025-10-24 17:43:52 +08:00
f2b7283fa5 商品映射新增导出未分配商品功能 2025-10-24 17:39:17 +08:00
3ed0363ef1 fix 字段起名错误,商家订单根据从order_id desc 改成 下单时间倒序排 2025-10-24 15:57:01 +08:00
fa9034f7b3 修改更新库存方法 2025-10-24 15:12:18 +08:00
72740a37c8 修改更新库存方法 2025-10-24 15:06:36 +08:00
8657996705 是否允许退款方法修正 2025-10-24 14:01:46 +08:00
e847381bde 类型改为可以更改 2025-10-24 12:05:05 +08:00
ea7af33acb 调整sql语句,预约下单的 2025-10-24 11:52:23 +08:00
20fe8535d0 预订单任务表 定时任务逻辑,redis 逻辑 2025-10-24 00:22:36 +08:00
b21f526797 修改库存无法退回问题 2025-10-23 17:23:13 +08:00
a62b4b837d 预订单任务表 方法编写 2025-10-23 16:51:05 +08:00
bc1c308043 异常订单更改操作流程 2025-10-23 16:38:14 +08:00
675d210956 预订单任务表 方法编写 2025-10-23 16:09:36 +08:00
0b738e1b05 异常订单自行发货状态修改,改为已出库 2025-10-23 15:17:40 +08:00
d886bb51ab 新增顺丰同城库存扣减 2025-10-23 14:59:34 +08:00
3ce2b7cbd6 商家手动点击确认后修改状态 2025-10-23 14:28:52 +08:00
e341d619e5 Merge remote-tracking branch 'origin/main' 2025-10-23 10:36:52 +08:00
7c8120b43f 预订单任务表 方法编写 2025-10-23 10:36:43 +08:00
724c22481e 同城配送时修改兼容手动配送的微信发货操作 2025-10-23 10:10:58 +08:00
8fcfbe2c5e 修改预定单字段 2025-10-23 02:17:31 +08:00
ea4d5f334e 增加预定任务表 2025-10-23 02:04:05 +08:00
0f76b38418 顺丰创建内部方法添加 2025-10-22 17:48:18 +08:00
c3a3b2800a Merge remote-tracking branch 'origin/main'
# Conflicts:
#	mall-shop/src/main/java/com/suisung/mall/shop/sfexpress/service/impl/SFExpressApiServiceImpl.java
2025-10-22 17:47:16 +08:00
42e825c323 顺丰创建内部方法添加 2025-10-22 17:46:51 +08:00
cbed988f4a 新增发货后的蓝驰系统库存扣减 2025-10-22 17:41:24 +08:00
20cab88cf9 商家异常订单手动发货功能新增 2025-10-22 15:17:32 +08:00
1112033ed8 拣货完成,更改参数 2025-10-22 12:48:35 +08:00
6398635707 预约订单参数加入下单流程。 2025-10-22 00:14:43 +08:00
a65fb441cb 思迅同步,改为出库时才扣减库存 2025-10-21 18:02:23 +08:00
2b03dee62d order info 增加预约下单的相关三字段 2025-10-21 16:27:24 +08:00
aeb3c0d029 思迅同步库存问题修改,新增取消订单和商家同意退货时触发库存回退到思迅 2025-10-21 15:19:03 +08:00
69b195322e 优化自动取消订单批次,改为分页 2025-10-21 15:18:46 +08:00
405 changed files with 70608 additions and 25970 deletions

View File

@ -36,6 +36,7 @@ public class DynamicTaskScheduler {
@PostConstruct
public void initTasks() {
try {
//初始化 start
CommentModel commentModel =sxDataService.getCommentModel();
DataBaseInfo enabledTask = sxDataService.getDataBaseInfo(commentModel);
@ -44,6 +45,10 @@ public class DynamicTaskScheduler {
refreshTasks();
// 每5分钟检查一次数据库更新
taskScheduler.scheduleAtFixedRate(this::refreshTasks, Duration.ofHours(1));
}catch (Exception e){
log.info("系统异常:{}",e.getMessage());
}
}
public void refreshTasks() {
@ -96,13 +101,46 @@ public class DynamicTaskScheduler {
commentModel =sxDataService.getCommentModel();
}
DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel);
if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){
commentModel.setSyncTime(DateUtil.formatDateTime(dataBaseInfo.getRefreshTime()));
if(dataBaseInfo==null||StringUtils.isEmpty(dataBaseInfo.getUserName())){
return;
}
sxDataService.syncStoreData(dataBaseInfo,commentModel);
String refreshTime="";
if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){
refreshTime=DateUtil.formatDateTime(dataBaseInfo.getRefreshTime());
commentModel.setSyncTime(refreshTime);
}
int i=0;
boolean isException=false;
while (i<3){
try {
sxDataService.syncStoreData(dataBaseInfo,commentModel);//同步网上售卖流水
break;
}catch (Exception e){
i++;
try {
Thread.sleep(Long.parseLong("3000"));
} catch (InterruptedException ex) {
log.info(ex.getMessage());
}
if(i==3){
log.info(e.getMessage());
isException=true;
}
}
}
if(isException){
return;
}
if(StringUtils.isNotEmpty(refreshTime)){//有刷新时间证明不是全量需要判断是否有新商品有新商品才同步品牌和分类
if(sxDataService.isNewShop(dataBaseInfo,refreshTime)){
sxDataService.SyncBranchList(dataBaseInfo,commentModel);
sxDataService.SyncCategory(dataBaseInfo,commentModel);
}
}else {
log.info("首次同步,无刷新时间");
sxDataService.SyncBranchList(dataBaseInfo,commentModel);
sxDataService.SyncCategory(dataBaseInfo,commentModel);
}
sxDataService.SyncGoods(dataBaseInfo,commentModel);//todo 暂时同步全部的商品如果后期修改需要增加服务器的字段
try {
if(ObjectUtil.isNotEmpty(dataBaseInfo.getShopGapTime())){
@ -114,9 +152,25 @@ public class DynamicTaskScheduler {
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if(ObjectUtil.isNotEmpty(dataBaseInfo.getRefreshTime())){
commentModel.setSyncTime(refreshTime);
}
if("1".equals(dataBaseInfo.getIsSyncMember())){//同步会员
sxDataService.SyncVipList(dataBaseInfo,commentModel);
sxDataService.syncAtive(dataBaseInfo,commentModel);
}
//同步活动数据判断是否同步活动数据有新活动且有活动数据才同步活动
if("1".equals(dataBaseInfo.getIsSyncActive())){
boolean isNewActives=sxDataService.syncAtive(dataBaseInfo,commentModel);
if(isNewActives){
log.info("---有新增的活动,同步活动商品开始--");
sxDataService.syncAtiveShops(dataBaseInfo,commentModel);
}else {
log.info("---无新增的活动,无需同步活动商品--");
}
}
sxDataService.refreshTime(commentModel);
isRuning=false;
}

View File

@ -36,7 +36,7 @@ public class FileUtils {
public static final String okEnd = "ok";//后缀
public static final String txtEnd = "txt";//后缀
public static String fileFormat = "%s_%s.%s";//good_1
public static String fileFormat = "%s_%s_%s.%s";//good_1
public static String getSyncTypeFlag(String syncType){
Calendar calendar=Calendar.getInstance();
@ -96,12 +96,21 @@ public class FileUtils {
* @param filePath
*/
public void writeFile(String filePath,String fileName,String content){
FileWriter writer =null;
try {
FileWriter writer = new FileWriter(filePath+pathSeparator+fileName);
writer = new FileWriter(filePath+pathSeparator+fileName,false);
writer.write(content);
writer.flush();
writer.close();
log.info("文件写入成功!");
} catch (IOException e) {
if(writer!=null){
try {
writer.close();
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
log.info("文件写入失败:{}", e.getMessage());
}
}
@ -112,7 +121,7 @@ public class FileUtils {
* @param page
* @return
*/
public String getFileName(String syncType ,Integer page,String endFix){
public String getFileName(String syncType ,Integer page,String endFix,String fileEndFix){
String result="";
switch (syncType){
case "1":
@ -130,7 +139,7 @@ public class FileUtils {
default:
break;
}
return String.format(fileFormat, result,page,endFix);
return String.format(fileFormat, result,page,fileEndFix,endFix);
}
/**
@ -170,7 +179,7 @@ public class FileUtils {
FileUtils fileUtils= new FileUtils();
File file=fileUtils.createFile("1",1);
System.out.printf("--"+file.getAbsoluteFile());
fileUtils.writeFile(file.getAbsolutePath(),fileUtils.getFileName("1",2,txtEnd),"456");
fileUtils.writeFile(file.getAbsolutePath(),fileUtils.getFileName("1",2,txtEnd,"operate"),"456");
}
}

View File

@ -36,6 +36,8 @@ public class HttpUtils {
public static final String URL_SYNC_GET_STOR_DATA_RELEASE="/shop/sync/third/syncStoreDataRelease";//库存同步
public static final String URL_SYNC_POST_STORE_DATA_RESPONSE="/shop/sync/third/syncStoreDataReleaseResponse";//等待服务器相应消费
public static final String URL_SYNC_GOODS_NOTICE_UPLOAD_TO_OSS="/shop/sync/third/uploudToCos";//通知上传文件到cos
public static final String URL_SYNC_ACTIVE="/shop/sync/third/syncAtive";//同步活动到服务器

View File

@ -0,0 +1,38 @@
package com.small.client.Utils;
import java.util.Collection;
import java.util.Iterator;
public class SqlBuilder {
/**
* 构建IN查询条件
* @param fieldName 字段名
* @param values 值集合
* @return IN条件字符串
*/
public static String buildInCondition(String fieldName, Collection<?> values) {
if (values == null || values.isEmpty()) {
return "";
}
StringBuilder sb = new StringBuilder();
sb.append(" ").append(fieldName).append(" in (");
Iterator<?> iterator = values.iterator();
while (iterator.hasNext()) {
Object value = iterator.next();
if (value instanceof String) {
sb.append("'").append(value).append("'");
} else {
sb.append(value);
}
if (iterator.hasNext()) {
sb.append(",");
}
}
sb.append(")");
return sb.toString();
}
}

View File

@ -75,7 +75,7 @@ public class WebController {
//sxDataService.getAppSign();
CommentModel commentModel= sxDataService.getCommentModel();
DataBaseInfo dataBaseInfo=sxDataService.getDataBaseInfo(commentModel);
if(dataBaseInfo==null){
if(dataBaseInfo==null||StringUtils.isEmpty(dataBaseInfo.getUserName())){
log.error("syncGoods dataBaseInfo is null");
return;
}

View File

@ -186,8 +186,8 @@ public class BaseDao {
int total=0;
Connection connection=getConnection(ip,username,password,portNumber,dataBaseName);
try {
String sql="select count(1) from t_pub_plan_detail_b d left join t_pub_plan_master m on " +
" d.plan_no =m.plan_no %s";
String sql="select count(1) from t_pub_plan_detail_b d left join t_pub_plan_master t on " +
" d.plan_no =t.plan_no %s";
sql=String.format(sql,where);
log.info(sql);
PreparedStatement ps= connection.prepareStatement(sql);
@ -266,7 +266,7 @@ public class BaseDao {
return total;
}
public Integer getBaseGoodsJoinTotal(String ip, String username, String password,Integer portNumber, String dataBaseName,String where){
public Integer getBaseGoodsJoinTotal(String ip, String username, String password,Integer portNumber, String dataBaseName,String where,String stockOperateWhere){
int total=0;
Connection connection=getConnection(ip,username,password,portNumber,dataBaseName);
try {
@ -278,19 +278,18 @@ public class BaseDao {
" ROW_NUMBER() OVER(PARTITION BY tib.item_no ORDER BY tib.oper_date DESC) AS rn " +
" FROM t_im_branch_stock tib\n" +
") " +
"SELECT " +
" b.*, " +
" ls.stock_qty, " +
" ls.oper_date " +
"SELECT count(1) " +
// " b.*, " +
// " ls.stock_qty, " +
// " ls.oper_date " +
"FROM ( " +
" SELECT " +
" ROW_NUMBER() OVER(ORDER BY item_clsno) AS rowId, " +
" ROW_NUMBER() OVER(ORDER BY item_clsno,item_no) AS rowId, " +
" * " +
" FROM t_bd_item_info " +
" FROM t_bd_item_info shop %s" +
") b " +
"LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 " +
" %s";
sql=String.format(sql,where);
"LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 %s";
sql=String.format(sql,where,stockOperateWhere);
log.info(sql);
PreparedStatement ps= connection.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
@ -344,7 +343,8 @@ public class BaseDao {
return resultDto;
}
public ResultDto baseFindGoodsListJoinPage(String ip, String username, String password,Integer portNumber, String dataBaseName, int pageNo, int pageSize,String where){
public ResultDto baseFindGoodsListJoinPage(String ip, String username, String password,Integer portNumber, String dataBaseName, int pageNo, int pageSize,
String where,String stockOperateWhere){
Connection connection=getConnection(ip,username,password,portNumber,dataBaseName);
int start=(pageNo-1)*pageSize+1;
int end=pageNo*pageSize;
@ -355,19 +355,76 @@ public class BaseDao {
" tib.oper_date," +
" ROW_NUMBER() OVER(PARTITION BY tib.item_no ORDER BY tib.oper_date DESC) AS rn " +
" FROM t_im_branch_stock tib " +
") " +
"SELECT " +
"), " +
"PagedData As( SELECT " +
"ROW_NUMBER() OVER (ORDER BY b.rowId) AS rowIdA, "+//-- 这里重新生成从1开始连续的行号
" b.*, " +
" ls.stock_qty, " +
" ls.oper_date " +
"FROM ( " +
" SELECT " +
" ROW_NUMBER() OVER(ORDER BY item_clsno) AS rowId ," +
" ROW_NUMBER() OVER(ORDER BY item_clsno,item_no) AS rowId ," +
" * " +
" FROM t_bd_item_info\n" +
" FROM t_bd_item_info shop %s" +
") b " +
"LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 " +
" %s b.rowId BETWEEN %s AND %s ";
"LEFT JOIN LatestStock ls ON b.item_no = ls.item_no AND ls.rn = 1 %s) " +
"SELECT * FROM PagedData where rowIdA BETWEEN %s AND %s ";
sql=String.format(sql,where,stockOperateWhere,start,end);
log.info(sql);
ResultDto resultDto=new ResultDto();
ResultSet rs=null;
try {
PreparedStatement ps= connection.prepareStatement(sql);
rs = ps.executeQuery();
} catch (SQLException e) {
log.info("数据库查询异常方法{},异常信息{}","com.suisung.mall.shop.sixun.dao.BaseDao.baseFindListJoinPage",e.getMessage());
throw new RuntimeException(e);
}
resultDto.setResultSet(rs);
resultDto.setConnection(connection);
return resultDto;
}
/**
* 全量查询
* @param ip
* @param username
* @param password
* @param portNumber
* @param dataBaseName
* @param pageNo
* @param pageSize
* @param where
* @param stockOperateWhere
* @return
*/
public ResultDto baseFindAllGoodsListJoinPage(String ip, String username, String password,Integer portNumber, String dataBaseName, int pageNo, int pageSize,
String where,String stockOperateWhere){
Connection connection=getConnection(ip,username,password,portNumber,dataBaseName);
int start=(pageNo-1)*pageSize+1;
int end=pageNo*pageSize;
String sql="SELECT * " +
"FROM (" +
" SELECT " +
" ROW_NUMBER() OVER(ORDER BY shop.item_clsno, shop.item_no) AS rowIdA," +
" shop.*," +
" (\n" +
" SELECT TOP 1 stock_qty " +
" FROM t_im_branch_stock " +
" WHERE item_no = shop.item_no " +
" ORDER BY oper_date DESC " +
" ) as stock_qty,\n" +
" (\n" +
" SELECT TOP 1 oper_date " +
" FROM t_im_branch_stock " +
" WHERE item_no = shop.item_no " +
" ORDER BY oper_date DESC " +
" ) as oper_date " +
" FROM t_bd_item_info shop " +
" %s " +
") t " +
"WHERE rowIdA BETWEEN %s AND %s " +
"ORDER BY rowIdA;";
sql=String.format(sql,where,start,end);
log.info(sql);
ResultDto resultDto=new ResultDto();

View File

@ -9,8 +9,10 @@ import com.google.gson.Gson;
import com.small.client.Utils.BigDecimalFormatter;
import com.small.client.Utils.CommonUtil;
import com.small.client.Utils.HttpUtils;
import com.small.client.Utils.SqlBuilder;
import com.small.client.dto.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@ -20,6 +22,8 @@ import org.springframework.web.client.RestTemplate;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.*;
import java.sql.Date;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -50,6 +54,10 @@ public class SxDataDao extends BaseDao{
//private final static String T_IM_BRANCH_STOCK="t_im_branch_stock";//库存表
private final static String T_BD_BRANCH_INFO="t_bd_branch_info";//仓库表
private final static String T_RM_CASHIER="t_rm_cashier";//小发收银账号
private final static String T_IM_BRANCH_STOCK="(" +
"select * from( " +
" select ROW_NUMBER() OVER( " +
@ -119,9 +127,15 @@ public class SxDataDao extends BaseDao{
try {
while (rs.next()) {
sxSyncCategory=new SxSyncCategory();
sxSyncCategory.setItem_clsname(rs.getString("item_clsname"));//分类名称
sxSyncCategory.setCls_parent(rs.getString("cls_parent"));//父级编码
sxSyncCategory.setItem_clsno(rs.getString("item_clsno"));//分类编码
if(StringUtils.isNotEmpty(rs.getString("item_clsname"))){
sxSyncCategory.setItem_clsname(rs.getString("item_clsname").trim());//分类名称
}
if(StringUtils.isNotEmpty(rs.getString("cls_parent"))){
sxSyncCategory.setCls_parent(rs.getString("cls_parent").trim());//父级编码
}
if(StringUtils.isNotEmpty(rs.getString("item_clsno"))){
sxSyncCategory.setItem_clsno(rs.getString("item_clsno").trim());//分类编码
}
// System.out.printf(rs.getString("item_clsno"));//分类编码
// log.info(rs.getString("item_clsname")+"\t");//分类名称
//log.info(rs.getString("cls_parent")+"\t");//父级编码
@ -170,8 +184,12 @@ public class SxDataDao extends BaseDao{
* @return
*/
public int getTBditemInfoJoninTotal(DataBaseInfo dataBaseInfo){
String stockOperateWhere="";
if(StringUtils.isNotEmpty(dataBaseInfo.getStockOperateWhere())){
stockOperateWhere="where "+dataBaseInfo.getStockOperateWhere();
}
return getBaseGoodsJoinTotal(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()
,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere());
,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere(),stockOperateWhere);
}
/**
@ -191,9 +209,22 @@ public class SxDataDao extends BaseDao{
* @param pageNo
* @param pageSize
*/
public List<SxSyncGoods> findBditemInfoListPage(DataBaseInfo dataBaseInfo,int pageNo,int pageSize){
ResultDto resultDto=baseFindGoodsListJoinPage(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()
,pageNo,pageSize,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere());
public List<SxSyncGoods> findBditemInfoListPage(DataBaseInfo dataBaseInfo,int pageNo,int pageSize,boolean isAll){
String stockOperateWhere="";
if(StringUtils.isNotEmpty(dataBaseInfo.getStockOperateWhere())){
stockOperateWhere=" where "+dataBaseInfo.getStockOperateWhere();
}
ResultDto resultDto=null;
if(!isAll){
resultDto=baseFindGoodsListJoinPage(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()
,pageNo,pageSize,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere(),stockOperateWhere);
}else {
resultDto=baseFindAllGoodsListJoinPage(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName()
,pageNo,pageSize,dataBaseInfo.getWhere()==null?DEFALTWHERE:dataBaseInfo.getWhere(),stockOperateWhere);
}
ResultSet rs= resultDto.getResultSet();
List<SxSyncGoods> sxSyncGoodses=new ArrayList<>();
SxSyncGoods sxSyncGoods=null;
@ -214,6 +245,7 @@ public class SxDataDao extends BaseDao{
}else {
sxSyncGoods.setGross_margin(new BigDecimal("0"));//毛利率
}
sxSyncGoods.setId(rs.getLong("rowIdA"));
sxSyncGoods.setItem_no(rs.getString("item_no"));//货号
sxSyncGoods.setItem_subname(rs.getString("item_name"));//商品名称
sxSyncGoods.setItem_subno(rs.getString("item_subno"));//商品条码
@ -470,17 +502,21 @@ public class SxDataDao extends BaseDao{
* @param dataBaseInfo
* @param map
*/
public void updateStoreData(DataBaseInfo dataBaseInfo, Map map,List<ProductQuantityConsumptionDto> productQuantityConsumptionDtoList,
public void updateStoreData(DataBaseInfo dataBaseInfo, Map map,Map<String,ProductQuantityConsumptionDto> pqMap,List<ProductQuantityConsumptionDto> productQuantityConsumptionDtoList,
CommentModel commentModel){
if(CollectionUtil.isEmpty(map)){
log.info("同步数据为空");
return;
}
String brachNo=getLocalBranch(dataBaseInfo);//获取总店铺分仓编号
Map<String,ItemInfo> itemInfoMap= findItemInfoList(dataBaseInfo,map);//查询商品信息
Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),
dataBaseInfo.getPassword(), dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName());
try {
conn.setAutoCommit(false); // 关闭自动提交开启事务
//String sql = "update t_im_branch_stock set stock_qty= stock_qty+(?),oper_date=? where item_no=?";
List<RmSaleflow> rmSaleflowList=new ArrayList<>();
List<TRmPayflow> tRmPayflowList=new ArrayList<>();
String sql = "WITH TopStock AS ( " +
" SELECT TOP(1) * " +
" FROM t_im_branch_stock " +
@ -489,17 +525,36 @@ public class SxDataDao extends BaseDao{
") " +
" UPDATE TopStock " +
" SET stock_qty = stock_qty+(?),oper_date=?;";
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
try (PreparedStatement ps = conn.prepareStatement(sql)) {
int batchSize = 1000; // 每批处理1000条
int batchSize = 100; // 每批处理1000条
int count = 0;
Set<Map.Entry> sme=map.entrySet();
for (Map.Entry entry : sme) {
String key=entry.getKey().toString();
String[] splitKey = key.split("-");
if(splitKey.length!=2){
continue;
}
String itemNo = splitKey[1];
BigDecimal stock_qty= (BigDecimal) entry.getValue();
if(stock_qty.compareTo(BigDecimal.ZERO)==0){
continue;
}
ps.setString(1, (String) entry.getKey());
ProductQuantityConsumptionDto productQuantityConsumptionDto=pqMap.get(key);
if(productQuantityConsumptionDto.getSaleAmount().compareTo(BigDecimal.ZERO)==0){
continue;
}
RmSaleflow rmSaleflow = getRmSaleflow(productQuantityConsumptionDto, itemNo, stock_qty);
rmSaleflow= fixRmSaleFlow(rmSaleflow,brachNo,itemInfoMap,dataBaseInfo.getSaleAccount());
TRmPayflow trmPayflow=fixTRmPayflow(rmSaleflow);
rmSaleflowList.add(rmSaleflow);
tRmPayflowList.add(trmPayflow);
ps.setString(1, itemNo);
ps.setDouble(2, stock_qty.doubleValue());
ps.setTimestamp(3, timestamp);
ps.addBatch(); // 添加至批处理
@ -513,6 +568,15 @@ public class SxDataDao extends BaseDao{
// 执行剩余未满 batchSize 的批次
int[] remainingCounts = ps.executeBatch();
//todo 新增流水
if(dataBaseInfo.getClientVersion().equals(DataBaseInfo.SHANG_YUN)){
updateStoreSaleFlow(conn,rmSaleflowList,tRmPayflowList);
}
if (dataBaseInfo.getClientVersion().equals(DataBaseInfo.SHANG_RUI)){
updateStoreSaleFlowShangRui(conn,rmSaleflowList,tRmPayflowList);
}
List<String> consumIds=productQuantityConsumptionDtoList
.stream()
.map(ProductQuantityConsumptionDto::getConsumeId)
@ -527,7 +591,7 @@ public class SxDataDao extends BaseDao{
if (!HttpUtils.SUCCESSCODE.equals(code)) {
throw new Exception("服务器异常");
}
log.info("剩余批次更新数: {}", Arrays.toString(remainingCounts));
log.info("库存更新剩余批次更新数: {}", Arrays.toString(remainingCounts));
conn.commit(); // 最终提交事务
log.info("批量更新完成,总记录数: {}" , count);
//baseUpdateImBrancStock(dataBaseInfo);
@ -548,6 +612,518 @@ public class SxDataDao extends BaseDao{
}
}
/**
* 封装对象
* @param productQuantityConsumptionDto
* @param itemNo
* @param stock_qty
* @return
*/
private RmSaleflow getRmSaleflow(ProductQuantityConsumptionDto productQuantityConsumptionDto, String itemNo, BigDecimal stock_qty) {
BigDecimal unitPrice = productQuantityConsumptionDto.getUnitPrice();
RmSaleflow rmSaleflow=new RmSaleflow();
rmSaleflow.setItemNo(itemNo);
rmSaleflow.setSalePrice(unitPrice);
rmSaleflow.setSaleQnty(stock_qty);
BigDecimal saleMoney = unitPrice.multiply(stock_qty).setScale(2, RoundingMode.HALF_UP);
if(saleMoney.compareTo(BigDecimal.ZERO)<0){
saleMoney=saleMoney.multiply(new BigDecimal(-1));
}
rmSaleflow.setSaleMoney(saleMoney);
// rmSaleflow.setSourcePrice(unitPrice);
rmSaleflow.setFlownoRand(productQuantityConsumptionDto.getOrderId());//随机子单号 设置网上订单号
if(null!=productQuantityConsumptionDto.getSaleTime()){
rmSaleflow.setOperDate(new Timestamp(productQuantityConsumptionDto.getSaleTime()));
}else {
rmSaleflow.setOperDate(new Timestamp(System.currentTimeMillis()));
}
return rmSaleflow;
}
/**
* 补充字段
* @param rmSaleflow
* @return
*/
public RmSaleflow fixRmSaleFlow(RmSaleflow rmSaleflow,String branchNo,Map<String,ItemInfo> itemInfoMap,String saleAccount){
//自定义单号 start
rmSaleflow.setFlowId(1);
String orderId=rmSaleflow.getFlownoRand();
String[] orderIdSplits= orderId.split("_");
//String DateStr=DateUtil.format(new java.util.Date(),"yyyyMMdd");
String DateStr=orderIdSplits[1];
String number= String.format("%04d", Integer.valueOf(orderIdSplits[orderIdSplits.length-1]));
String flowNo="99"+DateStr+number;
rmSaleflow.setFlowNo(flowNo);//订单号 todo
//自定义 单号 end
//判断取值 start
rmSaleflow.setSellWay("B");
rmSaleflow.setRetQnty(BigDecimal.ZERO);
if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){
rmSaleflow.setSellWay("A");
BigDecimal saleQnty=rmSaleflow.getSaleQnty();//销售数量
rmSaleflow.setSaleQnty(saleQnty);
rmSaleflow.setRetQnty(BigDecimal.ZERO);
}
// BigDecimal saleMoney=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty());
// if(rmSaleflow.getSaleQnty().compareTo(BigDecimal.ZERO)<0){
// saleMoney=saleMoney.multiply(new BigDecimal("-1"));
// }
// rmSaleflow.setSaleMoney(saleMoney);
//判断取值 end
//数据库查询取值start todo
ItemInfo itemInfo=itemInfoMap.get(rmSaleflow.getItemNo());
if(itemInfo!=null){
rmSaleflow.setInPrice(itemInfo.getPrice());
rmSaleflow.setSourcePrice(itemInfo.getSalePrice());
}
rmSaleflow.setBranchNo(branchNo);
//数据库查询取值end
//远程配置取值start todo
rmSaleflow.setOperId(saleAccount);
rmSaleflow.setSaleMan(saleAccount);
rmSaleflow.setCounterNo(saleAccount);
//远程配置取值end
//统一默认值 start
rmSaleflow.setNStan(BigDecimal.ZERO);
rmSaleflow.setChrStan("0");
rmSaleflow.setFlownoType("0");
rmSaleflow.setPrefAmt(BigDecimal.ZERO);
rmSaleflow.setComFlag("0");
rmSaleflow.setRemoteFlag("0");
rmSaleflow.setPaysum_flag("0");
rmSaleflow.setKz_flag("1");
//统一默认值 end
return rmSaleflow;
}
/**
* 支付流水赋值
* @return
*/
public TRmPayflow fixTRmPayflow(RmSaleflow rmSaleflow){
TRmPayflow rmPayflow=new TRmPayflow();
rmPayflow.setFlowId(rmSaleflow.getFlowId());
rmPayflow.setFlowNo(rmSaleflow.getFlowNo());
// BigDecimal saleAmount=rmSaleflow.getSalePrice().multiply(rmSaleflow.getSaleQnty()).setScale(2, RoundingMode.HALF_UP);
// if(saleAmount.compareTo(BigDecimal.ZERO)<0){
// saleAmount=saleAmount.multiply(new BigDecimal("-1"));
// }
// rmPayflow.setSaleAmount(saleAmount);
rmPayflow.setSaleAmount(rmSaleflow.getSaleMoney());
rmPayflow.setBranchNo(rmSaleflow.getBranchNo());
rmPayflow.setPayWay("RMB");//人民币
rmPayflow.setSellWay(rmSaleflow.getSellWay());
rmPayflow.setCardNo("");
rmPayflow.setVipNo(null);
rmPayflow.setCoinNo("RMB");//
rmPayflow.setCoinRate(new BigDecimal("1"));//利率
rmPayflow.setPayAmount(rmSaleflow.getSaleMoney());
rmPayflow.setOperDate(rmSaleflow.getOperDate());
rmPayflow.setOperId(rmSaleflow.getOperId());
rmPayflow.setCounterNo(rmSaleflow.getCounterNo());
rmPayflow.setSaleMan(rmSaleflow.getSaleMan());
rmPayflow.setMemo("");
rmPayflow.setVoucherNo("");//退货单号 退货时要填
rmPayflow.setRemoteFlag("0");
rmPayflow.setExchangeFlag("0");
rmPayflow.setShiftNo("");
rmPayflow.setComFlag("0");
rmPayflow.setPosid("01");
rmPayflow.setUptime(null);
rmPayflow.setFlownoRand(rmSaleflow.getFlownoRand());
rmPayflow.setCiceroniNo("0");
rmPayflow.setCiceroniId(null);
rmPayflow.setFlownoType(rmSaleflow.getFlownoType());
rmPayflow.setTransType(null);
rmPayflow.setUpBatchno("");//todo
rmPayflow.setUpVipacc("0");
rmPayflow.setCashNo("00");
if("B".equals(rmSaleflow.getSellWay())){//退货
rmPayflow.setMemo("正常退货");
rmPayflow.setVoucherNo("");//退货单号 退货时要填
rmPayflow.setRemoteFlag("");
rmPayflow.setExchangeFlag("0");
rmPayflow.setUpVipacc(null);
}
return rmPayflow;
}
/**
* 查询商品返回map
* @param dataBaseInfo
* @param map
* @return
*/
public Map<String,ItemInfo> findItemInfoList(DataBaseInfo dataBaseInfo,Map map){
if(CollectionUtil.isEmpty(map)){
return null;
}
Map<String,ItemInfo> resultMap=new HashMap<>();
Set<Map.Entry> sme=map.entrySet();
String where = "where 1=1 and ";
List<String> itemNos = sme.stream()
.map(entry -> {
String key= (String) entry.getKey();
String[] split = key.split("-");
return split[1];
})
.collect(Collectors.toList());
where += SqlBuilder.buildInCondition("item_no", itemNos);
ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),
dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(),T_BD_ITEM_INFO,where);
ResultSet rs= resultDto.getResultSet();
try {
while (rs.next()) {
ItemInfo itemInfo=new ItemInfo();
String itemNo=rs.getString("item_no").trim();
itemInfo.setItemNo(itemNo);//
if(StringUtils.isNotEmpty(rs.getString("item_subno"))){
itemInfo.setItemSubno(rs.getString("item_subno").trim());
}
if(StringUtils.isNotEmpty(rs.getString("item_name"))){
itemInfo.setItemName(rs.getString("item_name").trim());
}
if(StringUtils.isNotEmpty(rs.getString("item_brand"))){
itemInfo.setItemBrand(rs.getString("item_brand").trim());//品牌
}
if(StringUtils.isNotEmpty(rs.getString("price"))){
itemInfo.setPrice(rs.getBigDecimal("price"));//进货价
}
if(StringUtils.isNotEmpty(rs.getString("item_clsno"))){
itemInfo.setItemClsno(rs.getString("item_clsno").trim());
}
if(StringUtils.isNotEmpty(rs.getString("sale_price"))){
itemInfo.setSalePrice(rs.getBigDecimal("sale_price"));
}
resultMap.put(itemNo,itemInfo);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
try {
resultDto.getConnection().close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return resultMap;
}
/**
* 批量新增销售流水 商云10
* @param conn
* @param rmSaleflowList
*/
public void updateStoreSaleFlow(Connection conn,List<RmSaleflow> rmSaleflowList,List<TRmPayflow> payflowList){
if(CollectionUtil.isEmpty(rmSaleflowList)){
log.info("销售流水记录为空");
return;
}
// Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),
// dataBaseInfo.getPassword(), dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName());
//try {
//conn.setAutoCommit(false); // 关闭自动提交开启事务
String sql = "INSERT INTO t_rm_saleflow (" +
"flow_id, flow_no, branch_no, item_no, source_price, sale_price, " +
"sale_qnty, sale_money, sell_way, oper_id, sale_man, counter_no, " +
"oper_date, remote_flag, shift_no, com_flag, spec_flag, pref_amt, " +
"in_price, n_stan, chr_stan, posid, uptime, flowno_rand, ret_qnty, " +
"flowno_type, spec_sheet_no, cic_sheet_no" +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String sql2 = "INSERT INTO t_rm_payflow (" +
"flow_id, flow_no, sale_amount, branch_no, pay_way, sell_way, " +
"card_no, vip_no, coin_no, coin_rate, pay_amount, oper_date, " +
"oper_id, counter_no, sale_man, memo,remote_flag, " +
"exchange_flag, shift_no, com_flag, uptime, flowno_rand, " +
"ciceroni_no, ciceroni_id, flowno_type, trans_type, up_batchno, " +
"remark, cash_no" +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
try {
PreparedStatement ps = conn.prepareStatement(sql);//销售流水
PreparedStatement ps2 = conn.prepareStatement(sql2);//资金流水
int batchSize = 10; // 每批处理10条
int count = 0;
for (int i=0;i<rmSaleflowList.size();i++) {
//rmSaleflow start-------------
RmSaleflow rmSaleflow=rmSaleflowList.get(i);
ps.setInt(1,rmSaleflow.getFlowId());
ps.setString(2, rmSaleflow.getFlowNo());
ps.setString(3, rmSaleflow.getBranchNo());
ps.setString(4, rmSaleflow.getItemNo());
ps.setBigDecimal(5, rmSaleflow.getSourcePrice());
ps.setBigDecimal(6, rmSaleflow.getSalePrice());
BigDecimal saleQnty=rmSaleflow.getSaleQnty();
if(saleQnty.compareTo(BigDecimal.ZERO)<0){
saleQnty=saleQnty.multiply(new BigDecimal("-1"));
}
ps.setBigDecimal(7,saleQnty);
ps.setBigDecimal(8, rmSaleflow.getSaleMoney());
ps.setString(9, rmSaleflow.getSellWay());
ps.setString(10, rmSaleflow.getOperId());
ps.setString(11, rmSaleflow.getSaleMan());
ps.setString(12, rmSaleflow.getCounterNo());
ps.setTimestamp(13, rmSaleflow.getOperDate());//OperDate
ps.setString(14, rmSaleflow.getRemoteFlag());
ps.setString(15, "");//ShiftNo
ps.setString(16, rmSaleflow.getComFlag());
ps.setString(17, "");//SpecFlag
ps.setBigDecimal(18, rmSaleflow.getPrefAmt());
ps.setBigDecimal(19, rmSaleflow.getInPrice());
ps.setBigDecimal(20, rmSaleflow.getNStan());
ps.setString(21, rmSaleflow.getChrStan());
ps.setString(22, rmSaleflow.getPosid());
ps.setTimestamp(23, null);//Uptime
ps.setString(24, rmSaleflow.getFlownoRand());
ps.setBigDecimal(25, rmSaleflow.getRetQnty());
ps.setString(26, rmSaleflow.getFlownoType());
ps.setString(27, rmSaleflow.getSpecSheetNo());
ps.setString(28, "");//CicSheetNo
// ps.setString(29, rmSaleflow.getShareCardid());
// ps.setString(30, rmSaleflow.getItemNoFresh());
ps.addBatch(); // 添加至批处理
//rmSaleflow end-------------
//rmPayflow start-------------
TRmPayflow rmPayflow=payflowList.get(i);
//rmPayflow end-------------
ps2.setInt(1,rmPayflow.getFlowId());
ps2.setString(2, rmPayflow.getFlowNo());
ps2.setBigDecimal(3, rmPayflow.getSaleAmount());
ps2.setString(4, rmPayflow.getBranchNo());
ps2.setString(5, rmPayflow.getPayWay());
ps2.setString(6, rmPayflow.getSellWay());
ps2.setString(7, rmPayflow.getCardNo());
ps2.setString(8, rmPayflow.getVipNo());
ps2.setString(9, rmPayflow.getCoinNo());
ps2.setBigDecimal(10, rmPayflow.getCoinRate());
ps2.setBigDecimal(11, rmPayflow.getPayAmount());
ps2.setTimestamp(12, rmPayflow.getOperDate());
ps2.setString(13, rmPayflow.getOperId());//OperDate
ps2.setString(14, rmPayflow.getCounterNo());
ps2.setString(15, rmPayflow.getSaleMan());
ps2.setString(16, rmPayflow.getMemo());
// ps2.setString(17, rmPayflow.getVoucherNo());
ps2.setString(17, rmPayflow.getRemoteFlag());
ps2.setString(18, rmPayflow.getExchangeFlag());
ps2.setString(19, rmPayflow.getShiftNo());
ps2.setString(20, rmPayflow.getComFlag());
//ps2.setString(22, rmPayflow.getPosid());
ps2.setTimestamp(21, null);//Uptime
ps2.setString(22, rmPayflow.getFlownoRand());
ps2.setString(23, rmPayflow.getCiceroniNo());
ps2.setString(24, rmPayflow.getCiceroniId());
ps2.setString(25, rmPayflow.getFlownoType());
ps2.setString(26, rmPayflow.getTransType());
ps2.setString(27, rmPayflow.getUpBatchno());
// ps2.setString(30, rmPayflow.getUpVipacc());
ps2.setString(28, rmPayflow.getRemark());
ps2.setString(29, rmPayflow.getCashNo());
// ps2.setString(33, rmPayflow.getCheckData());
ps2.addBatch(); // 添加至批处理
count++;
if (count % batchSize == 0) {
ps.executeBatch();
ps2.executeBatch();
ps.clearBatch();
ps2.clearBatch();
log.info("已提交批次: {}", count);
}
}
// 执行剩余未满 batchSize 的批次
int[] remainingCounts = ps.executeBatch();
int[] remainingCounts2 = ps2.executeBatch();
log.info("销售流水记录剩余批次更新数: {}", Arrays.toString(remainingCounts));
log.info("支付流水记录剩余批次更新数: {}", Arrays.toString(remainingCounts2));
//conn.commit(); // 最终提交事务
log.info("销售-支付-流水记录批量更新完成,总记录数: {}" , count);
//baseUpdateImBrancStock(dataBaseInfo);
} catch (Exception e) {
// conn.rollback(); // 出错时回滚整个事务
log.info("销售支付流水记录业务失败:: {}", e.getMessage());
throw new RuntimeException("销售支付流水记录业务失败:: {}"+e.getMessage());
}
// } catch (SQLException e) {
// log.info("sql失败: {}", e.getMessage());
// throw new RuntimeException("sql失败: {}"+e.getMessage());
// }
}
/**
* 批量新增销售流水 商瑞9.7
* @param conn
* @param rmSaleflowList
*/
public void updateStoreSaleFlowShangRui(Connection conn,List<RmSaleflow> rmSaleflowList,List<TRmPayflow> payflowList){
if(CollectionUtil.isEmpty(rmSaleflowList)){
log.info("销售流水记录为空");
return;
}
// Connection conn =getConnection(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),
// dataBaseInfo.getPassword(), dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName());
//try {
//conn.setAutoCommit(false); // 关闭自动提交开启事务
String sql = "INSERT INTO t_rm_saleflow (" +
"flow_id, flow_no, branch_no, item_no, source_price, sale_price, " +
"sale_qnty, sale_money, sell_way, oper_id, sale_man, counter_no, " +
"oper_date, remote_flag, shift_no, com_flag, spec_flag, pref_amt, " +
"in_price, n_stan, chr_stan, posid, uptime, " +
"paysum_flag, spec_sheet_no,kz_flag, update_date" +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?)";
String sql2 = "INSERT INTO t_rm_payflow (" +
"flow_id, flow_no, sale_amount, branch_no, pay_way, sell_way, " +
"card_no, vip_no, coin_no, coin_rate, pay_amount, oper_date, " +
"oper_id, counter_no, sale_man, memo,remote_flag, " +
"exchange_flag, shift_no, com_flag, uptime, " +
"kz_no" +
") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
try {
PreparedStatement ps = conn.prepareStatement(sql);//销售流水
PreparedStatement ps2 = conn.prepareStatement(sql2);//资金流水
int batchSize = 10; // 每批处理10条
int count = 0;
for (int i=0;i<rmSaleflowList.size();i++) {
//rmSaleflow start-------------
RmSaleflow rmSaleflow=rmSaleflowList.get(i);
ps.setInt(1,rmSaleflow.getFlowId());
ps.setString(2, rmSaleflow.getFlowNo());
ps.setString(3, rmSaleflow.getBranchNo());
ps.setString(4, rmSaleflow.getItemNo());
ps.setBigDecimal(5, rmSaleflow.getSourcePrice());
ps.setBigDecimal(6, rmSaleflow.getSalePrice());
BigDecimal saleQnty=rmSaleflow.getSaleQnty();
if(saleQnty.compareTo(BigDecimal.ZERO)<0){
saleQnty=saleQnty.multiply(new BigDecimal("-1"));
}
ps.setBigDecimal(7,saleQnty);
ps.setBigDecimal(8, rmSaleflow.getSaleMoney());
ps.setString(9, rmSaleflow.getSellWay());
ps.setString(10, rmSaleflow.getOperId());
ps.setString(11, rmSaleflow.getSaleMan());
ps.setString(12, rmSaleflow.getCounterNo());
ps.setTimestamp(13, rmSaleflow.getOperDate());//OperDate
ps.setString(14, rmSaleflow.getRemoteFlag());
ps.setString(15, "");//ShiftNo
ps.setString(16, rmSaleflow.getComFlag());
ps.setString(17, "");//SpecFlag
ps.setBigDecimal(18, rmSaleflow.getPrefAmt());
ps.setBigDecimal(19, rmSaleflow.getInPrice());
ps.setBigDecimal(20, rmSaleflow.getNStan());
ps.setString(21, rmSaleflow.getChrStan());
ps.setString(22, rmSaleflow.getPosid());
ps.setTimestamp(23, null);//Uptime
// ps.setString(24, rmSaleflow.getFlownoRand());
// ps.setBigDecimal(25, rmSaleflow.getRetQnty());
ps.setString(24, rmSaleflow.getPaysum_flag());//paysum_flag
ps.setString(25, rmSaleflow.getSpecSheetNo());
ps.setString(26, rmSaleflow.getKz_flag());//kz_flag
ps.setTimestamp(27, rmSaleflow.getOperDate());//update_date
// ps.setString(29, rmSaleflow.getShareCardid());
// ps.setString(30, rmSaleflow.getItemNoFresh());
ps.addBatch(); // 添加至批处理
//rmSaleflow end-------------
//rmPayflow start-------------
TRmPayflow rmPayflow=payflowList.get(i);
//rmPayflow end-------------
ps2.setInt(1,rmPayflow.getFlowId());
ps2.setString(2, rmPayflow.getFlowNo());
ps2.setBigDecimal(3, rmPayflow.getSaleAmount());
ps2.setString(4, rmPayflow.getBranchNo());
ps2.setString(5, rmPayflow.getPayWay());
ps2.setString(6, rmPayflow.getSellWay());
ps2.setString(7, rmPayflow.getCardNo());
ps2.setString(8, rmPayflow.getVipNo());
ps2.setString(9, rmPayflow.getCoinNo());
ps2.setBigDecimal(10, rmPayflow.getCoinRate());
ps2.setBigDecimal(11, rmPayflow.getPayAmount());
ps2.setTimestamp(12, rmPayflow.getOperDate());
ps2.setString(13, rmPayflow.getOperId());//OperDate
ps2.setString(14, rmPayflow.getCounterNo());
ps2.setString(15, rmPayflow.getSaleMan());
ps2.setString(16, rmPayflow.getMemo());
// ps2.setString(17, rmPayflow.getVoucherNo());
ps2.setString(17, rmPayflow.getRemoteFlag());
ps2.setString(18, rmPayflow.getExchangeFlag());
ps2.setString(19, rmPayflow.getShiftNo());
ps2.setString(20, rmPayflow.getComFlag());
//ps2.setString(22, rmPayflow.getPosid());
ps2.setTimestamp(21, null);//Uptime
// ps2.setString(22, rmPayflow.getFlownoRand());
// ps2.setString(22, rmPayflow.getCiceroniNo());
// ps2.setString(23, rmPayflow.getCiceroniId());
// ps2.setString(24, rmPayflow.getFlownoType());
// ps2.setString(25, rmPayflow.getTransType());
// ps2.setString(26, rmPayflow.getUpBatchno());
// ps2.setString(30, rmPayflow.getUpVipacc());
ps2.setString(22, rmPayflow.getKz_no());
// ps2.setString(29, rmPayflow.getCashNo());
// ps2.setString(33, rmPayflow.getCheckData());
ps2.addBatch(); // 添加至批处理
count++;
if (count % batchSize == 0) {
ps.executeBatch();
ps2.executeBatch();
ps.clearBatch();
ps2.clearBatch();
log.info("已提交批次: {}", count);
}
}
// 执行剩余未满 batchSize 的批次
int[] remainingCounts = ps.executeBatch();
int[] remainingCounts2 = ps2.executeBatch();
log.info("销售流水记录剩余批次更新数: {}", Arrays.toString(remainingCounts));
log.info("支付流水记录剩余批次更新数: {}", Arrays.toString(remainingCounts2));
//conn.commit(); // 最终提交事务
log.info("销售-支付-流水记录批量更新完成,总记录数: {}" , count);
//baseUpdateImBrancStock(dataBaseInfo);
} catch (Exception e) {
// conn.rollback(); // 出错时回滚整个事务
log.info("销售支付流水记录业务失败:: {}", e.getMessage());
throw new RuntimeException("销售支付流水记录业务失败:: {}"+e.getMessage());
}
// } catch (SQLException e) {
// log.info("sql失败: {}", e.getMessage());
// throw new RuntimeException("sql失败: {}"+e.getMessage());
// }
}
/**
*获取促销活动价格 时段特价单
* @param dataBaseInfo
@ -775,7 +1351,7 @@ public class SxDataDao extends BaseDao{
,dataBaseInfo.getPassword()
,dataBaseInfo.getDbPort()
,dataBaseInfo.getDataBaseName()
,T_PUB_PLAN_MASTER
,T_PUB_PLAN_MASTER +" b"
,PLAN_NO
,pageNo
,pageSize
@ -895,4 +1471,54 @@ public class SxDataDao extends BaseDao{
return getTotalSpecShop(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),dataBaseInfo.getDbPort(),
dataBaseInfo.getDataBaseName(),where);
}
/**
* 获取本地仓库
* @return
*/
public String getLocalBranch(DataBaseInfo dataBaseInfo){
ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),
dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(),T_BD_BRANCH_INFO,"where property =2 ");
ResultSet rs= resultDto.getResultSet();
String branch_no = "";
try {
while (rs.next()) {
branch_no=rs.getString("branch_no");//
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
try {
resultDto.getConnection().close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return branch_no;
}
/**
* 获取小发账号
* @return
*/
public String getTRmCashier(DataBaseInfo dataBaseInfo,String accountNo){
ResultDto resultDto= this.baseFindList(dataBaseInfo.getIp(),dataBaseInfo.getUserName(),dataBaseInfo.getPassword(),
dataBaseInfo.getDbPort(),dataBaseInfo.getDataBaseName(),T_RM_CASHIER,"where cashier_id='"+accountNo+"'");
ResultSet rs= resultDto.getResultSet();
String cashier_id = "";
try {
while (rs.next()) {
cashier_id=rs.getString("cashier_id");//
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
try {
resultDto.getConnection().close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return cashier_id;
}
}

View File

@ -8,6 +8,10 @@ import java.util.Date;
@Data
public class DataBaseInfo {
public static final String SHANG_YUN="1";//1 商云10
public static final String SHANG_RUI="2";//2 商瑞9.7
public static final String SHANG_QI="3";//3 商祺
@ApiModelProperty("数据库IP")
private String ip;
@ApiModelProperty("用户名")
@ -41,4 +45,22 @@ public class DataBaseInfo {
@ApiModelProperty(value = "间隔时间")
private String shopGapTime;
@ApiModelProperty(value = "调价时间")
private String priceOperatime;
@ApiModelProperty(value = "库存条件")
private String stockOperateWhere;
@ApiModelProperty(value = "营业员账号")
private String saleAccount;
@ApiModelProperty(value = "是否同步活动(0:否,1:是)")
private String isSyncActive;
@ApiModelProperty(value = "是否同步会员(0:否,1:是)")
private String isSyncMember;
@ApiModelProperty(value = "客户端版本:1商云10,2商瑞9.7,3商祺")
private String clientVersion;
}

View File

@ -0,0 +1,50 @@
package com.small.client.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ItemInfo {
/**
* 商品货架号
*/
private String itemNo;
/**
* 自定义编号
*/
private String itemSubno;
/**
* 商品名称
*/
private String itemName;
/**
* 商品分类编号
*/
private String itemClsno;
/**
* 商品品牌
*/
private String itemBrand;
/**
* 单位
*/
private String unitNo;
/**
* 进货价格
*/
private BigDecimal price;
/**
* 零售价
*/
private BigDecimal salePrice;
}

View File

@ -23,9 +23,15 @@ public class ProductQuantityConsumptionDto {
@ApiModelProperty("商品编号")
private String productNumber;
@ApiModelProperty("商品单价,如果是切割商品要算回来每公斤多少")
private BigDecimal unitPrice;
@ApiModelProperty("数量(正数表示入库/增加,负数表示出库/减少)")
private BigDecimal quantity;
@ApiModelProperty("订单总额")
private BigDecimal saleAmount;
@ApiModelProperty("消费状态0-未消费1-已消费")
private Integer status;
@ -39,4 +45,7 @@ public class ProductQuantityConsumptionDto {
@ApiModelProperty(value = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@ApiModelProperty(value = "下单时间")
private Long saleTime;
}

View File

@ -0,0 +1,55 @@
package com.small.client.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
@Data
public class RmSaleflow {
private Long comNo;
private Integer flowId;//第几个商品 从1开始算
private String flowNo;//自定义编号
private String branchNo;
private String itemNo;
private BigDecimal sourcePrice;
private BigDecimal salePrice;
private BigDecimal saleQnty;//销售数量
private BigDecimal saleMoney;
private String sellWay;//A销售B退货
private String operId;
private String saleMan;
private String counterNo;
private Timestamp operDate;
private String remoteFlag;
private String shiftNo;
private String comFlag;
private String specFlag;
private BigDecimal prefAmt;
private BigDecimal inPrice;
private BigDecimal nStan;
private String chrStan;
private String posid;
private Date uptime;
private String specSheetNo;
//商云10字段
private String flownoRand;
private BigDecimal retQnty;
private String flownoType;
private String cicSheetNo;
private String shareCardid;
// private String itemNoFresh;
//商瑞9.7字段
private String paysum_flag;
private String voucher_no;
private String pr_spec_sheet_no;
private String ot_spec_sheet_no;
private String ot_spec_pref_amt;
private String item_no_Fresh;
private String kz_flag;
private Timestamp update_date;
}

View File

@ -71,4 +71,16 @@ public class StoreDbConfig implements Serializable {
@ApiModelProperty("商品同步间隔时间")
private String shopGapTime;
@ApiModelProperty(value = "营业员账号")
private String saleAccount;
@ApiModelProperty(value = "是否同步活动(0:否,1:是)")
private String isSyncActive;
@ApiModelProperty(value = "是否同步会员(0:否,1:是)")
private String isSyncMember;
@ApiModelProperty(value = "客户端版本:1商云10,2商瑞9.7,3商祺")
private String clientVersion;
}

View File

@ -12,6 +12,9 @@ import java.util.List;
@Data
public class SxGoosModel {
@ApiModelProperty(value = "分页编号")
private Long rowIdA;
@ApiModelProperty("商品名称")
private String product_name;

View File

@ -0,0 +1,181 @@
package com.small.client.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
@Data
public class TRmPayflow {
/**
* 流水ID - 主键自增
*/
private Long comNo;
/**
* 编号
*/
private Integer flowId;
/**
* 流水号
*/
private String flowNo;
/**
* 销售金额
*/
private BigDecimal saleAmount;
/**
* 门店编号
*/
private String branchNo;
/**
* 支付方式
*/
private String payWay;
/**
* 销售方式
*/
private String sellWay;
/**
* 卡号
*/
private String cardNo;
/**
* 会员号
*/
private String vipNo;
/**
* 币种
*/
private String coinNo;
/**
* 汇率
*/
private BigDecimal coinRate;
/**
* 支付金额
*/
private BigDecimal payAmount;
/**
* 操作时间
*/
private Timestamp operDate;
/**
* 操作员ID
*/
private String operId;
/**
* 柜台号
*/
private String counterNo;
/**
* 销售员
*/
private String saleMan;
/**
* 备注
*/
private String memo;
/**
* 凭证号
*/
private String voucherNo;
/**
* 远程标志
*/
private String remoteFlag;
/**
* 兑换标志
*/
private String exchangeFlag;
/**
* 班次号
*/
private String shiftNo;
/**
* 完成标志
*/
private String comFlag;
/**
* POS机ID
*/
private String posid;
/**
* 更新时间
*/
private Date uptime;
private String checkData;
/**
*
* 商云10
* **/
/**
* 随机流水号
*/
private String flownoRand;
/**
* 导游编号
*/
private String ciceroniNo;
/**
* 导游ID
*/
private String ciceroniId;
/**
* 流水号类型
*/
private String flownoType;
/**
* 交易类型
*/
private String transType;
/**
* 上传批次号
*/
private String upBatchno;
/**
* 上传会员账户
*/
private String upVipacc;
/**
* 备注
*/
private String remark;
private String cashNo;
//商瑞9.7
private String kz_no;
}

View File

@ -69,6 +69,7 @@ public abstract class SxDataAbstService {
SxCategoryModel sxCategoryModel=null;
while (iterator.hasNext()){
SxSyncCategory sxSyncCategory= iterator.next();
try {
sxCategoryModel=new SxCategoryModel();
sxCategoryModel.setCategory_image(SxDataDao.DEFAULT_IMG);
sxCategoryModel.setCategory_name(sxSyncCategory.getItem_clsname());
@ -100,6 +101,9 @@ public abstract class SxDataAbstService {
}
sxCategoryModel.setProduct_type(sxCategoryModel.getCategory_name());
sxCategoryModels.add(sxCategoryModel);
}catch (Exception e){
log.info("sxSyncCategory:{}",sxSyncCategory);
}
}
sxCategoryModels=filterCategories(sxCategoryModels);
return sxCategoryModels;
@ -132,7 +136,7 @@ public abstract class SxDataAbstService {
List<SxSyncCategory> list= sxSyncCategories.stream().filter(cc->
cc.getItem_clsno().trim().equals(parentId.trim()))
.collect(Collectors.toList());
return CollectionUtil.isNotEmpty(list)?list.get(0):new SxSyncCategory();
return CollectionUtil.isNotEmpty(list)?list.get(0):null;
}
/**
@ -148,6 +152,7 @@ public abstract class SxDataAbstService {
SxGoosModel sxGoosModel=null;
for (SxSyncGoods sxSyncGood:sxSyncGoods){
sxGoosModel=new SxGoosModel();
sxGoosModel.setRowIdA(sxSyncGood.getId());
sxGoosModel.setProduct_name(sxSyncGood.getItem_subname());
sxGoosModel.setProduct_number(sxSyncGood.getItem_no().trim());//
sxGoosModel.setProduct_barcode(sxSyncGood.getItem_no().trim());//

View File

@ -63,7 +63,7 @@ public interface SxDataService {
* @param commentModel
* @return
*/
void syncAtive(DataBaseInfo dataBaseInfo,CommentModel commentModel);
boolean syncAtive(DataBaseInfo dataBaseInfo,CommentModel commentModel);
/**
* 同步活动商品
@ -73,4 +73,18 @@ public interface SxDataService {
void syncAtiveShops(DataBaseInfo dataBaseInfo,CommentModel commentModel);
String getCategoryChildren(DataBaseInfo dataBaseInfo,String parentId);
/**
* 校验是否有新的入库
* @param dataBaseInfo
* @param refreshTime
* @return
*/
boolean isNewShop(DataBaseInfo dataBaseInfo, String refreshTime);
/**
* 刷新同步时间
* @return
*/
void refreshTime(CommentModel commentModel);
}

View File

@ -22,31 +22,22 @@ import com.small.client.service.WebClientService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.http.*;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StreamUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.time.Instant;
import java.util.*;
import java.util.stream.Collectors;
@ -142,9 +133,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
syncAllGoods(dataBaseInfo, commentModel);
break;
case "02"://增量 todo test
syncIncrementAddGoods(dataBaseInfo, commentModel);
syncIncrementModifyGoods(dataBaseInfo, commentModel);
syncIncrementStock(dataBaseInfo, commentModel);
String sycnTime=commentModel.getSyncTime();
syncIncrementAddGoods(dataBaseInfo, commentModel);//同步新商品和修改商品
syncIncrementStock(dataBaseInfo, commentModel);//同步库存
syncFlowPrice(dataBaseInfo, commentModel,sycnTime);//同步调价单
break;
}
@ -317,6 +309,22 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
return root;
}
/**
* 判断是否有新增商品有新增商品才同步分类
* @param dataBaseInfo
* @param refreshTime
* @return
*/
public boolean isNewShop(DataBaseInfo dataBaseInfo, String refreshTime){
String where="where b.status='1' ";
where+=" and ( b.modify_date>'"+refreshTime+"' ";
where+=" or b.build_date>'"+refreshTime+"') ";
dataBaseInfo.setWhere(where);
int total = sxDataDao.getTBditemInfoTotal(dataBaseInfo);
log.info("判断库存数量,库存数量:{}",total);
return total>0;
}
/**
*同步所有商品
* @param dataBaseInfo
@ -324,34 +332,59 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
*/
private void syncAllGoods(DataBaseInfo dataBaseInfo, CommentModel commentModel){
//String where="where 1=1";
String where="where b.status='1'";
String where="where shop.status='1'";
Integer total =0;
boolean isAll=false;
String parentId=getAndCacheTree(dataBaseInfo,dataBaseInfo.getCategoryName());//加载缓存用的
String fileEndFix="";
if(DicEnum.SYNCTYPE_02.getCode().equals(dataBaseInfo.getSyncType())){
if (StringUtils.isNotEmpty(dataBaseInfo.getCategoryName())) {
//syncGoodsSearchModel.setItemClsno(childrens);
String childrens= commonCache.get(CommonCache.CACHE_CATEGROY+parentId);
where += " and b.item_clsno in ('" + childrens + "')";
where += " and shop.item_clsno in ('" + childrens + "')";
fileEndFix="category";
}
if(StringUtils.isNotEmpty(commentModel.getSyncTime())){
where+=" and b.modify_date>'"+commentModel.getSyncTime()+"' ";
where+=" or b.build_date>'"+commentModel.getSyncTime()+"' ";
where+=" and shop.modify_date>'"+commentModel.getSyncTime()+"' ";
where+=" or shop.build_date>'"+commentModel.getSyncTime()+"' ";
fileEndFix="modify";
}
if(StringUtils.isNotEmpty(dataBaseInfo.getOperDate())){
where+=" and ls.oper_date>'"+dataBaseInfo.getOperDate()+"' ";
String stockOperateWhere=" ls.oper_date>'"+dataBaseInfo.getOperDate()+"' ";
dataBaseInfo.setStockOperateWhere(stockOperateWhere);
fileEndFix="operate";
}
if(StringUtils.isNotEmpty(dataBaseInfo.getPriceOperatime())){
where+=" and EXISTS ( " +
" select " +
" shop.item_no " +
" from " +
" t_pc_price_flow_detail tpfd " +
" left join t_pc_price_flow_master tppfm " +
" on " +
" tpfd.sheet_no = tppfm.sheet_no " +
" where " +
" tppfm.valid_flag = '1' " +//有效
" and shop.item_no=tpfd.item_no " +
" and tppfm.oper_date >'"+dataBaseInfo.getPriceOperatime()+"' " +
" )";
fileEndFix="price";
}
dataBaseInfo.setWhere(where);
// 记录总数
total = sxDataDao.getTBditemInfoJoninTotal(dataBaseInfo);
}else {
where="where b.status='1'";
isAll=true;
dataBaseInfo.setWhere(where);
total = sxDataDao.getTBditemInfoTotal(dataBaseInfo);
where="where shop.status='1'";
}
if(total==0){
log.info("暂无商品同步");
return;
}
where+=" and";
//where+=" and";
dataBaseInfo.setWhere(where);
// 总页数
@ -365,7 +398,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
Date refreshDate= DateUtil.date(tenMinutesAgo);
List<String> folders=new ArrayList<>();
for (int i = 1; i <=pages; i++) {
List<SxSyncGoods> sxSyncGoods= sxDataDao.findBditemInfoListPage(dataBaseInfo,i,SxDataDao.PAGESIZE);
List<SxSyncGoods> sxSyncGoods= sxDataDao.findBditemInfoListPage(dataBaseInfo,i,SxDataDao.PAGESIZE,isAll);
List<SxGoosModel> sxGoosModelList= CvtToGoosModel(sxSyncGoods,specPriceDtoList);
String jsonString="";
ObjectMapper objectMapper = new ObjectMapper();
@ -374,11 +407,11 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
String code= writeToFileAndUploud(i,jsonString,commentModel,DicEnum.MUAL_1.getCode());
String code= writeToFileAndUploud(i,jsonString,commentModel,DicEnum.MUAL_1.getCode(),fileEndFix);
if (!HttpUtils.SUCCESSCODE.equals(code)) {
continue;
}
folders.add(String.valueOf(i));
folders.add(i+"_"+fileEndFix);
syncCount+=sxSyncGoods.size();
}
//通知服务器上传cos
@ -388,7 +421,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
+"&syncType="+DicEnum.MUAL_1.getCode()
+"&refreshDateStr="+refreshDate,
JSONUtil.parseArray(folders));
log.info("商品分类总共有{}条数据,同步完成{}条",total,syncCount);
log.info("商品总共有{}条数据,同步完成{}条",total,syncCount);
String code= HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_GOODS_READ
+"?appKey="+commentModel.getAppKey()
+"&sign="+commentModel.getAppId()
@ -408,15 +441,15 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
* @param commentModel
* @return
*/
private String writeToFileAndUploud(Integer page,String content,CommentModel commentModel,String syncType){
private String writeToFileAndUploud(Integer page,String content,CommentModel commentModel,String syncType,String fileEndFix){
FileUtils fileUtils= new FileUtils();
File file=fileUtils.createFile(syncType,page);
String fileName=fileUtils.getFileName(syncType,page,FileUtils.txtEnd);
String fileName=fileUtils.getFileName(syncType,page,FileUtils.txtEnd,fileEndFix);
String filePath=file.getAbsolutePath();
fileUtils.writeFile(filePath,fileName,content);
String sign=CommonUtil.generateOpenSign(content,commentModel.getAppKey(),commentModel.getAppId());
commentModel.setSign(sign);
return webClientService.uploudSxData(filePath+FileUtils.pathSeparator+fileName,commentModel,page.toString(),syncType);
return webClientService.uploudSxData(filePath+FileUtils.pathSeparator+fileName,commentModel,page+"_"+fileEndFix,syncType);
}
/**
@ -458,6 +491,17 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
syncAllGoods(dataBaseInfo,commentModel);
}
/**
* 增量同步 调价单变化
*/
private void syncFlowPrice(DataBaseInfo dataBaseInfo, CommentModel commentModel,String sycnTime){
dataBaseInfo.setPriceOperatime(sycnTime);
commentModel.setSyncTime("");
dataBaseInfo.setOperDate("");
dataBaseInfo.setStockOperateWhere("");
syncAllGoods(dataBaseInfo,commentModel);
}
/**
*获取特价商品
* @param dataBaseInfo
@ -600,10 +644,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
log.info("文件下载目录: {}", downloadDirectory);
HttpHeaders headers = new HttpHeaders();
// headers.set("User-Agent", "Apifox/1.0.0 (https://apifox.com)");
headers.setAccept(Collections.singletonList(MediaType.ALL)); // 对应 */*
headers.set("Accept-Encoding", "gzip, deflate, br");
//headers.setAccept(Collections.singletonList(MediaType.ALL)); // 对应 */*
// headers.set("Accept-Encoding", "gzip, deflate, br");
// 可以添加其他Apifox可能发送的头部
headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
// headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
headers.set("Connection", "keep-alive");
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(headers);
@ -666,7 +710,8 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
log.error("文件下载失败:{}",e.getMessage());
return null;
}
return downloadDirectory+originalFileName;
File file=new File(downloadDirectory+originalFileName);
return file.length()>0?downloadDirectory+originalFileName:null;
}
@ -716,6 +761,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
DataBaseInfo dataBaseInfo=new DataBaseInfo();
if(null!=storeDbConfig){
dataBaseInfo.setIp(storeDbConfig.getDbIp());
dataBaseInfo.setUserName(storeDbConfig.getDbUsername());
dataBaseInfo.setPassword(storeDbConfig.getDbPassword());
dataBaseInfo.setDataBaseName(storeDbConfig.getDbName());
dataBaseInfo.setDbPort(storeDbConfig.getDbPort());
@ -725,6 +771,10 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
dataBaseInfo.setRefreshTime(storeDbConfig.getRefreshTime());
dataBaseInfo.setIsTowSync(storeDbConfig.getIsTowSync());
dataBaseInfo.setShopGapTime(storeDbConfig.getShopGapTime());
dataBaseInfo.setSaleAccount(storeDbConfig.getSaleAccount());
dataBaseInfo.setIsSyncActive(storeDbConfig.getIsSyncActive());
dataBaseInfo.setIsSyncMember(storeDbConfig.getIsSyncMember());
dataBaseInfo.setClientVersion(storeDbConfig.getClientVersion());
return dataBaseInfo;
}
return new DataBaseInfo();
@ -736,31 +786,54 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
log.info("不做双向同步数据库");
return;
}
String saleAccount= sxDataDao.getTRmCashier(dataBaseInfo,dataBaseInfo.getSaleAccount());
if(StringUtils.isEmpty(saleAccount)){
log.error("需要配置商城收银人员");
return;
}
JSONObject jsonObject= restTemplate.getForObject(remoteIp+HttpUtils.URL_SYNC_GET_STOR_DATA_RELEASE
+"?appKey="+commentModel.getAppKey()
+"&sign="+commentModel.getAppId(),JSONObject.class);
// String jsonStr="[{\"consumeId\":\"1986611923814223873\",\"orderId\":\"DD_20251107_1\",\"productNumber\":\"31011\",\"unitPrice\":10.90,\"quantity\":1.500,\"saleAmount\":16.35,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"},{\"consumeId\":\"1986611923814223872\",\"orderId\":\"DD_20251107_2\",\"productNumber\":\"6909409023853\",\"unitPrice\":1.00,\"quantity\":1.000,\"saleAmount\":1.00,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"},{\"consumeId\":\"1986611923814223874\",\"orderId\":\"DD_20251107_1\",\"productNumber\":\"6909409023853\",\"unitPrice\":1.00,\"quantity\":2.000,\"saleAmount\":2.00,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-07 01:49:26\",\"updateTime\":\"2025-11-07 01:49:26\"}]";
//String jsonObjectStr="{\"error_code\":0,\"error_msg\":\"success\",\"result\":[{\"consumeId\":\"1993254597656690689\",\"orderId\":\"DD_20251125_2\",\"productNumber\":\"10035\",\"unitPrice\":16.00,\"quantity\":-0.500,\"saleAmount\":8.00,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-25 09:45:03\",\"updateTime\":\"2025-11-25 09:45:03\",\"saleTime\":1764063651000},{\"consumeId\":\"1993254597656690688\",\"orderId\":\"DD_20251125_2\",\"productNumber\":\"6922896008127\",\"unitPrice\":8.80,\"quantity\":-1.000,\"saleAmount\":8.80,\"status\":0,\"storeId\":78,\"createTime\":\"2025-11-25 09:45:03\",\"updateTime\":\"2025-11-25 09:45:03\",\"saleTime\":1764063651000}]}";
// JSONObject jsonObject=JSONUtil.parseObj(jsonObjectStr);
if(null!=jsonObject.get("result")){
// Map map=(Map)jsonObject.get("result");
String jsonStr= jsonObject.getStr("result");
List<ProductQuantityConsumptionDto> productQuantityConsumptionDtoList =
JSONUtil.toList(jsonObject.getStr("result"),ProductQuantityConsumptionDto.class);
JSONUtil.toList(jsonStr,ProductQuantityConsumptionDto.class);
if(!productQuantityConsumptionDtoList.isEmpty()){
Map map = productQuantityConsumptionDtoList.stream()
.collect(Collectors.groupingBy(
ProductQuantityConsumptionDto::getProductNumber,
dto -> dto.getOrderId()+"-"+dto.getProductNumber(),
Collectors.reducing(
BigDecimal.ZERO,
ProductQuantityConsumptionDto::getQuantity,
BigDecimal::add
)
));
sxDataDao.updateStoreData(dataBaseInfo,map,productQuantityConsumptionDtoList,commentModel);
}
Map<String,ProductQuantityConsumptionDto> productQuantityConsumptionDtoMap=new HashMap<>();
productQuantityConsumptionDtoList.forEach(productQuantityConsumptionDto -> {
String key=productQuantityConsumptionDto.getOrderId()+"-"+productQuantityConsumptionDto.getProductNumber();
if(null!=productQuantityConsumptionDtoMap.get(key)){
ProductQuantityConsumptionDto oldProductQuantityConsumptionDto=productQuantityConsumptionDtoMap.get(key);
if(productQuantityConsumptionDto.getSaleTime()<oldProductQuantityConsumptionDto.getSaleTime()){
productQuantityConsumptionDtoMap.put(key,productQuantityConsumptionDto);
}
}else {
productQuantityConsumptionDtoMap.put(key,productQuantityConsumptionDto);
}
});
sxDataDao.updateStoreData(dataBaseInfo,map,productQuantityConsumptionDtoMap,productQuantityConsumptionDtoList,commentModel);
}else {
log.info("无线上流水同步");
}
}
}
@Override
public void syncAtive(DataBaseInfo dataBaseInfo, CommentModel commentModel) {
public boolean syncAtive(DataBaseInfo dataBaseInfo, CommentModel commentModel) {
String where="where 1=1";
Integer total =0;
if(StringUtils.isNotEmpty(commentModel.getSyncTime())){
@ -771,7 +844,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
total = sxDataDao.getNewActiveCount(dataBaseInfo);
if(total==0){
log.info("暂无活动同步");
return;
return false;
}
// 总页数
int pages = CommonUtil.getPagesCount(total, SxDataDao.PAGESIZE);
@ -796,7 +869,7 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
syncCount+=activeDtos.size();
}
log.info("成功同步活动数据:"+syncCount);
return true;
}
@Override
@ -804,13 +877,16 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
String where="where 1=1";
Integer total =0;
if(StringUtils.isNotEmpty(commentModel.getSyncTime())){
where+=" and m.oper_date>'"+commentModel.getSyncTime()+"' ";
where+=" and t.oper_date>'"+commentModel.getSyncTime()+"' ";
// where+=" or m.oper_date>'"+commentModel.getSyncTime()+"') ";
}
dataBaseInfo.setWhere(where);
total = sxDataDao.getTotalSpecShop(dataBaseInfo);
if(total==0){
// HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_REFRESH
// +"?appKey="+commentModel.getAppKey()
// +"&sign="+commentModel.getAppId(), new JSONArray());
log.info("暂无活动商品同步");
return;
}
@ -838,9 +914,9 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
syncCount+=activeDtos.size();
}
log.info("成功同步活动商品数据:"+syncCount);
HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_REFRESH
+"?appKey="+commentModel.getAppKey()
+"&sign="+commentModel.getAppId(), new JSONArray());
// HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_REFRESH
// +"?appKey="+commentModel.getAppKey()
// +"&sign="+commentModel.getAppId(), new JSONArray());
}
@ -854,35 +930,12 @@ public class SxDataServiceImp extends SxDataAbstService implements SxDataService
return map;
}
/**
* 创建跳过SSL验证的RestTemplate
* 仅用于测试环境生产环境不安全
*/
private RestTemplate createUnsafeRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
// 配置请求参数
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(30000)
.setSocketTimeout(30000)
.setRedirectsEnabled(true)
.setMaxRedirects(10)
.build();
// 创建SSL上下文信任所有证书 - 仅测试环境使用
SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
.loadTrustMaterial((chain, authType) -> true)
.build();
// 创建HttpClient配置SSL和重定向
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(config)
.setSSLContext(sslContext)
.setRedirectStrategy(new LaxRedirectStrategy())
.build();
// 创建请求工厂
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(factory);
@Override
public void refreshTime(CommentModel commentModel) {
HttpUtils.postData(restTemplate,remoteIp+HttpUtils.URL_SYNC_REFRESH
+"?appKey="+commentModel.getAppKey()
+"&sign="+commentModel.getAppId(), new JSONArray());
}
}

View File

@ -28,7 +28,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -234,9 +233,9 @@ public class LoginController extends BaseControllerImpl {
return CommonResult.success(accountUserBaseService.doAppConnectLogin(bind_name, code));
}
@ApiOperation(value = "商家注册与登录")
@ApiOperation(value = "商家(代理商)注册与登录")
@RequestMapping(value = "/doMerchSmsRegisterAndLogin", method = RequestMethod.POST)
public CommonResult doMerchSmsRegisterAndLogin(HttpServletRequest request, @RequestBody JSONObject paramJSON) {
public CommonResult doMerchSmsRegisterAndLogin(@RequestBody(required = false) JSONObject paramJSON) {
if (paramJSON == null) {
return CommonResult.failed("缺少必要参数!");
}
@ -245,20 +244,28 @@ public class LoginController extends BaseControllerImpl {
String randKey = paramJSON.getStr("rand_key");
String verifyCode = paramJSON.getStr("verify_code");
if (StrUtil.isBlank(userMobile) || StrUtil.isBlank(randKey) || StrUtil.isBlank(verifyCode)) {
if (StrUtil.hasBlank(userMobile, randKey, verifyCode)) {
return CommonResult.failed("缺少必要参数!");
}
// 检查输入字符是不是包含 sql 注入特征如果包含不给以通过
// 检查输入字符是否包含 SQL 注入特征
if (!CommonService.isValidInput(userMobile, randKey, verifyCode)) {
return CommonResult.failed(ResultCode.VALIDATE_INPUTS);
}
String cid = paramJSON.getStr("cid");
String osType = paramJSON.getStr("os_type");
return accountUserBaseService.doMerchSmsRegisterAndLogin(userMobile, randKey, verifyCode, cid, osType);
// 用户类型:0-普通买家; 1-管理员2-入驻商家3-代理商
Integer userType = paramJSON.getInt("user_type", CommonConstant.USER_TYPE_MCH);
// 修正逻辑当用户类型既不是商家也不是代理商时设置为默认商家类型
if (!CommonConstant.USER_TYPE_MCH.equals(userType) && !CommonConstant.USER_TYPE_AGENT.equals(userType)) {
userType = CommonConstant.USER_TYPE_MCH;
}
String inviteCode = paramJSON.getStr("invite_code", "");
return accountUserBaseService.doMerchSmsRegisterAndLogin(userMobile, randKey, verifyCode, userType, cid, osType, inviteCode);
}
@ApiOperation(value = "微信用户一键登录与注册")
@RequestMapping(value = "/doWxUserRegisterAndLogin", method = RequestMethod.POST)
@ -288,10 +295,14 @@ public class LoginController extends BaseControllerImpl {
@ApiOperation(value = "忘记密码-更改新密码")
@RequestMapping(value = "/edit/forgetPassword", method = RequestMethod.POST)
public CommonResult editForgetPassword(@RequestBody JSONObject paramJSON) {
// TODO 这个方法肯定有问题待修改
return accountUserBaseService.doMerchSmsRegisterAndLogin(paramJSON.getStr("user_mobile"),
paramJSON.getStr("rand_key"),
paramJSON.getStr("verify_code"),
paramJSON.getStr("cid"), paramJSON.getStr("os_type"));
paramJSON.getInt("user_type"),
paramJSON.getStr("cid"),
paramJSON.getStr("os_type"),
paramJSON.getStr("invite_code"));
}
@ApiOperation("退出登录")

View File

@ -11,6 +11,7 @@ import com.suisung.mall.common.utils.I18nUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@ -32,6 +33,7 @@ public class AccountBaseUserLevelController {
@Autowired
private AccountBaseUserLevelService accountBaseUserLevelService;
@Lazy
@Autowired
private AccountService accountService;

View File

@ -467,6 +467,11 @@ public class AccountController {
return accountUserBaseService.saveBatchAccountInfo(accountUserInfoList);
}
@RequestMapping(value = "/saveBatchAccountUserLogin", method = RequestMethod.POST)
public ThirdApiRes saveBatchAccountUserLogin(@RequestBody List<AccountUserLogin> accountUserLoginList) {
return accountUserBaseService.saveBatchAccountUserLogin(accountUserLoginList);
}
@RequestMapping(value = "/findOneAccountUserBase", method = RequestMethod.POST)
public AccountUserBase findOneAccountUserBase(@RequestBody AccountUserBase accountUserBase) {
@ -489,4 +494,9 @@ public class AccountController {
return accountUserBindConnectService.getAllBindCount(bindTmpl);
}
@RequestMapping(value = "/updateBatchAccountUserBindConnect", method = RequestMethod.POST)
public ThirdApiRes updateBatchAccountUserBindConnect(@RequestBody List<AccountUserBindConnect> accountUserBindConnectList) {
return accountUserBindConnectService.updateBatchAccountUserBindConnect(accountUserBindConnectList);
}
}

View File

@ -31,6 +31,7 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@ -231,5 +232,17 @@ public class AccountUserBaseController extends BaseControllerImpl {
return CommonResult.success(accountUserBaseService.logout());
}
@ApiOperation("注册商家账号,项目之间远程调用")
@RequestMapping(value = "/merchant/inner-register", method = RequestMethod.POST)
public Pair<Boolean, String> merchantInnerRegister(@RequestParam("mobile") String mobile, @RequestParam("regPwd") String regPwd) {
return accountUserBaseService.merchantInnerRegister(mobile, regPwd);
}
@ApiOperation("更改分店商家的手机号(仅限于分店,尽量不要更高总店的手机号),项目之间远程调用")
@RequestMapping(value = "/change/merchant/login-mobile", method = RequestMethod.POST)
public Pair<Boolean, String> changeMerchantLoginMobile(@RequestParam("oldMobile") String oldMobile, @RequestParam("newMobile") String newMobile, @RequestParam("password") String password) {
return accountUserBaseService.changeMerchantLoginMobile(oldMobile, newMobile, password);
}
}

View File

@ -85,5 +85,17 @@ public class AccountUserBindConnectController {
return accountUserBindConnectService.getUserBindConnectUserIdByCondition(bind_id, bind_type, user_type);
}
/**
* 检查手机注册的商家是否存在(仅供内部调用)
*
* @param mobile
* @return
*/
@ApiOperation(value = "检查手机注册的商家是否存在(仅供内部调用)", notes = "检查手机注册的商家是否存在(仅供内部调用)")
@RequestMapping(value = "/is-merchant-exists", method = RequestMethod.POST)
public Integer isMerchantExists(@RequestParam(name = "mobile") String mobile) {
return accountUserBindConnectService.isMerchantExists(mobile);
}
}

View File

@ -1,13 +1,11 @@
package com.suisung.mall.account.controller.mobile;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.suisung.mall.account.service.AccountUserBindConnectService;
import com.suisung.mall.account.service.WeiXinService;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -160,4 +158,12 @@ public class WeiXinController extends BaseControllerImpl {
return "fail";
}
@ApiOperation(value = "同意之后调用函数", notes = "小程序回调")
@RequestMapping(value = "/addPatAccountSendNumber")
public CommonResult addPatAccountSendNumber(@RequestParam(value = "storeId",defaultValue ="0") Integer storeId,
@RequestParam(value = "mobile") String mobile) {
accountUserBindConnectService.saveBindCountSendNumber(storeId,mobile);
return CommonResult.success();
}
}

View File

@ -3,6 +3,7 @@ package com.suisung.mall.account.listener;
import cn.hutool.json.JSONUtil;
import com.rabbitmq.client.Channel;
import com.suisung.mall.account.service.AccountUserInfoService;
import com.suisung.mall.account.service.ShopStoreMemberService;
import com.suisung.mall.common.constant.MqConstant;
import com.suisung.mall.common.modules.account.AccountUserInfo;
import lombok.extern.slf4j.Slf4j;
@ -11,6 +12,8 @@ import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@ -23,6 +26,9 @@ public class DealUserInfoListener {
@Autowired
private AccountUserInfoService accountUserInfoService;
@Autowired
private ShopStoreMemberService shopStoreMemberService;
@RabbitHandler
public void listener(byte[] data, Channel channel, Message message) throws IOException, InterruptedException {
// 将byte[]转换为String然后调用现有的处理逻辑
@ -34,10 +40,17 @@ public class DealUserInfoListener {
public void listener(String data, Channel channel, Message message) throws IOException, InterruptedException {
AccountUserInfo accountUserInfo = JSONUtil.toBean(data, AccountUserInfo.class);
// String messageId = message.getMessageProperties().getMessageId();
log.info("MQ处理活动开始:accountUserInfo:{}", JSONUtil.toJsonStr(accountUserInfo));
// 设置模拟的请求上下文避免RequestContextHolder报错
ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(reqAttr,true);
log.info("reqAttr{}", reqAttr);
try {
boolean flag = accountUserInfoService.saveOrUpdate(accountUserInfo);
if (flag) {
if(accountUserInfo.getStore_id()!=null){
shopStoreMemberService.dealStoreMember(accountUserInfo);
}
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} else {
log.error("消息消费失败执行dealUserInfo异常当前用户编号{}", accountUserInfo.getUser_id());
@ -50,4 +63,5 @@ public class DealUserInfoListener {
Thread.sleep(1000);
}
}
}

View File

@ -3,7 +3,9 @@ package com.suisung.mall.account.listener;
import cn.hutool.json.JSONUtil;
import com.rabbitmq.client.Channel;
import com.suisung.mall.account.service.AccountUserInfoService;
import com.suisung.mall.account.service.ShopStoreMemberLevelService;
import com.suisung.mall.common.constant.MqConstant;
import com.suisung.mall.common.modules.store.ShopStoreMemberLevel;
import com.suisung.mall.common.pojo.to.UserLevelTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
@ -23,6 +25,9 @@ public class UpgradeUserLevelListener {
@Autowired
private AccountUserInfoService accountUserInfoService;
@Autowired
private ShopStoreMemberLevelService shopStoreMemberLevelService;
@RabbitHandler
public void listener(byte[] data, Channel channel, Message message) throws IOException, InterruptedException {
// 将byte[]转换为String然后调用现有的处理逻辑
@ -38,6 +43,11 @@ public class UpgradeUserLevelListener {
try {
boolean flag = accountUserInfoService.checkUpdateUserLevel(userLevelTO.getUser_id(), userLevelTO.getUser_exp_total(), userLevelTO.getUser_fans_total(), userLevelTO.getUser_spend_total(), 0, 0, 0);
if (flag) {
ShopStoreMemberLevel shopStoreMemberLevel = new ShopStoreMemberLevel();
shopStoreMemberLevel.setUserLevelSpend(userLevelTO.getUser_store_spend_total());
shopStoreMemberLevel.setUserId(userLevelTO.getUser_id());
shopStoreMemberLevel.setStoreId(userLevelTO.getStore_id());
shopStoreMemberLevelService.checkUpdateStoreUserLevel(shopStoreMemberLevel);//店铺会员升级
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} else {
log.error("消息消费失败执行upgradeUserLevel异常当前用户编号{}", userLevelTO.getUser_id());

View File

@ -0,0 +1,9 @@
package com.suisung.mall.account.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.suisung.mall.common.modules.store.ShopStoreMemberLevel;
import org.springframework.stereotype.Component;
@Component
public interface ShopStoreMemberLevelMapper extends BaseMapper<ShopStoreMemberLevel> {
}

View File

@ -0,0 +1,9 @@
package com.suisung.mall.account.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.suisung.mall.common.modules.store.ShopStoreMember;
import org.springframework.stereotype.Repository;
@Repository
public interface ShopStoreMemberMapper extends BaseMapper<ShopStoreMember> {
}

View File

@ -4,6 +4,7 @@ import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.modules.account.AccountUserBase;
import com.suisung.mall.common.modules.account.AccountUserInfo;
import com.suisung.mall.common.modules.account.AccountUserLogin;
import com.suisung.mall.common.pojo.req.WxUserInfoReq;
import com.suisung.mall.common.pojo.res.ThirdApiRes;
import com.suisung.mall.core.web.service.IBaseService;
@ -141,11 +142,13 @@ public interface AccountUserBaseService extends IBaseService<AccountUserBase> {
* @param user_mobile
* @param rand_key 防机器人刷验证码
* @param verify_code
* @param userType 用户类型:0-普通买家; 1-管理员2-入驻商家3-代理商
* @param cid 推送 cid
* @param osType 手机系统类型 1-Android2-iOS3-微信小程序
* @param inviteCode 代理商邀请码
* @return
*/
CommonResult doMerchSmsRegisterAndLogin(String user_mobile, String rand_key, String verify_code, String cid, String osType);
CommonResult doMerchSmsRegisterAndLogin(String user_mobile, String rand_key, String verify_code, Integer userType, String cid, String osType, String inviteCode);
/**
* 微信小程序一键登录注册接口
@ -296,4 +299,30 @@ public interface AccountUserBaseService extends IBaseService<AccountUserBase> {
* @return
*/
ThirdApiRes saveBatchAccountInfo(List<AccountUserInfo> accountUserInfoList);
/**
* 商家内部注册服务之间调用
*
* @param mobile 商家手机号
* @param regPwd 注册密码
* @return Pair<Boolean, String> 第一个元素表示是否成功第二个元素表示提示信息
*/
Pair<Boolean, String> merchantInnerRegister(String mobile, String regPwd);
/**
* 更改分店商家的手机号(仅限于分店尽量不要更改总店的手机号)项目之间远程调用
*
* @param oldMobile 老的手机号
* @param newMobile 新的手机号
* @param password 新的登录密码可选
* @return Pair<Boolean, String> 操作结果和提示信息true表示成功false表示失败
*/
Pair<Boolean, String> changeMerchantLoginMobile(String oldMobile, String newMobile, String password);
/**
* 批量保存accountInfo
*
* @return
*/
ThirdApiRes saveBatchAccountUserLogin(List<AccountUserLogin> accountUserLoginList);
}

View File

@ -3,7 +3,9 @@ package com.suisung.mall.account.service;
import cn.hutool.json.JSONObject;
import com.suisung.mall.common.modules.account.AccountUserBindConnect;
import com.suisung.mall.common.pojo.req.WxUserInfoReq;
import com.suisung.mall.common.pojo.res.ThirdApiRes;
import com.suisung.mall.core.web.service.IBaseService;
import java.util.List;
import java.util.Map;
@ -85,13 +87,33 @@ public interface AccountUserBindConnectService extends IBaseService<AccountUserB
* @param bindType
* @param userId
* @param userType
* @param inviteCode
* @return
*/
AccountUserBindConnect initAccountUserBindConnect(String bindId, Integer bindType, Integer userId, Integer userType);
AccountUserBindConnect initAccountUserBindConnect(String bindId, Integer bindType, Integer userId, Integer userType, String inviteCode);
List<AccountUserBindConnect> getAllBindPage(String bindTmpl, Integer pageNum, Integer pageSize);
long getAllBindCount(String bindTmpl);
void bindTmplId(JSONObject jsonObject);
/**
* 检查手机注册的商家是否存在
*
* @param mobile
* @return 1-存在2-不存在3-参数有误
*/
Integer isMerchantExists(String mobile);
void saveBindCountSendNumber(Integer storeId, String mobile);
/**
* 批量保存accountUserBindConnect
*
* @return
*/
ThirdApiRes updateBatchAccountUserBindConnect(List<AccountUserBindConnect> accountUserBindConnectList);
List<AccountUserBindConnect> getAllBindList(AccountUserBindConnect accountUserBindConnect);
}

View File

@ -0,0 +1,10 @@
package com.suisung.mall.account.service;
import com.suisung.mall.common.modules.store.ShopStoreMemberLevel;
public interface ShopStoreMemberLevelService {
void checkUpdateStoreUserLevel(ShopStoreMemberLevel shopStoreMemberLevel);
}

View File

@ -0,0 +1,10 @@
package com.suisung.mall.account.service;
import com.suisung.mall.common.modules.account.AccountUserInfo;
public interface ShopStoreMemberService {
void dealStoreMember(AccountUserInfo accountUserInfo);
}

View File

@ -50,6 +50,9 @@ import com.suisung.mall.common.modules.distribution.ShopDistributionUser;
import com.suisung.mall.common.modules.distribution.ShopDistributionUserCommission;
import com.suisung.mall.common.modules.pay.PayUserResource;
import com.suisung.mall.common.modules.plantform.ShopPlantformSubsiteUser;
import com.suisung.mall.common.modules.store.ShopStoreBase;
import com.suisung.mall.common.modules.store.ShopStoreMember;
import com.suisung.mall.common.modules.store.ShopStoreMemberLevel;
import com.suisung.mall.common.pojo.dto.SmsDto;
import com.suisung.mall.common.pojo.req.WxUserInfoReq;
import com.suisung.mall.common.pojo.res.ThirdApiRes;
@ -67,6 +70,7 @@ import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -97,7 +101,7 @@ import static com.suisung.mall.common.utils.I18nUtil._;
@Service
public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseMapper, AccountUserBase> implements AccountUserBaseService {
private final String VERIFY_CODE_KEY = "register:verifyCode:";
private final String VERIFY_CODE_KEY = RedisConstant.VERIFY_CODE_KEY; //"register:verifyCode:";
private final Logger logger = LoggerFactory.getLogger(AccountUserBaseServiceImpl.class);
@Autowired
private AuthService authService;
@ -107,6 +111,8 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
private SnsService snsService;
@Autowired
private HttpServletRequest request;
@Lazy
@Autowired
private ShopService shopService;
@Autowired
@ -202,7 +208,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
data.put("key", token);
data.put("rid", rid); // 用户角色 rid0-用户;2-商家;3-门店;9-平台;
//user_type 用户类型对应user_base is_admin0-普通用户1-管理员2-入驻商家
//user_type 用户类型对应user_base user_is_admin0-普通用户1-管理员2-入驻商家3-代理商
String as = bindConnectService.getBind(user_id, BindCode.MOBILE, userDto.getUserType()) == null ? "0" : "1";
data.put("as", as); // 是否绑定了手机号 0- 1-
CookieUtils.setCookie("as", as);
@ -249,7 +255,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
public Map<String, Object> getUserInfo(Integer user_id) {
QueryWrapper<AccountUserBase> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", user_id).select(AccountUserBase.class, info -> !info.getColumn().equals("user_password"));
AccountUserBase accountUserBase = getOne(queryWrapper);
AccountUserBase accountUserBase = getOne(queryWrapper, false);
setIdentityByUser(accountUserBase);
AccountUserInfo userInfo = accountUserInfoService.get(user_id);
@ -290,6 +296,16 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
adminMap.put("user_level_rate", baseUserLevel.getUser_level_rate());
}
String inviteCode = "";
if (CommonConstant.USER_TYPE_AGENT.equals(accountUserBase.getUser_is_admin())) {
AccountUserBindConnect bindConnect = accountUserBindConnectService.getBindByUserId(user_id, BindCode.MOBILE, CommonConstant.USER_TYPE_MCH);
if (bindConnect != null && StrUtil.isNotBlank(bindConnect.getInvite_code())) {
inviteCode = bindConnect.getInvite_code();
}
}
// 代理商邀请码
adminMap.put("invite_code", inviteCode);
return adminMap;
}
@ -1675,10 +1691,11 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
String verifyCode = (String) userInfo.get("verify_code");
String verify_token = (String) userInfo.get("verify_token");
String rand_key = (String) userInfo.get("rand_key");
Integer userIsAdmin = Convert.toInt(userInfo.getOrDefault("user_is_admin", CommonConstant.USER_TYPE_NORMAL)); // 用户类型:0-普通买家; 1-管理员2-入驻商家
Integer userType = userIsAdmin; // 用户身份:0-普通买家; 1-管理员2-入驻商家
Integer userIsAdmin = Convert.toInt(userInfo.getOrDefault("user_is_admin", CommonConstant.USER_TYPE_NORMAL)); // 用户类型:0-普通买家; 1-管理员2-入驻商家3-代理商
Integer userType = userIsAdmin; // 用户类型:0-普通买家; 1-管理员2-入驻商家3-代理商
String user_email = (String) userInfo.get("user_email");
Integer bind_type = getParameter("bind_type", BindCode.MOBILE);
String inviteCode = Convert.toStr("invite_code", "");
if (StrUtil.isBlank(user_account)) {
throw new ApiException(_("请输入账号"));
@ -1713,10 +1730,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
throw new ApiException(_("账号已存在,请用另一账号名注册!"));
}
// 有手机参数优先手机注册
// if ((StrUtil.isNotBlank(user_mobile))
// || (CheckUtil.isMobile(user_account, user_intl) && StrUtil.equals(user_account, user_mobile))) {
if (StrUtil.isNotBlank(user_mobile) && CheckUtil.isMobile(user_mobile, user_intl)) {
if (StrUtil.isNotBlank(rand_key) && StrUtil.isNotBlank(verifyCode)) {
@ -1796,12 +1810,12 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
if (user_base_row != null) {
// 检测到 account_user_base 用户已经存在是因为账号没有绑定这时绑定账号即可
// 绑定基本关系
AccountUserBindConnect accountUserBindConnect = accountUserBindConnectService.initAccountUserBindConnect(user_mobile, bind_type, user_base_row.getUser_id(), userIsAdmin);
AccountUserBindConnect accountUserBindConnect = accountUserBindConnectService.initAccountUserBindConnect(user_mobile, bind_type, user_base_row.getUser_id(), userIsAdmin, inviteCode);
if (accountUserBindConnect == null) {
throw new ApiException(_("绑定账号失败"));
}
return user_base_row;
// throw new ApiException(_("用户已经存在,请更换用户名"));
} else {
// 检测到用户尚未注册立即新增用户基本信息和用户附加信息
String user_nickname = Convert.toStr(userInfo.get("user_nickname"), user_account);
@ -1816,7 +1830,6 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
// 密码加盐加密
user_password = SecureUtil.md5(user_salt + SecureUtil.md5(user_password));
user_base_reg_row.setUser_password(user_password);
// user_base_reg_row.setUser_password((BCrypt.hashpw(user_password)));
user_base_reg_row.setUser_nickname(user_nickname);
user_base_reg_row.setUser_state(user_state);
user_base_reg_row.setUser_key(user_key);
@ -1881,7 +1894,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
if (addUserBindConnect) {
// 初始化绑用户定关系
AccountUserBindConnect accountUserBindConnect = accountUserBindConnectService.initAccountUserBindConnect(user_mobile, bind_type, user_id, userIsAdmin);
AccountUserBindConnect accountUserBindConnect = accountUserBindConnectService.initAccountUserBindConnect(user_mobile, bind_type, user_id, userIsAdmin, inviteCode);
if (accountUserBindConnect == null) {
throw new ApiException(_("绑定账号失败"));
}
@ -1900,16 +1913,17 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
throw new ApiException(ResultCode.FAILED);
}
// 远程调用异常忽略掉
try {
// User_Resource初始化 用户积分
if (!payService.initUserPoints(user_id)) {
log.error("初始化用户积分失败");
// throw new ApiException(ResultCode.FAILED);
}
// 初始化用户经验表
if (!accountUserInfoService.initUserExperience(user_id)) {
log.error("初始化用户经验表失败");
// throw new ApiException(ResultCode.FAILED);
}
@ -1925,7 +1939,6 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
addSourceUserId(user_id, user_parent_id);
}
//todo 分享券
// 分享券活动id
Integer activityId = Convert.toInt(getParameter("activity_id"));
if (CheckUtil.isEmpty(activityId) && CheckUtil.isNotEmpty(activity_id)) {
@ -1950,10 +1963,10 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
}
if (StrUtil.isNotBlank(user_mobile) && userIsAdmin.equals(CommonConstant.USER_TYPE_MCH)) {
// 如果是商家首次注册 SMS_481085172 发送短信通知用户告知用户随机密码您已成功注册密码${password}密码可用于登录商家APP登录后请尽快修改密码
// 如果是商家首次注册 恭喜您成功注册了商家账号您的初始密码为${password}密码可登录商家 APP登录后请尽快修改密码
Map<String, Object> smsArgs = new HashMap<>();
smsArgs.put("password", user_password_src);
sendSmsMessage(PhoneNumberUtils.cleanPhoneNumber(user_mobile), "SMS_481085172", smsArgs);
sendSmsMessage(PhoneNumberUtils.cleanPhoneNumber(user_mobile), "SMS_496910525", smsArgs);
}
//初次注册发送消息
@ -2956,47 +2969,45 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
* @param user_mobile
* @param rand_key 防机器人刷验证码
* @param verify_code
* @param userType 用户类型:0-普通买家; 1-管理员2-入驻商家3-代理商
* @param cid 推送 cid
* @param osType 手机系统类型 1-Android2-iOS3-微信小程序
* @param inviteCode 代理商邀请码
* @return
*/
@Override
public CommonResult doMerchSmsRegisterAndLogin(String user_mobile, String rand_key, String verify_code, String cid, String osType) {
// 流程通过手机号检查是否有绑定关系没有就直接注册有就直接登录返回登录后的所有信息附加是否已经申请入驻标记
// 商家入驻账号都是需要手机号绑定的账号组成1000000+(数字加法)自增ID密码随机6位数
if (StrUtil.isBlank(user_mobile) || StrUtil.isBlank(verify_code)) {
public CommonResult doMerchSmsRegisterAndLogin(String user_mobile, String rand_key, String verify_code,
Integer userType, String cid, String osType, String inviteCode) {
// 参数验证
if (StrUtil.hasBlank(user_mobile, rand_key, verify_code)) {
return CommonResult.failed(_("缺少必要参数!"));
}
// 验证手机号格式
if (!PhoneNumberUtils.checkPhoneNumber(user_mobile)) {
return CommonResult.failed(_("请输入正确的手机号!"));
}
if (StrUtil.isBlank(rand_key)) {
return CommonResult.failed(_("程序非法请求, 检测验证码键值!"));
}
if (StrUtil.isBlank(verify_code)) {
return CommonResult.failed(_("请输入验证码!"));
}
// rmk 为什么随机数和手机号一致
if (ObjectUtil.notEqual(user_mobile, rand_key)) {
return CommonResult.failed(_("非法数据,或者提交超时,请刷新页面重新提交!"));
// 验证防刷机制
if (!ObjectUtil.equal(user_mobile, rand_key)) {
return CommonResult.failed(_("非法数据,请刷新页面重新提交!"));
}
String verifyMobile = PhoneNumberUtils.convZhPhoneNumber(user_mobile);
// TODO 短信验证码切换到正式平台,记得注释 9999
// 验证验证码 (TODO 短信验证码切换到正式平台,记得注释 9999)
if (!checkVerifyCode(verifyMobile, verify_code)) {
// 短信验证码
return CommonResult.failed(_("验证码错误!"));
}
// 找出手机对应的绑定用户
// 是否为手机号注册密码6位随机数
return doMobileBindLogin(verifyMobile, CommonConstant.USER_TYPE_MCH, cid, osType);
// 设置默认用户类型
userType = ObjectUtil.defaultIfNull(userType, CommonConstant.USER_TYPE_MCH);
// 找出手机对应的绑定用户进行绑定登录
return doMobileBindLogin(verifyMobile, userType, cid, osType, inviteCode);
}
/**
* 微信小程序一键登录注册接口
*
@ -3031,6 +3042,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
String mobile = PhoneNumberUtils.convWithIDDCodePhoneNumber(wxUserInfoReq.getPhoneNumber(), iddCode);
AccountUserBase accountUserBase = getByAccountAndType(mobile, CommonConstant.USER_TYPE_NORMAL);
Integer userId = 0;
if (accountUserBase == null) {
// 检测到用户尚未注册立即新增用户基本信息和用户附加信息
Date today = new Date();
@ -3063,7 +3075,7 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
return CommonResult.failed(_("微信注册账号失败!"));
}
Integer userId = accountUserBase.getUser_id();
userId = accountUserBase.getUser_id();
AccountUserLogin user_login_reg_row = new AccountUserLogin();
user_login_reg_row.setUser_id(userId);
@ -3145,6 +3157,36 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
args.put("register_time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(today));
messageService.sendNoticeMsg(userId, 0, message_id, args);
} else {
userId = accountUserBase.getUser_id();
}
//店铺会员如果从店铺进去 则生成店铺会员需要传入店铺id
if (com.suisung.mall.common.utils.StringUtils.isNotEmpty(wxUserInfoReq.getStoreId())) {
ShopStoreMember params = new ShopStoreMember();
params.setUserId(accountUserBase.getUser_id());
params.setStoreId(Convert.toInt(wxUserInfoReq.getStoreId()));
List<ShopStoreMember> shopStoreMembers = shopService.findShopStoreMemberList(params);
ShopStoreBase shopStoreBase = shopService.getShopStoreBase(Convert.toInt(wxUserInfoReq.getStoreId()));
if (shopStoreMembers.isEmpty() && shopStoreBase != null) {
ShopStoreMember shopStoreMember = new ShopStoreMember();
shopStoreMember.setStoreName(shopStoreBase.getStore_name());
shopStoreMember.setStoreId(shopStoreBase.getStore_id());
shopStoreMember.setUserId(userId);
shopStoreMember.setBind_openid(wxUserInfoReq.getOpenId());
shopStoreMember.setUserNickname(accountUserBase.getUser_nickname());
shopStoreMember.setUserAccount(accountUserBase.getUser_account());
ShopStoreMember saveShopStoreMember = shopService.saveShopStoreMember(shopStoreMember);
ShopStoreMemberLevel shopStoreMemberLevel = getShopStoreMemberLevel(shopStoreBase, saveShopStoreMember);
shopStoreMemberLevel.setUserId(userId);
shopService.saveShopStoreMemberLevel(shopStoreMemberLevel);
} else {
ShopStoreMember updateShopStoreMember = shopStoreMembers.get(0);
if (com.suisung.mall.common.utils.StringUtils.isNotEmpty(updateShopStoreMember.getBind_openid())) {
updateShopStoreMember.setBind_openid(wxUserInfoReq.getOpenId());
shopService.saveShopStoreMember(updateShopStoreMember);
}
}
}
// accountUserBase == null 的情况
@ -3171,6 +3213,17 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
return login(params);
}
private ShopStoreMemberLevel getShopStoreMemberLevel(ShopStoreBase shopStoreBase, ShopStoreMember shopStoreMember) {
ShopStoreMemberLevel shopStoreMemberLevel = new ShopStoreMemberLevel();
shopStoreMemberLevel.setStoreId(shopStoreBase.getStore_id());
shopStoreMemberLevel.setStoreMemberId(shopStoreMember.getStore_member_id());
shopStoreMemberLevel.setUserLevelName("v1");
shopStoreMemberLevel.setUserLevelId(1001);
shopStoreMemberLevel.setMemberLevelId(1001);
shopStoreMemberLevel.setMemberLevelName("v1");
return shopStoreMemberLevel;
}
/**
* 手机号登陆操作
@ -3215,50 +3268,67 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
* 商家版app入驻商家手机号绑定登录
*
* @param user_mobile +86的中国号码
* @param userType 用户类型0-普通用户1-管理员2-入驻商户
* @param userType 用户类型0-普通用户1-管理员2-入驻商户3-代理商
* @param cid 推送 cid
* @param osType 手机系统类型 1-Android2-iOS3-微信小程序
* @param inviteCode 代理商的邀请码商家注册时才用
* @return
*/
public CommonResult doMobileBindLogin(String user_mobile, Integer userType, String cid, String osType) {
public CommonResult doMobileBindLogin(String user_mobile, Integer userType, String cid, String osType, String inviteCode) {
return doMobileBindLogin(user_mobile, "", userType, cid, osType, inviteCode);
}
/**
* 商家版app入驻商家手机号绑定登录
*
* @param user_mobile
* @param regPwd 注册用途
* @param userType 用户类型:0-普通买家; 1-管理员2-入驻商家3-代理商
* @param cid
* @param osType
* @return
*/
public CommonResult doMobileBindLogin(String user_mobile, String regPwd, Integer userType, String cid, String osType, String inviteCode) {
if (StrUtil.isBlank(user_mobile) || userType == null) {
return CommonResult.failed("缺少必要参数!");
}
// 检查输入字符是不是包含 sql 注入特征如果包含不给以通过
// 检查输入字符是否包含 SQL 注入特征
if (!CommonService.isValidInput(user_mobile, cid, osType)) {
return CommonResult.failed(ResultCode.VALIDATE_INPUTS);
}
AccountUserBase accountUserBase;
// 查询绑定手机的商家账号
AccountUserBindConnect bind_row = accountUserBindConnectService.getBindByBindId(user_mobile, BindCode.MOBILE, userType);
AccountUserBase accountUserBase;
if (bind_row != null) {
// 已经注册账号的绑定了手机的情况
// 绑定账号的情况
Integer user_id = bind_row.getUser_id();
accountUserBase = get(user_id);
if (accountUserBase == null) {
return CommonResult.failed("获取不到用户信息!");
}
} else {
// 手机号码未绑定的情况直接去注册一个账号
// 手机号码未绑定注册新账号
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("user_account", user_mobile);
userInfo.put("user_mobile", user_mobile);
userInfo.put("user_is_admin", userType); // 商家入驻注册
// 随机数明文密码
String user_password = com.suisung.mall.common.utils.StringUtils.random(6, com.suisung.mall.common.utils.StringUtils.RandomType.STRING);
userInfo.put("user_is_admin", userType); // 商家或代理商入驻注册
String user_password = StrUtil.isNotBlank(regPwd) ? regPwd :
com.suisung.mall.common.utils.StringUtils.random(6, com.suisung.mall.common.utils.StringUtils.RandomType.STRING);
userInfo.put("user_password", user_password);
userInfo.put("is_admin", userType); // 商家入驻注册
userInfo.put("invite_code", StrUtil.isNotBlank(inviteCode) ? inviteCode : ""); // 商家注册代理商的邀请码
// 注册商家账号都是需要手机号绑定的
accountUserBase = register(userInfo);
if (accountUserBase == null) {
throw new ApiException(_("账号注册失败!"));
}
}
// 构建登录参数
Map<String, String> params = new HashMap<>();
params.put("client_id", CommonConstant.USER_TYPE_MCH.equals(userType) ? AuthConstant.MCH_CLIENT_ID : AuthConstant.MOBILE_CLIENT_ID);
params.put("client_secret", AuthConstant.AUTHORITY_MOBILE_SECRET);
@ -3267,17 +3337,164 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
params.put("username", accountUserBase.getUser_account());
params.put("password", "");
params.put("user_mobile", user_mobile);
params.put("is_merch", "1"); // 是否为商家入驻 1-其他-
params.put("is_merch", CommonConstant.USER_TYPE_MCH.equals(userType) ? "1" : "2"); // 是否为商家入驻 1-其他-
params.put("is_agent", CommonConstant.USER_TYPE_AGENT.equals(userType) ? "1" : "2"); // 是否为代理商入驻 1-其他-
if (StrUtil.isNotBlank(cid)) {
params.put("cid", cid); // 个推客户端Id
params.put("os_type", osType); // 个推客系统类别 1-Android2-iOS;3-微信小程序
// logger.info("推送参数2 cid:{} osType{}", cid, osType);
}
return login(params);
}
/**
* 商家内部注册服务之间调用
*
* @param mobile 商家手机号
* @param regPwd 注册明文密码
* @return Pair<Boolean, String> 第一个元素表示是否成功第二个元素表示提示信息
*/
@Override
public Pair<Boolean, String> merchantInnerRegister(String mobile, String regPwd) {
log.info("商家内部注册开始,手机号: {}", mobile);
// 1. 参数校验
if (StrUtil.isBlank(mobile)) {
log.warn("商家内部注册失败:手机号为空");
return Pair.of(false, "手机号不能为空");
}
try {
// 2. 转换手机号格式添加国家区号
String convertedMobile = PhoneNumberUtils.convZhPhoneNumber(mobile);
// 3. 检查手机号是否已注册为商家
Integer isExists = accountUserBindConnectService.isMerchantExists(convertedMobile);
if (CommonConstant.Enable.equals(isExists)) {
log.warn("商家内部注册失败:手机号已注册,手机号: {}", convertedMobile);
return Pair.of(false, "该手机号已注册!");
}
// 4. 执行手机号绑定登录注册商家账号
CommonResult result = doMobileBindLogin(convertedMobile, regPwd, CommonConstant.USER_TYPE_MCH, null, null, "");
// 5. 检查注册结果
if (result == null || result.getCode() != ResultCode.SUCCESS.getCode()) {
String errorMsg = result != null ? result.getMsg() : "注册结果为空";
log.error("商家账号注册失败:{},手机号: {}", errorMsg, convertedMobile);
return Pair.of(false, "商家账号注册失败:" + errorMsg);
}
log.info("商家内部注册成功,手机号: {}", convertedMobile);
return Pair.of(true, "商家注册成功");
} catch (Exception e) {
log.error("商家内部注册异常,手机号: {}", mobile, e);
return Pair.of(false, "商家注册失败:" + e.getMessage());
}
}
/**
* 更改分店商家的手机号(仅限于分店尽量不要更改总店的手机号)项目之间远程调用
*
* @param oldMobile 老的手机号
* @param newMobile 新的手机号
* @param password 新的登录密码可选
* @return Pair<Boolean, String> 操作结果和提示信息true表示成功false表示失败
*/
@Override
public Pair<Boolean, String> changeMerchantLoginMobile(String oldMobile, String newMobile, String password) {
log.debug("开始更改商家登录手机号,老手机号:{},新手机号:{},是否需要设置密码:{}", oldMobile, newMobile, StrUtil.isNotBlank(password));
try {
// 验证输入参数
if (StrUtil.isBlank(oldMobile) || StrUtil.isBlank(newMobile)) {
log.warn("手机号参数为空,老手机号:{},新手机号:{}", oldMobile, newMobile);
return Pair.of(false, "手机号不能为空");
}
// 格式化手机号添加国际区号
String formattedOldMobile = PhoneNumberUtils.convZhPhoneNumber(oldMobile);
String formattedNewMobile = PhoneNumberUtils.convZhPhoneNumber(newMobile);
log.debug("格式化后的手机号:老:{} 新:{}", formattedOldMobile, formattedNewMobile);
// 查询老手机号是否绑定商家账号
AccountUserBindConnect bindConnect = bindConnectService.getBindByBindId(formattedOldMobile, BindCode.MOBILE, CommonConstant.USER_TYPE_MCH);
if (bindConnect == null) {
log.warn("该老手机号未绑定商家账号,手机号:{}", formattedOldMobile);
return Pair.of(false, "该老手机号未绑定商家账号,无法进行更换");
}
// 获取用户信息
Integer userId = bindConnect.getUser_id();
log.debug("绑定记录中的用户ID{}", userId);
AccountUserBase userBase = get(userId);
if (userBase == null) {
log.warn("用户信息不存在用户ID{}", userId);
return Pair.of(false, "用户信息不存在,无法进行更换");
}
// 验证用户确实是商家类型
if (!userBase.getUser_is_admin().equals(CommonConstant.USER_TYPE_MCH)) {
log.warn("该账号不是商家账号用户ID{},用户类型:{}", userId, userBase.getUser_is_admin());
return Pair.of(false, "该账号不是商家账号,无法进行更换");
}
// 检查目标手机号是否已被其他商家账号使用
AccountUserBase existingNewUser = getByAccountAndType(formattedNewMobile, CommonConstant.USER_TYPE_MCH);
if (existingNewUser != null && !existingNewUser.getUser_id().equals(userId)) {
log.warn("目标手机号已被其他商家账号使用,手机号:{}用户ID{}", formattedNewMobile, existingNewUser.getUser_id());
return Pair.of(false, "该手机号已被其他商家账号使用");
}
// 检查新手机号是否已被其他商家绑定
AccountUserBindConnect newBindConnect = bindConnectService.getBindByBindId(formattedNewMobile, BindCode.MOBILE, CommonConstant.USER_TYPE_MCH);
if (newBindConnect != null && !newBindConnect.getUser_id().equals(userId)) {
log.warn("该新手机号已被其他商家账号绑定,手机号:{}用户ID{}", formattedNewMobile, newBindConnect.getUser_id());
return Pair.of(false, "该手机号已被其他商家账号绑定");
}
// 更新用户账号为新手机号
log.debug("开始更新用户账号信息用户ID{},新手机号:{}", userId, formattedNewMobile);
userBase.setUser_account(formattedNewMobile);
// 如果提供了密码则更新密码
if (StrUtil.isNotBlank(password)) {
log.debug("需要更新用户密码");
String user_salt = IdUtil.simpleUUID();
String encryptedPassword = SecureUtil.md5(user_salt + SecureUtil.md5(password));
userBase.setUser_password(encryptedPassword);
userBase.setUser_salt(user_salt);
}
// 更新用户基础信息
boolean updateUserResult = saveOrUpdate(userBase);
if (!updateUserResult) {
log.error("更新用户账号信息失败用户ID{}", userId);
return Pair.of(false, "更新用户账号信息失败");
}
// 更新绑定表中的bind_id为新手机号
log.debug("开始更新绑定信息原绑定ID{}新绑定ID{}", bindConnect.getBind_id(), formattedNewMobile);
bindConnect.setBind_id(formattedNewMobile);
boolean updateBindResult = accountUserBindConnectService.saveOrUpdate(bindConnect);
if (!updateBindResult) {
log.error("更新绑定信息失败绑定ID{}", formattedNewMobile);
return Pair.of(false, "更新绑定信息失败");
}
log.info("更换商家登录手机号成功用户ID{},新手机号:{}", userId, formattedNewMobile);
return Pair.of(true, "更换商家登录手机号成功");
} catch (Exception e) {
log.error("更改商家登录手机号过程中发生异常,老手机号:{},新手机号:{}", oldMobile, newMobile, e);
return Pair.of(false, "系统异常:" + e.getMessage());
}
}
@Override
public Map<String, Object> doAppConnectLogin(String bind_name, String code) {
String id_prefix = "";
@ -3803,6 +4020,23 @@ public class AccountUserBaseServiceImpl extends BaseServiceImpl<AccountUserBaseM
return new ThirdApiRes().fail(250, "保存异常");
}
@Override
public ThirdApiRes saveBatchAccountUserLogin(List<AccountUserLogin> accountUserLoginList) {
boolean result = false;
if (!accountUserLoginList.isEmpty()) {
try {
result = accountUserLoginService.saveBatch(accountUserLoginList, accountUserLoginList.size());
} catch (Exception e) {
throw new RuntimeException("保存AccountUserLogin报错" + e.getMessage());
}
}
if (result) {
return new ThirdApiRes().success("成功");
}
return new ThirdApiRes().fail(250, "保存异常");
}
/**
* 检查并修复商户店铺信息
* 重要补偿机制检查修复商户入驻店铺信息(商家账号关联入驻店铺Id给商家账户创立公司员工账号和权限)

View File

@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.suisung.mall.account.mapper.AccountUserBindConnectMapper;
@ -14,11 +15,18 @@ import com.suisung.mall.account.service.AccountUserInfoService;
import com.suisung.mall.common.api.BindCode;
import com.suisung.mall.common.api.ResultCode;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.constant.RedisConstant;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.feignService.ShopService;
import com.suisung.mall.common.modules.account.AccountUserBase;
import com.suisung.mall.common.modules.account.AccountUserBindConnect;
import com.suisung.mall.common.modules.account.AccountUserInfo;
import com.suisung.mall.common.modules.store.ShopStoreMember;
import com.suisung.mall.common.pojo.req.WxUserInfoReq;
import com.suisung.mall.common.pojo.res.ThirdApiRes;
import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.common.utils.ContextUtil;
import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.StringUtils;
import com.suisung.mall.common.utils.phone.PhoneNumberUtils;
@ -26,6 +34,7 @@ import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -43,6 +52,7 @@ import java.util.*;
*/
@Slf4j
@Service
@Transactional
public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUserBindConnectMapper, AccountUserBindConnect> implements AccountUserBindConnectService {
@Autowired
@ -51,6 +61,12 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
@Autowired
private AccountUserBaseService accountUserBaseService;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private ShopService shopService;
/**
* 获取有效绑定
*
@ -367,6 +383,152 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
}
}
/**
* 检查手机注册的商家是否存在
*
* @param mobile
* @return 1-已存在 2-不存在 3-格式错误
*/
@Override
public Integer isMerchantExists(String mobile) {
log.debug("检查商家是否存在,手机号: {}", mobile);
if (StrUtil.isBlank(mobile)) {
log.warn("手机号为空,无法检查商家是否存在");
return 3;
}
try {
String convertedMobile = PhoneNumberUtils.convZhPhoneNumber(mobile);
if (CheckUtil.isEmpty(convertedMobile)) {
log.warn("手机号格式无效: {}", mobile);
return 3;
}
// 使用正确的绑定类型检查手机号
LambdaQueryWrapper<AccountUserBindConnect> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AccountUserBindConnect::getBind_id, convertedMobile)
.eq(AccountUserBindConnect::getBind_type, BindCode.MOBILE) // 1-手机号
.eq(AccountUserBindConnect::getUser_type, CommonConstant.USER_TYPE_MCH) // 2-入驻商家
.eq(AccountUserBindConnect::getBind_active, CommonConstant.Enable)
.orderByAsc(AccountUserBindConnect::getBind_time)
.select(AccountUserBindConnect::getUser_id);
log.debug("执行查询,转换后的手机号: {}, 查询条件: {}", convertedMobile, queryWrapper.getSqlSegment());
AccountUserBindConnect accountUserBindConnect = getOne(queryWrapper);
if (accountUserBindConnect == null || CheckUtil.isEmpty(accountUserBindConnect.getUser_id())) {
log.info("未找到手机号绑定的商家记录,手机号: {}", convertedMobile);
return 2;
}
Integer userId = accountUserBindConnect.getUser_id();
log.debug("找到用户ID: {}", userId);
AccountUserBase accountUserBase = accountUserBaseService.get(userId);
if (accountUserBase == null) {
log.warn("用户基础信息不存在用户ID: {}", userId);
return 2;
}
log.info("商家存在用户ID: {}", userId);
return 1;
} catch (Exception e) {
log.error("查询商家绑定信息时发生异常,手机号: {}", mobile, e);
return null;
}
}
@Override
public void saveBindCountSendNumber(Integer storeId, String mobile) {
if (storeId == null) {
return;
}
UserDto userDto = ContextUtil.getCurrentUser();
assert userDto != null;
Integer userId = userDto.getId();
String mapKey = RedisConstant.SUB_SEND_CACHE + userId;
//redisTemplate.opsForHash().increment(RedisConstant.SUB_SEND_CACHE,mapKey, 1);//todo 删除
if (redisTemplate.opsForHash().get(RedisConstant.SUB_SEND_CACHE, mapKey) != null) {
Integer integer = (Integer) redisTemplate.opsForHash().get(RedisConstant.SUB_SEND_CACHE, mapKey);
if (integer != null && integer > 0) {
if (storeId > 0) { //店铺推送订阅
ShopStoreMember params = new ShopStoreMember();
params.setUserId(userId);
params.setStoreId(storeId);
List<ShopStoreMember> shopStoreMemberList = shopService.findShopStoreMemberList(params);
if (shopStoreMemberList != null && !shopStoreMemberList.isEmpty()) {
ShopStoreMember shopStoreMember = shopStoreMemberList.get(0);
shopStoreMember.setSend_number(shopStoreMember.getSend_number() + 1);
ShopStoreMember resultShopStoreMember = shopService.saveShopStoreMember(shopStoreMember);
if (resultShopStoreMember.getStore_member_id() != null) {
redisTemplate.opsForHash().increment(RedisConstant.SUB_SEND_CACHE, mapKey, -1);//店铺扣除一次
}
}
} else {//平台推送订阅
QueryWrapper<AccountUserBindConnect> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("bind_id", "+86" + mobile)//+86的
.eq("bind_type", BindCode.MOBILE)
.eq("user_type", 0)
.eq("user_id", userId)
.eq("bind_active", CommonConstant.Enable)
.orderByAsc("bind_time");
List<AccountUserBindConnect> accountUserBindConnectList = list(queryWrapper);
AccountUserBindConnect accountUserBindConnect = accountUserBindConnectList.get(0);
if (accountUserBindConnectList.isEmpty()) {
return;
}
UpdateWrapper<AccountUserBindConnect> updateWrapper = new UpdateWrapper<>();
accountUserBindConnect.setSend_number(accountUserBindConnect.getSend_number() + 1);
getUpdateWrapper(updateWrapper, accountUserBindConnect);
if (update(updateWrapper)) {
redisTemplate.opsForHash().increment(RedisConstant.SUB_SEND_CACHE, mapKey, -1);//店铺扣除一次
}
}
}
}
}
@Override
public ThirdApiRes updateBatchAccountUserBindConnect(List<AccountUserBindConnect> accountUserBindConnectList) {
boolean result = false;
if (!accountUserBindConnectList.isEmpty()) {
UpdateWrapper<AccountUserBindConnect> updateWrapper = new UpdateWrapper<>();
try {
for (AccountUserBindConnect accountUserBindConnect : accountUserBindConnectList) {
updateWrapper.set("send_number", accountUserBindConnect.getSend_number());
updateWrapper.eq("bind_id", accountUserBindConnect.getBind_id());
updateWrapper.eq("user_id", accountUserBindConnect.getUser_id());
updateWrapper.eq("bind_type", accountUserBindConnect.getBind_type());
updateWrapper.eq("user_type", accountUserBindConnect.getUser_type());
this.update(updateWrapper);
}
} catch (Exception e) {
throw new RuntimeException("保存AccountUserBindConnect报错" + e.getMessage());
}
}
if (result) {
return new ThirdApiRes().success("成功");
}
return new ThirdApiRes().fail(250, "保存异常");
}
@Override
public List<AccountUserBindConnect> getAllBindList(AccountUserBindConnect accountUserBindConnect) {
QueryWrapper<AccountUserBindConnect> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("bind_id", accountUserBindConnect.getBind_id());
queryWrapper.eq("bind_type", BindCode.MOBILE)
.eq("user_type", 0)
.eq("user_id", accountUserBindConnect.getUser_id())
.orderByAsc("bind_time");
return this.list(queryWrapper);
}
/**
* 用户绑定手机号和openid
*
@ -439,9 +601,10 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
* @param bindType 绑定类型
* @param userId 用户ID
* @param userType 用户类型
* @param inviteCode 代理商邀请码
* @return 账户用户绑定连接对象如果初始化失败则返回null
*/
public AccountUserBindConnect initAccountUserBindConnect(String bindId, Integer bindType, Integer userId, Integer userType) {
public AccountUserBindConnect initAccountUserBindConnect(String bindId, Integer bindType, Integer userId, Integer userType, String inviteCode) {
// 1. 校验入参任何一个为空直接返回null
if (StrUtil.isBlank(bindId)
|| ObjectUtil.isNull(bindType)
@ -463,7 +626,7 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
.eq("user_id", userId)
.eq("bind_active", CommonConstant.Enable).orderByAsc("bind_time");
AccountUserBindConnect existingBindConnect = findOne(queryWrapper);
AccountUserBindConnect existingBindConnect = getOne(queryWrapper, false);
if (existingBindConnect != null) {
log.info("账户用户绑定信息已存在bindId={}, bindType={}, userId={}, userType={}", bindId, bindType, userId, userType);
return existingBindConnect;
@ -481,6 +644,7 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
newBindConnect.setBind_token_ttl(0);
newBindConnect.setBind_level(0);
newBindConnect.setBind_vip(0);
newBindConnect.setInvite_code(inviteCode); // 代理商邀请码
// log.debug("准备创建新的账户用户绑定信息: {}", JSONUtil.toJsonStr(newBindConnect));
@ -512,6 +676,7 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
.eq("user_type", CommonConstant.USER_TYPE_NORMAL)
.eq("bind_active", CommonConstant.Enable)
.eq("bind_tmpl", bindTmpl)
.gt("send_number", 0)
.orderByAsc("bind_time");
return this.lists(queryWrapper, pageNum, pageSize).getRecords();
}
@ -560,6 +725,8 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
String templateId = object.getStr("TemplateId");//模板id
String SubscribeStatusString = object.getStr("SubscribeStatusString");//订阅结果accept接收reject拒收参考地址https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html#%E8%AE%A2%E9%98%85%E6%B6%88%E6%81%AF%E8%AF%AD%E9%9F%B3%E6%8F%90%E9%86%92
if (SubscribeStatusString.equals("accept")) {
String mapKey = RedisConstant.SUB_SEND_CACHE + accountUserBindConnect.getUser_id();
redisTemplate.opsForHash().increment(RedisConstant.SUB_SEND_CACHE, mapKey, 1);
accountUserBindConnect.setBind_tmpl(templateId);
getUpdateWrapper(updateWrapper, accountUserBindConnect);
}
@ -568,6 +735,8 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
String templateId = object.getStr("TemplateId");//模板id
String SubscribeStatusString = object.getStr("SubscribeStatusString");
if (StringUtils.isNotEmpty(SubscribeStatusString) && SubscribeStatusString.equals("accept")) {
String mapKey = RedisConstant.SUB_SEND_CACHE + accountUserBindConnect.getUser_id();
redisTemplate.opsForHash().increment(RedisConstant.SUB_SEND_CACHE, mapKey, 1);
accountUserBindConnect.setBind_tmpl(templateId);
getUpdateWrapper(updateWrapper, accountUserBindConnect);
} else {
@ -582,8 +751,10 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
}
}
/**
* 封装相同参数的调用方法
*
* @param updateWrapper
* @param accountUserBindConnect
*/
@ -594,6 +765,7 @@ public class AccountUserBindConnectServiceImpl extends BaseServiceImpl<AccountUs
updateWrapper.eq("bind_type", accountUserBindConnect.getBind_type());
updateWrapper.eq("user_id", accountUserBindConnect.getUser_id());
updateWrapper.eq("user_type", accountUserBindConnect.getUser_type());
updateWrapper.set("send_number", accountUserBindConnect.getSend_number());
}
}

View File

@ -23,6 +23,7 @@ import com.suisung.mall.common.feignService.PayService;
import com.suisung.mall.common.feignService.ShopService;
import com.suisung.mall.common.modules.account.*;
import com.suisung.mall.common.modules.distribution.ShopDistributionPlantformUser;
import com.suisung.mall.common.modules.store.ShopStoreMemberLevel;
import com.suisung.mall.common.modules.user.ShopUserExpHistory;
import com.suisung.mall.common.utils.CSVUtils;
import com.suisung.mall.common.utils.CheckUtil;
@ -80,6 +81,10 @@ public class AccountUserInfoServiceImpl extends BaseServiceImpl<AccountUserInfoM
@Autowired
private PayService payService;
@Autowired
private ShopStoreMemberLevelService shopStoreMemberLevelService;
/**
* 实名认证页面
*
@ -157,7 +162,6 @@ public class AccountUserInfoServiceImpl extends BaseServiceImpl<AccountUserInfoM
@Override
public boolean checkUpdateUserLevel(Integer user_id, BigDecimal user_exp_total, Integer user_fans_total, BigDecimal user_spend_total, Integer user_store_total, Integer user_fans_vip_total, Integer user_fans_team_total) {
AccountBaseUserLevel level_row = null;
if (CheckUtil.isNotEmpty(user_exp_total)) {
// 需要设置经验值设置为0否则忽略不计
QueryWrapper<AccountBaseUserLevel> levelQueryWrapper = new QueryWrapper<>();
@ -178,7 +182,7 @@ public class AccountUserInfoServiceImpl extends BaseServiceImpl<AccountUserInfoM
// 需要设置经验值设置为0否则忽略不计
QueryWrapper<AccountBaseUserLevel> levelQueryWrapper = new QueryWrapper<>();
levelQueryWrapper.le("user_level_spend", user_spend_total)
.gt("user_level_spend", 0).orderByDesc("user_level_spend");
.gt("user_level_spend", "0.00").orderByDesc("user_level_spend");
level_row = accountBaseUserLevelService.findOne(levelQueryWrapper);
}
@ -431,8 +435,11 @@ public class AccountUserInfoServiceImpl extends BaseServiceImpl<AccountUserInfoM
@Override
public List<Map> getUser(List<Integer> user_ids) {
List<AccountUserBase> user_base_rows = accountUserBaseService.gets(user_ids);
List<Map> user_info_rows = Convert.toList(Map.class, gets(user_ids));
QueryWrapper<AccountUserBase> queryWrapper = new QueryWrapper<>();
queryWrapper.in("user_id", user_ids);
List<AccountUserBase> user_base_rows = accountUserBaseService.list(queryWrapper);
//List<AccountUserBase> user_base_rows = accountUserBaseService.gets(user_ids);
List<Map> user_info_rows = Convert.toList(Map.class, user_base_rows);
for (Map user_info_row : user_info_rows) {
Integer user_id = (Integer) user_info_row.get("user_id");

View File

@ -0,0 +1,90 @@
package com.suisung.mall.account.service.impl;
import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.suisung.mall.account.mapper.AccountBaseUserLevelMapper;
import com.suisung.mall.account.mapper.ShopStoreMemberLevelMapper;
import com.suisung.mall.account.service.ShopStoreMemberLevelService;
import com.suisung.mall.common.modules.account.AccountBaseUserLevel;
import com.suisung.mall.common.modules.store.ShopStoreMemberLevel;
import com.suisung.mall.common.utils.CheckUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
* <p>
* 店铺会员-会员等级
* </p>
*/
@Service
@Slf4j
public class ShopStoreMemberLevelServiceImpl implements ShopStoreMemberLevelService {
@Autowired
private ShopStoreMemberLevelMapper shopStoreMemberLevelMapper;
@Autowired
private AccountBaseUserLevelMapper accountBaseUserLevelMapper;
@Override
public void checkUpdateStoreUserLevel(ShopStoreMemberLevel shopStoreMemberLevel) {
log.info("MQ店铺会员升级开始shopStoreMemberLevel:{}", shopStoreMemberLevel);
int maxAttempts = 3; // 最多尝试3次
int currentAttempt = 0;
boolean success = false;
while (currentAttempt < maxAttempts && !success) {
success = dealStoreUserLevel(shopStoreMemberLevel);
if (!success) {
currentAttempt++;
if (currentAttempt < maxAttempts) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
log.error("线程被中断,重试终止", e);
Thread.currentThread().interrupt();
break;
}
}
}
}
if (!success) {
log.error("店铺会员升级失败,已达到最大重试次数");
}
}
private boolean dealStoreUserLevel(ShopStoreMemberLevel shopStoreMemberLevel){
if(shopStoreMemberLevel.getUserLevelSpend()!=null && shopStoreMemberLevel.getStoreId()!=null && shopStoreMemberLevel.getUserId()!=null){//店铺消费
//查找会员再更新店铺会员等级 todo
QueryWrapper<ShopStoreMemberLevel> params = new QueryWrapper<>();
params.eq("user_id", shopStoreMemberLevel.getUserId());
params.eq("store_id", shopStoreMemberLevel.getStoreId());
List<ShopStoreMemberLevel> shopStoreMemberLevels= shopStoreMemberLevelMapper.selectList(params);
if(shopStoreMemberLevels!=null && !shopStoreMemberLevels.isEmpty()) {
ShopStoreMemberLevel updateShopStoreMemberLevel = shopStoreMemberLevels.get(0);
BigDecimal storeSpend = NumberUtil.add(updateShopStoreMemberLevel.getUserLevelSpend(), shopStoreMemberLevel.getUserLevelSpend());//店铺会员总消费
QueryWrapper<AccountBaseUserLevel> levelQueryWrapper = new QueryWrapper<>();
levelQueryWrapper.le("user_level_spend", storeSpend)
.gt("user_level_spend", "0.00").orderByDesc("user_level_spend");
AccountBaseUserLevel level_row = accountBaseUserLevelMapper.selectOne(levelQueryWrapper);
updateShopStoreMemberLevel.setUserLevelSpend(storeSpend);
if (level_row != null && CheckUtil.isNotEmpty(level_row.getUser_level_id())) {
Integer user_level_id = level_row.getUser_level_id();
String user_level_name = level_row.getUser_level_name();
updateShopStoreMemberLevel.setUserLevelId(user_level_id);
updateShopStoreMemberLevel.setUserLevelName(user_level_name);
updateShopStoreMemberLevel.setMemberLevelId(user_level_id);
updateShopStoreMemberLevel.setMemberLevelName(user_level_name);
}
shopStoreMemberLevelMapper.updateById(updateShopStoreMemberLevel);
}else {
return false;
}
}
return true;
}
}

View File

@ -0,0 +1,101 @@
package com.suisung.mall.account.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.suisung.mall.account.mapper.AccountUserBindConnectMapper;
import com.suisung.mall.account.mapper.AccountUserInfoMapper;
import com.suisung.mall.account.mapper.ShopStoreMemberLevelMapper;
import com.suisung.mall.account.mapper.ShopStoreMemberMapper;
import com.suisung.mall.account.service.ShopStoreMemberService;
import com.suisung.mall.common.api.BindCode;
import com.suisung.mall.common.modules.account.AccountUserBindConnect;
import com.suisung.mall.common.modules.account.AccountUserInfo;
import com.suisung.mall.common.modules.store.ShopStoreMember;
import com.suisung.mall.common.modules.store.ShopStoreMemberLevel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 店铺会员-店铺会员
* </p>
*/
@Service
@Slf4j
public class ShopStoreMemberServiceImpl implements ShopStoreMemberService {
@Autowired
private ShopStoreMemberMapper shopStoreMemberMapper;
@Autowired
private AccountUserBindConnectMapper accountUserBindConnectMapper;
@Autowired
private ShopStoreMemberLevelMapper shopStoreMemberLevelMapper;
@Autowired
private AccountUserInfoMapper accountUserInfoMapper;
@Override
public void dealStoreMember(AccountUserInfo accountUserInfo){
AccountUserInfo updateAccountUserInfo= accountUserInfoMapper.selectById(accountUserInfo.getUser_id());
log.info("dealStoreMember-MQ处理店铺会员开始:accountUserInfo:{}", JSONUtil.toJsonStr(accountUserInfo));
if(null!=accountUserInfo.getStore_id()){
log.info("MQ处理店铺会员开始:accountUserInfo:{}", JSONUtil.toJsonStr(accountUserInfo));
Integer store_id = accountUserInfo.getStore_id();
Integer user_id = accountUserInfo.getUser_id();
QueryWrapper<ShopStoreMember> params=new QueryWrapper<>();
params.eq("store_id",store_id);
params.eq("user_id",user_id);
List<ShopStoreMember> shopStoreMembers= shopStoreMemberMapper.selectList(params);
if(shopStoreMembers.isEmpty()){
QueryWrapper<AccountUserBindConnect> queryWrapper = new QueryWrapper<>();
String bind_id= updateAccountUserInfo.getUser_mobile();
if(!bind_id.contains("+86")){
bind_id="+86"+ updateAccountUserInfo.getUser_mobile();
}
queryWrapper.eq("bind_id", bind_id);
queryWrapper.eq("bind_type", BindCode.MOBILE)
.eq("user_type", 0)
.eq("user_id", user_id)
.orderByAsc("bind_time");
List<AccountUserBindConnect> accountUserBindConnectList = accountUserBindConnectMapper.selectList(queryWrapper);
if (!accountUserBindConnectList.isEmpty()){
AccountUserBindConnect accountUserBindConnect= accountUserBindConnectList.get(0);
ShopStoreMember shopStoreMember = new ShopStoreMember();
shopStoreMember.setStoreName(accountUserInfo.getStore_name());
shopStoreMember.setStoreId(store_id);
shopStoreMember.setUserId(user_id);
shopStoreMember.setBind_openid(accountUserBindConnect.getBind_openid());
shopStoreMember.setUserNickname(accountUserBindConnect.getBind_nickname());
shopStoreMember.setUserAccount(accountUserBindConnect.getBind_id());
shopStoreMemberMapper.insert(shopStoreMember);
ShopStoreMemberLevel shopStoreMemberLevel = getShopStoreMemberLevel(store_id, shopStoreMember);
shopStoreMemberLevel.setUserId(user_id);
shopStoreMemberLevelMapper.insert(shopStoreMemberLevel);
}
}
}
}
/**
* 店铺会员初始化信息
* @param storeId
* @param shopStoreMember
* @return
*/
private ShopStoreMemberLevel getShopStoreMemberLevel(Integer storeId, ShopStoreMember shopStoreMember) {
ShopStoreMemberLevel shopStoreMemberLevel=new ShopStoreMemberLevel();
shopStoreMemberLevel.setStoreId(storeId);
shopStoreMemberLevel.setStoreMemberId(shopStoreMember.getStore_member_id());
shopStoreMemberLevel.setUserLevelName("v1");
shopStoreMemberLevel.setUserLevelId(1001);
shopStoreMemberLevel.setMemberLevelId(1001);
shopStoreMemberLevel.setMemberLevelName("v1");
return shopStoreMemberLevel;
}
}

View File

@ -99,7 +99,7 @@ logging:
suisung:
mall:
account:
mapper: debug
mapper: info
sun:
mail: error
baomidou: error

View File

@ -4,6 +4,6 @@
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
bind_id
, bind_type, user_id, bind_time, bind_nickname, bind_icon, bind_gender, bind_vip, bind_level, bind_client_id, bind_country, bind_province, bind_city, bind_county, bind_code, bind_openid, bind_unionid, bind_access_token, bind_expires_in, bind_refresh_token, bind_token_ttl, bind_active, created_at, updated_at
, bind_type, user_id, bind_time, bind_nickname, bind_icon, bind_gender, bind_vip, bind_level, bind_client_id, bind_country, bind_province, bind_city, bind_county, bind_code, bind_openid, bind_unionid, bind_access_token, bind_expires_in, bind_refresh_token, bind_token_ttl, bind_active, invite_code, created_at, updated_at
</sql>
</mapper>

View File

@ -1,13 +1,19 @@
package com.suisung.mall.admin.controller.admin;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.suisung.mall.admin.service.AdminBaseMenuService;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.modules.admin.AdminBaseMenu;
import com.suisung.mall.common.modules.admin.Router;
import com.suisung.mall.common.utils.ContextUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
@ -38,6 +44,18 @@ public class AdminBaseMenuController {
return CommonResult.success(routers);
}
/**
* 获取用户权限目录信息
*
* @param
* @return
*/
@RequestMapping(value = "/treePage", method = RequestMethod.GET)
public IPage<AdminBaseMenu> getRouterList(AdminBaseMenu adminBaseMenu, @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
return adminBaseMenuService.treePage(adminBaseMenu,pageNum,pageSize);
}
/**
* 获取所有菜单配置
*
@ -83,6 +101,22 @@ public class AdminBaseMenuController {
return adminBaseMenuService.updateAdminBaseMenu(adminBaseMenu);
}
/**
* 批量删除
*
* @param menu_ids
* @return
*/
@ApiOperation(value = "权限表 -批量删除", notes = "权限表 -批量删除")
@RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
public CommonResult deleteBatch(String menu_ids) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
boolean flag = adminBaseMenuService.remove(Arrays.asList(menu_ids.split(",")));
return CommonResult.success(flag);
}
}

View File

@ -1,17 +1,16 @@
package com.suisung.mall.admin.controller.admin;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.suisung.mall.admin.service.AdminBaseProtocolService;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.modules.admin.AdminBaseProtocol;
import com.suisung.mall.common.utils.ContextUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
@ -43,15 +42,11 @@ public class AdminBaseProtocolController {
*/
@ApiOperation(value = "基础通信协议表-分页列表查询", notes = "基础通信协议表-分页列表查询")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult list(@RequestParam(name = "queryWrapper", required = false) AdminBaseProtocol adminBaseProtocol,
public CommonResult list(AdminBaseProtocol adminBaseProtocol,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
QueryWrapper<AdminBaseProtocol> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("cmd_id");
IPage<AdminBaseProtocol> pageList = adminBaseProtocolService.lists(queryWrapper, pageNum, pageSize);
return CommonResult.success(pageList);
return CommonResult.success(adminBaseProtocolService.getPageAdminBaseProtocol(adminBaseProtocol, pageNum, pageSize));
}
/**
@ -61,9 +56,13 @@ public class AdminBaseProtocolController {
* @return
*/
@ApiOperation(value = "基础通信协议表-编辑", notes = "基础通信协议表-编辑")
@RequestMapping(value = "/edit", method = RequestMethod.POST)
public CommonResult edit(AdminBaseProtocol adminBaseProtocol) {
boolean flag = adminBaseProtocolService.edit(adminBaseProtocol);
@RequestMapping(value = "/edit", method = RequestMethod.PUT)
public CommonResult edit(@RequestBody AdminBaseProtocol adminBaseProtocol) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
boolean flag = adminBaseProtocolService.editAdminBaseProtocol(adminBaseProtocol);
return CommonResult.success(flag);
}
@ -87,9 +86,13 @@ public class AdminBaseProtocolController {
* @return
*/
@ApiOperation(value = "基础通信协议表-批量删除", notes = "基础通信协议表-批量删除")
@RequestMapping(value = "/deleteBatch", method = RequestMethod.POST)
@RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
public CommonResult deleteBatch(@RequestParam(name = "cmd_ids") String cmd_ids) {
boolean flag = adminBaseProtocolService.removeByIds(Arrays.asList(cmd_ids.split(",")));
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
boolean flag = adminBaseProtocolService.deleteBatchByIds(Arrays.asList(cmd_ids.split(",")));
return CommonResult.success(flag);
}
@ -111,10 +114,25 @@ public class AdminBaseProtocolController {
* @return
*/
@ApiOperation(value = "基础通信协议表-新增", notes = "基础通信协议表-新增")
@RequestMapping(value = "/add", method = RequestMethod.PUT)
public CommonResult add(AdminBaseProtocol adminBaseProtocol) {
boolean flag = adminBaseProtocolService.save(adminBaseProtocol);
@RequestMapping(value = "/add", method = RequestMethod.POST)
public CommonResult add(@RequestBody AdminBaseProtocol adminBaseProtocol) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
boolean flag = adminBaseProtocolService.addAdminBaseProtocol(adminBaseProtocol);
return CommonResult.success(flag);
}
/**
* 根据id查出路由主要是显示平台权限名称和店铺权限名称
* @param cmd_id
* @return
*/
@ApiOperation(value = "基础通信协议表-查找单个协议", notes = "基础通信协议表-查找单个协议")
@RequestMapping(value = "/getOneById", method = RequestMethod.GET)
public CommonResult getOneById(@RequestParam(name = "cmd_id") Integer cmd_id) {
return CommonResult.success(adminBaseProtocolService.getOneByCmId(cmd_id));
}
}

View File

@ -1,11 +1,15 @@
package com.suisung.mall.admin.controller.admin;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.suisung.mall.admin.service.AdminRightsBaseService;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.modules.admin.AdminRightsBase;
import com.suisung.mall.common.modules.admin.ElTree;
import com.suisung.mall.common.utils.ContextUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -40,7 +44,7 @@ public class AdminRightsBaseController {
*/
@ApiOperation(value = "权限表 -分页列表查询", notes = "权限表 -分页列表查询")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public CommonResult list(@RequestParam(name = "queryWrapper", required = false) AdminRightsBase adminRightsBase,
public CommonResult list(AdminRightsBase adminRightsBase,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
@ -51,6 +55,21 @@ public class AdminRightsBaseController {
return CommonResult.success(pageList);
}
/**
* 树形分页列表查询
* @param adminRightsBase
* @param pageNum
* @param pageSize
* @return
*/
@ApiOperation(value = "权限表 -树形分页列表查询", notes = "权限表 -树形分页列表查询")
@RequestMapping(value = "/treeList", method = RequestMethod.GET)
public IPage<AdminRightsBase> treeList(AdminRightsBase adminRightsBase,
@RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
return adminRightsBaseService.treePage(adminRightsBase, pageNum, pageSize);
}
/**
* 获取tree数据
@ -78,8 +97,12 @@ public class AdminRightsBaseController {
* @return
*/
@ApiOperation(value = "权限表 -编辑", notes = "权限表 -编辑")
@RequestMapping(value = "/edit", method = RequestMethod.POST)
public CommonResult edit(AdminRightsBase adminRightsBase) {
@RequestMapping(value = "/edit", method = RequestMethod.PUT)
public CommonResult edit(@RequestBody AdminRightsBase adminRightsBase) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
boolean flag = adminRightsBaseService.edit(adminRightsBase);
return CommonResult.success(flag);
}
@ -94,6 +117,10 @@ public class AdminRightsBaseController {
@ApiOperation(value = "权限表 -通过rights_id删除", notes = "权限表 -通过rights_id删除")
@RequestMapping(value = "/delete", method = RequestMethod.POST)
public CommonResult delete(@RequestParam(name = "rights_id") String rights_id) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
boolean flag = adminRightsBaseService.remove(rights_id);
return CommonResult.success(flag);
}
@ -105,8 +132,12 @@ public class AdminRightsBaseController {
* @return
*/
@ApiOperation(value = "权限表 -批量删除", notes = "权限表 -批量删除")
@RequestMapping(value = "/deleteBatch", method = RequestMethod.POST)
public CommonResult deleteBatch(@RequestParam(name = "rights_ids") String rights_ids) {
@RequestMapping(value = "/deleteBatch", method = RequestMethod.DELETE)
public CommonResult deleteBatch(String rights_ids) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
boolean flag = this.adminRightsBaseService.remove(Arrays.asList(rights_ids.split(",")));
return CommonResult.success(flag);
}
@ -120,6 +151,13 @@ public class AdminRightsBaseController {
@ApiOperation(value = "权限表 -新增", notes = "权限表 -编辑")
@RequestMapping(value = "/add", method = RequestMethod.POST)
public CommonResult add(@RequestBody AdminRightsBase adminRightsBase) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
if(ObjectUtil.isEmpty(adminRightsBase.getRights_parent_id())){
adminRightsBase.setRights_parent_id(0);
}
boolean flag = adminRightsBaseService.save(adminRightsBase);
return CommonResult.success(flag);
}

View File

@ -30,6 +30,7 @@ import com.suisung.mall.common.pojo.dto.OssCallbackResultDTO;
import com.suisung.mall.common.pojo.dto.OssPolicyResultDTO;
import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.LogUtil;
import com.suisung.mall.common.utils.UploadUtil;
import com.suisung.mall.common.utils.VideoUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
@ -169,6 +170,9 @@ public class OssServiceImpl implements OssService {
* @return
*/
public Map upload(MultipartFile file, UserDto user, String dir, String uploadPath, String uploadName, String fileName) {
// 如果是图片先压缩图片再上传到 cos 对象存储
file = UploadUtil.compressImageIfNeeded(file, 2048);
// 创建临时文件
creTempFile(file, dir, uploadName);
String url = null;

View File

@ -1,6 +1,7 @@
package com.suisung.mall.admin.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.modules.admin.AdminBaseMenu;
import com.suisung.mall.common.modules.admin.Router;
@ -32,4 +33,6 @@ public interface AdminBaseMenuService extends IBaseService<AdminBaseMenu> {
CommonResult saveAdminBaseMenu(AdminBaseMenu adminBaseMenu);
CommonResult updateAdminBaseMenu(AdminBaseMenu adminBaseMenu);
IPage<AdminBaseMenu> treePage(AdminBaseMenu adminBaseMenu, Integer pageNum, Integer pageSize);
}

View File

@ -1,6 +1,7 @@
package com.suisung.mall.admin.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.suisung.mall.common.modules.admin.AdminBaseProtocol;
import com.suisung.mall.core.web.service.IBaseService;
@ -21,4 +22,17 @@ public interface AdminBaseProtocolService extends IBaseService<AdminBaseProtocol
* 初始化资源角色规则
*/
Map<String, List<String>> initResourceRolesMap();
/**
* 分页查询路由
*/
IPage<AdminBaseProtocol> getPageAdminBaseProtocol(AdminBaseProtocol adminBaseProtocol,Integer pageNum,Integer pageSize);
boolean addAdminBaseProtocol(AdminBaseProtocol adminBaseProtocol);
boolean editAdminBaseProtocol(AdminBaseProtocol adminBaseProtocol);
boolean deleteBatchByIds(List<String> adminBaseProtocolIds);
AdminBaseProtocol getOneByCmId(Integer cmId);
}

View File

@ -1,6 +1,7 @@
package com.suisung.mall.admin.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.suisung.mall.common.modules.admin.AdminRightsBase;
import com.suisung.mall.common.modules.admin.ElTree;
import com.suisung.mall.core.web.service.IBaseService;
@ -21,4 +22,9 @@ public interface AdminRightsBaseService extends IBaseService<AdminRightsBase> {
* 获取tree数据
*/
List<ElTree> tree();
/**
* 获取tree数据
*/
IPage<AdminRightsBase> treePage(AdminRightsBase adminRightsBase, Integer pageNum, Integer pageSize);
}

View File

@ -94,7 +94,7 @@ public class AdminAppMarketUpdateServiceImpl extends BaseServiceImpl<AdminAppMar
QueryWrapper<AdminAppMarketUpdate> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("market_id", marketId).eq("status", CommonConstant.Enable).orderByDesc("version_key");
AdminAppMarketUpdate adminAppMarketUpdate = findOne(queryWrapper);
AdminAppMarketUpdate adminAppMarketUpdate = getOne(queryWrapper, false);
if (adminAppMarketUpdate == null) {
return CommonResult.success(null, "没有找到最新版本");
}
@ -285,6 +285,6 @@ public class AdminAppMarketUpdateServiceImpl extends BaseServiceImpl<AdminAppMar
queryWrapper.eq("market_id", marketId).eq("status", CommonConstant.Enable)
.eq("package_name", packageName).orderByDesc("version_key");
return findOne(queryWrapper);
return getOne(queryWrapper, false);
}
}

View File

@ -5,6 +5,7 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.suisung.mall.admin.mapper.AdminBaseMenuMapper;
import com.suisung.mall.admin.service.AccountBaseConfigService;
@ -870,6 +871,16 @@ public class AdminBaseMenuServiceImpl extends BaseServiceImpl<AdminBaseMenuMappe
@Override
public CommonResult saveAdminBaseMenu(AdminBaseMenu adminBaseMenu) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("没有权限");
}
if(ObjectUtil.isEmpty(adminBaseMenu.getMenu_parent_id())){
adminBaseMenu.setMenu_parent_id(0);
}
if(ObjectUtil.isEmpty(adminBaseMenu.getMenu_time())){
adminBaseMenu.setMenu_time(new Date());
}
if (!save(adminBaseMenu)) {
return CommonResult.failed("新增失败");
}
@ -878,12 +889,61 @@ public class AdminBaseMenuServiceImpl extends BaseServiceImpl<AdminBaseMenuMappe
@Override
public CommonResult updateAdminBaseMenu(AdminBaseMenu adminBaseMenu) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("没有权限");
}
if(ObjectUtil.isEmpty(adminBaseMenu.getMenu_time())){
adminBaseMenu.setMenu_time(new Date());
}
if (!edit(adminBaseMenu)) {
return CommonResult.failed("更新失败");
}
return CommonResult.success("更新成功");
}
@Override
public IPage<AdminBaseMenu> treePage(AdminBaseMenu adminBaseMenu, Integer pageNum, Integer pageSize) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("没有权限");
}
QueryWrapper<AdminBaseMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("menu_id");
if(adminBaseMenu!=null){
if(StringUtils.isNotEmpty(adminBaseMenu.getMenu_name())){
queryWrapper.like("menu_name", adminBaseMenu.getMenu_name());
}
}
queryWrapper.eq("menu_parent_id",0);
IPage<AdminBaseMenu> pageList = this.lists(queryWrapper, pageNum, pageSize);
List<AdminBaseMenu> adminBaseMenus= pageList.getRecords();
adminBaseMenus=buildAdminBaseMenuTree(adminBaseMenus,0);
pageList.setRecords(adminBaseMenus);
return pageList;
}
/**
* 递归构建tree
*
* @param bases
* @param pid
* @return
*/
public List<AdminBaseMenu> buildAdminBaseMenuTree(List<AdminBaseMenu> bases, Integer pid) {
List<AdminBaseMenu> tree = new ArrayList<>();
bases.forEach(s -> {
if (s.getMenu_parent_id().intValue() == pid.intValue()) {
QueryWrapper<AdminBaseMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("menu_parent_id", s.getMenu_id());
long countAdminRightsBase=this.count(queryWrapper);
if(countAdminRightsBase>0){
s.setChildren(buildAdminBaseMenuTree(this.list(queryWrapper), s.getMenu_id()));
}
tree.add(s);
}
});
return tree;
}
/**
* 校验是否为平台

View File

@ -3,18 +3,30 @@ package com.suisung.mall.admin.service.impl;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.suisung.mall.admin.mapper.AdminBaseProtocolMapper;
import com.suisung.mall.admin.service.AdminBaseMenuService;
import com.suisung.mall.admin.service.AdminBaseProtocolService;
import com.suisung.mall.admin.service.AdminRightsBaseService;
import com.suisung.mall.admin.service.AdminRightsGroupService;
import com.suisung.mall.common.constant.AuthConstant;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.feignService.ShopService;
import com.suisung.mall.common.modules.admin.AdminBaseMenu;
import com.suisung.mall.common.modules.admin.AdminBaseProtocol;
import com.suisung.mall.common.modules.admin.AdminRightsBase;
import com.suisung.mall.common.modules.admin.AdminRightsGroup;
import com.suisung.mall.common.modules.store.ShopStoreEmployeeRightsBase;
import com.suisung.mall.common.utils.ContextUtil;
import com.suisung.mall.core.web.service.RedisService;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.hibernate.validator.internal.util.stereotypes.Lazy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.util.*;
@ -38,6 +50,17 @@ public class AdminBaseProtocolServiceImpl extends BaseServiceImpl<AdminBaseProto
@Autowired
private RedisService redisService;
@Lazy
@Autowired
private AdminRightsBaseService adminRightsBaseService;
@Autowired
private ShopService shopService;
@Lazy
@Autowired
private AdminBaseMenuService adminBaseMenuService;
/**
* 插入数据
*
@ -45,7 +68,15 @@ public class AdminBaseProtocolServiceImpl extends BaseServiceImpl<AdminBaseProto
* @return
*/
@Override
public boolean add(AdminBaseProtocol adminBaseProtocol) {
public boolean addAdminBaseProtocol(AdminBaseProtocol adminBaseProtocol) {
QueryWrapper<AdminBaseProtocol> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("ctl",adminBaseProtocol.getCtl());
queryWrapper.eq("met",adminBaseProtocol.getMet());
queryWrapper.eq("mdu",adminBaseProtocol.getMdu());
List<AdminBaseProtocol> adminBaseProtocolList=this.list(queryWrapper);
if(!adminBaseProtocolList.isEmpty()){
throw new ApiException("已存在相同的路由");
}
boolean flag = save(adminBaseProtocol);
initResourceRolesMap();
return flag;
@ -58,25 +89,83 @@ public class AdminBaseProtocolServiceImpl extends BaseServiceImpl<AdminBaseProto
* @return
*/
@Override
public boolean edit(AdminBaseProtocol adminBaseProtocol) {
public boolean editAdminBaseProtocol(AdminBaseProtocol adminBaseProtocol) {
QueryWrapper<AdminBaseProtocol> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("ctl",adminBaseProtocol.getCtl());
queryWrapper.eq("met",adminBaseProtocol.getMet());
queryWrapper.eq("mdu",adminBaseProtocol.getMdu());
List<AdminBaseProtocol> adminBaseProtocolList=this.list(queryWrapper);
if(!adminBaseProtocolList.isEmpty()){
throw new ApiException("已存在相同的路由");
}
boolean flag = updateById(adminBaseProtocol);
initResourceRolesMap();
return flag;
}
/**
* 根据cmd_id删除
*
* @param cmd_id
* 根据cmd_id批量删除
* @param adminBaseProtocolIds
* @return
*/
@Override
public boolean remove(Serializable cmd_id) {
boolean flag = super.remove(cmd_id);
@Transactional(rollbackFor = Exception.class)
public boolean deleteBatchByIds(List<String> adminBaseProtocolIds) {
boolean flag = removeBatchByIds(adminBaseProtocolIds);
initResourceRolesMap();
return flag;
}
@Override
public AdminBaseProtocol getOneByCmId(Integer cmId) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
QueryWrapper<AdminBaseProtocol> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("cmd_id",cmId);
List<AdminBaseProtocol> adminBaseProtocolList=this.list(queryWrapper);
if(adminBaseProtocolList.isEmpty()){
throw new ApiException("不存在通信协议");
}
AdminBaseProtocol adminBaseProtocol=adminBaseProtocolList.get(0);
String rigthsIds= adminBaseProtocol.getRights_id();
if(StringUtils.isNotBlank(rigthsIds)){
QueryWrapper<AdminBaseMenu> adminBaseMenuQuery = new QueryWrapper<>();
adminBaseMenuQuery.eq("menu_url_path",adminBaseProtocol.getPath());
List<AdminBaseMenu> adminBaseMenuList= adminBaseMenuService.list(adminBaseMenuQuery);
if(adminBaseMenuList.isEmpty()){
throw new ApiException("需要配置菜单");
}
List<String> rightsIdList= Arrays.asList(rigthsIds.split(","));
List<Integer> rightsIdsIntList=new ArrayList<>();
rightsIdList.forEach(s->rightsIdsIntList.add(Integer.parseInt(s)));
QueryWrapper<AdminRightsBase> adminRightsBaseQuery = new QueryWrapper<>();
adminRightsBaseQuery.in("rights_id",rightsIdsIntList);
List<AdminRightsBase> adminRightsBaseList= adminRightsBaseService.list(adminRightsBaseQuery);
AdminBaseMenu adminBaseMenu=adminBaseMenuList.get(0);
if(!adminRightsBaseList.isEmpty()){
adminRightsBaseList= adminRightsBaseList.stream().filter(s->s.getRights_name().equals(adminBaseMenu.getMenu_name())).collect(Collectors.toList());
Map<Integer,String> adminRightBaseMap=adminRightsBaseList.stream().collect(
Collectors.toMap(AdminRightsBase::getRights_id,
AdminRightsBase::getRights_name));
adminBaseProtocol.setAdminRightBaseMap(adminRightBaseMap);
}
QueryWrapper<ShopStoreEmployeeRightsBase> shopStoreEmployeeRightsBasesQuery = new QueryWrapper<>();
shopStoreEmployeeRightsBasesQuery.in("rights_id",rightsIdsIntList);
List<ShopStoreEmployeeRightsBase> shopStoreEmployeeRightsBases= shopService.queryByRightsIds(rigthsIds);
if(!shopStoreEmployeeRightsBases.isEmpty()){
shopStoreEmployeeRightsBases= shopStoreEmployeeRightsBases.stream().filter(s->s.getRights_name().equals(adminBaseMenu.getMenu_name())).collect(Collectors.toList());
Map<Integer,String> shopStoreEmployeeRightsBaseMap=shopStoreEmployeeRightsBases.stream().collect(
Collectors.toMap(ShopStoreEmployeeRightsBase::getRights_id,
ShopStoreEmployeeRightsBase::getRights_name));
adminBaseProtocol.setShopStoreEmployeeRightsBaseMap(shopStoreEmployeeRightsBaseMap);
}
}
return adminBaseProtocol;
}
@Override
public Map<String, List<String>> initResourceRolesMap() {
// 资源-分组信息
@ -108,6 +197,28 @@ public class AdminBaseProtocolServiceImpl extends BaseServiceImpl<AdminBaseProto
}
@Override
public IPage<AdminBaseProtocol> getPageAdminBaseProtocol(AdminBaseProtocol adminBaseProtocol, Integer pageNum, Integer pageSize) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("权限不足");
}
QueryWrapper<AdminBaseProtocol> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("cmd_id");
if(adminBaseProtocol!=null){
if(StringUtils.isNotBlank(adminBaseProtocol.getComment())){
queryWrapper.like("comment", adminBaseProtocol.getComment());
}
if(StringUtils.isNotBlank(adminBaseProtocol.getCtl())){
queryWrapper.like("ctl", adminBaseProtocol.getCtl());
}
}
return this.lists(queryWrapper, pageNum, pageSize);
}
/**
* 对比两个数组是否有相同元素
*

View File

@ -2,11 +2,16 @@ package com.suisung.mall.admin.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.suisung.mall.admin.mapper.AdminRightsBaseMapper;
import com.suisung.mall.admin.service.AccountBaseConfigService;
import com.suisung.mall.admin.service.AdminRightsBaseService;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.modules.admin.AdminRightsBase;
import com.suisung.mall.common.modules.admin.ElTree;
import com.suisung.mall.common.utils.ContextUtil;
import com.suisung.mall.common.utils.StringUtils;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -48,6 +53,59 @@ public class AdminRightsBaseServiceImpl extends BaseServiceImpl<AdminRightsBaseM
return BuildTree(list, 0);
}
@Override
public IPage<AdminRightsBase> treePage(AdminRightsBase adminRightsBase, Integer pageNum, Integer pageSize) {
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto.getRole_id()!=9){
throw new ApiException("没有权限");
}
QueryWrapper<AdminRightsBase> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("rights_id");
if(adminRightsBase!=null){
if(StringUtils.isNotEmpty(adminRightsBase.getRights_name())){
queryWrapper.like("rights_name", adminRightsBase.getRights_name());
}
}
queryWrapper.eq("rights_parent_id",0);
IPage<AdminRightsBase> pageList = this.lists(queryWrapper, pageNum, pageSize);
List<AdminRightsBase> adminRightsBases= pageList.getRecords();
adminRightsBases=buildAdminRightBaseTree(adminRightsBases,0);
pageList.setRecords(adminRightsBases);
return pageList;
}
/**
* 递归构建tree
*
* @param bases
* @param pid
* @return
*/
public List<AdminRightsBase> buildAdminRightBaseTree(List<AdminRightsBase> bases, Integer pid) {
List<AdminRightsBase> tree = new ArrayList<>();
bases.forEach(s -> {
if (s.getRights_parent_id().intValue() == pid.intValue()) {
AdminRightsBase adminRightsBase=new AdminRightsBase();
adminRightsBase.setRights_id(s.getRights_id());
adminRightsBase.setRights_name(s.getRights_name());
adminRightsBase.setRights_parent_id(s.getRights_parent_id());
adminRightsBase.setRights_order(s.getRights_order());
adminRightsBase.setRights_remark(s.getRights_remark());
adminRightsBase.setMenu_func(s.getMenu_func());
// adminRightsBase.setChildren(buildAdminRightBaseTree(bases, s.getRights_id()));
QueryWrapper<AdminRightsBase> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("rights_parent_id", s.getRights_id());
long countAdminRightsBase=this.count(queryWrapper);
if(countAdminRightsBase>0){
adminRightsBase.setChildren(buildAdminRightBaseTree(this.list(queryWrapper), s.getRights_id()));
}
tree.add(adminRightsBase);
}
});
return tree;
}
/**
* 递归构建tree
*

View File

@ -10,8 +10,8 @@ import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.exception.ApiUserException;
import com.suisung.mall.common.modules.cms.CmsArticleComment;
import com.suisung.mall.common.modules.cms.CmsArticleCommentHelpful;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -48,13 +48,13 @@ public class CmsArticleCommentHelpfulServiceImpl extends BaseServiceImpl<CmsArti
queryWrapper.eq("user_id", user.getId());
queryWrapper.eq("article_id", cmsArticleCommentHelpful.getArticle_id());
CmsArticleCommentHelpful dbArticleCommentHelpful = findOne(queryWrapper);
CmsArticleCommentHelpful dbArticleCommentHelpful = getOne(queryWrapper, false);
QueryWrapper<CmsArticleComment> commentQueryWrapper = new QueryWrapper<>();
commentQueryWrapper.eq("comment_id", cmsArticleCommentHelpful.getComment_id());
commentQueryWrapper.eq("article_id", cmsArticleCommentHelpful.getArticle_id());
commentQueryWrapper.eq("user_id", user.getId());
CmsArticleComment dbArticleComment = cmsArticleCommentService.findOne(commentQueryWrapper);
CmsArticleComment dbArticleComment = cmsArticleCommentService.getOne(commentQueryWrapper, false);
if (null == dbArticleCommentHelpful) {
cmsArticleCommentHelpful.setUser_id(user.getId());

View File

@ -0,0 +1,39 @@
package com.suisung.mall.common.annotation;
import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;
/**
* 分布式锁注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DistributedLock {
/**
* 锁的key支持SpEL表达式,下面是示例
* key = "'ACCOUNT_LOCK:' + #batchSize", // 使用SpEL表达式锁key包含参数
* public List<Integer> getBatchUserAccountBaseId(int batchSize)
*/
String key();
/**
* 等待时间默认0-不等待
*/
long waitTime() default 0;
/**
* 锁持有时间默认30秒-1表示使用看门狗机制
*/
long leaseTime() default 30;
/**
* 时间单位默认秒
*/
TimeUnit timeUnit() default TimeUnit.SECONDS;
/**
* 获取锁失败时的错误消息
*/
String errorMsg() default "系统繁忙,请稍后再试";
}

View File

@ -15,8 +15,8 @@ public class StateCode {
public static final int DELIVERY_TYPE_AIR_FREIGHT = 4; //货运空运水运铁路运输公路运输
public static final int DELIVERY_TYPE_SELF_PICK_UP = 5; // 自提运费 0
public static final int DELIVERY_TYPE_EXP = 10; // 普通快递
public static final int DELIVERY_TYPE_IN_STORE_SERVICE = 15; // 店铺配送
public static final int DELIVERY_TYPE_SAME_CITY = 16;//顺丰同城配送
public static final int DELIVERY_TYPE_IN_STORE_SERVICE = 15; // 店铺配送运费 0
public static final int DELIVERY_TYPE_SAME_CITY = 16;//同城配送
public static final Map<Integer, String> DELIVERY_TYPE_MAP = new HashMap() {
{
@ -27,7 +27,7 @@ public class StateCode {
put(DELIVERY_TYPE_SELF_PICK_UP, "到店自提");
put(DELIVERY_TYPE_EXP, "普通快递");
put(DELIVERY_TYPE_IN_STORE_SERVICE, "店铺配送");
put(DELIVERY_TYPE_SAME_CITY, "顺丰同城");
put(DELIVERY_TYPE_SAME_CITY, "顺丰同城配送");
}
};
@ -450,6 +450,11 @@ public class StateCode {
public static final int SF_ORDER_STATUS_EXCEPTION = 91;
public static final int SF_ORDER_STATUS_CANCELING = 31;
// 退款状态:0-是无退款;1-是部分退款;2-是全部退款
public static final int ORDER_REFUND_STATUS_NO = 0;
public static final int ORDER_REFUND_STATUS_PART = 1;
public static final int ORDER_REFUND_STATUS_ALL = 2;
static {
DELIVERY_TIME_NOT_TIMER.put(1, I18nUtil._("不限时段"));
DELIVERY_TIME_NOT_TIMER.put(15, I18nUtil._("上午"));

View File

@ -30,6 +30,11 @@ public class AuthConstant {
*/
public static final String MCH_CLIENT_ID = "mch-app";
/**
* 商家版移动端client_id
*/
public static final String AGENT_CLIENT_ID = "agent-app";
/**
* 微信client_ID
*/

View File

@ -20,11 +20,12 @@ public class CommonConstant {
public static final Integer Delivery_Amount_Comput_Type_Payment = 3;
/**
* 用户类型0-普通用户1-管理员2-入驻商户
* 用户类型:0-普通买家; 1-管理员2-入驻商家3-代理商
*/
public static final Integer USER_TYPE_NORMAL = 0;
public static final Integer USER_TYPE_ADMIN = 1;
public static final Integer USER_TYPE_MCH = 2;
public static final Integer USER_TYPE_AGENT = 3;
// 国际电话区号
public static final String IDD_ZH_CN = "+86"; //中国
@ -110,6 +111,12 @@ public class CommonConstant {
//秒杀活动订阅消息模板id
public static final String BIND_SUB_TMPL_SKILL = "kiDj_hSF_ASwD-Dlgxnypi6IJBQZ12a-hEpd3zZ-Uxc";
//平台首页
public static final String INDEX_PLAFT_PAGE = "pages/index/index";
//店铺首页
public static final String INDEX_STORE_PAGE = "pagesub/index/store";
//分账计算方式1-按总金额2-按可分账金额
public static final int SeparateCalcMode_TotalAmt = 1;
public static final int SeparateCalcMode_CanSeparateAmt = 2;
@ -121,4 +128,32 @@ public class CommonConstant {
public static final Integer Agent_Level_2nd = 2;
// 订单配送预约状态1-立即配送2-预约配送
public static final Integer Order_Booking_State_LJ = 1;
public static final Integer Order_Booking_State_YY = 2;
// 预约下单从当前时间延迟的最小分钟数单位分钟不能低于35分钟
public final static Integer MIN_DELAY_MINUTES_FOR_BOOKING_ORDER = 50;
// 店铺营业状态1-开业营业中且在营业时间内12-开业打烊中但在营业时间外2-停业中3-开业或活动筹备中
// 1-开业营业中且在营业时间内
public final static Integer Store_Biz_State_Opening = 1;
// 12-开业打烊中但在营业时间外
public final static Integer Store_Biz_State_Opening2 = 12;
//2-停业中
public final static Integer Store_Biz_State_Closed = 2;
//3-开业(活动)筹备中
public final static Integer Store_Biz_State_PreActivity = 3;
//用户砍价订单状态1-砍价已完成下单
public static final Integer CutPrice_Order_State_Finished = 1;
//2-砍价未下单已取消
public static final Integer CutPrice_Order_State_Canceled = 2;
//3-砍价助力进行中
public static final Integer CutPrice_Order_State_ING = 3;
//4-砍价过期失效
public static final Integer CutPrice_Order_State_Expired = 4;
//6-砍价助力已完成待下单
public static final Integer CutPrice_Order_State_CutFinished = 6;
}

View File

@ -14,6 +14,7 @@ public class MqConstant {
public static final Integer FAILURE = 2; // 消息消费失败更改状态
public static final Integer DELIVERED = 3; // 消息重试消费成功更改状态
public static final Integer MAX_COUNT = 3; // 消息重新投递最大重试次数
public static final String SHOP_EXCHANGE = "shop-event-exchange"; // SHOP服务交换机
public static final String ACCOUNT_EXCHANGE = "account-event-exchange"; // ACCOUNT服务交换机
public static final String PAY_EXCHANGE = "pay-event-exchange"; // PAY服务交换机

View File

@ -41,4 +41,16 @@ public class RedisConstant {
// 您有新的订单来了
public static final String New_Order_Push_Flag_Key = ConstantRedis.Cache_NameSpace + "new:order:comimg:";
// 预约订单任务新增键
public static final String Order_Booking_Task_Key = ConstantRedis.Cache_NameSpace + "new:order:booking:task:";
public static final String VERIFY_CODE_KEY = "register:verifyCode:";
// 拉卡拉合同是否强制签署
public static final String LKL_EC_REPEAT_SIGN = "lkl:ec:repeat:sign:";
// 微信同意记录
public static final String SUB_SEND_CACHE = "sub:send:cache";
}

View File

@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.suisung.mall.common.constant.AuthConstant;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.utils.CheckUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
@ -23,7 +24,7 @@ public class UserDto implements Serializable {
private String user_password;
private String user_nickname;
private Integer user_state;
private String client_id; // 客户端 后台管理-admin-app移动端-mobile-app入驻商家移动端-mch-app
private String client_id; // 客户端 后台管理-admin-app移动端-mobile-app入驻商家移动端-mch-app代理商端-agent-app
private String user_salt;
private List<String> roles;
// 服务端返回rid 角色编号: 0-用户;2-商家;3-门店;9-平台;
@ -31,6 +32,8 @@ public class UserDto implements Serializable {
private Integer site_id = 0; //分站编号
private String store_id;
private String chain_id;
private Integer user_is_admin;//用户类型对应user_base is_admin0-普通用户1-管理员2-入驻商家3-代理商
private String invite_code; // 代理商邀请码
/**
* 用户角色是平台
@ -91,18 +94,41 @@ public class UserDto implements Serializable {
}
/**
* 获取用户类型对应user_base is_admin0-普通用户1-管理员2-入驻商家
* 代理商端
*
* @return
*/
public boolean isAgent() {
return ObjectUtil.equal(client_id, AuthConstant.AGENT_CLIENT_ID);
}
/**
* 获取用户类型对应user_base user_is_admin0-普通用户1-管理员2-入驻商家3-代理商
*
* @return
*/
// public Integer getUserType() {
// Integer user_type = CommonConstant.USER_TYPE_NORMAL; // 用户类型对应user_base user_is_admin0-普通用户1-管理员2-入驻商家3-代理商
// if (isAdmin()) {
// user_type = CommonConstant.USER_TYPE_ADMIN;
// } else if (isMerchant()) {
// user_type = CommonConstant.USER_TYPE_MCH;
// } else if (isAgent()) {
// user_type = CommonConstant.USER_TYPE_AGENT;
// } else {
// user_type = CommonConstant.USER_TYPE_NORMAL;
// }
//
// return user_type;
// }
/**
* 获取用户类型对应user_base user_is_admin0-普通用户1-管理员2-入驻商家3-代理商
*
* @return
*/
public Integer getUserType() {
Integer user_type = CommonConstant.USER_TYPE_NORMAL; // 用户类型对应user_base is_admin0-普通用户1-管理员2-入驻商家
if (isAdmin()) {
user_type = CommonConstant.USER_TYPE_ADMIN;
} else if (isMerchant()) {
user_type = CommonConstant.USER_TYPE_MCH;
}
return user_type;
// 用户类型对应user_base is_admin0-普通用户1-管理员2-入驻商家
return CheckUtil.isNotEmpty(this.user_is_admin) ? this.user_is_admin : CommonConstant.USER_TYPE_NORMAL;
}
}

View File

@ -7,6 +7,7 @@ import com.suisung.mall.common.pojo.output.TimelineOutput;
import com.suisung.mall.common.pojo.res.ThirdApiRes;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.data.util.Pair;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
@ -278,6 +279,15 @@ public interface AccountService {
@PostMapping(value = "/admin/account/accountController/saveBatchAccountInfo")
ThirdApiRes saveBatchAccountInfo(@RequestBody List<AccountUserInfo> accountUserInfoList);
/**
* 批量保存accountUserLogin
*
* @return
*/
@PostMapping(value = "/admin/account/accountController/saveBatchAccountUserLogin")
ThirdApiRes saveBatchAccountUserLogin(@RequestBody List<AccountUserLogin> accountUserLoginList);
/**
* 批量保存accountInfo
*
@ -303,4 +313,37 @@ public interface AccountService {
@GetMapping(value = "/admin/account/accountController/getAllBindCount")
long getAllBindCount(@RequestParam(name = "bindTmpl") String bindTmpl);
/**
* 批量更新保存accountUserBindConnect
*
* @return
*/
@PostMapping(value = "/admin/account/accountController/updateBatchAccountUserBindConnect")
ThirdApiRes updateBatchAccountUserBindConnect(@RequestBody List<AccountUserBindConnect> accountUserBindConnectList);
/**
* 检查手机注册的商家是否存在(仅供内部调用)
*
* @param mobile
* @return
*/
@RequestMapping(value = "/admin/account/account-user-bind-connect/is-merchant-exists", method = RequestMethod.POST)
Integer isMerchantExists(@RequestParam(name = "mobile") String mobile);
/**
* 服务间注册商家账号项目之间远程调用
*/
@RequestMapping(value = "/admin/account/account-user-base/merchant/inner-register", method = RequestMethod.POST)
Pair<Boolean, String> merchantInnerRegister(@RequestParam("mobile") String mobile, @RequestParam("regPwd") String regPwd);
/**
* 服务间注册商家账号项目之间远程调用
*/
@RequestMapping(value = "/admin/account/account-user-base/merchant/inner-register", method = RequestMethod.POST)
Pair<Boolean, String> changeMerchantLoginMobile(@RequestParam("oldMobile") String oldMobile, @RequestParam("newMobile") String newMobile, @RequestParam("password") String password);
}

View File

@ -18,10 +18,7 @@ import com.suisung.mall.common.modules.pay.dto.ItemActivityInfoDTO;
import com.suisung.mall.common.modules.plantform.ShopPlantformSubsiteUser;
import com.suisung.mall.common.modules.product.ShopProductBase;
import com.suisung.mall.common.modules.product.ShopProductIndex;
import com.suisung.mall.common.modules.store.ShopStoreBase;
import com.suisung.mall.common.modules.store.ShopStoreEmployee;
import com.suisung.mall.common.modules.store.ShopStoreEmployeeKefu;
import com.suisung.mall.common.modules.store.ShopStoreEmployeeRightsGroup;
import com.suisung.mall.common.modules.store.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
@ -35,7 +32,7 @@ import java.util.Map;
/**
* 认证服务远程调用
*/
@FeignClient("mall-shop")
@FeignClient(value = "mall-shop")
public interface ShopService {
@PostMapping(value = "/admin/shop/shopController/deletePlantformUserByUid")
@ -326,5 +323,31 @@ public interface ShopService {
BigDecimal getOrderShippingFee(@RequestParam(name = "order_id") String order_id);
/**
* 获取店铺的内部运费 shopping_fee_inner 远程调用用途
*
* @param order_id
* @return
*/
@ApiOperation(value = "获取店铺的内部运费 shopping_fee_inner", notes = "获取店铺的内部运费 shopping_fee_inner (远程调用用途)")
@RequestMapping(value = "/admin/shop/shop-store-info/shopping-fee-inner", method = RequestMethod.POST)
Integer storeShoppingFeeInner(@RequestParam(name = "order_id") String order_id);
@GetMapping(value = "/admin/shop/shop-store-employee-rights-base/queryByRightsIds")
List<ShopStoreEmployeeRightsBase> queryByRightsIds(@RequestParam(name = "rights_ids") String rights_ids);
@PostMapping(value = "/admin/shop/shop-store-member/saveShopStoreMember")
ShopStoreMember saveShopStoreMember(@RequestBody ShopStoreMember shopStoreMember);
@PostMapping(value = "/admin/shop/shop-store-member/findShopStoreMemberList")
List<ShopStoreMember> findShopStoreMemberList(@RequestBody ShopStoreMember shopStoreMember);
@PostMapping(value = "/admin/shop/shop-store-member-lever/saveShopStoreMemberLevel")
CommonResult saveShopStoreMemberLevel(@RequestBody ShopStoreMemberLevel shopStoreMemberLevel);
@PostMapping(value = "/admin/shop/shop-store-member-lever/findShopStoreMemberLevelList")
List<ShopStoreMemberLevel> findShopStoreMemberLevelList(@RequestBody ShopStoreMemberLevel shopStoreMemberLevel);
}

View File

@ -53,7 +53,7 @@ public class AccountBaseUserLevel implements Serializable {
private Integer user_level_fans_team;
@ApiModelProperty(value = "累计消费")
private Integer user_level_spend;
private BigDecimal user_level_spend;
@ApiModelProperty(value = "升级产品SPU编号(DOT)")
private String user_level_product_id;

View File

@ -108,4 +108,10 @@ public class AccountUserBindConnect implements Serializable {
@ApiModelProperty(value = "允许通知的消息通知模板id")
private String bind_tmpl;
@ApiModelProperty(value = "剩余订阅次数")
private Integer send_number;
@ApiModelProperty(value = "(商家的)代理商的邀请码")
private String invite_code;
}

View File

@ -1,6 +1,7 @@
package com.suisung.mall.common.modules.account;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.suisung.mall.common.annotation.OssMedia;
@ -119,5 +120,14 @@ public class AccountUserInfo implements Serializable {
@ApiModelProperty(value = "渠道编码")
private Integer ucc_id;
/**
* 同步会员到店铺会员与消息队列UserLevelTO关联
*/
@ApiModelProperty(value = "店铺id")
@TableField(exist = false)
private Integer store_id;
@ApiModelProperty(value = "店铺名称")
@TableField(exist = false)
private String store_name;
}

View File

@ -56,8 +56,20 @@ public class ShopActivityCutprice implements Serializable {
@ApiModelProperty(value = "砍价人数")
private Integer ac_num;
@ApiModelProperty(value = "砍价过期时间戳")
private Long expired_at;
@ApiModelProperty(value = "用户砍价订单状态1-砍价已完成下单2-砍价未下单已取消3-砍价助力进行中4-砍价过期失效6-砍价助力已完成待下单;")
private Integer state;
@Version
@ApiModelProperty(value = "乐观锁")
private Integer version;
@ApiModelProperty(value = "更新时间")
private Date updated_at;
@ApiModelProperty(value = "大转盘次数")
private Integer lottery_num;
}

View File

@ -1,8 +1,6 @@
package com.suisung.mall.common.modules.activity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -52,5 +50,14 @@ public class ShopActivityCutpriceHistory implements Serializable {
@ApiModelProperty(value = "砍价编号")
private Integer ac_id;
@ApiModelProperty(value = "摇骰子次数")
private Integer lottery_num;
@ApiModelProperty(value = "骰子点数")
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private Integer alh_point;
@ApiModelProperty(value = "转盘前砍掉的价格")
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private BigDecimal ach_price_pre;
}

View File

@ -1,6 +1,7 @@
package com.suisung.mall.common.modules.admin;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@ -11,6 +12,7 @@ import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* <p>
@ -105,5 +107,7 @@ public class AdminBaseMenu implements Serializable {
@ApiModelProperty(value = "允许关闭(BOOL):0-禁止;1-允许")
private Integer menu_close;
@TableField(exist = false)
@ApiModelProperty(value = "节点子集")
private List<AdminBaseMenu> children;
}

View File

@ -1,6 +1,7 @@
package com.suisung.mall.common.modules.admin;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@ -10,6 +11,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Map;
/**
* <p>
@ -61,5 +63,11 @@ public class AdminBaseProtocol implements Serializable {
@ApiModelProperty(value = "请求地址")
private String path;
//平台权限id和名称
@TableField(exist = false)
private Map<Integer,String> adminRightBaseMap;
//店铺权限id和名称
@TableField(exist = false)
private Map<Integer,String> shopStoreEmployeeRightsBaseMap;
}

View File

@ -1,6 +1,7 @@
package com.suisung.mall.common.modules.admin;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@ -10,6 +11,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* <p>
@ -47,5 +49,7 @@ public class AdminRightsBase implements Serializable {
@ApiModelProperty(value = "功能开启:跟设置config_key")
private String menu_func;
@ApiModelProperty(value = "节点子集")
@TableField(exist = false)
private List<AdminRightsBase> children;
}

View File

@ -9,6 +9,7 @@
package com.suisung.mall.common.modules.esign;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@ -54,12 +55,18 @@ public class EsignPlatformInfo implements Serializable {
@ApiModelProperty(value = "平台方营业执照上的经营内容")
private String license_content;
@ApiModelProperty(value = "代理商的省/市/区,如:广东省/深圳市/福田区")
@ApiModelProperty(value = "代理商执照的省/市/区,如:广东省/深圳市/福田区")
private String license_area;
@ApiModelProperty(value = "代理商的省id/市id/区id11000/11100/11101")
@ApiModelProperty(value = "代理商营业执照的省id/市id/区id11000/11100/11101")
private String license_district_id;
@ApiModelProperty(value = "期望代理的省/市/区,如:广东省/深圳市/福田区")
private String agent_area;
@ApiModelProperty(value = "期望代理的省id/市id/区id11000/11100/11101")
private String agent_district_id;
@ApiModelProperty(value = "平台方营业执照公司详细地址")
private String license_address;
@ -114,6 +121,10 @@ public class EsignPlatformInfo implements Serializable {
@ApiModelProperty(value = "邀请码,后期跟收益有关")
private String invite_code;
@TableField(exist = false)
@ApiModelProperty(value = "代理商邀请链接")
private String invite_url;
@ApiModelProperty(value = "县级市代理商设定的配送费(单位:分)")
private Integer shipping_fee;
@ -123,9 +134,12 @@ public class EsignPlatformInfo implements Serializable {
@ApiModelProperty(value = "分账比例值,取值范围:[0.01,1.00]")
private BigDecimal split_ratio;
@ApiModelProperty(value = "记录状态:1-有效2-无效")
@ApiModelProperty(value = "状态:0-未申请过1-已审核通过2-审核未通过3-待审中")
private Integer status;
@ApiModelProperty(value = "审核代理商备注")
private String remark;
@ApiModelProperty(value = "创建人用户ID")
private String created_by;

View File

@ -155,6 +155,9 @@ public class LklOrderDraw {
@ApiModelProperty(value = "异步通知地址", example = "https://api.example.com/notify")
private String notify_url;
@ApiModelProperty(value = "接口请求报文")
private String lkl_req;
/**
* 异步通知返回的JSON数据
*/

View File

@ -94,6 +94,9 @@ public class LklOrderSeparate {
@ApiModelProperty(value = "处理状态ACCEPTED-已受理, PROCESSING-处理中, FAIL-失败, SUCCESS-成功")
private String final_status;
@ApiModelProperty(value = "接口请求报文")
private String lkl_req;
@ApiModelProperty(value = "异步通知数据")
private String notify_resp;

View File

@ -0,0 +1,42 @@
package com.suisung.mall.common.modules.lakala;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 拉卡拉确认收货通知数据日志
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("lkl_receive_notify_log")
@ApiModel(value = "拉卡拉确认收货通知数据日志", description = "拉卡拉确认收货通知数据日志")
public class LklReceiveNotifyLog {
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "自增 Id", example = "1")
private Long id;
@ApiModelProperty(value = "订单Id")
private String orderId = "";
@ApiModelProperty(value = "通知 JSON 响应数据")
private String respJson;
@ApiModelProperty(value = "使用状态1-被使用过2-未被使用;")
private Integer status = 2;
@ApiModelProperty(value = "创建时间")
private Date createdAt;
@ApiModelProperty(value = "更新时间")
private Date updatedAt;
}

View File

@ -11,6 +11,7 @@ import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
@Builder
@ -20,7 +21,7 @@ import java.util.Date;
@ApiModel(value = "商品库的商品", description = "商品库的商品表")
public class LibraryProduct implements Serializable {
@TableId(value = "id", type = IdType.INPUT)
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "商品ID", example = "1001")
private Long id;
@ -28,7 +29,11 @@ public class LibraryProduct implements Serializable {
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String name;
@ApiModelProperty(value = "商品简称,作为匹配关键字", example = "小米12 Pro")
private String sname;
@ApiModelProperty(value = "商品标题", example = "小米12 Pro")
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String title;
@ApiModelProperty(value = "条形码/Barcode", example = "6923450657713")
@ -36,9 +41,11 @@ public class LibraryProduct implements Serializable {
private String barcode;
@ApiModelProperty(value = "第一级分类", example = "生鲜")
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String category_1st;
@ApiModelProperty(value = "第二级分类", example = "牛肉")
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String category_2nd;
@ApiModelProperty(value = "商品分类", example = "牛肉")
@ -62,7 +69,6 @@ public class LibraryProduct implements Serializable {
@ApiModelProperty(value = "商品卖点", example = "绿色有机")
private String selling_point;
@ApiModelProperty(value = "商品介绍", example = "商品介绍")
private String intro;
@ -92,4 +98,11 @@ public class LibraryProduct implements Serializable {
@ApiModelProperty(value = "更新时间", example = "2023-01-02 15:30:00")
@TableField(value = "updated_at")
private Date updatedAt;
// @ApiModelProperty(value = "来源ID", example = "vendor_001")
// @TableField(value = "product_short_name", updateStrategy = FieldStrategy.NOT_EMPTY)
// private String productShortName;
@TableField(exist = false)
private List<LibraryProductImage> product_image_list;
}

View File

@ -9,6 +9,7 @@
package com.suisung.mall.common.modules.library;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@ -34,13 +35,16 @@ public class LibraryProductImage implements Serializable {
private Long id;
@ApiModelProperty(value = "商品ID", position = 2, example = "1001")
@TableField(value = "product_id")
private Long productId;
@ApiModelProperty(value = "图片地址", position = 3,
example = "/media/images/product/1001.jpg")
@TableField(value = "image_url")
private String imageUrl;
@ApiModelProperty(value = "是否主图 1-主图 0-副图", position = 4, example = "1")
@TableField(value = "is_main")
private Boolean isMain;
@ApiModelProperty(value = "排序值,越小越前面", position = 5, example = "10")
@ -50,8 +54,10 @@ public class LibraryProductImage implements Serializable {
private Integer status;
@ApiModelProperty(value = "创建时间", position = 7, example = "2023-01-01 12:30:00")
@TableField(value = "created_at")
private Date createdAt;
@ApiModelProperty(value = "更新时间", position = 8, example = "2023-01-01 13:15:00")
@TableField(value = "updated_at")
private Date updatedAt;
}

View File

@ -67,6 +67,9 @@ public class ShopOrderBase implements Serializable {
@ApiModelProperty(value = "订单状态(LIST):2011-待订单审核;2013-待财务审核;2020-待配货/待出库审核;2030-待发货;2040-已发货/待收货确认;2060-已完成/已签收;2070-已取消/已作废;")
private Integer order_state_id;
@ApiModelProperty(value = "异常订单操作流程,0-可操作自行发货1-可操作订单完成2-订单完成不可操作")
private String operate_flag;
// @ApiModelProperty(value = "easy支付id存储")
// private String easy_pay_id;

View File

@ -0,0 +1,53 @@
package com.suisung.mall.common.modules.order;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 预约订单任务表
* </p>
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("shop_order_booking")
@ApiModel(value = "ShopOrderBooking对象", description = "预约订单任务表")
public class ShopOrderBooking implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "自增Id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "订单Id")
private String order_id;
@ApiModelProperty(value = "Redis 任务键")
private String task_key;
@ApiModelProperty(value = "执行时间戳(秒)")
private Long run_at;
@ApiModelProperty(value = "预约送达时间戳(秒)")
private Long booking_at;
@ApiModelProperty(value = "状态1-有效任务待执行2-无效(任务已执行);")
private Integer status = 1;
@ApiModelProperty(value = "创建时间")
private Date created_at;
@ApiModelProperty(value = "更改时间")
private Date updated_at;
}

View File

@ -75,7 +75,7 @@ public class ShopOrderInfo implements Serializable {
@ApiModelProperty(value = "下单时间:检索使用")
private Long order_time;
@ApiModelProperty(value = "当前状态的处理时间")
@ApiModelProperty(value = "当前状态的处理时间,一般是确认收货时间")
private Long order_deal_time;
@ApiModelProperty(value = "买家删除(BOOL): 1-是; 0-否")
@ -204,6 +204,18 @@ public class ShopOrderInfo implements Serializable {
@ApiModelProperty(value = "拣货完成时间戳")
private Long order_picked_time;
@ApiModelProperty(value = "订单配送预约状态1-立即配送2-预约配送")
private Integer booking_state;
@ApiModelProperty(value = "预约送达起始时间格式如yyyy-MM-dd HH:mm:ss")
private Date booking_begin_time;
@ApiModelProperty(value = "预约送达截止时间格式如yyyy-MM-dd HH:mm:ss")
private Date booking_end_time;
@ApiModelProperty(value = "预订单到达时间戳(秒)")
private Long booking_at;
@ApiModelProperty(value = "新建时间")
private Date created_at;

View File

@ -49,6 +49,9 @@ public class ShopOrderItem implements Serializable {
@ApiModelProperty(value = "货品编号")
private Long item_id;
@ApiModelProperty(value = "产品条形码(唯一码)")
private String item_barcode;
@ApiModelProperty(value = "商品名称")
private String item_name;

View File

@ -43,6 +43,9 @@ public class MchOrderInfoDTO implements Serializable {
@ApiModelProperty(value = "物流轨迹信息")
Map<String, Object> logistics_traces;
// 退款订单详情
MchReturnOrderDetailDTO return_order_detail;
// 订单信息
@ApiModelProperty(value = "订单编号")
private String order_id;
@ -93,4 +96,14 @@ public class MchOrderInfoDTO implements Serializable {
private Integer distance;
@ApiModelProperty(value = "是否禁止退款1-是2-否;")
private Integer is_deny_return;
@ApiModelProperty(value = "异常订单操作流程,0-可操作自行发货1-可操作订单完成2-订单完成不可操作")
private String operate_flag;
@ApiModelProperty(value = "订单配送预约状态1-立即配送2-预约配送")
private Integer booking_state;
@ApiModelProperty(value = "预约送达起始时间格式如yyyy-MM-dd HH:mm:ss")
private Date booking_begin_time;
@ApiModelProperty(value = "预约送达截止时间格式如yyyy-MM-dd HH:mm:ss")
private Date booking_end_time;
@ApiModelProperty(value = "预订单到达时间戳(秒)")
private Long booking_at;
}

View File

@ -0,0 +1,193 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.common.modules.order.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "退款单详情主表实体类 对象", description = "商家版退款单详情主表实体类")
public class MchReturnOrderDetailDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "退货单编号")
private String return_id;
@ApiModelProperty(value = "订单编号")
private String order_id;
@ApiModelProperty(value = "买家用户ID")
private Integer buyer_user_id;
@ApiModelProperty(value = "买家店铺ID")
private Integer buyer_store_id;
@ApiModelProperty(value = "退货原因ID")
private Integer return_reason_id;
@ApiModelProperty(value = "退货原因名称")
private String return_reason_name;
@ApiModelProperty(value = "买家退货留言")
private String return_buyer_message;
@ApiModelProperty(value = "店铺ID")
private Integer store_id;
@ApiModelProperty(value = "退货退款金额")
private BigDecimal return_refund_amount;
@ApiModelProperty(value = "退货佣金费用")
private BigDecimal return_commision_fee;
@ApiModelProperty(value = "退货状态ID")
private Integer return_state_id;
@ApiModelProperty(value = "退货状态名称")
private String return_state_name;
@ApiModelProperty(value = "退货联系电话")
private String return_tel;
@ApiModelProperty(value = "退货年份")
private Integer return_year;
@ApiModelProperty(value = "退货月份")
private Integer return_month;
@ApiModelProperty(value = "退货日期")
private Integer return_day;
@ApiModelProperty(value = "退货地址")
private String return_addr;
@ApiModelProperty(value = "退货联系手机")
private Long return_mobile;
@ApiModelProperty(value = "退货联系电话")
private String return_telephone;
@ApiModelProperty(value = "退货联系人姓名")
private String return_contact_name;
@ApiModelProperty(value = "分站ID")
private Integer subsite_id;
@ApiModelProperty(value = "退货申请时间")
private Date return_add_time;
@ApiModelProperty(value = "退货完成时间")
private Date return_finish_time;
@ApiModelProperty(value = "是否已退款(ENUM): 0-未退款; 1-已退款")
private Integer return_is_paid;
@ApiModelProperty(value = "退款渠道代码")
private String return_channel_code;
@ApiModelProperty(value = "退款渠道交易ID")
private String return_channel_trans_id;
@ApiModelProperty(value = "退款渠道处理时间")
private Date return_channel_time;
@ApiModelProperty(value = "退款渠道状态(ENUM): 0-待退; 1-已退; 2-异常")
private Integer return_channel_flag;
@ApiModelProperty(value = "支付交易号")
private String deposit_trade_no;
@ApiModelProperty(value = "支付渠道ID")
private Integer payment_channel_id;
@ApiModelProperty(value = "商家处理留言")
private String return_store_message;
@ApiModelProperty(value = "平台退货状态ID")
private Integer plantform_return_state_id;
@ApiModelProperty(value = "平台退货状态名称")
private String plantform_return_state_name;
@ApiModelProperty(value = "退货类型(ENUM): 0-不用退货; 1-需要退货")
private Integer return_flag;
@ApiModelProperty(value = "申请类型(ENUM): 1-退款申请; 2-退货申请; 3-虚拟退款")
private Integer return_type;
@ApiModelProperty(value = "提交的退货退款金额")
private BigDecimal submit_return_refund_amount;
@ApiModelProperty(value = "订单商品ID列表")
private List<Long> order_item_ids;
@ApiModelProperty(value = "买家用户名")
private String buyer_user_name;
@ApiModelProperty(value = "是否有合同类型")
private Boolean contract_type_ids;
@ApiModelProperty(value = "尝试退款次数")
private Integer try_return_count;
// 收货地址相关信息
@ApiModelProperty(value = "收货省份")
private String da_province;
@ApiModelProperty(value = "收货城市")
private String da_city;
@ApiModelProperty(value = "收货区县")
private String da_county;
@ApiModelProperty(value = "收货详细地址")
private String da_address;
@ApiModelProperty(value = "收货人姓名")
private String da_name;
@ApiModelProperty(value = "收货人手机号")
private String da_mobile;
@ApiModelProperty(value = "收货人电话")
private String da_telephone;
@ApiModelProperty(value = "收货省份ID")
private Integer da_province_id;
@ApiModelProperty(value = "收货城市ID")
private Integer da_city_id;
@ApiModelProperty(value = "收货区县ID")
private Integer da_county_id;
@ApiModelProperty(value = "纬度")
private String da_latitude;
@ApiModelProperty(value = "经度")
private String da_longitude;
// 退款商品列表
@ApiModelProperty(value = "退货商品详情列表")
private List<MchReturnOrderItemDetailDTO> items;
}

View File

@ -0,0 +1,106 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.common.modules.order.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "退款单商品详情实体对象", description = "退款单商品详情实体类")
public class MchReturnOrderItemDetailDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "退货商品项ID")
private Long order_return_item_id;
@ApiModelProperty(value = "退货单编号")
private String return_id;
@ApiModelProperty(value = "订单商品项ID")
private Long order_item_id;
@ApiModelProperty(value = "订单编号")
private String order_id;
@ApiModelProperty(value = "退货商品数量")
private Integer return_item_num;
@ApiModelProperty(value = "退货商品小计金额")
private BigDecimal return_item_subtotal;
@ApiModelProperty(value = "退货原因ID")
private Integer return_reason_id;
@ApiModelProperty(value = "退货商品备注")
private String return_item_note;
@ApiModelProperty(value = "退货商品图片")
private String return_item_image;
@ApiModelProperty(value = "退货商品状态ID")
private Integer return_state_id;
@ApiModelProperty(value = "退货商品佣金费用")
private BigDecimal return_item_commision_fee;
@ApiModelProperty(value = "退货商品商家备注")
private String return_item_store_remark;
// 关联的订单商品信息
@ApiModelProperty(value = "商品名称")
private String item_name;
@ApiModelProperty(value = "产品名称")
private String product_name;
@ApiModelProperty(value = "货品ID")
private Long item_id;
@ApiModelProperty(value = "订单商品图片")
private String order_item_image;
@ApiModelProperty(value = "单位ID")
private Integer unit_id;
@ApiModelProperty(value = "单位名称")
private String unit_name;
@ApiModelProperty(value = "订单商品单价")
private BigDecimal order_item_unit_price;
@ApiModelProperty(value = "订单商品数量")
private Integer order_item_quantity;
@ApiModelProperty(value = "订单商品总金额")
private BigDecimal order_item_amount;
@ApiModelProperty(value = "订单商品总重量")
private BigDecimal order_item_weight_total;
@ApiModelProperty(value = "订单商品备注")
private String order_item_note;
@ApiModelProperty(value = "商品编号")
private String item_number;
@ApiModelProperty(value = "产品编号")
private String product_number;
}

View File

@ -1,8 +1,6 @@
package com.suisung.mall.common.modules.page;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -67,5 +65,22 @@ public class ShopPageApp implements Serializable {
@ApiModelProperty(value = "是否使用(BOOL):0-否;1-是")
private Integer app_is_use;
@ApiModelProperty(value = "模板编号,用于模板市场")
private Integer app_template_id;
@ApiModelProperty(value = "是否收费0否1是")
private String is_pay;
@ApiModelProperty(value = "是否发布0否1是")
private String is_pulish;
@TableField(exist = false)
private String tpl_label;
@ApiModelProperty(value = "市场展示图片,[{'imageUrl:'','description':''}")
private String app_market_images;
@ApiModelProperty(value = "行业类别1超市,2数码家电, 3水果生鲜, 4烘培饮品, 5社区团购, 6时尚美妆, 7婴儿服饰, 8家居, 9汽车, 10酒店旅游, 11鲜花绿植, 12医药健康, 13工业五金, 14节日模板,0其他行业")
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String app_industry;
}

View File

@ -10,6 +10,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
@ -135,5 +136,9 @@ public class ShopPageBase implements Serializable {
@ApiModelProperty(value = "信息发布(BOOL):0-否;1-是")
private Integer page_message;
@ApiModelProperty(value = "创建时间")
private Date created_at;
@ApiModelProperty(value = "最后更新时间")
private Date updated_at;
}

View File

@ -1,8 +1,6 @@
package com.suisung.mall.common.modules.product;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -44,10 +42,12 @@ public class ShopProductImage implements Serializable {
@ApiModelProperty(value = "规格值")
private String color_name;
@ApiModelProperty(value = "商品主图")
@ApiModelProperty(value = "商品主图,0是编辑空图片1是同步空图片")
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String item_image_default;
@ApiModelProperty(value = "副图(DOT)")
@TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
private String item_image_other;
@ApiModelProperty(value = "DIY背景")

View File

@ -10,6 +10,8 @@ import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import static com.baomidou.mybatisplus.annotation.FieldStrategy.NOT_EMPTY;
/**
* <p>
* 产品索引表-不读取数据只读主键
@ -33,10 +35,11 @@ public class ShopProductIndex implements Serializable {
private Long product_id;
@ApiModelProperty(value = "产品名称:店铺平台先在对用表中检索后通过id检索,检索使用")
@TableField(updateStrategy=NOT_EMPTY)
private String product_name;
@ApiModelProperty(value = "名称索引关键字(DOT)")
@TableField(updateStrategy=NOT_EMPTY)
private String product_name_index;
@ApiModelProperty(value = "店铺编号")

View File

@ -56,6 +56,10 @@ public class ShopProductSpecItem implements Serializable {
@TableField(exist=false)
private BigDecimal itemPrice;
@ApiModelProperty(value = "市场价")
@TableField(exist=false)
private BigDecimal marketPrice;
@ApiModelProperty(value = "切割后的库存")
@TableField(exist=false)
private BigDecimal itemQuantity;

View File

@ -0,0 +1,53 @@
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 砍价抽奖历史记录DTO
*/
@Data
@TableName("shop_activity_cut_lottery_history")
@ApiModel(value = "ShopActivityCutLotteryHistory", description = "砍价大转盘抽奖历史记录")
public class ShopActivityCutLotteryHistory implements Serializable{
private static final long serialVersionUID = 1L;
@TableId(value = "alh_id", type = IdType.AUTO)
@ApiModelProperty(value = "用户中奖编号", example = "1")
private Long alhId;
@TableField(value ="user_id",updateStrategy = FieldStrategy.NOT_EMPTY)
@ApiModelProperty(value = "用户编号", example = "10001")
private Integer userId;
@TableField(value ="activity_id",updateStrategy = FieldStrategy.NOT_EMPTY)
@ApiModelProperty(value = "活动编号", example = "20001")
private Integer activityId;
@TableField(value ="alh_item_id",updateStrategy = FieldStrategy.NOT_EMPTY)
@ApiModelProperty(value = "抽奖物品编号", example = "30001")
private Integer alhItemId;
@TableField(value ="alh_item_name",updateStrategy = FieldStrategy.NOT_EMPTY)
@ApiModelProperty(value = "抽奖物品名称", example = "iPhone 15 Pro")
private String alhItemName;
@TableField(value = "alh_award_flag",updateStrategy = FieldStrategy.NOT_EMPTY)
@ApiModelProperty(value = "是否中奖:0-未中奖;1-中奖", example = "1")
private Boolean alhAwardFlag;
@TableField(value ="create_time")
@ApiModelProperty(value = "创建时间", example = "2023-12-01 10:00:00")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@TableField("update_time")
@ApiModelProperty(value = "更新时间", example = "2023-12-01 10:00:00")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
}

View File

@ -9,6 +9,7 @@
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@ -96,6 +97,9 @@ public class ShopMchEntry implements Serializable {
@ApiModelProperty(value = "入驻商家店铺门面环境图片的存储路径", required = true)
private String environment_image;
@ApiModelProperty(value = "收银台照片", required = true)
private String checkstand_image;
@ApiModelProperty(value = "入驻主体类型企业或个人1-企业2-个人;", required = true)
private Integer entity_type;
@ -183,6 +187,9 @@ public class ShopMchEntry implements Serializable {
@ApiModelProperty(value = "结算账户⾏号", required = true)
private String openning_bank_code;
@ApiModelProperty(value = "开户许可证(银行对公开户证明)")
private String opening_permit_image;
@ApiModelProperty(value = "结算账户清算⾏号")
private String clearing_bank_code;
@ -258,6 +265,13 @@ public class ShopMchEntry implements Serializable {
@ApiModelProperty(value = "是否绑定分账接收方1-是2-否;")
private Integer has_bind_receiver;
@ApiModelProperty(value = "父入驻id总店入驻id")
private Long parent_id;
@TableField(exist = false)
@ApiModelProperty(value = "代理商邀请码")
private String invite_code;
@ApiModelProperty(value = "该商家入驻记录是否有效0:无效1:有效")
private Integer status;

View File

@ -0,0 +1,70 @@
/*
* Copyright (c) 2025. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("shop_mch_entry_branch")
@ApiModel(value = "shop_mch_entry_branch 实体", description = "商家分店拉卡拉商户申请数据")
public class ShopMchEntryBranch implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "自增ID")
@TableId(value = "id", type = IdType.INPUT)
private Long id;
@ApiModelProperty(value = "拉卡拉外部(银联)商户号", required = true)
private String lkl_mer_cup_no;
@ApiModelProperty(value = "拉卡拉终端号")
private String lkl_term_no;
@ApiModelProperty(value = "审核关联号", required = true)
private String review_related_id;
@ApiModelProperty(value = "商户登录手机号")
private String login_mobile;
@ApiModelProperty(value = "分店名称")
private String store_name;
@ApiModelProperty(value = "请求拉卡拉参数")
private String lkl_req;
@ApiModelProperty(value = "拉卡拉响应数据")
private String lkl_reps;
@ApiModelProperty(value = "拉卡拉通知响应数据")
private String lkl_notify_reps;
@ApiModelProperty(value = "状态1-已成功2-审核未通过3-未处理4-待审核;")
private Integer status;
@ApiModelProperty(value = "审核状态")
private String status_text;
@ApiModelProperty(value = "商家入驻记录的创建时间")
private Date created_at;
@ApiModelProperty(value = "商家入驻记录的更新时间")
private Date updated_at;
}

View File

@ -79,9 +79,9 @@ public class ShopStoreActivityBase implements Serializable {
@TableField(updateStrategy = NOT_EMPTY)
private Integer activity_state;
@ApiModelProperty(value = "活动规则(json):不检索{rule_id:{}, rule_id:{}}")
@TableField(updateStrategy = NOT_EMPTY)
private String activity_rule;
@ApiModelProperty(value = "活动规则(json):不检索{rule_id:{}, rule_id:{}},统一解析规则{\"requirement\":{\"buy\":{\"item\":[1,2,3],\"subtotal\":\"通过计算修正满足的条件\"}},\"rule\":[{\"total\":100,\"max_num\":1,\"item\":{\"1\":1,\"1200\":3}},{\"total\":200,\"max_num\":1,\"item\":{\"1\":1,\"1200\":3}}]}")
@TableField(updateStrategy = NOT_EMPTY, fill = FieldFill.INSERT_UPDATE)
private String activity_rule = "{}";
@ApiModelProperty(value = "参与类型(ENUM):1-免费参与;2-积分参与;3-购买参与")
@TableField(updateStrategy = NOT_EMPTY)
@ -119,7 +119,6 @@ public class ShopStoreActivityBase implements Serializable {
@TableField(updateStrategy = NOT_EMPTY)
private Integer activity_share_num;
@Version
@ApiModelProperty(value = "乐观锁")
private Integer version;
@ -127,4 +126,22 @@ public class ShopStoreActivityBase implements Serializable {
@TableField(updateStrategy = NOT_EMPTY)
private String flow_no;
@ApiModelProperty(value = "在活动时间范围内,用户砍价有效期(小时)")
private Integer cut_hour;
@ApiModelProperty(value = "参与活动商品的总数量(个)")
private Integer product_count;
@ApiModelProperty(value = "规则配置")
@TableField(updateStrategy = NOT_EMPTY)
private String lucky_turn;
@ApiModelProperty(value = "每人限购,0为不限购")
private Integer person_limit;
@ApiModelProperty(value = "每单限购,0为不限购")
private Integer order_limit;
@ApiModelProperty(value = "是否店铺新用户专享1是0否")
private String is_new_person_shop;
}

View File

@ -80,9 +80,12 @@ public class ShopStoreBase implements Serializable {
@ApiModelProperty(value = "店铃声开关1-开启2-关闭;")
private Integer ringtone_is_enable;
@ApiModelProperty(value = "店铺营业状态1-营业中2-已打烊")
@ApiModelProperty(value = "店铺营业状态1-开业营业中且在营业时间内12-开业打烊中但在营业时间外2-停业中3-开业(或活动)筹备中")
private Integer store_biz_state;
@ApiModelProperty(value = "开业(活动)筹备日期 yyyy-MM-dd")
private Date store_biz_opening_date;
@ApiModelProperty(value = "上级店铺编号:创建店铺决定,所属分销商-不可更改! 佣金公平性考虑")
private Integer shop_parent_id;
@ -138,6 +141,9 @@ public class ShopStoreBase implements Serializable {
@ApiModelProperty(value = "店铺统一的打包费, 0-10元范围")
private BigDecimal packing_fee;
@ApiModelProperty(value = "分店所属总店 Id一般分店有值总店为0")
private Integer parent_id;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "新增时间")

View File

@ -1,6 +1,7 @@
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
@ -10,6 +11,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* <p>
@ -47,5 +49,7 @@ public class ShopStoreEmployeeRightsBase implements Serializable {
@ApiModelProperty(value = "功能开启:跟设置config_key")
private String menu_func;
@ApiModelProperty(value = "节点子集")
@TableField(exist = false)
private List<ShopStoreEmployeeRightsBase> children;
}

View File

@ -3,11 +3,13 @@ package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
@ -121,5 +123,21 @@ public class ShopStoreInfo implements Serializable {
@ApiModelProperty(value = "线下买单折扣:10代表原价")
private BigDecimal store_discount;
@ApiModelProperty(value = "店铺内部运费单位0-使用平台的内部运费;>0 使用店铺的内部运费")
private Integer shopping_fee_inner;
@ApiModelProperty(value = "是否自配送1-是2-否;")
private Integer is_delivery_self;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "新增时间")
private Date created_at;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "最后更新时间")
private Date updated_at;
}

View File

@ -1,15 +1,14 @@
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.io.Serializable;
import java.util.Date;
@Data
@ -17,38 +16,47 @@ import java.util.Date;
@Accessors(chain = true)
@TableName("shop_store_member")
@ApiModel(value = "ShopStoreMember", description = "店铺会员表")
public class ShopStoreMember {
public class ShopStoreMember implements Serializable {
@TableId(value ="store_member_id", type = IdType.AUTO)
@ApiModelProperty(value = "店铺会员ID", example = "10001")
private Integer storeMemberId;
private Long store_member_id;
@ApiModelProperty(value = "用户ID", example = "20001")
@TableField(value = "user_id")
private Integer userId;
@ApiModelProperty(value = "店铺ID", example = "30001")
@TableField(value = "store_id")
private Integer storeId;
@ApiModelProperty(value = "用户名")
@TableField(value = "user_account")
private String userAccount;
@ApiModelProperty(value = "用户昵称")
@TableField(value = "user_nickname")
private String userNickname;
@ApiModelProperty(value = "店铺名称", example = "旗舰店")
@TableField(value = "store_name")
private String storeName;
@ApiModelProperty(value = "首次消费时间")
private Date firstPurchaseTime;
@ApiModelProperty(value = "累计消费金额", example = "1500.00")
private BigDecimal totalConsumption;
@ApiModelProperty(value = "最近消费时间")
private Date lastPurchaseTime;
@ApiModelProperty(value = "会员等级ID", example = "2")
private Integer memberLevelId;
@ApiModelProperty(value = "等级名称", example = "铂金会员")
private String memberLevelName;
@ApiModelProperty(value = "创建时间")
private Date createdAt;
@TableField(value = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新时间")
private Date updatedAt;
@TableField(value = "update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@ApiModelProperty(value = "访问Open编号")
private String bind_openid;
@ApiModelProperty(value = "剩余订阅次数")
private Integer send_number;
@TableField(exist = false)
private ShopStoreMemberLevel shopStoreMemberLevel;
}

View File

@ -1,14 +1,14 @@
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@ -17,26 +17,74 @@ import java.util.Date;
@Accessors(chain = true)
@TableName("shop_store_member_level")
@ApiModel(value = "ShopStoreMemberLevel", description = "店铺会员等级表")
public class ShopStoreMemberLevel {
@TableId(value = "user_level_id", type = IdType.AUTO)
public class ShopStoreMemberLevel implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "store_member_level_id", type = IdType.AUTO)
@ApiModelProperty(value = "主表id", example = "1")
private Integer store_member_level_id;
@ApiModelProperty(value = "等级编号", example = "1")
@TableField(value = "user_level_id")
private Integer userLevelId;
@ApiModelProperty(value = "等级名称", example = "黄金会员")
@TableField(value = "user_level_name")
private String userLevelName;
@ApiModelProperty(value = "累计消费额度", example = "1000.00")
@TableField(value = "user_level_spend")
private BigDecimal userLevelSpend;
@ApiModelProperty(value = "首次消费时间")
@TableField(value = "first_purchase_time",updateStrategy = FieldStrategy.NOT_EMPTY)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date firstPurchaseTime;
@ApiModelProperty(value = "积分")
@TableField(value = "store_points",updateStrategy = FieldStrategy.NOT_EMPTY)
private Integer store_points;
@ApiModelProperty(value = "最近消费时间")
@TableField(value = "last_purchase_time",updateStrategy = FieldStrategy.NOT_EMPTY)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastPurchaseTime;
@ApiModelProperty(value = "会员等级ID", example = "2")
@TableField(value = "member_level_id",updateStrategy = FieldStrategy.NOT_EMPTY)
private Integer memberLevelId;
@ApiModelProperty(value = "等级名称", example = "铂金会员")
@TableField(value = "member_level_name")
private String memberLevelName;
@ApiModelProperty(value = "折扣率百分比", example = "95.00")
@TableField(value = "user_level_rate")
private BigDecimal userLevelRate;
@ApiModelProperty(value = "等级修改时间")
@TableField(value = "user_level_time")
private Date userLevelTime;
@ApiModelProperty(value = "创建时间")
private Date createdAt;
@TableField(value = "create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新时间")
private Date updatedAt;
@TableField(value = "update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@ApiModelProperty(value = "店铺id")
@TableField(value = "store_id",updateStrategy = FieldStrategy.NOT_EMPTY)
private Integer storeId;
@TableField(value = "store_member_id")
@ApiModelProperty(value = "店铺会员ID")
private Long storeMemberId;
@ApiModelProperty(value = "用户ID", example = "20001")
@TableField(value = "user_id")
private Integer userId;
}

View File

@ -0,0 +1,50 @@
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("shop_store_points_account")
@ApiModel(value = "ShopStorePointsAccount", description = "会员表-积分账户表")
public class ShopStorePointsAccount implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户ID")
@TableId(value = "user_id", type = IdType.AUTO)
private String user_id;
@ApiModelProperty(value = "店铺会员id", required = true)
@TableField("store_member_id")
private Integer storeMemberId;
@ApiModelProperty(value = "累计获得积分")
@TableField("total_points")
private Integer totalPoints;
@ApiModelProperty(value = "可用积分")
@TableField("available_points")
private Integer availablePoints;
@ApiModelProperty(value = "冻结积分")
@TableField("frozen_points")
private Integer frozenPoints;
@ApiModelProperty(value = "已过期积分")
@TableField("expired_points")
private Integer expiredPoints;
@ApiModelProperty(value = "最后更新时间", required = true)
@TableField(value = "last_update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date lastUpdateTime;
}

View File

@ -0,0 +1,78 @@
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("shop_store_points_rule")
@ApiModel(value = "ShopStorePointsRuleDTO对象", description = "会员表-积分规则表")
public class ShopStorePointsRule implements Serializable {
@ApiModelProperty(value = "规则ID")
@TableId(value = "rule_id", type = IdType.INPUT)
private String rule_id;
@ApiModelProperty(value = "规则名称", required = true)
@TableField("rule_name")
private String ruleName;
@ApiModelProperty(value = "规则类型1-获取规则 2-过期规则", required = true)
@TableField("rule_type")
private Integer ruleType;
@ApiModelProperty(value = "获取积分数值或比例")
@TableField("points_value")
private Integer pointsValue;
@ApiModelProperty(value = "过期天数(0表示永久有效)")
@TableField("expiry_days")
private Integer expiryDays;
@ApiModelProperty(value = "状态1-启用 0-禁用")
@TableField("status")
private Integer status;
@ApiModelProperty(value = "开始时间")
@TableField("start_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
@ApiModelProperty(value = "结束时间")
@TableField("end_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
@ApiModelProperty(value = "新建时间")
@TableField("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ApiModelProperty(value = "更新时间")
@TableField("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@ApiModelProperty(value = "店铺编号", required = true)
@TableField("store_id")
private Long storeId;
@ApiModelProperty(value = "预警通知0是表示没有预警")
@TableField("warning_day")
private Integer warningDay;
@ApiModelProperty(value = "备注")
@TableField("remark")
private String remark;
}

View File

@ -0,0 +1,69 @@
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("shop_store_points_transaction")
@ApiModel(value = "ShopStorePointsTransactionDTO对象", description = "会员表-积分流水表")
public class ShopStorePointsTransaction implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "流水ID")
@TableId(value = "transaction_id", type = IdType.AUTO)
private String transaction_id;
@ApiModelProperty(value = "用户编号", required = true)
@TableField("user_id")
private Integer userId;
@ApiModelProperty(value = "店铺会员id", required = true)
@TableField("store_member_id")
private String storeMemberId;
@ApiModelProperty(value = "正数为获得,负数为消耗", required = true)
@TableField("points")
private Integer points;
@ApiModelProperty(value = "交易后余额", required = true)
@TableField("balance_after")
private Integer balanceAfter;
@ApiModelProperty(value = "交易类型1-获取 2-消费 3-过期 4-调整", required = true)
@TableField("transaction_type")
private Integer transactionType;
@ApiModelProperty(value = "流水时间")
@TableField("transaction_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date transactionTime;
@ApiModelProperty(value = "过期日期")
@TableField("expiry_date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date expiryDate;
@ApiModelProperty(value = "来源ID(订单ID等)")
@TableField("source_id")
private String sourceId;
@ApiModelProperty(value = "来源描述")
@TableField("source_desc")
private String sourceDesc;
@ApiModelProperty(value = "备注")
@TableField("remark")
private String remark;
}

View File

@ -43,12 +43,18 @@ public class ShopStoreSameCityTransportBase implements Serializable {
@TableId(value = "transport_base_id", type = IdType.AUTO)
private Long transport_base_id;
@ApiModelProperty(value = "平台配送费设置1-是2-否")
private Integer is_platform;
@ApiModelProperty(value = "店铺ID")
private Long store_id;
@ApiModelProperty(value = "顺丰同城第三方店铺ID")
private String shop_id;
@ApiModelProperty(value = "顺丰平台商家Id (用于县级代理商创建店铺的)")
private String supplier_id;
@ApiModelProperty(value = "店铺主营商品分类ID")
private Integer business_type;

View File

@ -0,0 +1,73 @@
package com.suisung.mall.common.modules.store;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("shop_store_sf_supplier")
@ApiModel(value = "顺丰地区提供商商家ID表", description = "顺丰地区提供商商家ID表")
public class ShopStoreSfSupplier {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "自增ID")
@TableId(value = "id", type = IdType.AUTO)
@JsonProperty("id")
private Long id;
@ApiModelProperty(value = "商家Id")
@JsonProperty("supplier_id")
private String supplier_id;
@ApiModelProperty(value = "省份Id")
@JsonProperty("province_id")
private String province_id;
@ApiModelProperty(value = "省份名称")
@JsonProperty("province_name")
private String province_name;
@ApiModelProperty(value = "城市Id")
@JsonProperty("city_id")
private String city_id;
@ApiModelProperty(value = "城市名称")
@JsonProperty("city_name")
private String city_name;
@ApiModelProperty(value = "区域Id")
@JsonProperty("district_id")
private String district_id;
@ApiModelProperty(value = "区域名称")
@JsonProperty("district_name")
private String district_name;
@ApiModelProperty(value = "状态1-有效2-无效;")
@JsonProperty("status")
private Integer status;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@JsonProperty("created_at")
@ApiModelProperty(value = "新建时间")
private Date created_at;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@ApiModelProperty(value = "更新时间")
@JsonProperty("updated_at")
private Date updated_at;
}

View File

@ -81,15 +81,18 @@ public class ProductMapping implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@TableField(value ="premium_rate",updateStrategy=NOT_EMPTY)
@ApiModelProperty("线上溢价率")
private BigDecimal premiumRate;
/**
* 生成唯一键productName + storeId + specValue + specUnit
* 生成唯一键productName + productNumber + storeId
*/
public String getUniqueKey() {
return String.format("%s|%d|%s|%s",
return String.format("%s|%s|%d",
productName,
storeId,
specValue.stripTrailingZeros().toPlainString(),
specUnit);
productNumber,
storeId);
}
}

Some files were not shown because too many files have changed in this diff Show More