Browse Source

订单逻辑调整

master
xyiege 3 years ago
parent
commit
e2dddaae07
  1. 39
      src/main/java/cn/chjyj/szwh/controller/api/OrderController.java
  2. 6
      src/main/java/cn/chjyj/szwh/service/OrderService.java
  3. 187
      src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java
  4. 64
      src/main/java/cn/chjyj/szwh/utils/SzOrderUtils.java
  5. 10
      src/main/java/cn/chjyj/szwh/vo/OrderDetailVo.java

39
src/main/java/cn/chjyj/szwh/controller/api/OrderController.java

@ -8,6 +8,7 @@ import cn.chjyj.szwh.utils.RedisUtil;
import cn.chjyj.szwh.utils.RedisUtils;
import cn.chjyj.szwh.utils.SzOrderUtils;
import cn.chjyj.szwh.utils.SzwhApiUtils;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
@ -129,33 +130,29 @@ public class OrderController extends BaseController {
/**
* 创建订单
* @param request 接收到的请求
* 接收和处理json数组
* @param reqstr 接收到的请求
* @return
*/
@RequestMapping("/createOrder")
public JSONObject createOrder(HttpServletRequest request,@RequestBody String reqstr) {
log.info("createOrder:"+reqstr);
//goods_isli=010007-00000000347399999999-2
// &is_car=2&user_isli=899998-000000001640-3
// &use_years=99&random=0.23348573938145045
// todo 对参数进行非空判断
public JSONObject createOrder(@RequestBody String reqstr) {
/**
* {"appkey":"0acdbb709ee95707","goods":[{"goods_isli":"010007-00000000349999999999-2","use_years":"1"}],
* "timestamp":"1667283296","user_isli":"899998-000000001640-3"}
*/
long start = System.currentTimeMillis();
// 商品编号,逗号分隔
String goodsIsli=request.getParameter("goods_isli");
// 是否在购物车
String isCar = request.getParameter("is_car");
// //用户购买年限,逗号分隔
String userYears = request.getParameter("user_years");
Integer iuyears=StringUtils.isNotBlank(userYears)?Integer.valueOf(userYears):1;
// // 用户编码
String userIsli= request.getParameter("user_isli");
// get http_sign
String httpSign = request.getHeader("HTTP_SIGN");
log.info("createOrder:"+reqstr);
JSONObject request = JSONObject.parseObject(reqstr);
// 抽取出goods 节点,存入jsonArray
JSONArray jGoodsArray = request.getJSONArray("goods");
//
String userIsli = request.getString("user_isli");
//redis chk order flag
String redisKey = "createOrder_"+userIsli;
Object redisCon = RedisUtil.get(redisKey);
Map<String,Object> retmap = orderService.createOrder(userIsli,goodsIsli,iuyears);
Map<String,Object> retmap = orderService.createOrder(userIsli,jGoodsArray);
if(redisCon!=null){
jsonObject.put("code","error");
jsonObject.put("msg","请勿重复提交");
@ -165,6 +162,8 @@ public class OrderController extends BaseController {
}
long end =System.currentTimeMillis();
long howuse = (end-start)/1000l;
jsonObject.put("data",retmap);
jsonObject.put("msg","成功");
jsonObject.put("useTime",howuse);
return jsonObject;
}
@ -223,7 +222,7 @@ public class OrderController extends BaseController {
// 判断当前订单是否存在问题
Order order=new Order();
//校验订单信息合法
SzOrderUtils.checkOrder(goods,goodsDetail,null,userIsli);
SzOrderUtils.checkOrder(goods,goodsDetail,userIsli);
//服务费
BigDecimal serviceCharge=new BigDecimal(0.00);
//订单总费用

6
src/main/java/cn/chjyj/szwh/service/OrderService.java

@ -2,6 +2,7 @@ package cn.chjyj.szwh.service;
import cn.chjyj.szwh.bean.Goods;
import cn.chjyj.szwh.bean.Order;
import com.alibaba.fastjson2.JSONArray;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -105,9 +106,8 @@ public interface OrderService {
/**
* 创建订单
* @param userIsli
* @param goodsIsli
* @param userYears
* @param jsonArray json数组
* @return
*/
Map<String,Object> createOrder(String userIsli,String goodsIsli,Integer userYears);
Map<String,Object> createOrder(String userIsli, JSONArray jsonArray);
}

187
src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java

@ -5,9 +5,7 @@ import cn.chjyj.szwh.constant.ChConstant;
import cn.chjyj.szwh.exception.ChException;
import cn.chjyj.szwh.mapper.*;
import cn.chjyj.szwh.service.OrderService;
import cn.chjyj.szwh.utils.RedisUtil;
import cn.chjyj.szwh.utils.RedisUtils;
import cn.chjyj.szwh.utils.SzFileUtils;
import cn.chjyj.szwh.utils.*;
import cn.chjyj.szwh.vo.OrderDetailVo;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
@ -51,6 +49,8 @@ public class OrderServiceImpl implements OrderService {
private GoodsSourceMapper goodsSourceMapper;
@Autowired
private GoodsMapper goodsMapper;
@Autowired
private GoodsDetailMapper goodsDetailMapper;
//分账相关
@Autowired
@ -58,6 +58,13 @@ public class OrderServiceImpl implements OrderService {
@Autowired
private AccountRatioDetailMapper accountRatioDetailMapper;
//用户账单
@Autowired
private UserAccountBillMapper userAccountBillMapper;
//操作日志
@Autowired
private OperationLogMapper operationLogMapper;
// 声明式事物\
@Autowired
private DataSourceTransactionManager transactionManager;
@ -521,16 +528,164 @@ public class OrderServiceImpl implements OrderService {
return orderMapper.addOrder(order);
}
/**
* todo
* @param userIsli
* @param goodsIsli
* @param userYears
* @return
*/
@Override
public String buyFindGoods(String userIsli, String goodsIsli, int userYears) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Goods goods = goodsMapper.getGoodsByIsli(goodsIsli);
if(goods==null){
log.error("create order error!"+goodsIsli+"");
return null;
}
// goods detail
GoodsDetail goodsDetail = goodsDetailMapper.getGoodsDetailBygid(goods.getGoodsDetailId());
int count = userYears;
if(goodsDetail.getGoodsEntrust()==1){
count=1;
}
// ratio setting
AccountRatioSetting accountRatioSetting = accountRatioSettingMapper.getUsingAccRatioSetting();
AccountRatioDetail accountRatioDetail = accountRatioDetailMapper.getAccRatioDetailByIdRole(accountRatioSetting.getId(),2);
// 根据用户编号、商品编号查询是否存在订单
// check has order infomation
Map oqmap =new HashMap();
oqmap.put("o.buy_islicode",userIsli);
oqmap.put("od.goods_islicode",goodsIsli);
OrderDetailVo orderDetailVo = orderMapper.getOrderDetailVOByMap(oqmap);
// 检查订单支付情况
if(orderDetailVo!=null) {
if (orderDetailVo.getStatus() == 1) {
throw new ChException("您的待付款订单中有标的:" + goods.getGoodsIslicode() + ",请勿重复下单", 400);
} else if (orderDetailVo.getStatus() == 2) {
throw new ChException("您的未完成订单中有标的:" + goods.getGoodsIslicode() + ",请勿重复下单", 400);
} else {
throw new ChException("您的已完成订单中有标的:" + goods.getGoodsIslicode() + ",请勿重复下单", 400);
}
}
// 判断当前订单是否存在问题
Order order=new Order();
//校验订单信息合法
SzOrderUtils.checkOrder(goods,goodsDetail,userIsli);
// 计算服务费等 委托方总金额
BigDecimal serviceCharge =new BigDecimal("0");
BigDecimal totalMoney= new BigDecimal("0");
int status=0;//订单状态
int payStatus=0;//支付状态
// 付费商品
if(goodsDetail.getChargesType()==2){
if(accountRatioDetail.getCalculate()==1){
Map calmap =SzOrderUtils.calOrderServiceFee(accountRatioDetail,userYears,goodsDetail.getPrice(),goodsDetail.getEarnestMoney());
serviceCharge = (BigDecimal) calmap.get("service_charge");
totalMoney = (BigDecimal) calmap.get("total_money");
}else{
//固定金额
// 购买数量*单机+固定费额
serviceCharge = new BigDecimal(count).multiply(goodsDetail.getPrice())
.add(accountRatioDetail.getAmount());
}
//总的额度
totalMoney = new BigDecimal(count).multiply(goodsDetail.getPrice())
.add(serviceCharge)
.add(goodsDetail.getEarnestMoney());
status=1;
payStatus=1;
}else{
// 免费
serviceCharge =new BigDecimal(0.00);
totalMoney = new BigDecimal(0.00);
status=2;
payStatus=2; //已支付
}
// 订单编号
String batchCode = SzOrderUtils.createOrderBatchcode();
// 增加到订单商品详情
OrderGoodsDetail orderGoodsDetail = SzOrderUtils.mkOrderGoodsDetail(goodsDetail,batchCode,count,userYears);
// 补充其他未添加的属性
orderGoodsDetail.setEntrustIslicode(goods.getUserIslicode());
// 订单服务费
orderGoodsDetail.setServiceCharge(serviceCharge);
//总金额
orderGoodsDetail.setMoney(totalMoney);
orderGoodsDetail.setIslicode(goods.getIsLicode());
// 查找用户
OrderUser orderUser = orderUserMapper.getUserOrder(batchCode,goods.getIsLicode());
int userId=0;
if(orderUser!=null){
userId = orderUser.getId();
}else{
// 获取远程用户信息
JSONObject userjson = SzwhApiUtils.getApiUser(userIsli);
if(StringUtils.isBlank(userjson.getString("data"))){
log.error("未查询到用户信息,下单失败");
return null;
//throw new ChException("未查询到用户信息,下单失败",400);
}
//添加用户
OrderUser odu =SzOrderUtils.mkOrderUser(batchCode,userjson,0);
orderUserMapper.addOrderUser(odu);
userId = odu.getId();
}
// 订单实体
order.setBatchcode(batchCode);
order.setUserId(userId);
order.setBuyIslicode(userIsli);
order.setTotalServiceCharge(serviceCharge);
order.setTotalMoney(totalMoney);
order.setType(1);
order.setStatus(status);
order.setPayStatus(payStatus);
// 分配设置编号
order.setAccountRatioId(accountRatioSetting.getId());
//如果是付费
if(goodsDetail.getChargesType()==1){
order.setPaymenttime(new Date());
}
order.setCreatetime(new Date());
// 订单信息入库
int ret = orderMapper.addOrder(order);
if(ret==1){
//if(status==2){
// 更新订单信息
//payService.payFinishOperate(batchCode);
// }
// 用户账单
UserAccountBill userAccountBill = new UserAccountBill();
userAccountBill.setUserIsli(userIsli);
userAccountBill.setBatchcode(batchCode);
userAccountBill.setOrderUserId(userId);
userAccountBill.setServiceCharge(serviceCharge);
userAccountBill.setThatdayBuyMoney(totalMoney);
// save user's bill
userAccountBillMapper.addUserAccBill(userAccountBill);
//调整库存
if(goodsDetail.getGoodsEntrust()==1 || goodsDetail.getContractualPeriod()==2 && goodsDetail.getGoodsEntrust()!=2){
int gdret = goodsDetailMapper.decGoodsDetailStock(goodsDetail.getId());
if(gdret==1){
String status_Str="";
// 更新goods 状态
Map gmap = new HashMap();
gmap.put("goods_status", status);
if(goodsDetail.getGoodsEntrust() ==1){
goodsMapper..changeGoodsStatus(5,goods.getId());
status_Str="暂停";
}else {
goodsService.changeGoodsStatus(2,goods.getId());
status_Str="下架";
}
//更新订单用户状态信息
String buyUserName = orderUser.getName();
OperationLog oplog =new OperationLog();
oplog.setType("goods");
oplog.setLogid(goods.getId());
oplog.setMessage(sdf.format(new Date())+"用户"+buyUserName+"下单,"+status_Str+"该委托标的");
operationLogMapper.addLog(oplog);
return batchCode;
}else{
throw new ChException("标的已卖完",400);
}
}
}
return batchCode;
}
/**
@ -617,14 +772,24 @@ public class OrderServiceImpl implements OrderService {
return outmap;
}
/**
* 创建订单实现方法
* @param userIsli
* @param jsonArray json数组
* @return
*/
@Override
public Map<String, Object> createOrder(String userIsli, String goodsIsli, Integer userYears) {
public Map<String, Object> createOrder(String userIsli, JSONArray jsonArray) {
Map<String,Object> retmap = new HashMap<>();
User user = userMapper.getUserByIsli(userIsli);
if(user==null){
retmap.put("code","error");
retmap.put("msg","用户不存在");
}
if(jsonArray.size()==1){
JSONObject tmpgjson = jsonArray.getJSONObject(0);
String batchcode = buyFindGoods(userIsli,tmpgjson.getString("goods_islid"))
}
String ureidsKey="car_"+userIsli;
//查询购物车
Object shopCar = RedisUtil.get(ureidsKey);

64
src/main/java/cn/chjyj/szwh/utils/SzOrderUtils.java

@ -8,11 +8,10 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.*;
public class SzOrderUtils {
private static Log log = LogFactory.getLog(SzOrderUtils.class);
@ -65,11 +64,10 @@ public class SzOrderUtils {
* 检查下单过程中的异常信息
* @param goods
* @param goodsDetail
* @param order
* @param use_isli
* @return
*/
public static boolean checkOrder(Goods goods, GoodsDetail goodsDetail, Order order,String use_isli){
public static boolean checkOrder(Goods goods, GoodsDetail goodsDetail,String use_isli){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 非工作时间购买
Calendar calendar= Calendar.getInstance();
@ -95,16 +93,6 @@ public class SzOrderUtils {
throw new ChException("标的委托已结束,标的ISLI标识码:"+goods.getGoodsIslicode(), 400);
}
}
// 检查订单支付情况
if(order!=null) {
if (order.getStatus() == 1) {
throw new ChException("您的待付款订单中有标的:" + goods.getGoodsIslicode() + ",请勿重复下单", 400);
} else if (order.getStatus() == 2) {
throw new ChException("您的未完成订单中有标的:" + goods.getGoodsIslicode() + ",请勿重复下单", 400);
} else {
throw new ChException("您的已完成订单中有标的:" + goods.getGoodsIslicode() + ",请勿重复下单", 400);
}
}
return true;
}
/**
@ -214,4 +202,50 @@ public class SzOrderUtils {
String batcode = ntime+""+subRand;
return batcode;
}
/**
* 计算订单的服务费总价
* @param accountRatioDetail 分配详情
* @param count 年限
* @param price 单价
* @param earnestMoney 商品保证金
* @return
*/
public static Map<String,Object> calOrderServiceFee(AccountRatioDetail accountRatioDetail,int count,
BigDecimal price,BigDecimal earnestMoney){
Map retmap =new HashMap();
// 订单服务费
BigDecimal serviceCharge = new BigDecimal("0.00");
// 订单总价
BigDecimal totalMoney = new BigDecimal("0.00");
if (accountRatioDetail.getCalculate() == 1) {
//rate 小于等于0
if(accountRatioDetail.getRatio().compareTo(new BigDecimal(0))!=1){
// 服务费0
serviceCharge = new BigDecimal("0");
}else{
// 购买数量* 单价*(分配比例/100)
serviceCharge =new BigDecimal(count).multiply(price)
.multiply(accountRatioDetail.getRatio().divide(new BigDecimal(100)));
}
// 小于0或等于0
// if(accountRatioDetail.getRatio().compareTo(new BigDecimal("1"))==-1){
// BigDecimal rate = accountRatioDetail.getRatio()
// .divide(new BigDecimal("100"))
// .setScale(2, RoundingMode.HALF_UP);
// serviceCharge = new BigDecimal(count).multiply(price)
// .multiply(rate);
// }
} else {
serviceCharge = new BigDecimal(count).multiply(price)
.add(accountRatioDetail.getAmount());
}
totalMoney = new BigDecimal(count).multiply(price)
.add(serviceCharge)
.add(earnestMoney);
//
retmap.put("total_money",totalMoney);
retmap.put("service_charge",serviceCharge);
return retmap;
}
}

10
src/main/java/cn/chjyj/szwh/vo/OrderDetailVo.java

@ -29,6 +29,8 @@ public class OrderDetailVo {
private String money;
private String batchcode;
private String contract_code;
// 订单状态
private Integer status;
public String getGoods_image() {
return goods_image;
@ -213,4 +215,12 @@ public class OrderDetailVo {
public void setContract_code(String contract_code) {
this.contract_code = contract_code;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}

Loading…
Cancel
Save