package com.xzx.gc.shop.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.xzx.gc.common.constant.Constants; import com.xzx.gc.common.exception.RestException; import com.xzx.gc.common.utils.IdUtils; import com.xzx.gc.entity.*; import com.xzx.gc.shop.dto.*; import com.xzx.gc.shop.mapper.*; import com.xzx.gc.shop.vo.ExpressInfoVo; import com.xzx.gc.shop.vo.QueryOrderListVo; import com.xzx.gc.shop.vo.ViewOrderVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; @Service @Transactional @Slf4j public class OrderService { @Resource ScoreOrderMapper scoreOrderMapper; @Resource ScoreExpressInfoMapper scoreExpressInfoMapper; @Resource ScoreOrderDetailsMapper scoreOrderDetailsMapper; @Resource private AddressInfoMapper addressInfoMapper; @Autowired private AccountInfoMapper accountInfoMapper; @Autowired private ScoreGoodsStyleMapper scoreGoodsStyleMapper; @Autowired private ScoreGoodsSkuMapper scoreGoodsSkuMapper; @Autowired private ScoreGoodsMapper scoreGoodsMapper; @Autowired private ScoreDetailsMapper scoreDetailsMapper; @Autowired private IdUtils idUtils; public Map queryOrderList(QueryOrderListDto model) { String name = model.getName(); String orderNo = model.getOrderNo(); Integer status = model.getStatus() == null ? 0 : model.getStatus(); Date createdTimeStart = model.getCreatedTimeStart(); Date createdTimeEnd = model.getCreatedTimeEnd(); PageHelper.startPage(model.getPage(), model.getLimit()); List maps = scoreOrderMapper.queryOrderList(name,orderNo,status,createdTimeStart,createdTimeEnd); PageInfo pageInfo = new PageInfo(maps); int count = Convert.toInt(pageInfo.getTotal()); Map map = new HashMap<>(); map.put("data", maps); map.put("count", count); map.put("code", 0); return map; } public ViewOrderVo viewOrder(Long id) { ViewOrderVo viewOrderVo = new ViewOrderVo(); ScoreOrder scoreOrder = scoreOrderMapper.selectByPrimaryKey(id); if(ObjectUtil.isNotEmpty(scoreOrder)){ /** * 获取基本信息 * 获取物流信息 * 获取商品订单详情 */ ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); viewOrderVo = objectMapper.convertValue(scoreOrder, ViewOrderVo.class); // String voucherImg = viewOrderVo.getVoucherImg(); String voucherImg = scoreOrder.getVoucherImg(); List lists = StrUtil.splitTrim(voucherImg, ","); viewOrderVo.setVoucherImgs(lists); //2-待收货3-已收货4-已完成5-已评价,获取物流信息 Integer status = scoreOrder.getStatus() == null ? 0:scoreOrder.getStatus(); if(ScoreOrder.STATUS_DOING == status || ScoreOrder.STATUS_DONE == status || ScoreOrder.STATUS_ON == status || ScoreOrder.STATUS_EVALUATE == status){ Example exampleExpress = new Example(ScoreExpressInfo.class); Example.Criteria criteriaExpress = exampleExpress.createCriteria(); criteriaExpress.andEqualTo("orderId",id); ScoreExpressInfo scoreExpressInfo = scoreExpressInfoMapper.selectOneByExample(exampleExpress); ExpressInfoVo expressInfoVo = objectMapper.convertValue(scoreExpressInfo, ExpressInfoVo.class); viewOrderVo.setExpressInfoVo(expressInfoVo); } //订单详情 Example exampleDetails = new Example(ScoreOrderDetails.class); Example.Criteria criteriaDetails = exampleDetails.createCriteria(); criteriaDetails.andEqualTo("orderId",id); List scoreOrderDetails = scoreOrderDetailsMapper.selectByExample(exampleDetails); if(CollUtil.isNotEmpty(scoreOrderDetails)){ viewOrderVo.setScoreOrderDetails(scoreOrderDetails); } } return viewOrderVo; } public Long deliverGoods(DeliverGoodsDto model) { /** * 获取物流表的信息 * 更新物流信息 * 更新订单状态 */ Long id = model.getId(); Example exampleExpress = new Example(ScoreExpressInfo.class); Example.Criteria criteriaExpress = exampleExpress.createCriteria(); criteriaExpress.andEqualTo("orderId",id); ScoreExpressInfo scoreExpressInfo = scoreExpressInfoMapper.selectOneByExample(exampleExpress); if(ObjectUtil.isNotEmpty(scoreExpressInfo)){ scoreExpressInfo.setExpressNo(model.getExpressNo()); scoreExpressInfo.setExpressCom(model.getExpressCom()); scoreExpressInfoMapper.updateByPrimaryKeySelective(scoreExpressInfo); ScoreOrder scoreOrder = new ScoreOrder(); scoreOrder.setId(id); scoreOrder.setStatus(ScoreOrder.STATUS_ON); scoreOrderMapper.updateByPrimaryKeySelective(scoreOrder); } return id; } public Long insureOrder(InsureOrderDto model) { ScoreOrder scoreOrder = new ScoreOrder(); scoreOrder.setId(model.getId()); scoreOrder.setStatus(ScoreOrder.STATUS_DONE); scoreOrder.setVoucherImg(CollUtil.join(model.getVoucherImgs(),",")); scoreOrderMapper.updateByPrimaryKeySelective(scoreOrder); return scoreOrder.getId(); } public void addOrder(AddGoodsOrderDto addGoodsOrderDto) { ScoreGoodsStyle style = scoreGoodsStyleMapper.selectByPrimaryKey(addGoodsOrderDto.getStyleId()); ScoreGoodsSku sku = scoreGoodsSkuMapper.selectByPrimaryKey(addGoodsOrderDto.getSkuId()); ScoreGoods goods = scoreGoodsMapper.selectByPrimaryKey(style.getGoodsId()); if (goods == null || ScoreGoods.ISSALE_NO.equals(goods.getIsSale())) { throw new RestException(-3, "商品不存在或已下架"); } if (ScoreGoods.ISQG_YES.equals(goods.getIsQg())) { if (new Date().before(goods.getQgStartTime())) { throw new RestException(-3, "抢购未开始"); } if (new Date().after(goods.getQgEndTime())) { throw new RestException(-3, "抢购已结束"); } } AccountInfo accountInfo = accountInfoMapper.selectAccountInfoByUserId(addGoodsOrderDto.getUserId()); if (accountInfo.getCollectScore() == null) { throw new RestException(-3, "积分不足"); } BigDecimal totalPrice = sku.getPresentPrice().multiply(BigDecimal.valueOf(addGoodsOrderDto.getCnt())); BigDecimal score = new BigDecimal(accountInfo.getCollectScore()); if (score.compareTo(totalPrice) < 0) { throw new RestException(-3, "积分不足"); } ScoreOrder order = new ScoreOrder(); order.setOrderNo(idUtils.generate("JF", 9)); order.setCnt(addGoodsOrderDto.getCnt()); order.setTotalPrice(totalPrice); order.setCreatedTime(new Date()); order.setUserId(addGoodsOrderDto.getUserId()); order.setStatus(ScoreOrder.STATUS_READY); order.setGoodsName(goods.getName()); order.setRemark(addGoodsOrderDto.getRemark()); scoreOrderMapper.insert(order); ScoreOrderDetails orderDetails = new ScoreOrderDetails(); orderDetails.setGoodsName(goods.getName()); orderDetails.setStyle(style.getName()); orderDetails.setSku(sku.getName()); orderDetails.setOrderId(order.getId()); orderDetails.setCnt(addGoodsOrderDto.getCnt()); orderDetails.setTotalPrice(totalPrice); orderDetails.setUnitPrice(sku.getPresentPrice()); orderDetails.setGoodsId(goods.getId()); orderDetails.setThumb(goods.getThumb()); scoreOrderDetailsMapper.insert(orderDetails); AddressInfo addressInfo = addressInfoMapper.selectByPrimaryKey(addGoodsOrderDto.getAddressId()); ScoreExpressInfo expressInfo = new ScoreExpressInfo(); expressInfo.setUsername(addressInfo.getRelaName()); expressInfo.setPhone(addressInfo.getMobilePhone()); expressInfo.setUserId(addressInfo.getUserId()); expressInfo.setOrderId(order.getId()); StringBuffer address = new StringBuffer(); address.append(addressInfo.getAddressArea()); address.append(addressInfo.getDetailAddress()); if (StrUtil.isNotBlank(addressInfo.getTagName())) { address.append(StrUtil.isNotBlank(addressInfo.getHouseName()) ? addressInfo.getHouseName() : ""); if (Constants.ADDRESS_TYPE_HOME.equals(addressInfo.getTagName())) { address.append(StrUtil.isNotBlank(addressInfo.getHouseNumber()) ? addressInfo.getHouseNumber() : ""); address.append(StrUtil.isNotBlank(addressInfo.getUnitName()) ? addressInfo.getUnitName() : ""); } } expressInfo.setAddress(address.toString()); expressInfo.setCreatedTime(new Date()); scoreExpressInfoMapper.insert(expressInfo); BigDecimal remianScore = score.subtract(totalPrice).setScale(0, BigDecimal.ROUND_DOWN); accountInfo.setCollectScore(remianScore.toString()); accountInfoMapper.updateByPrimaryKey(accountInfo); ScoreDetails scoreDetails = new ScoreDetails(); scoreDetails.setOrderNo(order.getOrderNo()); scoreDetails.setUserId(addGoodsOrderDto.getUserId()); scoreDetails.setType(ScoreDetails.SCORE_TYPE_SHOPPING); scoreDetails.setOriginalScore(score); scoreDetails.setCurrentScore(remianScore); scoreDetails.setChangeScore(totalPrice); scoreDetailsMapper.insert(scoreDetails); } public Long cancelOrder(CancelOrderDto model) { /** * todo 只更新了订单状态,后续操作待增加 */ ScoreOrder scoreOrder = new ScoreOrder(); scoreOrder.setId(model.getId()); scoreOrder.setStatus(ScoreOrder.STATUS_CANCEL); scoreOrderMapper.updateByPrimaryKeySelective(scoreOrder); return scoreOrder.getId(); } }