diff --git a/src/main/java/cn/chjyj/szwh/controller/api/OrderController.java b/src/main/java/cn/chjyj/szwh/controller/api/OrderController.java index 0ad2312..07aaf96 100644 --- a/src/main/java/cn/chjyj/szwh/controller/api/OrderController.java +++ b/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 retmap = orderService.createOrder(userIsli,goodsIsli,iuyears); + Map 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); //订单总费用 diff --git a/src/main/java/cn/chjyj/szwh/service/OrderService.java b/src/main/java/cn/chjyj/szwh/service/OrderService.java index 4bfdc4c..20ee651 100644 --- a/src/main/java/cn/chjyj/szwh/service/OrderService.java +++ b/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 createOrder(String userIsli,String goodsIsli,Integer userYears); + Map createOrder(String userIsli, JSONArray jsonArray); } diff --git a/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java b/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java index b84c833..a8e50f0 100644 --- a/src/main/java/cn/chjyj/szwh/service/impl/OrderServiceImpl.java +++ b/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) { - return null; + 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 createOrder(String userIsli, String goodsIsli, Integer userYears) { + public Map createOrder(String userIsli, JSONArray jsonArray) { Map 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); diff --git a/src/main/java/cn/chjyj/szwh/utils/SzOrderUtils.java b/src/main/java/cn/chjyj/szwh/utils/SzOrderUtils.java index 64f63ee..e3f439d 100644 --- a/src/main/java/cn/chjyj/szwh/utils/SzOrderUtils.java +++ b/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 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; + } } diff --git a/src/main/java/cn/chjyj/szwh/vo/OrderDetailVo.java b/src/main/java/cn/chjyj/szwh/vo/OrderDetailVo.java index f819031..ae2e11f 100644 --- a/src/main/java/cn/chjyj/szwh/vo/OrderDetailVo.java +++ b/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; + } }