下单接口完善,添加支付成功回调及自动取消超时订单接口

This commit is contained in:
zhh 2018-09-05 17:05:11 +08:00
parent cae7f7e4f8
commit cbdb93ee3f
21 changed files with 872 additions and 423 deletions

View File

@ -53,12 +53,12 @@ JTA事务处理 | ✔
OSS上传功能 | ✔
Elasticsearch搜索功能 | ✔
HTTPS支持 | ✔
ELK日志收集功能 |
Redis数字型ID生成 |
Redis数字型ID生成 | ✔
SpringTask定时任务支持 | ✔
RestTemplate服务间调用 |
docker容器化部署 | ✔
配置区分生产和测试环境 | ✔
ELK日志收集功能 |
SpringSecurity权限管理功能 |
### 使用工具
@ -273,9 +273,9 @@ Linux远程连接工具 | http://www.netsarang.com/download/software.html
- 根据用户搜索记录聚合生成热搜词
#### 购物流程
#### 购物流程
> **购物车**
> **购物车**
- 添加商品到购物车
- 购物车商品列表(商品主图、商品名称、商品数量、商品规格)
@ -283,7 +283,7 @@ Linux远程连接工具 | http://www.netsarang.com/download/software.html
- 购物车中商品重选规格
- 购物车中商品删除功能
> **生成确认单**
> **生成确认单**
- 生成确认单信息:收货信息、商品信息、价格信息、发票信息、支付方式
- 选择收货地址:默认收货地址
@ -292,7 +292,7 @@ Linux远程连接工具 | http://www.netsarang.com/download/software.html
- 选择支付方式:在线支付及货到付款
- 计算应付金额:合计+运费-优惠券抵扣-积分抵扣-活动优惠
> **提交订单**
> **提交订单**
- 将确认单信息转化为订单
- 删除购物车中相关商品
@ -306,7 +306,6 @@ Linux远程连接工具 | http://www.netsarang.com/download/software.html
> **取消订单(未支付情况下)**
- 订单超时后自动取消订单,解除商品库存锁定,返还优惠券,积分
- 用户自己取消订单,解除商品库存锁定,返还优惠券,积分
#### 会员模块(我的)✔

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -10,7 +10,7 @@ Target Server Type : MYSQL
Target Server Version : 50719
File Encoding : 65001
Date: 2018-09-03 17:10:32
Date: 2018-09-05 17:02:45
*/
SET FOREIGN_KEY_CHECKS=0;
@ -379,16 +379,18 @@ CREATE TABLE `oms_order` (
`note` varchar(500) DEFAULT NULL COMMENT '订单备注',
`confirm_status` int(1) DEFAULT NULL COMMENT '确认收货状态0->未确认1->已确认',
`delete_status` int(1) NOT NULL DEFAULT '0' COMMENT '删除状态0->未删除1->已删除',
`use_integration` int(11) DEFAULT NULL COMMENT '下单时使用的积分',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='订单表';
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COMMENT='订单表';
-- ----------------------------
-- Records of oms_order
-- ----------------------------
INSERT INTO `oms_order` VALUES ('12', '1', '2', null, '2018-09-03 16:24:27', 'test', '18732.00', '16377.75', '0.00', '2344.25', '0.00', '10.00', null, '0', '1', '0', '0', null, null, null, '0', null, '单品促销,打折优惠满3件打7.50折,满减优惠满1000.00元减120.00元,满减优惠满1000.00元减120.00元,无优惠', null, null, null, null, null, '大梨', '18033441849', '518000', '广东省', '深圳市', '福田区', '东晓街道', null, '0', '0');
INSERT INTO `oms_order` VALUES ('13', '1', '2', null, '2018-09-03 16:24:29', 'test', '18732.00', '16377.75', '0.00', '2344.25', '0.00', '10.00', null, '0', '1', '0', '0', null, null, null, '0', null, '单品促销,打折优惠满3件打7.50折,满减优惠满1000.00元减120.00元,满减优惠满1000.00元减120.00元,无优惠', null, null, null, null, null, '大梨', '18033441849', '518000', '广东省', '深圳市', '福田区', '东晓街道', null, '0', '0');
INSERT INTO `oms_order` VALUES ('14', '1', '2', null, '2018-09-03 16:57:40', 'test', '18732.00', '16377.75', '0.00', '2344.25', '0.00', '10.00', null, '0', '1', '0', '0', null, null, null, '18682', '18682', '单品促销,打折优惠满3件打7.50折,满减优惠满1000.00元减120.00元,满减优惠满1000.00元减120.00元,无优惠', null, null, null, null, null, '大梨', '18033441849', '518000', '广东省', '深圳市', '福田区', '东晓街道', null, '0', '0');
INSERT INTO `oms_order` VALUES ('15', '1', '2', null, '2018-09-03 17:03:00', 'test', '18732.00', '16377.75', '0.00', '2344.25', '0.00', '10.00', null, '0', '1', '0', '0', null, null, null, '18682', '18682', '单品促销,打折优惠满3件打7.50折,满减优惠满1000.00元减120.00元,满减优惠满1000.00元减120.00元,无优惠', null, null, null, null, null, '大梨', '18033441849', '518000', '广东省', '深圳市', '福田区', '东晓街道', null, '0', '0');
INSERT INTO `oms_order` VALUES ('12', '1', '2', null, '2018-09-05 12:24:27', 'test', '18732.00', '16377.75', '0.00', '2344.25', '0.00', '10.00', null, '0', '1', '1', '0', null, null, null, '0', null, '单品促销,打折优惠满3件打7.50折,满减优惠满1000.00元减120.00元,满减优惠满1000.00元减120.00元,无优惠', null, null, null, null, null, '大梨', '18033441849', '518000', '广东省', '深圳市', '福田区', '东晓街道', null, '0', '0', null);
INSERT INTO `oms_order` VALUES ('13', '1', '2', null, '2018-09-05 14:24:29', 'test', '18732.00', '16377.75', '0.00', '2344.25', '0.00', '10.00', null, '0', '1', '4', '0', null, null, null, '0', null, '单品促销,打折优惠满3件打7.50折,满减优惠满1000.00元减120.00元,满减优惠满1000.00元减120.00元,无优惠', null, null, null, null, null, '大梨', '18033441849', '518000', '广东省', '深圳市', '福田区', '东晓街道', null, '0', '0', '1000');
INSERT INTO `oms_order` VALUES ('14', '1', '2', null, '2018-09-03 16:57:40', 'test', '18732.00', '16377.75', '0.00', '2344.25', '0.00', '10.00', null, '0', '1', '4', '0', null, null, null, '18682', '18682', '单品促销,打折优惠满3件打7.50折,满减优惠满1000.00元减120.00元,满减优惠满1000.00元减120.00元,无优惠', null, null, null, null, null, '大梨', '18033441849', '518000', '广东省', '深圳市', '福田区', '东晓街道', null, '0', '0', null);
INSERT INTO `oms_order` VALUES ('15', '1', '2', null, '2018-09-03 17:03:00', 'test', '18732.00', '16377.75', '0.00', '2344.25', '0.00', '10.00', null, '0', '1', '4', '0', null, null, null, '18682', '18682', '单品促销,打折优惠满3件打7.50折,满减优惠满1000.00元减120.00元,满减优惠满1000.00元减120.00元,无优惠', null, null, null, null, null, '大梨', '18033441849', '518000', '广东省', '深圳市', '福田区', '东晓街道', null, '0', '0', null);
INSERT INTO `oms_order` VALUES ('16', '1', '2', null, '2018-09-04 16:16:16', 'test', '18732.00', '16377.75', '0.00', '2344.25', '0.00', '10.00', null, '0', '1', '4', '0', null, null, null, '18682', '18682', '单品促销,打折优惠满3件打7.50折,满减优惠满1000.00元减120.00元,满减优惠满1000.00元减120.00元,无优惠', null, null, null, null, null, '大梨', '18033441849', '518000', '广东省', '深圳市', '福田区', '东晓街道', null, '0', '0', null);
-- ----------------------------
-- Table structure for oms_order_item
@ -419,7 +421,7 @@ CREATE TABLE `oms_order_item` (
`gift_integration` int(11) DEFAULT '0',
`gift_growth` int(11) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8 COMMENT='订单中所包含的商品';
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COMMENT='订单中所包含的商品';
-- ----------------------------
-- Records of oms_order_item
@ -444,6 +446,11 @@ INSERT INTO `oms_order_item` VALUES ('37', '15', null, '27', null, '小米8', nu
INSERT INTO `oms_order_item` VALUES ('38', '15', null, '28', null, '红米5A', null, null, '649.00', '1', '102', '201808270028001', '19', null, null, null, '满减优惠满1000.00元减120.00元', '57.60', '0.35', '0.00', '591.05', '0', '0');
INSERT INTO `oms_order_item` VALUES ('39', '15', null, '28', null, '红米5A', null, null, '699.00', '1', '103', '201808270028001', '19', null, null, null, '满减优惠满1000.00元减120.00元', '62.40', '0.37', '0.00', '636.23', '0', '0');
INSERT INTO `oms_order_item` VALUES ('40', '15', null, '29', null, 'Apple iPhone 8 Plus', null, null, '5499.00', '1', '106', '201808270029001', '19', null, null, null, '无优惠', '0.00', '2.94', '0.00', '5496.06', '0', '0');
INSERT INTO `oms_order_item` VALUES ('41', '16', null, '26', null, '华为 HUAWEI P20', null, null, '3788.00', '1', '90', '201806070026001', '19', null, null, null, '单品促销', '200.00', '2.02', '0.00', '3585.98', '0', '0');
INSERT INTO `oms_order_item` VALUES ('42', '16', null, '27', null, '小米8', null, null, '2699.00', '3', '98', '201808270027001', '19', null, null, null, '打折优惠满3件打7.50折', '674.75', '1.44', '0.00', '2022.81', '0', '0');
INSERT INTO `oms_order_item` VALUES ('43', '16', null, '28', null, '红米5A', null, null, '649.00', '1', '102', '201808270028001', '19', null, null, null, '满减优惠满1000.00元减120.00元', '57.60', '0.35', '0.00', '591.05', '0', '0');
INSERT INTO `oms_order_item` VALUES ('44', '16', null, '28', null, '红米5A', null, null, '699.00', '1', '103', '201808270028001', '19', null, null, null, '满减优惠满1000.00元减120.00元', '62.40', '0.37', '0.00', '636.23', '0', '0');
INSERT INTO `oms_order_item` VALUES ('45', '16', null, '29', null, 'Apple iPhone 8 Plus', null, null, '5499.00', '1', '106', '201808270029001', '19', null, null, null, '无优惠', '0.00', '2.94', '0.00', '5496.06', '0', '0');
-- ----------------------------
-- Table structure for oms_order_operate_history
@ -530,11 +537,12 @@ CREATE TABLE `oms_order_setting` (
`finish_overtime` int(11) DEFAULT NULL COMMENT '自动完成交易时间,不能申请售后(天)',
`comment_overtime` int(11) DEFAULT NULL COMMENT '订单完成后自动好评时间(天)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单设置表';
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='订单设置表';
-- ----------------------------
-- Records of oms_order_setting
-- ----------------------------
INSERT INTO `oms_order_setting` VALUES ('1', '40', '60', '15', '7', '7');
-- ----------------------------
-- Table structure for pms_album
@ -1237,19 +1245,19 @@ INSERT INTO `pms_sku_stock` VALUES ('78', '23', '201806070023001', '99.00', '0',
INSERT INTO `pms_sku_stock` VALUES ('79', '23', '201806070023002', '99.00', '0', null, '米白色', 'X', null, 'http://macro-oss.oss-cn-shenzhen.aliyuncs.com/mall/images/20180604/1522738681.jpg', null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('80', '23', '201806070023003', '99.00', '0', null, '浅黄色', 'M', null, 'http://macro-oss.oss-cn-shenzhen.aliyuncs.com/mall/images/20180604/2017091716493787_20170917164937650 (1).png', null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('81', '23', '201806070023004', '99.00', '0', null, '浅黄色', 'X', null, 'http://macro-oss.oss-cn-shenzhen.aliyuncs.com/mall/images/20180604/2017091716493787_20170917164937650 (1).png', null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('90', '26', '201806070026001', '3788.00', '500', null, '金色', '16G', null, null, null, '3588.00', '19');
INSERT INTO `pms_sku_stock` VALUES ('90', '26', '201806070026001', '3788.00', '499', null, '金色', '16G', null, null, null, '3588.00', '-4');
INSERT INTO `pms_sku_stock` VALUES ('91', '26', '201806070026002', '3999.00', '500', null, '金色', '32G', null, null, null, '3799.00', '0');
INSERT INTO `pms_sku_stock` VALUES ('92', '26', '201806070026003', '3788.00', '500', null, '银色', '16G', null, null, null, '3588.00', '0');
INSERT INTO `pms_sku_stock` VALUES ('93', '26', '201806070026004', '3999.00', '500', null, '银色', '32G', null, null, null, '3799.00', '0');
INSERT INTO `pms_sku_stock` VALUES ('98', '27', '201808270027001', '2699.00', '100', null, '黑色', '32G', null, null, null, null, '57');
INSERT INTO `pms_sku_stock` VALUES ('98', '27', '201808270027001', '2699.00', '97', null, '黑色', '32G', null, null, null, null, '-12');
INSERT INTO `pms_sku_stock` VALUES ('99', '27', '201808270027002', '2999.00', '100', null, '黑色', '64G', null, null, null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('100', '27', '201808270027003', '2699.00', '100', null, '蓝色', '32G', null, null, null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('101', '27', '201808270027004', '2999.00', '100', null, '蓝色', '64G', null, null, null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('102', '28', '201808270028001', '649.00', '100', null, '金色', '16G', null, null, null, null, '19');
INSERT INTO `pms_sku_stock` VALUES ('103', '28', '201808270028002', '699.00', '100', null, '金色', '32G', null, null, null, null, '19');
INSERT INTO `pms_sku_stock` VALUES ('102', '28', '201808270028001', '649.00', '99', null, '金色', '16G', null, null, null, null, '-4');
INSERT INTO `pms_sku_stock` VALUES ('103', '28', '201808270028002', '699.00', '99', null, '金色', '32G', null, null, null, null, '-4');
INSERT INTO `pms_sku_stock` VALUES ('104', '28', '201808270028003', '649.00', '100', null, '银色', '16G', null, null, null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('105', '28', '201808270028004', '699.00', '100', null, '银色', '32G', null, null, null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('106', '29', '201808270029001', '5499.00', '100', null, '金色', '32G', null, null, null, null, '19');
INSERT INTO `pms_sku_stock` VALUES ('106', '29', '201808270029001', '5499.00', '99', null, '金色', '32G', null, null, null, null, '-4');
INSERT INTO `pms_sku_stock` VALUES ('107', '29', '201808270029002', '6299.00', '100', null, '金色', '64G', null, null, null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('108', '29', '201808270029003', '5499.00', '100', null, '银色', '32G', null, null, null, null, '0');
INSERT INTO `pms_sku_stock` VALUES ('109', '29', '201808270029004', '6299.00', '100', null, '银色', '64G', null, null, null, null, '0');
@ -1286,7 +1294,7 @@ CREATE TABLE `sms_coupon` (
INSERT INTO `sms_coupon` VALUES ('2', '0', '全品类通用券', '0', '99', '10.00', '1', '100.00', '2018-08-27 16:40:47', '2018-09-15 16:40:47', '0', '满100减10', '100', '0', '1', '2018-08-27 16:40:47', null, null);
INSERT INTO `sms_coupon` VALUES ('3', '0', '小米手机专用券', '0', '99', '50.00', '1', '1000.00', '2018-08-27 16:40:47', '2018-09-15 16:40:47', '2', '小米手机专用优惠券', '100', '0', '1', '2018-08-27 16:40:47', null, null);
INSERT INTO `sms_coupon` VALUES ('4', '0', '手机品类专用券', '0', '99', '300.00', '1', '2000.00', '2018-08-27 16:40:47', '2018-09-15 16:40:47', '1', '手机分类专用优惠券', '100', '0', '1', '2018-08-27 16:40:47', null, null);
INSERT INTO `sms_coupon` VALUES ('7', '0', 'T恤分类专用优惠券', '0', '99', '50.00', '1', '500.00', '2018-08-27 16:40:47', '2018-08-15 16:40:47', '1', '满500减50', '100', '0', '1', '2018-08-27 16:40:47', null, null);
INSERT INTO `sms_coupon` VALUES ('7', '0', 'T恤分类专用优惠券', '0', '93', '50.00', '1', '500.00', '2018-08-27 16:40:47', '2018-08-15 16:40:47', '1', '满500减50', '100', '0', '7', '2018-08-27 16:40:47', null, null);
-- ----------------------------
-- Table structure for sms_coupon_history
@ -1306,15 +1314,15 @@ CREATE TABLE `sms_coupon_history` (
PRIMARY KEY (`id`),
KEY `idx_member_id` (`member_id`) USING BTREE,
KEY `idx_coupon_id` (`coupon_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='优惠券使用、领取历史表';
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='优惠券使用、领取历史表';
-- ----------------------------
-- Records of sms_coupon_history
-- ----------------------------
INSERT INTO `sms_coupon_history` VALUES ('2', '2', '1', null, 'windir', '1', '2018-08-29 14:04:12', '1', '2018-09-03 17:03:00', null);
INSERT INTO `sms_coupon_history` VALUES ('2', '2', '1', null, 'windir', '1', '2018-08-29 14:04:12', '0', '2018-09-04 16:16:16', null);
INSERT INTO `sms_coupon_history` VALUES ('3', '3', '1', null, 'windir', '1', '2018-08-29 14:04:29', '0', null, null);
INSERT INTO `sms_coupon_history` VALUES ('4', '4', '1', null, 'windir', '1', '2018-08-29 14:04:32', '0', null, null);
INSERT INTO `sms_coupon_history` VALUES ('5', '7', '1', null, 'windir', '1', '2018-08-29 14:04:37', '0', null, null);
INSERT INTO `sms_coupon_history` VALUES ('11', '7', '1', '4931048380330001', 'windir', '1', '2018-09-04 16:21:50', '0', null, null);
-- ----------------------------
-- Table structure for sms_coupon_product_category_relation
@ -1607,7 +1615,7 @@ CREATE TABLE `ums_member` (
-- ----------------------------
-- Records of ums_member
-- ----------------------------
INSERT INTO `ums_member` VALUES ('1', '4', 'test', '202cb962ac59075b964b07152d234b70', 'windir', '18061581849', '1', '2018-08-02 10:35:44', null, '1', '2009-06-01', '上海', '学生', 'test', null, '1000', null, null, null);
INSERT INTO `ums_member` VALUES ('1', '4', 'test', '202cb962ac59075b964b07152d234b70', 'windir', '18061581849', '1', '2018-08-02 10:35:44', null, '1', '2009-06-01', '上海', '学生', 'test', null, '3000', null, null, null);
INSERT INTO `ums_member` VALUES ('3', '4', 'test1', '698d51a19d8a121ce581499d7b701668', null, '18061581848', '1', '2018-08-03 16:46:38', null, null, null, null, null, null, null, null, null, null, null);
-- ----------------------------

View File

@ -37,7 +37,6 @@ public class SmsCouponServiceImpl implements SmsCouponService {
@Override
public int add(SmsCouponParam couponParam) {
//插入优惠券表
// TODO: 2018/8/28 生成优惠券条码
int count = couponMapper.insert(couponParam);
//插入优惠券和商品关系表
if(couponParam.getUseType().equals(2)){

View File

@ -261,6 +261,13 @@ public class OmsOrder implements Serializable {
*/
private Integer deleteStatus;
/**
* 下单时使用的积分
*
* @mbggenerated
*/
private Integer useIntegration;
private static final long serialVersionUID = 1L;
public Long getId() {
@ -567,6 +574,14 @@ public class OmsOrder implements Serializable {
this.deleteStatus = deleteStatus;
}
public Integer getUseIntegration() {
return useIntegration;
}
public void setUseIntegration(Integer useIntegration) {
this.useIntegration = useIntegration;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
@ -611,6 +626,7 @@ public class OmsOrder implements Serializable {
sb.append(", note=").append(note);
sb.append(", confirmStatus=").append(confirmStatus);
sb.append(", deleteStatus=").append(deleteStatus);
sb.append(", useIntegration=").append(useIntegration);
sb.append(", serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();

View File

@ -2555,6 +2555,66 @@ public class OmsOrderExample {
addCriterion("delete_status not between", value1, value2, "deleteStatus");
return (Criteria) this;
}
public Criteria andUseIntegrationIsNull() {
addCriterion("use_integration is null");
return (Criteria) this;
}
public Criteria andUseIntegrationIsNotNull() {
addCriterion("use_integration is not null");
return (Criteria) this;
}
public Criteria andUseIntegrationEqualTo(Integer value) {
addCriterion("use_integration =", value, "useIntegration");
return (Criteria) this;
}
public Criteria andUseIntegrationNotEqualTo(Integer value) {
addCriterion("use_integration <>", value, "useIntegration");
return (Criteria) this;
}
public Criteria andUseIntegrationGreaterThan(Integer value) {
addCriterion("use_integration >", value, "useIntegration");
return (Criteria) this;
}
public Criteria andUseIntegrationGreaterThanOrEqualTo(Integer value) {
addCriterion("use_integration >=", value, "useIntegration");
return (Criteria) this;
}
public Criteria andUseIntegrationLessThan(Integer value) {
addCriterion("use_integration <", value, "useIntegration");
return (Criteria) this;
}
public Criteria andUseIntegrationLessThanOrEqualTo(Integer value) {
addCriterion("use_integration <=", value, "useIntegration");
return (Criteria) this;
}
public Criteria andUseIntegrationIn(List<Integer> values) {
addCriterion("use_integration in", values, "useIntegration");
return (Criteria) this;
}
public Criteria andUseIntegrationNotIn(List<Integer> values) {
addCriterion("use_integration not in", values, "useIntegration");
return (Criteria) this;
}
public Criteria andUseIntegrationBetween(Integer value1, Integer value2) {
addCriterion("use_integration between", value1, value2, "useIntegration");
return (Criteria) this;
}
public Criteria andUseIntegrationNotBetween(Integer value1, Integer value2) {
addCriterion("use_integration not between", value1, value2, "useIntegration");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -40,6 +40,7 @@
<result column="note" jdbcType="VARCHAR" property="note" />
<result column="confirm_status" jdbcType="INTEGER" property="confirmStatus" />
<result column="delete_status" jdbcType="INTEGER" property="deleteStatus" />
<result column="use_integration" jdbcType="INTEGER" property="useIntegration" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
@ -105,7 +106,8 @@
pay_type, source_type, status, order_type, delivery_company, delivery_sn, auto_confirm_day,
integration, growth, promotion_info, bill_type, bill_header, bill_content, bill_receiver_phone,
bill_receiver_email, receiver_name, receiver_phone, receiver_post_code, receiver_province,
receiver_city, receiver_region, receiver_detail_address, note, confirm_status, delete_status
receiver_city, receiver_region, receiver_detail_address, note, confirm_status, delete_status,
use_integration
</sql>
<select id="selectByExample" parameterType="com.macro.mall.model.OmsOrderExample" resultMap="BaseResultMap">
select
@ -153,7 +155,7 @@
receiver_name, receiver_phone, receiver_post_code,
receiver_province, receiver_city, receiver_region,
receiver_detail_address, note, confirm_status,
delete_status)
delete_status, use_integration)
values (#{memberId,jdbcType=BIGINT}, #{couponId,jdbcType=BIGINT}, #{orderSn,jdbcType=VARCHAR},
#{createTime,jdbcType=TIMESTAMP}, #{memberUsername,jdbcType=VARCHAR}, #{totalAmount,jdbcType=DECIMAL},
#{payAmount,jdbcType=DECIMAL}, #{freightAmount,jdbcType=DECIMAL}, #{promotionAmount,jdbcType=DECIMAL},
@ -166,7 +168,7 @@
#{receiverName,jdbcType=VARCHAR}, #{receiverPhone,jdbcType=VARCHAR}, #{receiverPostCode,jdbcType=VARCHAR},
#{receiverProvince,jdbcType=VARCHAR}, #{receiverCity,jdbcType=VARCHAR}, #{receiverRegion,jdbcType=VARCHAR},
#{receiverDetailAddress,jdbcType=VARCHAR}, #{note,jdbcType=VARCHAR}, #{confirmStatus,jdbcType=INTEGER},
#{deleteStatus,jdbcType=INTEGER})
#{deleteStatus,jdbcType=INTEGER}, #{useIntegration,jdbcType=INTEGER})
</insert>
<insert id="insertSelective" parameterType="com.macro.mall.model.OmsOrder">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
@ -285,6 +287,9 @@
<if test="deleteStatus != null">
delete_status,
</if>
<if test="useIntegration != null">
use_integration,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="memberId != null">
@ -398,6 +403,9 @@
<if test="deleteStatus != null">
#{deleteStatus,jdbcType=INTEGER},
</if>
<if test="useIntegration != null">
#{useIntegration,jdbcType=INTEGER},
</if>
</trim>
</insert>
<select id="countByExample" parameterType="com.macro.mall.model.OmsOrderExample" resultType="java.lang.Integer">
@ -523,6 +531,9 @@
<if test="record.deleteStatus != null">
delete_status = #{record.deleteStatus,jdbcType=INTEGER},
</if>
<if test="record.useIntegration != null">
use_integration = #{record.useIntegration,jdbcType=INTEGER},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
@ -567,7 +578,8 @@
receiver_detail_address = #{record.receiverDetailAddress,jdbcType=VARCHAR},
note = #{record.note,jdbcType=VARCHAR},
confirm_status = #{record.confirmStatus,jdbcType=INTEGER},
delete_status = #{record.deleteStatus,jdbcType=INTEGER}
delete_status = #{record.deleteStatus,jdbcType=INTEGER},
use_integration = #{record.useIntegration,jdbcType=INTEGER}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -686,6 +698,9 @@
<if test="deleteStatus != null">
delete_status = #{deleteStatus,jdbcType=INTEGER},
</if>
<if test="useIntegration != null">
use_integration = #{useIntegration,jdbcType=INTEGER},
</if>
</set>
where id = #{id,jdbcType=BIGINT}
</update>
@ -727,7 +742,8 @@
receiver_detail_address = #{receiverDetailAddress,jdbcType=VARCHAR},
note = #{note,jdbcType=VARCHAR},
confirm_status = #{confirmStatus,jdbcType=INTEGER},
delete_status = #{deleteStatus,jdbcType=INTEGER}
delete_status = #{deleteStatus,jdbcType=INTEGER},
use_integration = #{useIntegration,jdbcType=INTEGER}
where id = #{id,jdbcType=BIGINT}
</update>
</mapper>

View File

@ -1,7 +1,10 @@
package com.macro.mall.portal.component;
import com.macro.mall.portal.domain.CommonResult;
import com.macro.mall.portal.service.OmsPortalOrderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@ -12,13 +15,16 @@ import org.springframework.stereotype.Component;
@Component
public class OrderTimeOutCancelTask {
private Logger LOGGER =LoggerFactory.getLogger(OrderTimeOutCancelTask.class);
@Autowired
private OmsPortalOrderService portalOrderService;
/**
* cron表达式Seconds Minutes Hours DayofMonth Month DayofWeek [Year]
* 每10分钟扫描一次扫描超时时间*2时间内所下订单如果没支付则取消该订单
* 每10分钟扫描一次扫描设定超时时间之前下的订单如果没支付则取消该订单
*/
@Scheduled(cron = "0 0/10 * ? * ?")
private void cancelTimeOutOrder(){
LOGGER.info("取消订单并根据sku编号释放锁定库存");
CommonResult result = portalOrderService.cancelTimeOutOrder();
LOGGER.info("取消订单并根据sku编号释放锁定库存:{}",result);
}
}

View File

@ -8,10 +8,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
/**
* 订单管理Controller
@ -37,4 +34,17 @@ public class OmsPortalOrderController {
public Object generateOrder(@RequestBody OrderParam orderParam){
return portalOrderService.generateOrder(orderParam);
}
@ApiOperation("支付成功的回调")
@RequestMapping(value = "/paySuccess",method = RequestMethod.POST)
@ResponseBody
public Object paySuccess(@RequestParam Long orderId){
return portalOrderService.paySuccess(orderId);
}
@ApiOperation("自动取消超时订单")
@RequestMapping(value = "/cancelTimeOutOrder",method = RequestMethod.POST)
@ResponseBody
public Object cancelTimeOutOrder(){
return portalOrderService.cancelTimeOutOrder();
}
}

View File

@ -0,0 +1,40 @@
package com.macro.mall.portal.dao;
import com.macro.mall.model.OmsOrderItem;
import com.macro.mall.portal.domain.OmsOrderDetail;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 前台订单自定义Dao
* Created by macro on 2018/9/4.
*/
public interface PortalOrderDao {
/**
* 获取订单及下单商品详情
*/
OmsOrderDetail getDetail(@Param("orderId") Long orderId);
/**
* 修改 pms_sku_stock表的锁定库存及真实库存
*/
int updateSkuStock(@Param("itemList") List<OmsOrderItem> orderItemList);
/**
* 获取超时订单
* @param minute 超时时间
*/
List<OmsOrderDetail> getTimeOutOrders(@Param("minute") Integer minute);
/**
* 批量修改订单状态
*/
int updateOrderStatus(@Param("ids") List<Long> ids,@Param("status") Integer status);
/**
* 解除取消订单的库存锁定
*/
int releaseSkuStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
}

View File

@ -0,0 +1,22 @@
package com.macro.mall.portal.domain;
import com.macro.mall.model.OmsOrder;
import com.macro.mall.model.OmsOrderItem;
import java.util.List;
/**
* 包含订单商品信息的订单详情
* Created by macro on 2018/9/4.
*/
public class OmsOrderDetail extends OmsOrder {
private List<OmsOrderItem> orderItemList;
public List<OmsOrderItem> getOrderItemList() {
return orderItemList;
}
public void setOrderItemList(List<OmsOrderItem> orderItemList) {
this.orderItemList = orderItemList;
}
}

View File

@ -20,4 +20,16 @@ public interface OmsPortalOrderService {
*/
@Transactional
CommonResult generateOrder(OrderParam orderParam);
/**
* 支付成功后的回调
*/
@Transactional
CommonResult paySuccess(Long orderId);
/**
* 自动取消超时订单
*/
@Transactional
CommonResult cancelTimeOutOrder();
}

View File

@ -25,4 +25,11 @@ public interface RedisService {
* 删除数据
*/
void remove(String key);
/**
* 自增操作
* @param delta 自增步长
*/
Long increment(String key, long delta);
}

View File

@ -14,6 +14,11 @@ public interface UmsMemberService {
*/
UmsMember getByUsername(String username);
/**
* 根据会员编号获取会员
*/
UmsMember getById(Long id);
/**
* 用户注册
*/
@ -35,4 +40,9 @@ public interface UmsMemberService {
* 获取当前登录会员
*/
UmsMember getCurrentMember();
/**
* 根据会员id修改会员积分
*/
void updateIntegration(Long id,Integer integration);
}

View File

@ -1,20 +1,20 @@
package com.macro.mall.portal.service.impl;
import com.macro.mall.mapper.OmsOrderMapper;
import com.macro.mall.mapper.PmsSkuStockMapper;
import com.macro.mall.mapper.SmsCouponHistoryMapper;
import com.macro.mall.mapper.UmsIntegrationConsumeSettingMapper;
import com.macro.mall.mapper.*;
import com.macro.mall.model.*;
import com.macro.mall.portal.dao.PortalOrderDao;
import com.macro.mall.portal.dao.PortalOrderItemDao;
import com.macro.mall.portal.dao.SmsCouponHistoryDao;
import com.macro.mall.portal.domain.*;
import com.macro.mall.portal.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@ -43,7 +43,14 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
private PortalOrderItemDao orderItemDao;
@Autowired
private SmsCouponHistoryMapper couponHistoryMapper;
@Autowired
private RedisService redisService;
@Value("${redis.key.prefix.orderId}")
private String REDIS_KEY_PREFIX_ORDER_ID;
@Autowired
private PortalOrderDao portalOrderDao;
@Autowired
private OmsOrderSettingMapper orderSettingMapper;
@Override
public ConfirmOrderResult generateConfirmOrder() {
ConfirmOrderResult result = new ConfirmOrderResult();
@ -184,15 +191,25 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
order.setIntegration(calcGifIntegration(orderItemList));
//计算赠送成长值
order.setGrowth(calcGiftGrowth(orderItemList));
// TODO: 2018/9/3 order_sn,bill_*,delivery_*
//生成订单号
order.setOrderSn(generateOrderSn(order));
// TODO: 2018/9/3 bill_*,delivery_*
//插入order表和order_item表
orderMapper.insert(order);
for (OmsOrderItem orderItem : orderItemList) {
orderItem.setOrderId(order.getId());
orderItem.setOrderSn(order.getOrderSn());
}
orderItemDao.insertList(orderItemList);
//更新优惠券使用状态
updateCouponStatus(orderParam.getCouponId(),currentMember);
//如使用优惠券更新优惠券使用状态
if(orderParam.getCouponId()!=null){
updateCouponStatus(orderParam.getCouponId(),currentMember.getId(),1);
}
//如使用积分需要扣除积分
if(orderParam.getUseIntegration()!=null){
order.setUseIntegration(orderParam.getUseIntegration());
memberService.updateIntegration(currentMember.getId(),currentMember.getIntegration()-orderParam.getUseIntegration());
}
//删除购物车中的下单商品
deleteCartItemList(cartPromotionItemList,currentMember);
Map<String,Object> result = new HashMap<>();
@ -201,6 +218,67 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
return new CommonResult().success("下单成功", result);
}
@Override
public CommonResult paySuccess(Long orderId) {
//修改订单支付状态
OmsOrder order = new OmsOrder();
order.setId(orderId);
order.setStatus(1);
orderMapper.updateByPrimaryKeySelective(order);
//恢复所有下单商品的锁定库存扣减真实库存
OmsOrderDetail orderDetail = portalOrderDao.getDetail(orderId);
int count = portalOrderDao.updateSkuStock(orderDetail.getOrderItemList());
return new CommonResult().success("支付成功",count);
}
@Override
public CommonResult cancelTimeOutOrder() {
OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
//查询超时未支付的订单及订单详情
List<OmsOrderDetail> timeOutOrders = portalOrderDao.getTimeOutOrders(orderSetting.getNormalOrderOvertime());
if(CollectionUtils.isEmpty(timeOutOrders)){
return new CommonResult().failed("暂无超时订单");
}
//修改订单状态为交易取消
List<Long> ids = new ArrayList<>();
for (OmsOrderDetail timeOutOrder : timeOutOrders) {
ids.add(timeOutOrder.getId());
}
portalOrderDao.updateOrderStatus(ids,4);
for (OmsOrderDetail timeOutOrder : timeOutOrders) {
//解除订单商品库存锁定
portalOrderDao.releaseSkuStockLock(timeOutOrder.getOrderItemList());
//修改优惠券使用状态
updateCouponStatus(timeOutOrder.getCouponId(),timeOutOrder.getMemberId(),0);
//返还使用积分
if(timeOutOrder.getUseIntegration()!=null){
UmsMember member = memberService.getById(timeOutOrder.getMemberId());
memberService.updateIntegration(timeOutOrder.getMemberId(),member.getIntegration()+timeOutOrder.getUseIntegration());
}
}
return new CommonResult().success(null);
}
/**
* 生成18位订单编号:8位日期+2位平台号码+2位支付方式+6位以上自增id
*/
private String generateOrderSn(OmsOrder order) {
StringBuilder sb = new StringBuilder();
String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
String key = REDIS_KEY_PREFIX_ORDER_ID + date;
Long increment = redisService.increment(key, 1);
sb.append(date);
sb.append(String.format("%02d",order.getSourceType()));
sb.append(String.format("%02d",order.getPayType()));
String incrementStr = increment.toString();
if(incrementStr.length()<=6){
sb.append(String.format("%06d",increment));
}else{
sb.append(incrementStr);
}
return sb.toString();
}
/**
* 删除下单商品的购物车信息
*/
@ -235,22 +313,22 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
}
/**
* 更新sms_coupon_history的可用信息
* 将优惠券信息更改为指定状态
* @param couponId 优惠券id
* @param currentMember 当前会员
* @param memberId 会员id
* @param useStatus 0->未使用1->已使用
*/
private void updateCouponStatus(Long couponId, UmsMember currentMember) {
SmsCouponHistory record = new SmsCouponHistory();
record.setUseStatus(1);
//查询第一张未使用优惠券
private void updateCouponStatus(Long couponId, Long memberId,Integer useStatus) {
if(couponId==null)return;
//查询第一张优惠券
SmsCouponHistoryExample example = new SmsCouponHistoryExample();
example.createCriteria().andMemberIdEqualTo(currentMember.getId())
.andCouponIdEqualTo(couponId).andUseStatusEqualTo(0);
example.createCriteria().andMemberIdEqualTo(memberId)
.andCouponIdEqualTo(couponId).andUseStatusEqualTo(useStatus==0?1:0);
List<SmsCouponHistory> couponHistoryList = couponHistoryMapper.selectByExample(example);
if(!CollectionUtils.isEmpty(couponHistoryList)){
SmsCouponHistory couponHistory = couponHistoryList.get(0);
couponHistory.setUseTime(new Date());
couponHistory.setUseStatus(1);
couponHistory.setUseStatus(useStatus);
couponHistoryMapper.updateByPrimaryKeySelective(couponHistory);
}
}

View File

@ -35,4 +35,9 @@ public class RedisServiceImpl implements RedisService {
public void remove(String key) {
stringRedisTemplate.delete(key);
}
@Override
public Long increment(String key, long delta) {
return stringRedisTemplate.opsForValue().increment(key,delta);
}
}

View File

@ -13,9 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
/**
* 会员优惠券管理Service实现类
@ -56,7 +54,7 @@ public class UmsMemberCouponServiceImpl implements UmsMemberCouponService {
//生成领取优惠券历史
SmsCouponHistory couponHistory = new SmsCouponHistory();
couponHistory.setCouponId(couponId);
couponHistory.setCouponCode(coupon.getCode());
couponHistory.setCouponCode(generateCouponCode(currentMember.getId()));
couponHistory.setCreateTime(now);
couponHistory.setMemberId(currentMember.getId());
couponHistory.setMemberNickname(currentMember.getNickname());
@ -72,6 +70,26 @@ public class UmsMemberCouponServiceImpl implements UmsMemberCouponService {
return new CommonResult().success("领取成功",null);
}
/**
* 16位优惠码生成时间戳后8位+4位随机数+用户id后4位
*/
private String generateCouponCode(Long memberId) {
StringBuilder sb = new StringBuilder();
Long currentTimeMillis = System.currentTimeMillis();
String timeMillisStr = currentTimeMillis.toString();
sb.append(timeMillisStr.substring(timeMillisStr.length() - 8));
for (int i = 0; i < 4; i++) {
sb.append(new Random().nextInt(10));
}
String memberIdStr = memberId.toString();
if (memberIdStr.length() <= 4) {
sb.append(String.format("%04d", memberId));
} else {
sb.append(memberIdStr.substring(memberIdStr.length()-4));
}
return sb.toString();
}
@Override
public List<SmsCouponHistory> list(Integer useStatus) {
UmsMember currentMember = memberService.getCurrentMember();

View File

@ -54,6 +54,11 @@ public class UmsMemberServiceImpl implements UmsMemberService {
return null;
}
@Override
public UmsMember getById(Long id) {
return memberMapper.selectByPrimaryKey(id);
}
@Override
public CommonResult register(String username, String password, String telephone, String authCode) {
//验证验证码
@ -125,6 +130,15 @@ public class UmsMemberServiceImpl implements UmsMemberService {
MemberDetails memberDetails = (MemberDetails) auth.getPrincipal();
return memberDetails.getUmsMember();
}
@Override
public void updateIntegration(Long id, Integer integration) {
UmsMember record=new UmsMember();
record.setId(id);
record.setIntegration(integration);
memberMapper.updateByPrimaryKeySelective(record);
}
//对输入的验证码进行校验
private boolean verifyAuthCode(String authCode, String telephone){
if(StringUtils.isEmpty(authCode)){

View File

@ -11,6 +11,7 @@ mybatis.mapper-locations=classpath:dao/*.xml,classpath*:com/**/mapper/*.xml
#===redis custom key start===
redis.key.prefix.authCode=portal:authCode:
redis.key.prefix.orderId=portal:orderId:
authCode.expire.seconds=90
#===redis custom key end===

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.macro.mall.portal.dao.PortalOrderDao">
<resultMap id="orderDetailMap" type="com.macro.mall.portal.domain.OmsOrderDetail"
extends="com.macro.mall.mapper.OmsOrderMapper.BaseResultMap">
<collection property="orderItemList" columnPrefix="ot_"
resultMap="com.macro.mall.mapper.OmsOrderItemMapper.BaseResultMap">
</collection>
</resultMap>
<select id="getDetail" resultMap="orderDetailMap">
SELECT
o.id,
o.order_sn,
o.coupon_id,
o.integration,
o.member_id,
ot.id ot_id,
ot.product_name ot_product_name,
ot.product_sku_id ot_product_sku_id,
ot.product_sku_code ot_product_sku_code,
ot.product_quantity ot_product_quantity
FROM
oms_order o
LEFT JOIN oms_order_item ot ON o.id = ot.order_id
WHERE
o.id = #{orderId}
</select>
<select id="getTimeOutOrders" resultMap="orderDetailMap">
SELECT
o.id,
o.order_sn,
o.coupon_id,
o.integration,
o.member_id,
o.use_integration,
ot.id ot_id,
ot.product_name ot_product_name,
ot.product_sku_id ot_product_sku_id,
ot.product_sku_code ot_product_sku_code,
ot.product_quantity ot_product_quantity
FROM
oms_order o
LEFT JOIN oms_order_item ot ON o.id = ot.order_id
WHERE
o.status = 0
AND o.create_time &lt; date_add(NOW(), INTERVAL -#{minute} MINUTE);
</select>
<update id="updateSkuStock">
UPDATE pms_sku_stock
SET
stock = CASE id
<foreach collection="itemList" item="item">
WHEN #{item.productSkuId} THEN stock - #{item.productQuantity}
</foreach>
END,
lock_stock = CASE id
<foreach collection="itemList" item="item">
WHEN #{item.productSkuId} THEN lock_stock - #{item.productQuantity}
</foreach>
END
WHERE
id IN
<foreach collection="itemList" item="item" separator="," open="(" close=")">
#{item.productSkuId}
</foreach>
</update>
<update id="updateOrderStatus">
update oms_order
set status=#{status}
where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</update>
<update id="releaseSkuStockLock">
UPDATE pms_sku_stock
SET
lock_stock = CASE id
<foreach collection="itemList" item="item">
WHEN #{item.productSkuId} THEN lock_stock - #{item.productQuantity}
</foreach>
END
WHERE
id IN
<foreach collection="itemList" item="item" separator="," open="(" close=")">
#{item.productSkuId}
</foreach>
</update>
</mapper>