From 55642c818f14bf8cf52c98e6858014bd8dc3d3a7 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期四, 16 四月 2026 20:10:58 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java | 4459 ++++++++++++++++++++++++++++++++++------------------------
1 files changed, 2,612 insertions(+), 1,847 deletions(-)
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
index c89435b..5224b0f 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -1,63 +1,66 @@
package com.doumee.service.business.impl;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.AreasBiz;
+import com.doumee.biz.system.OperationConfigBiz;
import com.doumee.biz.system.SystemDictDataBiz;
-import com.doumee.config.wx.SendWxMessage;
import com.doumee.config.wx.WxMiniConfig;
import com.doumee.config.wx.WxMiniUtilService;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
-import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
-import com.doumee.core.utils.GeoUtils;
+import com.doumee.core.utils.Tencent.MapUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
-import com.doumee.dao.dto.*;
-import com.doumee.dao.vo.OrderReleaseVO;
-import com.doumee.service.business.AliSmsService;
+import com.doumee.dao.system.SystemUserMapper;
+import com.doumee.dao.system.model.SystemDictData;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.dao.dto.CalculateLocalPriceDTO;
+import com.doumee.dao.dto.CalculateRemotePriceDTO;
+import com.doumee.dao.dto.CommentOrderDTO;
+import com.doumee.dao.dto.CreateOrderDTO;
+import com.doumee.dao.dto.DispatchDTO;
+import com.doumee.dao.dto.MyOrderDTO;
+import com.doumee.dao.dto.OrderItemDTO;
+import com.doumee.dao.vo.*;
+import com.doumee.service.business.OrderLogService;
import com.doumee.service.business.OrdersService;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.service.business.AreasService;
+import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.wechat.pay.java.service.partnerpayments.jsapi.model.Amount;
-import com.wechat.pay.java.service.partnerpayments.jsapi.model.Payer;
-import com.wechat.pay.java.service.partnerpayments.jsapi.model.PrepayRequest;
-import com.wechat.pay.java.service.partnerpayments.jsapi.model.PrepayWithRequestPaymentResponse;
-import com.wechat.pay.java.service.refund.model.RefundNotification;
-import jodd.util.StringUtil;
-import lombok.With;
-import lombok.extern.slf4j.Slf4j;
-import nonapi.io.github.classgraph.json.Id;
-import org.apache.poi.sl.image.ImageHeaderEMF;
-import org.checkerframework.checker.units.qual.A;
-import org.springframework.beans.BeanUtils;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
-import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.math.RoundingMode;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
- * 璁㈠崟淇℃伅璁板綍Service瀹炵幇
- * @author 姹熻箘韫�
- * @date 2025/07/09 12:00
+ * 瀵勫瓨璁㈠崟淇℃伅Service瀹炵幇
+ * @author rk
+ * @date 2026/04/10
*/
-@Slf4j
@Service
public class OrdersServiceImpl implements OrdersService {
@@ -65,7 +68,13 @@
private OrdersMapper ordersMapper;
@Autowired
- private SystemDictDataBiz systemDictDataBiz;
+ private MemberMapper memberMapper;
+
+ @Autowired
+ private ShopInfoMapper shopInfoMapper;
+
+ @Autowired
+ private DriverInfoMapper driverInfoMapper;
@Autowired
private CategoryMapper categoryMapper;
@@ -74,300 +83,57 @@
private MultifileMapper multifileMapper;
@Autowired
- private OrderLogMapper orderLogMapper;
+ private OrdersDetailMapper ordersDetailMapper;
@Autowired
- private MemberMapper memberMapper;
+ private SystemDictDataBiz systemDictDataBiz;
@Autowired
- private MemberRevenueMapper memberRevenueMapper;
+ private OrderLogService orderLogService;
@Autowired
- private IdentityInfoMapper identityInfoMapper;
+ private OrdersRefundMapper ordersRefundMapper;
@Autowired
- private WithdrawalOrdersMapper withdrawalOrdersMapper;
+ private OtherOrdersMapper otherOrdersMapper;
@Autowired
- private ReceiveWeightMapper receiveWeightMapper;
+ private OrderCommentMapper orderCommentMapper;
+
+ @Autowired
+ private RevenueMapper revenueMapper;
@Autowired
private WxMiniUtilService wxMiniUtilService;
@Autowired
- private SendWxMessage sendWxMessage;
+ private SystemUserMapper systemUserMapper;
@Autowired
- private AliSmsService aliSmsService;
+ private PricingRuleMapper pricingRuleMapper;
+ @Autowired
+ private RedisTemplate<String, Object> redisTemplate;
- @Resource
- private RedisTemplate<String,Object> redisTemplate;
+ @Autowired
+ private AreasBiz areasBiz;
+
+ @Autowired
+ private OperationConfigBiz operationConfigBiz;
+
+ @Autowired
+ private AreasService areasService;
@Override
- @Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public OrderReleaseVO create(Orders orders) {
- OrderReleaseVO orderReleaseVO = new OrderReleaseVO();
- Object objects = null;
- this.initVerification(orders);
- Member member = memberMapper.selectById(orders.getMember().getId());
- if(Objects.isNull(member)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛淇℃伅寮傚父");
- }
-
- orders.setCreateTime(new Date());
- orders.setUpdateTime(orders.getUpdateTime());
- orders.setPayStatus(Constants.ZERO);
- orders.setDeleted(Constants.ZERO);
- orders.setReleaseMemberId(orders.getMember().getId());
- orders.setCommentStatus(Constants.ZERO);
- //鏌ヨ鎵嬬画璐�
- Category platformCategory = categoryMapper.selectOne(new QueryWrapper<Category>().lambda().eq(Category::getType,Constants.THREE).eq(Category::getName,orders.getType()).eq(Category::getDeleted,Constants.ZERO).last("limit 1 "));
- if(Objects.isNull(platformCategory)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈缃钩鍙伴厤缃俊鎭�");
- }
- orders.setPlatformRata(new BigDecimal(platformCategory.getDetail()).divide(new BigDecimal("100")));
- //璁㈠崟缂栧彿
- orders.setCode(this.getNextCode(orders.getType()));
- Category category = categoryMapper.selectOne(new QueryWrapper<Category>().lambda()
- .eq(Category::getDeleted,Constants.ZERO).eq(Category::getType,Constants.THREE)
- .eq(Category::getName,orders.getType())
- .last("limit 1")
- );
- if(Objects.isNull(category)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鍙傛暟閰嶇疆閿欒,璇疯仈绯荤鐞嗗憳");
- }
- orders.setPayAccount(orders.getEstimatedAccount());
- Long tcje = Long.valueOf(new BigDecimal(orders.getPayAccount().toString()).multiply(orders.getPlatformRata()).intValue());
- orders.setReceiveAccount(orders.getPayAccount() - tcje);
- //鐢ㄩ璁㈠崟
- if(Constants.equalsInteger(orders.getType(),Constants.TWO)){
- orders.setStatus(Constants.ordersStatus.waitPay.getKey());
- orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
- //鍞よ捣鏀粯涓氬姟
- objects = this.getWxPayResponse(orders,member.getOpenid());
- orderReleaseVO.setObject(objects);
- }else{
- orders.setStatus(Constants.ordersStatus.wait.getKey());
- }
- orders.setOriginPriceNum1(orders.getPriceNum1());
- orders.setOriginPriceNum2(orders.getPriceNum2());
- orders.setOriginEstimatedAccount(orders.getEstimatedAccount());
- orders.setConfirmOtherFee(0l);
+ public Integer create(Orders orders) {
ordersMapper.insert(orders);
-
- orderReleaseVO.setId(orders.getId());
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(orders.getMultifileList())){
- List<Multifile> multifileList = orders.getMultifileList();
- for (Multifile multifile:multifileList) {
- if(Objects.isNull(multifile)
- || StringUtils.isEmpty(multifile.getFileurl())
- || StringUtils.isEmpty(multifile.getName())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"闄勪欢淇℃伅閿欒");
- }
- multifile.setIsdeleted(Constants.ZERO);
- multifile.setCreateDate(new Date());
- multifile.setObjId(orders.getId());
- multifile.setObjType(Constants.ONE);
- }
- multifileMapper.insert(multifileList);
- }
- //鏇存柊鐢ㄦ埛鍙戝崟閲�
- memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" PUBLISH_NUM = ( ifnull(PUBLISH_NUM,0) + 1 )").eq(Member::getId,orders.getMember().getId()));
-
- //鍒涘缓鎿嶄綔鏃ュ織
- Constants.OrdersLog ordersLog = Constants.OrdersLog.UPLOAD;
- String orderTypeInfo = Constants.getOrderInfo(orders);/*"鐢ㄥ伐鍗�";
- if(!Constants.equalsInteger(orders.getType(),Constants.ZERO)){
- orderTypeInfo = Constants.equalsInteger(orders.getType(),Constants.ONE)?"鐢ㄨ溅鍗�":"閫侀鍗�";
- }else{
- if(Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)){
- orderTypeInfo = orderTypeInfo + "-閲囨憳宸�";
- }else{
- orderTypeInfo = orderTypeInfo + (Constants.equalsInteger(orders.getWorkType(),Constants.ONE)?"-鍒嗘嫞宸�":"-鍖呰宸�");
- }
- }*/
- String logInfo = ordersLog.getInfo()
- .replace("{param}",orderTypeInfo)
- .replace("{userName}", org.apache.commons.lang3.StringUtils.isNotBlank(member.getName())?member.getName():"-");
- this.saveOrderLog(orders,ordersLog,
- logInfo,orders.getReleaseMemberId(),null);
- return orderReleaseVO;
+ return orders.getId();
}
-
- private Object getWxPayResponse(Orders orders,String openid){
- Object response = null;
- //璋冭捣鏀粯
- PrepayRequest request = new PrepayRequest();
- request.setAttach("createOrder");
- request.setDescription("杩戝揩璁㈠崟鏀粯");
- request.setSpMchid(WxMiniConfig.wxProperties.getMchId());
- request.setSpAppid(WxMiniConfig.wxProperties.getAppId());
- request.setSubMchid(WxMiniConfig.wxProperties.getSubMchId());
- request.setSubAppid(WxMiniConfig.wxProperties.getSubAppId());
-
- Payer payer = new Payer();
- payer.setSubOpenid(openid);
- request.setPayer(payer);
- request.setOutTradeNo(orders.getOutTradeNo());
- request.setNotifyUrl(WxMiniConfig.wxProperties.getNotifyUrl());//杩欎釜鍥炶皟url蹇呴』鏄痟ttps寮�澶寸殑
- Amount amount = new Amount();
- amount.setTotal(orders.getPayAccount().intValue());
- request.setAmount(amount);
-// PrepayResponse res = WxMiniConfig.wxPayService.prepay(request);
- // 璺熶箣鍓嶄笅鍗曠ず渚嬩竴鏍凤紝濉厖棰勪笅鍗曞弬鏁�
- PrepayWithRequestPaymentResponse resParam = WxMiniConfig.jsapiExtService.prepayWithRequestPayment(request,WxMiniConfig.wxProperties.getSubAppId());
- response =resParam;
- return response;
- }
-
- /**
- * 鏃ュ織淇℃伅
- * @param orders 璁㈠崟淇℃伅
- * @param ordersLog 璁㈠崟鏀寔鍒嗙被
- * @param logInfo 鏃ュ織鍐呭
- * @param memberId 绉诲姩绔搷浣滀汉
- * @param userId 绯荤粺鎿嶄綔浜�
- */
- public void saveOrderLog(Orders orders,Constants.OrdersLog ordersLog,String logInfo,Integer memberId,Integer userId){
- OrderLog orderLog = new OrderLog();
- orderLog.setCreateTime(orders.getUpdateTime());
- orderLog.setDeleted(Constants.ZERO);
- orderLog.setOrderId(orders.getId());
- orderLog.setTitle(ordersLog.getName());
- orderLog.setLogInfo(logInfo);
- orderLog.setObjType(ordersLog.getKey());
- orderLog.setOrderStatus(orders.getStatus());
- orderLog.setMemberId(memberId);
- orderLog.setCreateUser(userId);
- orderLog.setOptUserType(ordersLog.getUserType());
- orderLogMapper.insert(orderLog);
- }
-
-
-
-
- public void initVerification(Orders orders){
- if(Objects.isNull(orders)
- || Objects.isNull(orders.getType())
- || Objects.isNull(orders.getStartDate())
- || Objects.isNull(orders.getEndDate())
- || StringUtil.isBlank(orders.getLocation())
- || StringUtil.isBlank(orders.getLinkPhone())
- || Objects.isNull(orders.getLat())
- || Objects.isNull(orders.getLgt())
- || (!Constants.equalsInteger(orders.getType(),Constants.TWO) && Objects.isNull(orders.getCategoryId()))
- || (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Objects.isNull(orders.getWorkType()))
- || Objects.isNull(orders.getPriceNum1())
- || Objects.isNull(orders.getEstimatedAccount())
- || Objects.isNull(orders.getPrice())
- ){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- Integer priceNum2 = orders.getPriceNum2();
- if( (Constants.equalsInteger(orders.getType(),Constants.ZERO)
- && Constants.equalsInteger(orders.getWorkType(),Constants.TWO) &&
- ( Constants.equalsInteger(orders.getCarType(),Constants.ZERO)
- || Constants.equalsInteger(orders.getCarType(),Constants.ONE) ))
- || (Constants.equalsInteger(orders.getType(),Constants.ZERO)
- && Constants.equalsInteger(orders.getWorkType(),Constants.ONE))
- ){
- if(Objects.isNull(orders.getPriceNum2())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- }else{
- orders.setPriceNum2(Constants.ONE);
- }
- orders.setTotalDays(DateUtil.daysBetweenDates(orders.getEndDate(),orders.getStartDate())+1);
- if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
- if(Constants.equalsInteger(orders.getWorkType(),Constants.TWO)
- && ( Objects.isNull(orders.getCarType()) ) ){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
- if(Objects.isNull(orders.getTransportTypeId())
- || Objects.isNull(orders.getCarType())
- || Objects.isNull(orders.getTransportNum())
- || StringUtils.isEmpty(orders.getTransportUnit())
- || StringUtils.isEmpty(orders.getLocationEnd())
- || StringUtils.isEmpty(orders.getCarUnit())
- || Objects.isNull(orders.getLatEnd())
- || Objects.isNull(orders.getLgtEnd())
- || CollectionUtils.isEmpty(orders.getWayInfoDTOList())
- ){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- for (WayInfoDTO wayInfoDTO:orders.getWayInfoDTOList()) {
- if(Objects.isNull(wayInfoDTO)
- ||StringUtils.isEmpty(wayInfoDTO.getLocation())
-// ||StringUtils.isEmpty(wayInfoDTO.getProvince())
-// ||StringUtils.isEmpty(wayInfoDTO.getCity())
-// ||StringUtils.isEmpty(wayInfoDTO.getArea())
- ||Objects.isNull(wayInfoDTO.getLat())
- ||Objects.isNull(wayInfoDTO.getLgt())
- ){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- }
- orders.setWayInfo(JSONObject.toJSONString(orders.getWayInfoDTOList()));
- }else{
- List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda().eq(Category::getDeleted,Constants.ZERO)
- .eq(Category::getType,Constants.TWO)
- );
- if(CollectionUtils.isEmpty(categoryList)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"椁愭爣淇℃伅閿欒");
- }
- //鐢ㄩ璁㈠崟
- if(CollectionUtils.isEmpty(orders.getCateringDTOList())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- Long sumPrice = 0L;
-// List<CateringDTO> cateringDTOList = new ArrayList<>();
- for (CateringDTO cateringDTO:orders.getCateringDTOList()) {
- if(Objects.isNull(cateringDTO)
- || StringUtils.isEmpty(cateringDTO.getName())
- || Objects.isNull(cateringDTO.getPrice())
- || Objects.isNull(cateringDTO.getNum())
- ){
- throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢ㄩ鏍囧噯鏁版嵁閿欒");
- }
- //椁愭爣淇℃伅
- List<Category> categories = categoryList.stream().filter(i->Constants.equalsInteger(i.getId(),cateringDTO.getId())).collect(Collectors.toList());
- if(CollectionUtils.isEmpty(categories)){
- throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢ㄩ鏍囧噯鏁版嵁閿欒锛岃鍒锋柊閲嶈瘯");
- }
- Category category = categories.get(Constants.ZERO);
- List<String> priceList = JSONArray.parseArray(category.getDetail(),String.class );
- if(CollectionUtils.isEmpty(priceList)){
- throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢ㄩ鏍囧噯鏁版嵁閿欒锛岃鍒锋柊閲嶈瘯");
- }
- if(priceList.stream().filter(i->((Long.valueOf(i)*100)+"").equals((cateringDTO.getPrice()+""))).collect(Collectors.toList()).size()==Constants.ZERO){
- throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢ㄩ鏍囧噯鏁版嵁閿欒锛岃鍒锋柊閲嶈瘯");
- }
- sumPrice = sumPrice + (cateringDTO.getPrice() * cateringDTO.getNum()) ;
-
- }
- if(new BigDecimal(sumPrice.toString()).compareTo(orders.getPrice())!=Constants.ZERO){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍗曚环璁$畻閿欒");
- }
-
-
- orders.setWayInfo(JSONObject.toJSONString(orders.getCateringDTOList()));
- }
- if(!orders.getEstimatedAccount().equals(this.getTotal(orders))){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閲戦璁$畻閿欒!");
- }
- orders.setPriceNum2(priceNum2);
- }
-
-
-
-
-
-
@Override
public void deleteById(Integer id) {
- ordersMapper.deleteById(id);
+ ordersMapper.update(new UpdateWrapper<Orders>().lambda()
+ .set(Orders::getDeleted, Constants.ONE)
+ .eq(Orders::getId, id));
}
@Override
@@ -378,176 +144,36 @@
@Override
public void deleteByIdInBatch(List<Integer> ids) {
- if (CollectionUtils.isEmpty(ids)) {
+ if (ids == null || ids.isEmpty()) {
return;
}
ordersMapper.deleteBatchIds(ids);
}
@Override
- public void update(Orders orders){
- if(Objects.isNull(orders)
- || Objects.isNull(orders.getId())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- Orders model = ordersMapper.selectById(orders.getId());
- if(!Constants.equalsInteger(model.getReleaseMemberId(),orders.getMember().getId())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勮鍗曟棤娉曡繘琛岃鎿嶄綔");
- }
- if(Constants.equalsInteger(model.getIsUpdate(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟宸蹭慨鏀癸紝寰呮帴鍗曟柟纭锛屾棤娉曡繘琛岃鎿嶄綔");
- }
- if(!Constants.equalsInteger(model.getType(),Constants.TWO)){
- if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)
- ||Constants.equalsInteger(model.getStatus(),Constants.ONE)){
- this.updateById(orders);
- }else if(Constants.equalsInteger(model.getStatus(),Constants.TWO)){
- this.updOrderData(orders,model);
- }else{
- throw new BusinessException(ResponseStatus.NOT_ALLOWED);
- }
- }else{
- throw new BusinessException(ResponseStatus.NOT_ALLOWED);
- }
- }
-
-
-
-// @Override
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
public void updateById(Orders orders) {
-
- Orders model = ordersMapper.selectById(orders.getId());
- if(Constants.equalsInteger(model.getType(),Constants.TWO)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"姝ょ被璁㈠崟鏃犳硶杩涜淇敼");
- }
- if(!Constants.equalsInteger(model.getStatus(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜璇ユ搷浣�");
- }
- this.initVerification(orders);
- orders.setUpdateTime(new Date());
- Category category = categoryMapper.selectOne(new QueryWrapper<Category>().lambda()
- .eq(Category::getDeleted,Constants.ZERO).eq(Category::getType,Constants.THREE)
- .eq(Category::getName,orders.getType())
- .last("limit 1")
- );
- if(Objects.isNull(category)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鍙傛暟閰嶇疆閿欒,璇疯仈绯荤鐞嗗憳");
- }
- multifileMapper.update(new UpdateWrapper<Multifile>().lambda().set(Multifile::getIsdeleted,Constants.ONE).eq(Multifile::getObjType,Constants.ONE)
- .eq(Multifile::getObjId,orders.getId()));
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(orders.getMultifileList())){
- List<Multifile> multifileList = orders.getMultifileList();
- for (Multifile multifile:multifileList) {
- if(Objects.isNull(multifile)
- || Objects.isNull(multifile.getObjType())
- || StringUtils.isEmpty(multifile.getFileurl())
- || StringUtils.isEmpty(multifile.getName())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"闄勪欢淇℃伅閿欒");
- }
- multifile.setId(null);
- multifile.setIsdeleted(Constants.ZERO);
- multifile.setCreateDate(new Date());
- multifile.setObjId(orders.getId());
- multifile.setObjType(Constants.ONE);
- }
- multifileMapper.insert(multifileList);
- }
- orders.setOriginPriceNum1(orders.getPriceNum1());
- orders.setOriginPriceNum2(orders.getPriceNum2());
- orders.setOriginEstimatedAccount(orders.getEstimatedAccount());
- orders.setPayAccount(orders.getEstimatedAccount());
- orders.setConfirmOtherFee(0L);
ordersMapper.updateById(orders);
}
@Override
- public void updateByIdInBatch(List<Orders> orderss) {
- if (CollectionUtils.isEmpty(orderss)) {
+ public void updateByIdInBatch(List<Orders> ordersList) {
+ if (ordersList == null || ordersList.isEmpty()) {
return;
}
- for (Orders orders: orderss) {
- //this.updateById(orders);
+ for (Orders orders : ordersList) {
+ this.updateById(orders);
}
}
@Override
public Orders findById(Integer id) {
- Orders orders = ordersMapper.selectJoinOne(Orders.class,new MPJLambdaWrapper<Orders>()
- .selectAll(Orders.class)
- .select(" m1.name " , Orders::getReleaseName)
- .select(" m1.telephone " , Orders::getReleasePhone)
- .select(" case when i.AUTH_TYPE = 0 then i.LINK_NAME else i.COMPANY_NAME end " , Orders::getAcceptName)
- .select(" i.TELEPHONE " , Orders::getAcceptPhone)
- .select("c1.name",Orders::getCategoryName)
- .select("c2.name",Orders::getTransportTypeName)
- .leftJoin(" category c1 on t.category_id = c1.id ")
- .leftJoin(" category c2 on t.TRANSPORT_TYPE_ID = c2.id ")
- .leftJoin("member m1 on t.RELEASE_MEMBER_ID = m1.id ")
- .leftJoin("member m2 on t.ACCEPT_MEMBER_ID = m2.id ")
- .leftJoin("identity_info i on m2.id = i.MEMBER_ID and i.TYPE = t.type and i.AUDIT_STATUS = 2 ")
- .eq(Orders::getDeleted,Constants.ZERO)
- .eq(Orders::getId,id)
- .orderByDesc(Orders::getId));
- if(Objects.isNull(orders)){
+ Orders orders = ordersMapper.selectById(id);
+ if (Objects.isNull(orders)) {
throw new BusinessException(ResponseStatus.DATA_EMPTY);
- }
- orders.setStatusName(Constants.ordersStatus.getName(orders.getStatus()));
- this.getPriceUnit(orders);
-
- //闄勪欢淇℃伅
- List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda().eq(Multifile::getObjId,orders.getId())
- .eq(Multifile::getIsdeleted,Constants.ZERO).eq(Multifile::getObjType,Constants.ONE).orderByAsc(Multifile::getId));
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
- String path = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
- +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ORDERS_FILES).getCode();
- for (Multifile multifile:multifileList) {
- multifile.setFileurlFull(path + multifile.getFileurl());
- }
- orders.setMultifileList(multifileList);
- }
- //璁㈠崟娴佽浆璁板綍
- List<OrderLog> orderLogList = orderLogMapper.selectList(new QueryWrapper<OrderLog>().lambda()
- .eq(OrderLog::getDeleted,Constants.ZERO)
- .eq(OrderLog::getOrderId,orders.getId())
- .orderByAsc(OrderLog::getCreateTime)
- );
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(orderLogList)){
- for (OrderLog orderLog:orderLogList) {
- if(Constants.equalsInteger(orderLog.getOptUserType(),Constants.ZERO)&& org.apache.commons.lang3.StringUtils.isNotBlank(orders.getReleaseName())){
- orderLog.setLogInfo(orderLog.getLogInfo().replace("{userName}",orders.getReleaseName()));
- }else if(Constants.equalsInteger(orderLog.getOptUserType(),Constants.ONE)&& org.apache.commons.lang3.StringUtils.isNotBlank(orders.getAcceptName())){
- orderLog.setLogInfo(orderLog.getLogInfo().replace("{userName}",orders.getAcceptName()));
- }
- }
- orders.setOrderLogList(orderLogList);
}
return orders;
}
- public void getPriceUnit(Orders orders){
- if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
- if(Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)){
- orders.setPriceUnit("鍏�/鏂�");
- }else if(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)){
- orders.setPriceUnit("鍏�/浜�/澶�");
- }else{
- if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)){
- orders.setPriceUnit("鍏�/浜�/澶�");
- }else if(Constants.equalsInteger(orders.getCarType(),Constants.ONE)){
- orders.setPriceUnit("鍏�/浜�/灏忔椂");
- }else{
- orders.setPriceUnit("鍏�/鏂�");
- }
- }
- }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
- if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)){
- orders.setPriceUnit("鍏�/澶�");
- }else if(Constants.equalsInteger(orders.getCarType(),Constants.ONE)){
- orders.setPriceUnit("鍏�/娆�");
- }
- }
- }
@Override
public Orders findOne(Orders orders) {
QueryWrapper<Orders> wrapper = new QueryWrapper<>(orders);
@@ -559,109 +185,354 @@
QueryWrapper<Orders> wrapper = new QueryWrapper<>(orders);
return ordersMapper.selectList(wrapper);
}
-
+
@Override
public PageData<Orders> findPage(PageWrap<Orders> pageWrap) {
IPage<Orders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
- MPJLambdaWrapper<Orders> queryWrapper = new MPJLambdaWrapper<Orders>();
+ MPJLambdaWrapper<Orders> queryWrapper = new MPJLambdaWrapper<Orders>()
+ .selectAll(Orders.class)
+ .selectAs(Category::getDetail, Orders::getOrderLevel)
+ .select("s1.name", Orders::getDepositShopName)
+ .leftJoin(Category.class, Category::getId, Orders::getGoodType)
+ .leftJoin(DriverInfo.class, DriverInfo::getId, Orders::getAcceptDriver)
+ .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
+ .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID");
+ ;
Utils.MP.blankToNull(pageWrap.getModel());
- Orders model = pageWrap.getModel();
- queryWrapper.selectAll(Orders.class)
- .select(" m1.name " , Orders::getReleaseName)
- .select(" m1.telephone " , Orders::getReleasePhone)
- .select(" case when i.AUTH_TYPE = 0 then i.LINK_NAME else i.COMPANY_NAME end " , Orders::getAcceptName)
- .select(" i.TELEPHONE " , Orders::getAcceptPhone)
- .select("c1.name",Orders::getCategoryName)
- .select("c2.name",Orders::getTransportTypeName)
- .leftJoin(" category c1 on t.category_id = c1.id ")
- .leftJoin(" category c2 on t.TRANSPORT_TYPE_ID = c2.id ")
- .leftJoin("member m1 on t.RELEASE_MEMBER_ID = m1.id ")
- .leftJoin("member m2 on t.ACCEPT_MEMBER_ID = m2.id ")
- .leftJoin("identity_info i on m2.id = i.MEMBER_ID and i.TYPE = t.type and i.AUDIT_STATUS = 2 ")
- .eq(Orders::getDeleted,Constants.ZERO)
- .orderByDesc(Orders::getId)
- ;
- queryWrapper.ge(Objects.nonNull(model.getCreateTimeStart()),Orders::getCreateTime, Utils.Date.getStart(model.getCreateTimeStart()));
- queryWrapper.le(Objects.nonNull(model.getCreateTimeEnd()),Orders::getCreateTime, Utils.Date.getEnd(model.getCreateTimeEnd()));
- queryWrapper.ge(Objects.nonNull(model.getAcceptTimeStart()),Orders::getAcceptTime, Utils.Date.getStart(model.getAcceptTimeStart()));
- queryWrapper.le(Objects.nonNull(model.getAcceptTimeEnd()),Orders::getAcceptTime, Utils.Date.getEnd(model.getAcceptTimeEnd()));
- queryWrapper.ge(Objects.nonNull(model.getDoneTimeStart()),Orders::getFinishTime, Utils.Date.getStart(model.getDoneTimeStart()));
- queryWrapper.le(Objects.nonNull(model.getDoneTimeEnd()),Orders::getFinishTime, Utils.Date.getEnd(model.getDoneTimeEnd()));
- queryWrapper.like(org.apache.commons.lang3.StringUtils.isNotBlank(model.getCode()),Orders::getCode, model.getCode());
- queryWrapper.eq(Objects.nonNull(model.getType()),Orders::getType, model.getType());
- queryWrapper.eq(Objects.nonNull(model.getStatus()),Orders::getStatus, model.getStatus());
- queryWrapper.eq(Objects.nonNull(model.getCommentStatus()),Orders::getCommentStatus, model.getCommentStatus());
- queryWrapper.eq(Objects.nonNull(model.getReleaseMemberId()),Orders::getReleaseMemberId, model.getReleaseMemberId());
- queryWrapper.eq(Objects.nonNull(model.getAcceptMemberId()),Orders::getAcceptMemberId, model.getAcceptMemberId());
- queryWrapper.eq(Objects.nonNull(model.getAcceptType()),Orders::getAcceptType, model.getAcceptType());
- queryWrapper.apply(org.apache.commons.lang3.StringUtils.isNotBlank(model.getReleaseName()),"m1.name like '%"+model.getReleaseName()+"%' or m1.TELEPHONE like '%"+model.getReleaseName()+"%' ");
- queryWrapper.apply(org.apache.commons.lang3.StringUtils.isNotBlank(model.getAcceptName()),"( i.LINK_NAME like '%"+model.getAcceptName()+"%' or i.company_name like '%"+model.getAcceptName()+"%' or i.TELEPHONE like '%"+model.getAcceptName()+"%' ) ");
- IPage<Orders> iPage = ordersMapper.selectJoinPage(page,Orders.class,queryWrapper);
- for (Orders orders:iPage.getRecords()) {
- this.getOrderContent(orders);
- orders.setStatusName(Constants.ordersStatus.getName(orders.getStatus()));
- orders.setEstimatedAccountYuan(Objects.nonNull(orders.getEstimatedAccount())&&orders.getEstimatedAccount()>0?orders.getEstimatedAccount()/100:0L);
- orders.setPayAccountYuan(Objects.nonNull(orders.getPayAccount())&&orders.getPayAccount()>0?orders.getPayAccount()/100:0L);
- }
- return PageData.from(iPage);
- }
-
- public void getOrderContent(Orders orders){
- if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
- orders.setOrderContent(Constants.workType.getName(orders.getWorkType()) +" | " + orders.getCategoryName());
- if(Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)){
- if(Objects.nonNull(orders.getPriceNum1())){
- orders.setOrderContent(orders.getOrderContent()+" | " +orders.getPriceNum1()+"鏂�");
- }
- }else if(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)){
- if(Objects.nonNull(orders.getPriceNum2())) {
- orders.setOrderContent(orders.getOrderContent() + " | " + orders.getPriceNum2() + "浜�");
- }
- }else{
- if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)||Constants.equalsInteger(orders.getCarType(),Constants.ONE)){
- if(Objects.nonNull(orders.getPriceNum2())) {
- orders.setOrderContent(orders.getOrderContent() + " | " + orders.getPriceNum2() + "浜�");
- }
- }else{
- if(Objects.nonNull(orders.getPriceNum1())) {
- orders.setOrderContent(orders.getOrderContent() + " | " + orders.getPriceNum1() + "鏂�");
- }
- }
- }
- }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
- if(org.apache.commons.lang3.StringUtils.isNotBlank(orders.getCategoryName())){
- orders.setOrderContent( orders.getCategoryName() +
- (StringUtils.isEmpty(orders.getTransportTypeName())?"":" | " + orders.getTransportTypeName() ) +
- (Objects.isNull(orders.getTransportNum())?null:" | " + orders.getTransportNum() +"鏂�"));
- }
-
- if(Constants.equalsInteger(orders.getCarType(),Constants.ZERO)){
- if(Objects.nonNull(orders.getPriceNum2())) {
- orders.setOrderContent(orders.getOrderContent() + " | 鐢ㄨ溅" + orders.getPriceNum1() + "澶�");
- }
- }else{
- if(Objects.nonNull(orders.getPriceNum2())) {
- orders.setOrderContent(orders.getOrderContent() + " | 鐢ㄨ溅" + orders.getPriceNum1() + "娆�");
- }
- }
- }else{
- if(org.apache.commons.lang3.StringUtils.isNotBlank(orders.getWayInfo())){
- List<CateringDTO> cateringDTOList = JSONArray.parseArray(orders.getWayInfo(),CateringDTO.class);
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(cateringDTOList)){
- for (CateringDTO cateringDTO:cateringDTOList) {
- if(StringUtils.isEmpty(orders.getOrderContent())){
- orders.setOrderContent(cateringDTO.getName()+(new BigDecimal(cateringDTO.getPrice().toString()).divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_UP))+" 闇�"+cateringDTO.getNum()+"浠�");
- }else{
- orders.setOrderContent(orders.getOrderContent()+" | "+cateringDTO.getName()+(new BigDecimal(cateringDTO.getPrice().toString()).divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_UP))+" 闇�"+cateringDTO.getNum()+"浠�");
- }
- }
- }
+ pageWrap.getModel().setDeleted(Constants.ZERO);
+ queryWrapper.eq(pageWrap.getModel().getDeleted() != null, Orders::getDeleted, pageWrap.getModel().getDeleted());
+ queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()), Orders::getCode, pageWrap.getModel().getCode());
+ queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDepositShopName()), "s1.name", pageWrap.getModel().getDepositShopName());
+ queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getTakeShopName()), "s2.name", pageWrap.getModel().getTakeShopName());
+ queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
+ queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
+ queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+ queryWrapper.eq(pageWrap.getModel().getDepositShopId() != null, Orders::getDepositShopId, pageWrap.getModel().getDepositShopId());
+ queryWrapper.eq(pageWrap.getModel().getType() != null, Orders::getType, pageWrap.getModel().getType());
+ queryWrapper.eq(pageWrap.getModel().getStatus() != null, Orders::getStatus, pageWrap.getModel().getStatus());
+ queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId());
+ queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
+ .or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword()));
+ for (PageWrap.SortData sortData : pageWrap.getSorts()) {
+ if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+ queryWrapper.orderByDesc(sortData.getProperty());
+ } else {
+ queryWrapper.orderByAsc(sortData.getProperty());
}
}
-
+ return PageData.from(ordersMapper.selectJoinPage(page, Orders.class, queryWrapper));
}
+ @Override
+ public OrderSummaryVO findSummary(PageWrap<Orders> pageWrap) {
+ // 鏋勫缓涓巉indPage鐩稿悓鐨勬煡璇㈡潯浠�
+ MPJLambdaWrapper<Orders> queryWrapper = new MPJLambdaWrapper<Orders>()
+ .leftJoin(Category.class, Category::getId, Orders::getGoodType)
+ .leftJoin(DriverInfo.class, DriverInfo::getId, Orders::getAcceptDriver)
+ .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
+ .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID");
+ Utils.MP.blankToNull(pageWrap.getModel());
+ pageWrap.getModel().setDeleted(Constants.ZERO);
+ queryWrapper.eq(pageWrap.getModel().getDeleted() != null, Orders::getDeleted, pageWrap.getModel().getDeleted());
+ queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()), Orders::getCode, pageWrap.getModel().getCode());
+ queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDepositShopName()), "s1.name", pageWrap.getModel().getDepositShopName());
+ queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getTakeShopName()), "s2.name", pageWrap.getModel().getTakeShopName());
+ queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getGoodsInfo()), Orders::getGoodsInfo, pageWrap.getModel().getGoodsInfo());
+ queryWrapper.ge(pageWrap.getModel().getCreateStartTime() != null, Orders::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateStartTime()));
+ queryWrapper.le(pageWrap.getModel().getCreateEndTime() != null, Orders::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateEndTime()));
+ queryWrapper.eq(pageWrap.getModel().getDepositShopId() != null, Orders::getDepositShopId, pageWrap.getModel().getDepositShopId());
+ queryWrapper.eq(pageWrap.getModel().getType() != null, Orders::getType, pageWrap.getModel().getType());
+ queryWrapper.eq(pageWrap.getModel().getStatus() != null, Orders::getStatus, pageWrap.getModel().getStatus());
+ queryWrapper.eq(pageWrap.getModel().getTakeShopId() != null, Orders::getTakeShopId, pageWrap.getModel().getTakeShopId());
+ queryWrapper.and(pageWrap.getModel().getDriverKeyword() != null, i->i.like(DriverInfo::getName, pageWrap.getModel().getDriverKeyword())
+ .or().like(DriverInfo::getTelephone, pageWrap.getModel().getDriverKeyword()));
+ queryWrapper.select(
+ "IFNULL(SUM(t.total_amount), 0) as total_amount_sum",
+ "IFNULL(SUM(CASE WHEN t.settlement_status = 1 THEN t.total_amount ELSE 0 END), 0) as settled_total_amount_sum",
+ "IFNULL(SUM(t.driver_fee), 0) as driver_fee_sum",
+ "IFNULL(SUM(CASE WHEN t.settlement_status = 1 THEN t.driver_fee ELSE 0 END), 0) as settled_driver_fee_sum"
+ );
+ queryWrapper.groupBy("1=1");
+
+ List<Map<String, Object>> result = ordersMapper.selectJoinMaps(queryWrapper);
+ OrderSummaryVO vo = new OrderSummaryVO();
+ if (result != null && !result.isEmpty()) {
+ Map<String, Object> row = result.get(0);
+ vo.setTotalAmountSum(toLong(row.get("total_amount_sum")));
+ vo.setSettledTotalAmountSum(toLong(row.get("settled_total_amount_sum")));
+ vo.setDriverFeeSum(toLong(row.get("driver_fee_sum")));
+ vo.setSettledDriverFeeSum(toLong(row.get("settled_driver_fee_sum")));
+ } else {
+ vo.setTotalAmountSum(0L);
+ vo.setSettledTotalAmountSum(0L);
+ vo.setDriverFeeSum(0L);
+ vo.setSettledDriverFeeSum(0L);
+ }
+ return vo;
+ }
+
+ private Long toLong(Object val) {
+ if (val == null) return 0L;
+ if (val instanceof Number) return ((Number) val).longValue();
+ return Long.parseLong(val.toString());
+ }
+
+ @Override
+ public BigDecimal calculateInsuranceFee(BigDecimal declaredValue) {
+ if (declaredValue == null || declaredValue.compareTo(BigDecimal.ZERO) <= 0) {
+ return BigDecimal.ZERO;
+ }
+ String rateStr = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, Constants.OP_INSURANCE_RATE).getCode();
+ BigDecimal rate = new BigDecimal(rateStr);
+ return declaredValue.multiply(rate).setScale(2, BigDecimal.ROUND_HALF_UP);
+ }
+
+ /**
+ * 璁$畻灏卞湴瀛樺彇棰勪及璐圭敤
+ *
+ * 璁$畻瑙勫垯锛�
+ * 1. 鏍规嵁鍩庡競+鐗╁搧绫诲瀷 鏌ヨ pricing_rule(type=0)锛宖ieldA=categoryId, fieldB=鍗曚环(鍒�/澶�)
+ * 2. 姣忛」灏忚 = 鍗曚环 脳 鏁伴噺 脳 澶╂暟
+ * 3. 鐗╁搧浠锋牸 = 鍚勯」灏忚涔嬪拰
+ * 4. 淇濅环璐圭敤 = 鎶ヤ环閲戦 脳 淇濅环璐圭巼锛堝瓧鍏� INSURANCE_RATE锛夛紝鍏冭浆鍒�
+ * 5. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤
+ *
+ * @param dto 灏卞湴瀛樺彇璁′环璇锋眰鍙傛暟
+ * @return 浠锋牸璁$畻缁撴灉
+ */
+ @Override
+ public PriceCalculateVO calculateLocalPrice(CalculateLocalPriceDTO dto) {
+ // 澶╂暟鏍¢獙锛屾渶灏�1澶�
+ int days = dto.getEstimatedDepositDays() != null && dto.getEstimatedDepositDays() > 0
+ ? dto.getEstimatedDepositDays() : 1;
+
+ // 鏀堕泦鎵�鏈夌墿鍝佺被鍨婭D
+ List<Integer> categoryIds = new ArrayList<>();
+ for (OrderItemDTO item : dto.getItems()) {
+ categoryIds.add(item.getCategoryId());
+ }
+
+ // 鎵归噺鏌ヨ璁′环瑙勫垯 pricing_rule type=0锛歠ieldA=categoryId, fieldB=鍗曚环(鍒�/澶�)
+ List<String> fieldAList = new ArrayList<>();
+ for (Integer cid : categoryIds) {
+ fieldAList.add(String.valueOf(cid));
+ }
+ List<PricingRule> rules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
+ .eq(PricingRule::getDeleted, Constants.ZERO)
+ .eq(PricingRule::getType, Constants.ZERO)
+ .eq(PricingRule::getCityId, dto.getCityId())
+ .in(PricingRule::getFieldA, fieldAList));
+ Map<String, PricingRule> ruleMap = new HashMap<>();
+ for (PricingRule r : rules) {
+ ruleMap.put(r.getFieldA(), r);
+ }
+
+ // 鎵归噺鏌ヨ鐗╁搧绫诲瀷鍚嶇О
+ List<Category> categories = categoryMapper.selectBatchIds(categoryIds);
+ Map<Integer, String> categoryNameMap = new HashMap<>();
+ Map<Integer, String> categoryDetailMap = new HashMap<>();
+ for (Category c : categories) {
+ categoryNameMap.put(c.getId(), c.getName());
+ categoryDetailMap.put(c.getId(), c.getDetail());
+ }
+
+ // 璁$畻姣忛」鐗╁搧璐圭敤锛氬皬璁� = 鍗曚环 脳 鏁伴噺 脳 澶╂暟
+ List<ItemPriceVO> itemList = new ArrayList<>();
+ long itemPriceTotal = 0L;
+
+ for (OrderItemDTO item : dto.getItems()) {
+ PricingRule rule = ruleMap.get(String.valueOf(item.getCategoryId()));
+ if (rule == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+ "鏈壘鍒拌鍩庡競鐗╁搧绫诲瀷鐨勮浠疯鍒�");
+ }
+
+ long unitPrice = Long.parseLong(rule.getFieldB());
+ long subtotal = unitPrice * item.getQuantity() * days;
+
+ ItemPriceVO vo = new ItemPriceVO();
+ vo.setCategoryId(item.getCategoryId());
+ vo.setCategoryName(categoryNameMap.getOrDefault(item.getCategoryId(), ""));
+ vo.setDetail(categoryDetailMap.get(item.getCategoryId()));
+ vo.setQuantity(item.getQuantity());
+ vo.setUnitPrice(unitPrice);
+ vo.setLocallyPrice(unitPrice);
+ vo.setSubtotal(subtotal);
+ itemList.add(vo);
+
+ itemPriceTotal += subtotal;
+ }
+
+ // 淇濅环璐圭敤锛氭姤浠烽噾棰� 脳 淇濅环璐圭巼(瀛楀吀 INSURANCE_RATE)锛屽厓鈫掑垎
+ long insuranceFeeFen = 0L;
+ if (Boolean.TRUE.equals(dto.getInsured()) && dto.getDeclaredAmount() != null) {
+ BigDecimal insuranceFeeYuan = calculateInsuranceFee(dto.getDeclaredAmount());
+ insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue();
+ }
+
+ // 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤
+ long totalPrice = itemPriceTotal + insuranceFeeFen;
+
+ PriceCalculateVO result = new PriceCalculateVO();
+ result.setItemList(itemList);
+ result.setItemPrice(itemPriceTotal);
+ result.setInsuranceFee(insuranceFeeFen);
+ result.setTotalPrice(totalPrice);
+ result.setDays(days);
+ result.setUrgentFee(0L);
+ return result;
+ }
+
+ /**
+ * 璁$畻寮傚湴瀛樺彇棰勪及璐圭敤
+ *
+ * 璁$畻瑙勫垯锛�
+ * 1. 璋冪敤鑵捐鍦板浘API璁$畻瀵勪欢鐐逛笌鍙栦欢鐐圭殑椹捐溅璺濈(绫斥啋鍏噷)
+ * 2. 鏍规嵁鍩庡競+鐗╁搧绫诲瀷 鏌ヨ pricing_rule(type=1)锛�
+ * fieldB=璧锋璺濈(km), fieldC=璧锋浠�(鍒�), fieldD=瓒呭嚭璺濈鍗曚綅(km), fieldE=瓒呭嚭璺濈鍗曚环(鍒�)
+ * 3. 姣忛」杩愯垂鍗曚环锛�
+ * - 璺濈 鈮� 璧锋璺濈 鈫� 鍗曚环 = 璧锋浠�
+ * - 璺濈 > 璧锋璺濈 鈫� 鍗曚环 = 璧锋浠� + ceil((璺濈-璧锋璺濈)/瓒呭嚭璺濈鍗曚綅) 脳 瓒呭嚭璺濈鍗曚环
+ * 4. 灏忚 = 杩愯垂鍗曚环 脳 鏁伴噺
+ * 5. 鐗╁搧浠锋牸 = 鍚勯」灏忚涔嬪拰
+ * 6. 淇濅环璐圭敤 = 鎶ヤ环閲戦 脳 淇濅环璐圭巼锛堝瓧鍏� INSURANCE_RATE锛夛紝鍏冭浆鍒�
+ * 7. 鍔犳�ヨ垂鐢� = 鐗╁搧浠锋牸 脳 鍔犳�ョ郴鏁帮紙瀛楀吀 URGENT_COEFFICIENT锛�
+ * 8. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤 + 鍔犳�ヨ垂鐢�
+ *
+ * @param dto 寮傚湴瀛樺彇璁′环璇锋眰鍙傛暟
+ * @return 浠锋牸璁$畻缁撴灉
+ */
+ @Override
+ public PriceCalculateVO calculateRemotePrice(CalculateRemotePriceDTO dto) {
+ // 1. 璋冪敤鑵捐鍦板浘璺濈鐭╅樀API璁$畻椹捐溅璺濈
+ String from = dto.getFromLat() + "," + dto.getFromLgt();
+ String to = dto.getToLat() + "," + dto.getToLgt();
+ JSONObject distanceResult = MapUtil.distanceSingle("driving", from, to);
+ BigDecimal distance = distanceResult.getBigDecimal("distance");
+ // distance 鍗曚綅涓虹背锛岃浆涓哄叕閲�
+ BigDecimal distanceKm = distance.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP);
+
+ // 鏀堕泦鎵�鏈夌墿鍝佺被鍨婭D
+ List<Integer> categoryIds = new ArrayList<>();
+ for (OrderItemDTO item : dto.getItems()) {
+ categoryIds.add(item.getCategoryId());
+ }
+
+ // 2. 鎵归噺鏌ヨ閰嶉�佽浠疯鍒� pricing_rule type=1
+ List<String> fieldAList = new ArrayList<>();
+ for (Integer cid : categoryIds) {
+ fieldAList.add(String.valueOf(cid));
+ }
+ List<PricingRule> rules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
+ .eq(PricingRule::getDeleted, Constants.ZERO)
+ .eq(PricingRule::getType, Constants.ONE)
+ .eq(PricingRule::getCityId, dto.getCityId())
+ .in(PricingRule::getFieldA, fieldAList));
+ Map<String, PricingRule> ruleMap = new HashMap<>();
+ for (PricingRule r : rules) {
+ ruleMap.put(r.getFieldA(), r);
+ }
+
+ // 鏌ヨ灏卞湴瀛樺彇璁′环瑙勫垯 pricing_rule type=0锛岀敤浜庤幏鍙� locallyPrice
+ List<PricingRule> localRules = pricingRuleMapper.selectList(new QueryWrapper<PricingRule>().lambda()
+ .eq(PricingRule::getDeleted, Constants.ZERO)
+ .eq(PricingRule::getType, Constants.ZERO)
+ .eq(PricingRule::getCityId, dto.getCityId())
+ .in(PricingRule::getFieldA, fieldAList));
+ Map<String, PricingRule> localRuleMap = new HashMap<>();
+ for (PricingRule r : localRules) {
+ localRuleMap.put(r.getFieldA(), r);
+ }
+
+ // 鎵归噺鏌ヨ鐗╁搧绫诲瀷鍚嶇О
+ List<Category> categories = categoryMapper.selectBatchIds(categoryIds);
+ Map<Integer, String> categoryNameMap = new HashMap<>();
+ Map<Integer, String> categoryDetailMap = new HashMap<>();
+ for (Category c : categories) {
+ categoryNameMap.put(c.getId(), c.getName());
+ categoryDetailMap.put(c.getId(), c.getDetail());
+ }
+
+ // 3. 閫愰」璁$畻杩愯垂锛氳捣姝ヤ环 + 瓒呭嚭閮ㄥ垎闃舵浠�
+ List<ItemPriceVO> itemList = new ArrayList<>();
+ long itemPriceTotal = 0L;
+
+ for (OrderItemDTO item : dto.getItems()) {
+ PricingRule rule = ruleMap.get(String.valueOf(item.getCategoryId()));
+ if (rule == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),
+ "鏈壘鍒拌鍩庡競鐗╁搧绫诲瀷鐨勯厤閫佽浠疯鍒�");
+ }
+
+ // fieldB=璧锋璺濈(km), fieldC=璧锋浠�(鍒�), fieldD=瓒呭嚭璺濈鍗曚綅(km), fieldE=瓒呭嚭璺濈鍗曚环(鍒�)
+ BigDecimal startDistance = new BigDecimal(rule.getFieldB());
+ long startPrice = Long.parseLong(rule.getFieldC());
+ BigDecimal extraDistanceUnit = new BigDecimal(rule.getFieldD());
+ long extraPricePerUnit = Long.parseLong(rule.getFieldE());
+
+ // 闃舵璁′环锛氳窛绂� 鈮� 璧锋璺濈鍙栬捣姝ヤ环锛岃秴鍑烘寜 ceil(瓒呭嚭璺濈/鍗曚綅) 脳 鍗曚环绱姞
+ long unitPrice;
+ if (distanceKm.compareTo(startDistance) <= 0) {
+ unitPrice = startPrice;
+ } else {
+ BigDecimal extraKm = distanceKm.subtract(startDistance);
+ BigDecimal extraCount = extraKm.divide(extraDistanceUnit, 0, RoundingMode.CEILING);
+ unitPrice = startPrice + extraCount.longValue() * extraPricePerUnit;
+ }
+
+ long subtotal = unitPrice * item.getQuantity();
+
+ // 灏卞湴瀛樺彇鍗曚环
+ PricingRule localRule = localRuleMap.get(String.valueOf(item.getCategoryId()));
+ Long locallyPrice = localRule != null ? Long.parseLong(localRule.getFieldB()) : null;
+
+ ItemPriceVO vo = new ItemPriceVO();
+ vo.setCategoryId(item.getCategoryId());
+ vo.setCategoryName(categoryNameMap.getOrDefault(item.getCategoryId(), ""));
+ vo.setDetail(categoryDetailMap.get(item.getCategoryId()));
+ vo.setQuantity(item.getQuantity());
+ vo.setUnitPrice(unitPrice);
+ vo.setLocallyPrice(locallyPrice);
+ vo.setSubtotal(subtotal);
+ vo.setStartDistance(startDistance);
+ vo.setStartPrice(startPrice);
+ vo.setExtraDistance(extraDistanceUnit);
+ vo.setExtraPrice(extraPricePerUnit);
+ itemList.add(vo);
+
+ itemPriceTotal += subtotal;
+ }
+
+ // 4. 淇濅环璐圭敤锛氭姤浠烽噾棰� 脳 淇濅环璐圭巼(瀛楀吀 INSURANCE_RATE)锛屽厓鈫掑垎
+ long insuranceFeeFen = 0L;
+ if (Boolean.TRUE.equals(dto.getInsured()) && dto.getDeclaredAmount() != null) {
+ BigDecimal insuranceFeeYuan = calculateInsuranceFee(dto.getDeclaredAmount());
+ insuranceFeeFen = insuranceFeeYuan.multiply(new BigDecimal(100)).longValue();
+ }
+
+ // 5. 鍔犳�ヨ垂鐢細鐗╁搧浠锋牸 脳 鍔犳�ョ郴鏁�(瀛楀吀 URGENT_COEFFICIENT)
+ long urgentFeeFen = 0L;
+ if (Boolean.TRUE.equals(dto.getUrgent())) {
+ String urgentRateStr = systemDictDataBiz.queryByCode(
+ Constants.OPERATION_CONFIG, Constants.OP_URGENT_COEFFICIENT).getCode();
+ BigDecimal urgentRate = new BigDecimal(urgentRateStr);
+ urgentFeeFen = new BigDecimal(itemPriceTotal).multiply(urgentRate)
+ .setScale(0, RoundingMode.HALF_UP).longValue();
+ }
+
+ // 6. 鎬讳环鏍� = 鐗╁搧浠锋牸 + 淇濅环璐圭敤 + 鍔犳�ヨ垂鐢�
+ long totalPrice = itemPriceTotal + insuranceFeeFen + urgentFeeFen;
+
+ PriceCalculateVO result = new PriceCalculateVO();
+ result.setItemList(itemList);
+ result.setItemPrice(itemPriceTotal);
+ result.setInsuranceFee(insuranceFeeFen);
+ result.setUrgentFee(urgentFeeFen);
+ result.setTotalPrice(totalPrice);
+ result.setDistance(distanceKm);
+ return result;
+ }
@Override
public long count(Orders orders) {
@@ -669,1427 +540,2321 @@
return ordersMapper.selectCount(wrapper);
}
-
/**
- * 鎵嬪姩鎺ュ崟
- * @param orderId
+ * 鍒涘缓璁㈠崟
+ *
+ * 涓氬姟娴佺▼锛�
+ * 1. 鍙傛暟鏍¢獙锛氬繀濉瓧娈点�佹椂闂撮『搴忋�佺墿鍝佷笉閲嶅銆佸紓鍦板繀濉湇鍔℃椂鏁�
+ * 2. 鏌ヨ瀵勪欢搴楅摵淇℃伅锛堣幏鍙栫粡绾害銆佸湴鍧�锛�
+ * 3. 璋冪敤璁′环鎺ュ彛璁$畻璐圭敤锛坈alculateLocalPrice / calculateRemotePrice锛�
+ * 4. 鐢熸垚璁㈠崟缂栧彿锛欽C + yyyyMMddHHmmss + 4浣嶉殢鏈烘暟
+ * 5. 鍒涘缓璁㈠崟涓昏〃 Orders锛堢姸鎬�=寰呮敮浠橈級
+ * 6. 鍒涘缓璁㈠崟鏄庣粏琛� OrdersDetail锛堟瘡椤圭墿鍝佸昂瀵革級
+ * 7. 鍒涘缓闄勪欢璁板綍 Multifile锛堢墿鍝佸浘鐗� objType=12锛�
+ *
+ * @param dto 鍒涘缓璁㈠崟璇锋眰鍙傛暟
+ * @param memberId 褰撳墠鐧诲綍浼氬憳ID
+ * @return 璁㈠崟ID
*/
@Override
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public void accept(Integer orderId,Member member){
- Orders orders = ordersMapper.selectById(orderId);
- if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ @Transactional(rollbackFor = Exception.class)
+ public PayResponse createOrder(CreateOrderDTO dto, Integer memberId) {
+ String lockKey = Constants.GOODS_ORDER_CREATE_LOCK + memberId;
+ //鍒ゆ柇鍓嶇鏄惁鍦ㄥ悓涓�椤甸潰鍒涘缓浜嗕袱娆¤鍗�
+ if (redisTemplate.hasKey(lockKey)) {
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"姝e湪鍒涘缓璁㈠崟锛岃鍕块噸澶嶈皟鐢紒");
+ } else {
+ redisTemplate.opsForValue().set(lockKey, "", 5, TimeUnit.SECONDS);
}
- if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.wait.getKey())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜璇ユ搷浣�");
+ Date now = new Date();
+ // ========== 1. 鍙傛暟鏍¢獙 ==========
+ // 棰勮鍒板簵瀛樹欢鏃堕棿蹇呴』灏忎簬棰勮鍒板簵鍙栦欢鏃堕棿
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm");
+ Date depositTime;
+ Date takeTime;
+ try {
+ depositTime = sdf.parse(dto.getExpectedDepositTime());
+ takeTime = sdf.parse(dto.getExpectedTakeTime());
+ } catch (java.text.ParseException e) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃堕棿鏍煎紡閿欒锛屾纭牸寮忥細yyyy-MM-dd HH:mm");
}
- if(Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎮ㄨ嚜宸辩殑璁㈠崟鏃犳硶杩涜璇ユ搷浣�");
- }
- member = memberMapper.selectById(member.getId());
- //鏌ヨ鐢ㄦ埛鏄惁鏈夊搴旇韩浠�
- if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
- if(!Constants.equalsInteger(member.getWorkerIdentity(),Constants.TWO)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎮ㄨ繕鏈敞鍐岃鏈嶅姟锛岃鍓嶅線\"鎴戠殑\"椤甸潰鎻愪氦鐢宠");
- }
- }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
- if(!Constants.equalsInteger(member.getDriverIdentity(),Constants.TWO)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎮ㄨ繕鏈敞鍐岃鏈嶅姟锛岃鍓嶅線\"鎴戠殑\"椤甸潰鎻愪氦鐢宠");
- }
- }else{
- if(!Constants.equalsInteger(member.getChefIdentity(),Constants.TWO)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎮ㄨ繕鏈敞鍐岃鏈嶅姟锛岃鍓嶅線\"鎴戠殑\"椤甸潰鎻愪氦鐢宠");
- }
+ if (!depositTime.before(takeTime)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "棰勮鍒板簵瀛樹欢鏃堕棿蹇呴』灏忎簬棰勮鍒板簵鍙栦欢鏃堕棿");
}
- ordersMapper.update(new UpdateWrapper<Orders>().lambda().eq(Orders::getId,orders.getId())
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getAcceptType,Constants.ZERO)
- .set(Orders::getAcceptTime,new Date())
- .set(Orders::getAcceptMemberId,member.getId())
- .set(Orders::getStatus,Constants.ordersStatus.accept.getKey())
- );
-
- //鏇存柊鎺ュ崟閲�
- memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" RECEIVE_NUM = (ifnull(RECEIVE_NUM,0) + 1 )").eq(Member::getId,member.getId()));
-
- //鍒涘缓鎿嶄綔鏃ュ織
- Constants.OrdersLog ordersLog = Constants.OrdersLog.RECEIVE;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),member.getId(),null);
-
- IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,member.getId())
- .eq(IdentityInfo::getType,orders.getType())
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- Member releaseMember = memberMapper.selectById(orders.getReleaseMemberId());
-
- if(Objects.nonNull(releaseMember)){
- if(org.apache.commons.lang3.StringUtils.isNotBlank(releaseMember.getOpenid())&&Objects.nonNull(wokerIdentityInfo)){
- //鍙戦�佸井淇¢�氱煡
- sendWxMessage.acceptMessage(releaseMember.getOpenid(),orders,wokerIdentityInfo.getLinkName(),wokerIdentityInfo.getTelephone());
+ // 鐗╁搧灏哄涓嶈兘閲嶅
+ List<Integer> categoryIds = new ArrayList<>();
+ for (OrderItemDTO item : dto.getItems()) {
+ if (categoryIds.contains(item.getCategoryId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐗╁搧灏哄涓嶈兘閲嶅");
}
- if(org.apache.commons.lang3.StringUtils.isNotBlank(orders.getLinkPhone())){
- //鐭俊閫氱煡
- aliSmsService.businessSendSms(Constants.smsContent.accept.getKey(),orders.getLinkPhone(),orders,null,
- wokerIdentityInfo,categoryMapper);
- }
+ categoryIds.add(item.getCategoryId());
}
+ // 鐗╁搧鍥剧墖鏈�澶�3寮�
+ if (dto.getGoodsImages() != null && dto.getGoodsImages().size() > 3) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐗╁搧鍥剧墖鏈�澶�3寮�");
+ }
+ // ========== 2. 鏍¢獙鐗╁搧绫诲瀷 ==========
+ Category goodTypeCategory = categoryMapper.selectById(dto.getGoodType());
+ if (goodTypeCategory == null || Constants.equalsInteger(goodTypeCategory.getDeleted(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐗╁搧绫诲瀷涓嶅瓨鍦�");
+ }
+ if (!Constants.equalsInteger(goodTypeCategory.getType(), Constants.TWO)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐗╁搧绫诲瀷鍙傛暟閿欒");
+ }
+ // ========== 3. 鏌ヨ瀵勪欢搴楅摵淇℃伅 ==========
+ ShopInfo depositShop = shopInfoMapper.selectById(dto.getDepositShopId());
+ if (depositShop == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵勪欢搴楅摵涓嶅瓨鍦�");
+ }
+
+ // ========== 4. 璁$畻璐圭敤 ==========
+
+ // 寮傚湴瀵勫瓨锛氭牎楠屽彇浠剁偣
+ BigDecimal takeLat = null;
+ BigDecimal takeLgt = null;
+ String takeLocationValue = null;
+ ShopInfo takeShop = null;
+ if (Constants.ONE.equals(dto.getType())) {
+ // 寮傚湴蹇呭~鏈嶅姟鏃舵晥
+ if (dto.getIsUrgent() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚湴瀵勫瓨鏈嶅姟鏃舵晥涓嶈兘涓虹┖");
+ }
+ // 鍙栦欢鐐癸細搴楅摵 or 鑷�夌偣锛岃嚦灏戞彁渚涗竴缁�
+ if (dto.getTakeShopId() != null) {
+ takeShop = shopInfoMapper.selectById(dto.getTakeShopId());
+ if (takeShop == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍙栦欢搴楅摵涓嶅瓨鍦�");
+ }
+ takeLat = BigDecimal.valueOf(takeShop.getLatitude());
+ takeLgt = BigDecimal.valueOf(takeShop.getLongitude());
+ takeLocationValue = takeShop.getAddress();
+ } else if (dto.getTakeLat() != null && dto.getTakeLgt() != null && StringUtils.isNotBlank(dto.getTakeLocation())) {
+ takeLat = dto.getTakeLat();
+ takeLgt = dto.getTakeLgt();
+ takeLocationValue = dto.getTakeLocation();
+ } else {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇烽�夋嫨鍙栦欢搴楅摵鎴栬緭鍏ヨ嚜閫夊彇浠跺湴鍧�");
+ }
+ } else {
+ // 灏卞湴瀛樺彇锛氬彇浠堕棬搴楀悓瀵勪欢闂ㄥ簵
+ takeShop = depositShop;
+ }
+
+ // ========== 3. 璁$畻璐圭敤 ==========
+ PriceCalculateVO priceResult;
+ if (Constants.ZERO.equals(dto.getType())) {
+ // 灏卞湴瀵勫瓨锛氳绠楀ぉ鏁�
+ long diffMs = takeTime.getTime() - depositTime.getTime();
+ int days = (int) Math.max(1, (diffMs / (1000 * 60 * 60 * 24)) + 1);
+
+ CalculateLocalPriceDTO priceDTO = new CalculateLocalPriceDTO();
+ priceDTO.setCityId(dto.getCityId());
+ priceDTO.setEstimatedDepositDays(days);
+ priceDTO.setItems(dto.getItems());
+ priceDTO.setInsured(dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0);
+ priceDTO.setDeclaredAmount(dto.getDeclaredAmount());
+ priceResult = calculateLocalPrice(priceDTO);
+ } else {
+ // 寮傚湴瀵勫瓨
+ CalculateRemotePriceDTO priceDTO = new CalculateRemotePriceDTO();
+ priceDTO.setCityId(dto.getCityId());
+ priceDTO.setFromLat(BigDecimal.valueOf(depositShop.getLatitude()));
+ priceDTO.setFromLgt(BigDecimal.valueOf(depositShop.getLongitude()));
+ priceDTO.setToLat(takeLat);
+ priceDTO.setToLgt(takeLgt);
+ priceDTO.setItems(dto.getItems());
+ priceDTO.setInsured(dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0);
+ priceDTO.setDeclaredAmount(dto.getDeclaredAmount());
+ priceDTO.setUrgent(Constants.ONE.equals(dto.getIsUrgent()));
+ priceResult = calculateRemotePrice(priceDTO);
+ }
+
+ // ========== 5. 鐢熸垚璁㈠崟缂栧彿 ==========
+ String orderCode = "JC" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now)
+ + String.format("%04d", new java.util.Random().nextInt(10000));
+ // 鐢熸垚32浣嶅敮涓�绗笁鏂硅鍗曠紪鍙�
+ String orderTradeNo = generateOrderTradeNo();
+
+ // ========== 6. 鍒涘缓璁㈠崟涓昏〃 ==========
+ Orders orders = new Orders();
+ orders.setCode(orderCode);
+ orders.setOutTradeNo(orderTradeNo);
+ orders.setMemberId(memberId);
+ orders.setType(dto.getType());
+ orders.setCityId(String.valueOf(dto.getCityId()));
+ orders.setStatus(Constants.ZERO); // 寰呮敮浠�
+ orders.setPayStatus(Constants.ZERO); // 鏈敮浠�
+ orders.setCommentStatus(Constants.ZERO); // 鏈瘎浠�
+ orders.setSettlementStatus(Constants.ZERO); // 鏈粨绠�
+ orders.setDeleted(Constants.ZERO);
+ orders.setCreateTime(now);
+ orders.setUpdateTime(now);
+
+ // 瀵勪欢淇℃伅
+ orders.setDepositShopId(dto.getDepositShopId());
+ // 瀛樹欢鍦扮偣锛氱渷甯傚尯鍏ㄨ矾寰� + 鍦板潃鎻忚堪
+ String depositLocationRemark = depositShop.getAddress();
+ if (depositShop.getAreaId() != null) {
+ Areas depositArea = areasBiz.resolveArea(depositShop.getAreaId());
+ if (depositArea != null) {
+ depositLocationRemark = depositArea.getProvinceName() + depositArea.getCityName() + depositArea.getName() + depositShop.getAddress();
+ }
+ }
+ orders.setDepositLocation(depositLocationRemark);
+ orders.setDepositLocationRemark(depositShop.getAddress());
+ orders.setDepositLat(BigDecimal.valueOf(depositShop.getLatitude()));
+ orders.setDepositLgt(BigDecimal.valueOf(depositShop.getLongitude()));
+
+ // 鍙栦欢淇℃伅
+ orders.setTakeUser(dto.getTakeUser());
+ orders.setTakePhone(dto.getTakePhone());
+ orders.setExpectedDepositTime(depositTime);
+ orders.setExpectedTakeTime(takeTime);
+ // 璁$畻棰勮瀛樻斁澶╂暟
+ long dayDiff = (takeTime.getTime() - depositTime.getTime()) / (1000 * 60 * 60 * 24);
+ orders.setEstimatedDepositDays((int) Math.max(1, dayDiff + 1));
+
+ if (Constants.ONE.equals(dto.getType())) {
+ // 寮傚湴锛氬彇浠剁偣淇℃伅
+ orders.setTakeShopId(dto.getTakeShopId());
+ orders.setTakeLocation(takeLocationValue);
+ orders.setTakeLat(takeLat);
+ orders.setTakeLgt(takeLgt);
+ orders.setIsUrgent(dto.getIsUrgent());
+ } else {
+ // 灏卞湴锛氬彇浠剁偣鍚屽瘎浠跺簵閾�
+ orders.setTakeShopId(dto.getDepositShopId());
+ orders.setTakeLocation(depositShop.getAddress());
+ orders.setTakeLat(BigDecimal.valueOf(depositShop.getLatitude()));
+ orders.setTakeLgt(BigDecimal.valueOf(depositShop.getLongitude()));
+ orders.setIsUrgent(Constants.ZERO);
+ }
+
+ // 鐗╁搧淇℃伅
+ orders.setGoodType(dto.getGoodType());
+ // 鎷兼帴鐗╁搧淇℃伅锛氱墿鍝佺被鍨嬪悕绉般�佸昂瀵稿悕绉�*鏁伴噺锛堟暟缁勫瓧绗︿覆锛�
+ List<String> goodsParts = new ArrayList<>();
+ for (ItemPriceVO itemVO : priceResult.getItemList()) {
+ goodsParts.add(itemVO.getCategoryName() + "*" + itemVO.getQuantity());
+ }
+ orders.setGoodsInfo(goodTypeCategory.getName() + "銆�" + String.join("锛�", goodsParts));
+ orders.setRemark(dto.getRemark());
+ orders.setSelfTake(Constants.ZERO);
+
+ // 璐圭敤淇℃伅(鍒�)
+ orders.setBasicAmount(priceResult.getItemPrice());
+ orders.setEstimatedAmount(priceResult.getTotalPrice());
+ orders.setTotalAmount(priceResult.getTotalPrice());
+ orders.setUrgentAmount(priceResult.getUrgentFee());
+ if (dto.getDeclaredAmount() != null && dto.getDeclaredAmount().compareTo(BigDecimal.ZERO) > 0) {
+ orders.setDeclaredAmount(dto.getDeclaredAmount().multiply(new BigDecimal(100)).longValue());
+ } else {
+ orders.setDeclaredAmount(0L);
+ }
+ orders.setDeclaredFee(priceResult.getInsuranceFee());
+ orders.setPrice(priceResult.getItemPrice());
+
+ // 钖叕璁$畻涓庡崰姣斿瓨鍌�
+ calculateAndSetFeeAllocation(orders, depositShop, takeShop);
+
+ ordersMapper.insert(orders);
+ Integer orderId = orders.getId();
+
+ // ========== 7. 鍒涘缓璁㈠崟鏄庣粏 ==========
+ for (ItemPriceVO itemVO : priceResult.getItemList()) {
+ OrdersDetail detail = new OrdersDetail();
+ detail.setOrderId(orderId);
+ detail.setLuggageId(itemVO.getCategoryId());
+ detail.setLuggageName(itemVO.getCategoryName());
+ detail.setLuggageDetail(itemVO.getDetail());
+ detail.setNum(itemVO.getQuantity());
+ detail.setUnitPrice(itemVO.getUnitPrice());
+ detail.setStartDistance(itemVO.getStartDistance());
+ detail.setStartPrice(itemVO.getStartPrice());
+ detail.setExtraDistance(itemVO.getExtraDistance());
+ detail.setExtraPrice(itemVO.getExtraPrice());
+ detail.setLocallyPrice(itemVO.getLocallyPrice());
+ detail.setDeleted(Constants.ZERO);
+ detail.setCreateTime(now);
+ ordersDetailMapper.insert(detail);
+ }
+ // ========== 8. 淇濆瓨鐗╁搧鍥剧墖闄勪欢 ==========
+ if (dto.getGoodsImages() != null && !dto.getGoodsImages().isEmpty()) {
+ int sortNum = 1;
+ for (String imgUrl : dto.getGoodsImages()) {
+ Multifile multifile = new Multifile();
+ multifile.setObjId(orderId);
+ multifile.setObjType(Constants.FileType.ORDER_FILE.getKey());
+ multifile.setType(Constants.ZERO);
+ multifile.setFileurl(imgUrl);
+ multifile.setIsdeleted(Constants.ZERO);
+ multifile.setCreateDate(now);
+ multifile.setSortnum(sortNum++);
+ multifileMapper.insert(multifile);
+ }
+ }
+ // ========== 9. 鍞よ捣寰俊鏀粯 ==========
+ Member member = memberMapper.selectById(memberId);
+ if (member == null || StringUtils.isBlank(member.getOpenid())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛淇℃伅寮傚父锛屾棤娉曞彂璧锋敮浠�");
+ }
+ PayResponse payResponse = wxPay(orders, member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
+ payResponse.setLockKey(lockKey);
+ return payResponse;
}
-
- /**
- * 寮�濮嬩綔涓�
- * @param orderId
- * @param member
- */
@Override
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public void begin(Integer orderId,Member member){
+ @Transactional(rollbackFor = Exception.class)
+ public PayResponse continuePay(Integer orderId, Integer memberId) {
+ // 1. 鏌ヨ璁㈠崟
Orders orders = ordersMapper.selectById(orderId);
- if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
+ if (Objects.isNull(orders) || Constants.equalsInteger(orders.getDeleted(), Constants.ONE)) {
throw new BusinessException(ResponseStatus.DATA_EMPTY);
}
- if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜璇ユ搷浣�");
+ // 2. 鏍¢獙璁㈠崟褰掑睘
+ if (!Constants.equalsInteger(orders.getMemberId(), memberId)) {
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鎿嶄綔璇ヨ鍗�");
}
- if(!Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勮鍗曟棤娉曡繘琛岃鎿嶄綔");
+ // 3. 鏍¢獙璁㈠崟鐘舵�侊細浠呭緟鏀粯鍙户缁敮浠�
+ if (!Constants.equalsInteger(orders.getStatus(), Constants.ZERO)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鏀寔缁х画鏀粯");
}
- if(Constants.equalsInteger(orders.getIsUpdate(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟淇敼寰呯‘璁わ紝鏃犳硶杩涜璇ユ搷浣�");
+ // 4. 鏍¢獙鏀粯閲戦
+ if (orders.getTotalAmount() == null || orders.getTotalAmount() <= 0) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟閲戦寮傚父锛屾棤娉曞彂璧锋敮浠�");
}
- if(orders.getStartDate().getTime()>System.currentTimeMillis()){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鏈埌寮�濮嬫椂闂存棤娉曡繘琛岃鎿嶄綔");
- }
+ // 5. 閲嶆柊鐢熸垚绗笁鏂硅鍗曠紪鍙凤紙閬垮厤閲嶅锛�
+ String orderTradeNo = generateOrderTradeNo();
+ orders.setOutTradeNo(orderTradeNo);
orders.setUpdateTime(new Date());
- orders.setStatus(Constants.ordersStatus.doing.getKey());
- orders.setWorkStartTime(new Date());
ordersMapper.updateById(orders);
-
- //鍒涘缓鎿嶄綔鏃ュ織
- Constants.OrdersLog ordersLog = Constants.OrdersLog.BEGIN;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),member.getId(),null);
- }
-
-
- /**
- * 鍙戝崟鏂逛慨鏀硅鍗� - 宸叉帴鍗曠姸鎬�
- */
-// @Override
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public void updOrderData(Orders orders,Orders model){
- if(Objects.isNull(orders)
- || Objects.isNull(orders.getStartDate())
- || Objects.isNull(orders.getEndDate())){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ // 6. 鍞よ捣寰俊鏀粯
+ Member member = memberMapper.selectById(memberId);
+ if (member == null || StringUtils.isBlank(member.getOpenid())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛淇℃伅寮傚父锛屾棤娉曞彂璧锋敮浠�");
}
- model.setTotalDays(DateUtil.daysBetweenDates(orders.getEndDate(),orders.getStartDate())+1);
- model.setStartDate(orders.getStartDate());
- model.setEndDate(orders.getEndDate());
- //鐢ㄨ溅绫诲瀷
- if(Constants.equalsInteger(model.getType(),Constants.ONE)){
- if(Constants.equalsInteger(model.getCarType(),Constants.ZERO)) {
- model.setPriceNum1(orders.getTotalDays());
- }
- }else if(Constants.equalsInteger(model.getType(),Constants.ZERO)){
- if(Constants.equalsInteger(model.getWorkType(),Constants.ONE)||
- (Constants.equalsInteger(model.getWorkType(),Constants.TWO)&&Constants.equalsInteger(model.getCarType(),Constants.ZERO))){
- model.setPriceNum1(orders.getTotalDays());
- }
- }else{
- model.setPriceNum1(orders.getTotalDays());
- }
- Long total = this.getTotal(orders);
- Long tcje = Long.valueOf(new BigDecimal(total.toString()).multiply(model.getPlatformRata()).intValue());
- Long reciveTotal = total - tcje;
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getStartDate,model.getStartDate())
- .set(Orders::getEndDate,model.getEndDate())
- .set(Orders::getTotalDays,model.getTotalDays())
- .set(Orders::getIsUpdate,Constants.ONE)
- .set(Orders::getIsUpdateTime,new Date())
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getEstimatedAccount,total)
- .set(Orders::getOriginEstimatedAccount,total)
- .set(Orders::getReceiveAccount,reciveTotal)
- .eq(Orders::getId,orders.getId())
- );
- //鍒涘缓鎿嶄綔鏃ュ織
- Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_ORDER;
- this.saveOrderLog(model,ordersLog,
- ordersLog.getInfo(),orders.getMember().getId(),null);
-
- //閫氱煡鎺ュ崟浜� 璁㈠崟鍙戠敓鍙樻洿
- Member member = memberMapper.selectById(model.getAcceptMemberId());
- if(Objects.nonNull(member)){
- if(org.apache.commons.lang3.StringUtils.isNotBlank(member.getOpenid())){
- model.setStartDate(orders.getStartDate());
- model.setEndDate(orders.getEndDate());
- //鍙戦�佸井淇¢�氱煡
- sendWxMessage.orderUpdMessage(member.getOpenid(),model);
- }
- IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,member.getId())
- .eq(IdentityInfo::getType,orders.getType())
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- if(Objects.nonNull(wokerIdentityInfo)){
- //鐭俊閫氱煡
- aliSmsService.businessSendSms(Constants.smsContent.orderUpd.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
- null,categoryMapper);
- }
- }
-
- }
-
-
- @Override
- public Long getTotal(Orders orders){
- if(Objects.isNull(orders)
- ||Objects.isNull(orders.getPrice())
- ||Objects.isNull(orders.getPriceNum1())
- ||Objects.isNull(orders.getType())
- ){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- BigDecimal bigDecimalPrice = BigDecimal.ZERO;
- if(
- (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Constants.equalsInteger(orders.getWorkType(),Constants.ZERO ))
- || (Constants.equalsInteger(orders.getType(),Constants.ZERO) && Objects.nonNull(orders.getCarType()) && Constants.equalsInteger(orders.getWorkType(),Constants.TWO ) && Constants.equalsInteger(orders.getCarType(),Constants.TWO))
- || Constants.equalsInteger(orders.getType(),Constants.ONE)
- || Constants.equalsInteger(orders.getType(),Constants.TWO)
- ){
- bigDecimalPrice = orders.getPrice().multiply(new BigDecimal(orders.getPriceNum1().toString()));
- }else{
- if(Objects.isNull(orders.getPriceNum2())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- bigDecimalPrice = orders.getPrice().multiply(new BigDecimal(orders.getPriceNum1().toString())).multiply(new BigDecimal(orders.getPriceNum2().toString()));
- }
- if(Objects.nonNull(orders.getConfirmOtherFee())){
- bigDecimalPrice = bigDecimalPrice.add(new BigDecimal(orders.getConfirmOtherFee().toString()));
- }
- return bigDecimalPrice.divide(new BigDecimal("1"),0,BigDecimal.ROUND_HALF_UP).longValue();//orders.getPrice() * orders.getPriceNum1() * orders.getPriceNum2();
- }
-
-
- /**
- * 鎺ュ崟鏂圭‘璁よ鍗曡垂鐢�
- */
- @Override
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public void confirmFee(ConfirmFeeOrderDTO confirmUpdOrderDTO){
- if(Objects.isNull(confirmUpdOrderDTO)
- || Objects.isNull(confirmUpdOrderDTO.getOrderId())
- || Objects.isNull(confirmUpdOrderDTO.getPriceNum1())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- Orders orders = ordersMapper.selectById(confirmUpdOrderDTO.getOrderId());
- if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
- }
- if(!Constants.equalsInteger(orders.getAcceptMemberId(),confirmUpdOrderDTO.getMember().getId())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勮鍗曟棤娉曡繘琛岃鎿嶄綔");
- }
- if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.doing.getKey())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜璇ユ搷浣�");
- }
- //绫诲瀷:0=鐢ㄥ伐锛�1=杩愯揣锛�2=璁㈤
- if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
- //鐢ㄥ伐绫诲瀷:0=閲囨憳宸ワ紱1=鍒嗘嫞宸ワ紱2=鍖呰宸ワ紱锛堢敤宸ヨ鍗曪級
- if(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)){
- //1=鍒嗘嫞宸�
- if( Objects.isNull(confirmUpdOrderDTO.getPriceNum2())){//蹇呴』鏈夌敤宸ユ暟閲忥紙浜猴級
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- }else if(Constants.equalsInteger(orders.getWorkType(),Constants.TWO)){
- //鍖呰宸� 鐢ㄨ溅绫诲瀷(鐢ㄥ伐鍖呰/杩愯揣浣跨敤):0=澶�;1=娆�/灏忔椂;2=閲嶉噺
- if( !Constants.equalsInteger(orders.getCarType(),Constants.TWO)
- && Objects.isNull(confirmUpdOrderDTO.getPriceNum2())){
- //涓嶆槸鎸夐噸閲忚璐圭殑锛屽繀椤绘湁鐢ㄥ伐鏁伴噺锛堜汉锛�
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- }
- }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
- //杩愯揣璁㈠崟
-
- }else{
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璇ヨ鍗曚笉鏀寔璇ユ搷浣滐紝璇疯繑鍥炲埛鏂伴噸璇曪紒");
- }
- orders.setPriceNum1(confirmUpdOrderDTO.getPriceNum1());
- orders.setPriceNum2(confirmUpdOrderDTO.getPriceNum2());
- orders.setConfirmOtherFee(confirmUpdOrderDTO.getConfirmOtherFee());
- Long totalFee = this.getTotal(orders);//閲嶆柊璁$畻璐圭敤
- Long payFee = totalFee;//閲嶆柊璁$畻璐圭敤
- Long tcje = Long.valueOf(new BigDecimal(orders.getPayAccount().toString()).multiply(orders.getPlatformRata()).intValue());
- Long reciveTotal = payFee - tcje;
- //BigDecimal recFee = new BigDecimal(payFee).multiply((new BigDecimal(1).subtract(Constants.formatBigDecimal(orders.getPlatformRata())))).setScale(0, RoundingMode.HALF_UP) ;
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getPriceNum1,confirmUpdOrderDTO.getPriceNum1())
- .set(Orders::getPriceNum2,confirmUpdOrderDTO.getPriceNum2())
- .set(Orders::getConfirmFeeRemark,confirmUpdOrderDTO.getConfirmFeeRemark())
- .set(Orders::getConfirmOtherFee,confirmUpdOrderDTO.getConfirmOtherFee())
- .set(Orders::getEstimatedAccount,totalFee)
- .set(Orders::getStatus,Constants.ordersStatus.feeconfirm.getKey())
- .set(Orders::getPayAccount,payFee)
- .set(Orders::getReceiveAccount,reciveTotal)
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getConfirmFeeTime,new Date())
- .eq(Orders::getId,orders.getId())
- );
- //璁板綍鍚屾剰淇敼鐨勬棩蹇�
- Constants.OrdersLog ordersLog = Constants.OrdersLog.FEE_CONFIRM;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),confirmUpdOrderDTO.getMember().getId(),null);
-
- //寰俊閫氱煡
- Member member = memberMapper.selectById(orders.getReleaseMemberId());
- if(Objects.nonNull(member)&& org.apache.commons.lang3.StringUtils.isNotBlank(member.getOpenid())){
- sendWxMessage.waitPayMessage(member.getOpenid(),orders);
- }
-
+ return wxPay(orders, member.getOpenid(), Constants.OrdersAttach.STORAGE_ORDER);
}
/**
- * 鎺ュ崟鏂瑰鐞嗚鍗曚慨鏀�
- * @param confirmUpdOrderDTO
+ * 鍞よ捣寰俊灏忕▼搴忔敮浠�
+ *
+ * @param orders 璁㈠崟瀹炰綋锛堥渶瑕� code銆乼otalAmount锛�
+ * @param openid 鐢ㄦ埛寰俊openid
+ * @param ordersAttach 璁㈠崟鏀粯绫诲瀷
+ * @return PayResponse 鍖呭惈寰俊璋冭捣鍙傛暟鍜岃鍗曚富閿�
*/
- @Override
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public void confirmUpd(ConfirmUpdOrderDTO confirmUpdOrderDTO){
- if(Objects.isNull(confirmUpdOrderDTO)
- || Objects.isNull(confirmUpdOrderDTO.getOrderId())
- || Objects.isNull(confirmUpdOrderDTO.getStatus())
- || !(Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ONE)||
- Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ZERO))
- ){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
- }
- Orders orders = ordersMapper.selectById(confirmUpdOrderDTO.getOrderId());
- if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
- }
- if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜璇ユ搷浣�");
- }
- if(!Constants.equalsInteger(orders.getIsUpdate(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟淇敼鐘舵�佸凡娴佽浆锛屾棤娉曡繘琛岃鎿嶄綔");
- }
- if(!Constants.equalsInteger(orders.getAcceptMemberId(),confirmUpdOrderDTO.getMember().getId())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勮鍗曟棤娉曡繘琛岃鎿嶄綔");
- }
- if(!Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ONE)){
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getIsUpdate,Constants.TWO)
- .set(Orders::getUpdateTime,new Date())
- .eq(Orders::getId,orders.getId())
- );
- //璁板綍鍚屾剰淇敼鐨勬棩蹇�
- Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_AGREE;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),confirmUpdOrderDTO.getMember().getId(),null);
- }else{
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getIsUpdate,Constants.TWO)
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getStatus,Constants.ordersStatus.wait.getKey())
- .set(Orders::getAcceptMemberId,null)
- .set(Orders::getAcceptType,null)
- .eq(Orders::getId,orders.getId())
- );
+ private PayResponse wxPay(Orders orders, String openid, Constants.OrdersAttach ordersAttach) {
+ try {
+ WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
+ request.setBody(ordersAttach.getName());
+ request.setAttach(ordersAttach.getKey());
+ request.setOutTradeNo(orders.getOutTradeNo());
+ // totalAmount 鍗曚綅涓哄垎锛學eChat Pay setTotalFee 涔熸槸鍒嗭紝鐩存帴杞琲nt
+ long totalFee = orders.getTotalAmount() != null ? orders.getTotalAmount() : 0L;
+ request.setTotalFee((int) totalFee);
+ request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss"));
+ request.setSpbillCreateIp(Constants.getIpAddr());
+ request.setOpenid(openid);
- memberMapper.update(new UpdateWrapper<Member>().lambda().setSql("receive_num = receive_num - 1").eq(Member::getId,confirmUpdOrderDTO.getMember().getId()));
+ Object response = WxMiniConfig.wxPayService.createOrder(request);
- //璁板綍涓嶅悓鎰忎慨鏀圭殑鏃ュ織
- Constants.OrdersLog ordersLog = Constants.OrdersLog.UPD_DISAGREE;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),confirmUpdOrderDTO.getMember().getId(),null);
+ PayResponse payResponse = new PayResponse();
+ payResponse.setResponse(response);
+ payResponse.setOrderId(orders.getId());
+ return payResponse;
+ } catch (WxPayException e) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏀粯璋冭捣澶辫触锛�" + e.getMessage());
}
- //鐭俊閫氱煡
- aliSmsService.businessSendSms(!Constants.equalsInteger(confirmUpdOrderDTO.getStatus(),Constants.ONE)?
- Constants.smsContent.agreeUpd.getKey():Constants.smsContent.disAgreeUpd.getKey()
- ,orders.getLinkPhone(),null,null,
- null,categoryMapper);
}
+
+
+
@Override
- public void cancelOrder(Integer orderId,Member member){
- Orders orders = ordersMapper.selectById(orderId);
- if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
+ public OrderDetailVO findDetail(Integer id) {
+ Orders order = ordersMapper.selectById(id);
+ if (Objects.isNull(order)) {
throw new BusinessException(ResponseStatus.DATA_EMPTY);
}
- if(Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){
- this.releaseCancelOrder(orders,member);
- }else if(Constants.equalsInteger(orders.getAcceptMemberId(),member.getId())){
- this.receiveCancelOrder(orders,member);
- }else{
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勮鍗曟棤娉曡繘琛岃鎿嶄綔");
+
+ OrderDetailVO vo = new OrderDetailVO();
+ vo.setOrder(order);
+
+ // 鍥剧墖璺緞鍓嶇紑
+ String imgPrefix = getOrdersPrefix();
+
+ // 涓嬪崟鍥剧墖 (type=12)
+ vo.setOrderFiles(getFileUrls(id, Constants.FileType.ORDER_FILE.getKey(), imgPrefix));
+
+ // 浼氬憳淇℃伅
+ if (order.getMemberId() != null) {
+ Member member = memberMapper.selectById(order.getMemberId());
+ if (member != null) {
+ vo.setMemberName(member.getName());
+ vo.setMemberPhone(member.getTelephone());
+ }
}
+ // 瀵勫瓨闂ㄥ簵淇℃伅
+ if (order.getDepositShopId() != null) {
+ ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+ if (depositShop != null) {
+ vo.setDepositShopName(depositShop.getName());
+ vo.setDepositShopPhone(depositShop.getLinkPhone());
+ }
+ }
+ // 鍙栦欢闂ㄥ簵淇℃伅
+ if (order.getTakeShopId() != null) {
+ ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
+ if (takeShop != null) {
+ vo.setTakeShopName(takeShop.getName());
+ vo.setTakeShopAddress(takeShop.getAddress());
+ vo.setTakeShopPhone(takeShop.getLinkPhone());
+ }
+ }
+
+ // 鎺ュ崟鍙告満淇℃伅
+ if (order.getAcceptDriver() != null) {
+ DriverInfo driverInfo = driverInfoMapper.selectById(order.getAcceptDriver());
+ if (driverInfo != null) {
+ vo.setDriverName(driverInfo.getName());
+ }
+ }
+
+ // 閰嶉�侀檮浠跺浘鐗�
+ vo.setDepositImages(getFileUrls(id, Constants.FileType.ORDER_DEPOSIT.getKey(), imgPrefix));
+ vo.setStoreInImages(getFileUrls(id, Constants.FileType.ORDER_TAKE.getKey(), imgPrefix));
+ vo.setDriverTakeImages(getFileUrls(id, Constants.FileType.DRIVER_TAKE.getKey(), imgPrefix));
+ vo.setDriverDoneImages(getFileUrls(id, Constants.FileType.DRIVER_DONE.getKey(), imgPrefix));
+ vo.setStoreOutImages(getFileUrls(id, Constants.FileType.STORE_OUT.getKey(), imgPrefix));
+ // 鐗╁搧鏄庣粏
+ vo.setDetailList(buildDetailList(id));
+ Category category = categoryMapper.selectById(order.getGoodType());
+ if(CollectionUtils.isNotEmpty(vo.getDetailList())&&Objects.nonNull(category)){
+ for (OrderItemVO v:vo.getDetailList()) {
+ v.setTypeName(category.getName());
+ }
+ }
+
+ // 鍙栨秷/閫�娆剧姸鎬佹椂鏌ヨ閫�娆捐褰�
+ Integer status = order.getStatus();
+ if (status != null && (status == Constants.OrderStatus.overdue.getStatus()
+ || status == Constants.OrderStatus.closed.getStatus()
+ || status == Constants.OrderStatus.cancelOverdue.getStatus()
+ || status == Constants.OrderStatus.cancelling.getStatus()
+ || status == Constants.OrderStatus.cancelled.getStatus())) {
+ OrdersRefund ordersRefund = ordersRefundMapper.selectOne(
+ new QueryWrapper<OrdersRefund>().lambda()
+ .eq(OrdersRefund::getOrderId, id)
+ .eq(OrdersRefund::getDeleted, Constants.ZERO)
+ .orderByDesc(OrdersRefund::getCreateTime)
+ .last("limit 1"));
+ if (ordersRefund != null) {
+ vo.setOrdersRefund(ordersRefund);
+ // 閫�娆炬柟寮忥細1=骞冲彴鐩存帴鍙栨秷 鈫� 杩斿洖骞冲彴鎿嶄綔浜哄悕绉�
+ if (Constants.equalsInteger(ordersRefund.getType(), Constants.ONE) && ordersRefund.getUserId() != null) {
+ // userId 鍏宠仈 system_user 琛紝鏌ヨ鎿嶄綔浜哄悕绉�
+ vo.setPlatformUserName(getPlatformUserName(ordersRefund.getUserId()));
+ }
+ // 閫�娆炬柟寮忥細2=宸插瓨浠剁敵璇峰彇娑� 鈫� 杩斿洖閫�娆惧彇浠跺浘鐗� (multifile objType=14)
+ if (Constants.equalsInteger(ordersRefund.getType(), Constants.TWO)) {
+ vo.setRefundTakeImages(getFileUrls(id, Constants.FileType.REFUND_TAKE.getKey(), imgPrefix));
+ }
+ }
+ }
+
+ return vo;
}
-
@Override
- public String cancelTips(Integer orderId,Member member){
- Orders orders = ordersMapper.selectById(orderId);
- if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
+ public OrderDispatchVO findDispatchInfo(Integer id) {
+ Orders order = ordersMapper.selectById(id);
+ if (Objects.isNull(order)) {
throw new BusinessException(ResponseStatus.DATA_EMPTY);
}
- Integer totalCancelTimes = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIMES).getCode());
- Long cancelTimes = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
- .apply(" DATE(cancel_time) = DATE(NOW()) ")
- .eq(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
- .eq(Orders::getReleaseMemberId,member.getId()));
- //鏌ヨ鍙栨秷娆℃暟
- if(totalCancelTimes<=cancelTimes){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浠婃棩璁㈠崟涓诲姩鍙栨秷娆℃暟宸茶秴鍑�"+totalCancelTimes+"娆�,鏃犳硶鍙栨秷璁㈠崟");
+ OrderDispatchVO vo = new OrderDispatchVO();
+ vo.setCode(order.getCode());
+ vo.setPayAmountYuan(order.getPayAmount() != null ? Constants.getFormatMoney(order.getPayAmount()) : 0);
+ vo.setType(order.getType());
+ vo.setTypeDesc(order.getType() != null && order.getType() == Constants.ONE ? "寮傚湴瀛樺彇" : "灏卞湴瀛樺彇");
+ vo.setDetailList(buildDetailList(id));
+
+ return vo;
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void dispatch(DispatchDTO dto) {
+ // 鍙傛暟鏍¢獙
+ if (dto == null || dto.getOrderId() == null || dto.getUrgentFee() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟涓婚敭鍜屽姞鎬ヨ垂鐢ㄤ笉鑳戒负绌�");
}
- Integer cancelTimeHour = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIME).getCode());
- Long hours = DateUtil.getBetweenHours(new Date(),orders.getStartDate());
- if(hours < cancelTimeHour){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璺濈璁㈠崟寮�濮嬫椂闂翠笉瓒�"+cancelTimeHour+"灏忔椂,鏃犳硶鍙栨秷璁㈠崟");
+ Orders order = ordersMapper.selectById(dto.getOrderId());
+ if (Objects.isNull(order)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY);
}
- return "浠婃棩杩樺彲涓诲姩鍙栨秷"+(totalCancelTimes-cancelTimes)+"娆★紝鏄惁纭鍙栨秷";
+ // 鍓嶇疆鏉′欢鏍¢獙锛氬紓鍦板瓨鍙� + 宸插瘎瀛�
+ if (!Constants.ONE.equals(order.getType())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呮敮鎸佸紓鍦板瓨鍙栬鍗曟淳鍗�");
+ }
+ if (!Integer.valueOf(Constants.OrderStatus.deposited.getStatus()).equals(order.getStatus())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭凡瀵勫瓨鐘舵�佽鍗曞彲娲惧崟");
+ }
+
+ String optUserName = getCurrentUserName();
+
+ // 鍔犳�ヨ垂鏃ュ織锛堟瘡娆″崟鐙褰曟湰娆″姞鎬ヨ垂锛�
+ Constants.OrderLogType urgentLogType = Constants.OrderLogType.urgent;
+ OrderLog feeLog = new OrderLog();
+ feeLog.setOrderId(order.getId());
+ feeLog.setTitle(urgentLogType.getTitle());
+ feeLog.setLogInfo(urgentLogType.getStatusInfo().replace("{param}", dto.getUrgentFee().toPlainString()));
+ feeLog.setObjType(urgentLogType.getStatus());
+ feeLog.setOrderStatus(order.getStatus());
+ feeLog.setOptUserType(3);
+ feeLog.setOptUserName(optUserName);
+ feeLog.setCreateTime(new Date());
+ feeLog.setDeleted(Constants.ZERO);
+ orderLogService.create(feeLog);
+
+ // 鍔犳�ヨ垂鐢� 鍏冣啋鍒�
+ long urgentFeeFen = dto.getUrgentFee().multiply(new BigDecimal(100)).longValue();
+
+ // 浣跨敤 UpdateWrapper 绮剧‘鏇存柊锛屼笉褰卞搷鍏朵粬瀛楁
+ com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<Orders> updateWrapper =
+ new UpdateWrapper<Orders>().lambda()
+ .eq(Orders::getId, order.getId())
+ .set(Orders::getIsUrgent, Constants.ONE)
+ .set(Orders::getPlatformRewardAmount, urgentFeeFen)
+ .set(Orders::getUpdateTime, new Date());
+
+ // 寮傚湴瀵勫瓨涓旀湁鍙栦欢闂ㄥ簵鏃讹紝鐢熸垚鍙告満鏍搁攢鐮�
+ if (order.getTakeShopId() != null) {
+ String driverVerifyCode = generateVerifyCode();
+ updateWrapper.set(Orders::getDriverVerifyCode, driverVerifyCode);
+ }
+
+ // 澶囨敞
+ if (StringUtils.isNotBlank(dto.getRemark())) {
+ updateWrapper.set(Orders::getRemark, dto.getRemark());
+ }
+
+ // 鎸囨淳鍙告満锛堥潪蹇呭~锛�
+ if (dto.getDriverId() != null) {
+ updateWrapper.set(Orders::getAssignDriverId, dto.getDriverId());
+
+ Member driver = memberMapper.selectById(dto.getDriverId());
+ String driverName = driver != null ? driver.getName() : String.valueOf(dto.getDriverId());
+
+ Constants.OrderLogType dispatchLogType = Constants.OrderLogType.dispatch;
+ OrderLog driverLog = new OrderLog();
+ driverLog.setOrderId(order.getId());
+ driverLog.setTitle(dispatchLogType.getTitle());
+ driverLog.setLogInfo(dispatchLogType.getStatusInfo().replace("{param}", driverName));
+ driverLog.setObjType(dispatchLogType.getStatus());
+ driverLog.setOrderStatus(order.getStatus());
+ driverLog.setOptUserType(3);
+ driverLog.setOptUserName(optUserName);
+ driverLog.setCreateTime(new Date());
+ driverLog.setDeleted(Constants.ZERO);
+ orderLogService.create(driverLog);
+ }
+
+ ordersMapper.update(updateWrapper);
+ }
+
+ private String getCurrentUserName() {
+ try {
+ com.doumee.core.model.LoginUserInfo user =
+ (com.doumee.core.model.LoginUserInfo) org.apache.shiro.SecurityUtils.getSubject().getPrincipal();
+ return user != null ? user.getUsername() : "绯荤粺";
+ } catch (Exception e) {
+ return "绯荤粺";
+ }
}
/**
- * 鍙戝崟鏂瑰彇娑堣鍗�
- * @param member
+ * 鏋勫缓璁㈠崟鐗╁搧鏄庣粏鍒楄〃
*/
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public void releaseCancelOrder(Orders orders,Member member){
- if(!(Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.wait.getKey())
- ||Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.waitPay.getKey())
- || Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey()))){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜鍙栨秷");
- }
- if(!Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勮鍗曟棤娉曡繘琛岃鎿嶄綔");
- }
- //寰呮敮浠樼敤椁愯鍗�/寰呮帴鍗曡鍗曡繘琛屽彇娑�
- if(Constants.equalsInteger(orders.getStatus(),Constants.ONE)
- ||Constants.equalsInteger(orders.getStatus(),Constants.ZERO)){
- if(Constants.equalsInteger(orders.getType(),Constants.TWO)&&Constants.equalsInteger(orders.getStatus(),Constants.ONE)){
- //閫�娆句笟鍔�
- WithdrawalOrders withdrawalOrders = new WithdrawalOrders();
- withdrawalOrders.setCreateTime(new Date());
- withdrawalOrders.setDeleted(Constants.ZERO);
- withdrawalOrders.setMemberId(orders.getReleaseMemberId());
- withdrawalOrders.setAmount(orders.getPayAccount());
- withdrawalOrders.setStatus(Constants.ZERO);
- withdrawalOrders.setDoneTime(new Date());
- withdrawalOrders.setType(Constants.ONE);
- withdrawalOrders.setObjId(orders.getId());
- wxMiniUtilService.wxRefund(withdrawalOrders,orders);
- }
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getCancelTime,new Date())
- .set(Orders::getCancelType,Constants.ZERO)
- .eq(Orders::getId,orders.getId())
- );
- }else{
- //鍒ゆ柇鏄惁鍙慨鏀� 宸插彇娑堟鏁� 涓� 鏃堕棿闄愬埗
- Integer totalCancelTimes = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIMES).getCode());
- Long cancelTimes = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
- .apply(" DATE(cancel_time) = DATE(NOW()) ")
- .eq(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
- .eq(Orders::getReleaseMemberId,orders.getReleaseMemberId()));
- //鏌ヨ鍙栨秷娆℃暟
- if(totalCancelTimes<=cancelTimes){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浠婃棩璁㈠崟涓诲姩鍙栨秷娆℃暟宸茶秴鍑�"+totalCancelTimes+"娆�,鏃犳硶鍙栨秷璁㈠崟");
- }
-
- Integer cancelTimeHour = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIME).getCode());
- Long hours = DateUtil.getBetweenHours(new Date(),orders.getStartDate());
- if(hours < cancelTimeHour){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璺濈璁㈠崟寮�濮嬫椂闂翠笉瓒�"+cancelTimeHour+"灏忔椂,鏃犳硶鍙栨秷璁㈠崟");
- }
-
- if(Constants.equalsInteger(orders.getType(),Constants.TWO)){
- //閫�娆句笟鍔�
- WithdrawalOrders withdrawalOrders = new WithdrawalOrders();
- withdrawalOrders.setCreateTime(new Date());
- withdrawalOrders.setMemberId(orders.getReleaseMemberId());
- withdrawalOrders.setAmount(orders.getPayAccount());
- withdrawalOrders.setWxExternalNo("refund_"+orders.getCode());
- withdrawalOrders.setStatus(Constants.ONE);
- withdrawalOrders.setDoneTime(new Date());
- withdrawalOrders.setType(Constants.ONE);
- withdrawalOrders.setObjId(orders.getId());
- wxMiniUtilService.wxRefund(withdrawalOrders,orders);
- }
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getCancelTime,new Date())
- .set(Orders::getCancelType,Constants.ONE)
- .eq(Orders::getId,orders.getId())
- );
- //鍑忓皯鎺ュ崟閲�
- memberMapper.update(new UpdateWrapper<Member>().lambda().setSql("receive_num = (receive_num - 1) ").eq(Member::getId,orders.getAcceptMemberId()));
- }
- //鍑忓皯鍙戝崟閲�
- memberMapper.update(new UpdateWrapper<Member>().lambda().setSql("publish_num = (publish_num - 1)").eq(Member::getId,orders.getReleaseMemberId()));
-
- //鏃ュ織瀛樺偍
- Constants.OrdersLog ordersLog = Constants.OrdersLog.RELEASE_CANCEL;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),member.getId(),null);
-
- List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
- .and(i->i.eq(Member::getId,orders.getReleaseMemberId()).or().eq(Member::getId,orders.getAcceptMemberId()))
- );
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(members)){
- List<String> openIdList = members.stream().map(i->i.getOpenid()).collect(Collectors.toList());
- //鍙戦�佸井淇¢�氱煡
- orders.setCancelTime(new Date());
- sendWxMessage.cancelMessage(openIdList,orders,Constants.ONE);
- }
-
- IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,orders.getAcceptMemberId())
- .eq(IdentityInfo::getType,orders.getType())
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- if(Objects.nonNull(wokerIdentityInfo)){
- //鐭俊閫氱煡
- aliSmsService.businessSendSms(Constants.smsContent.releaseCancel.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
- null,categoryMapper);
- }
+ private List<OrderItemVO> buildDetailList(Integer orderId) {
+ List<OrdersDetail> details = ordersDetailMapper.selectList(
+ new QueryWrapper<OrdersDetail>().lambda()
+ .eq(OrdersDetail::getOrderId, orderId)
+ .eq(OrdersDetail::getDeleted, Constants.ZERO));
+ return buildDetailList(details);
}
-
/**
- * 鎺ュ崟鏂瑰彇娑堟帴鍗�
- * @param member
+ * 鏍规嵁宸叉煡璇㈢殑鏄庣粏鏋勫缓鐗╁搧鍒楄〃锛堥伩鍏嶉噸澶嶆煡璇級
*/
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public void receiveCancelOrder(Orders orders,Member member){
- if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜鍙栨秷");
+ private List<OrderItemVO> buildDetailList(List<OrdersDetail> details) {
+ List<OrderItemVO> items = new ArrayList<>();
+ if (details != null) {
+ for (OrdersDetail d : details) {
+ OrderItemVO item = new OrderItemVO();
+ item.setLuggageName(d.getLuggageName());
+ item.setLuggageDetail(d.getLuggageDetail());
+ item.setNum(d.getNum());
+ double unitPriceYuan = d.getUnitPrice() != null ? Constants.getFormatMoney(d.getUnitPrice()) : 0;
+ item.setUnitPriceYuan(unitPriceYuan);
+ item.setSubtotal(unitPriceYuan * (d.getNum() != null ? d.getNum() : 0));
+ items.add(item);
+ }
}
- if(!Constants.equalsInteger(orders.getAcceptMemberId(),member.getId())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勮鍗曟棤娉曡繘琛岃鎿嶄綔");
- }
- //鍒ゆ柇鏄惁鍙慨鏀� 宸插彇娑堟鏁� 涓� 鏃堕棿闄愬埗
- Integer totalCancelTimes = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RECEIVE_CANCEL_TIMES).getCode());
- Long cancelTimes = orderLogMapper.selectCount(new QueryWrapper<OrderLog>().lambda()
- .apply(" DATE(create_time) = DATE(NOW()) ")
- .eq(OrderLog::getObjType,Constants.OrdersLog.CANCEL.getKey())
- .eq(OrderLog::getMemberId,member.getId()));
- //鏌ヨ鍙栨秷娆℃暟
- if(totalCancelTimes<=cancelTimes){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浠婃棩璁㈠崟涓诲姩鍙栨秷娆℃暟宸茶秴鍑�"+totalCancelTimes+"娆�,鏃犳硶鍙栨秷璁㈠崟");
- }
-
- Integer cancelTimeHour = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RECEIVE_CANCEL_TIME).getCode());
- Long hours = DateUtil.getBetweenHours(new Date(),orders.getStartDate());
- if(hours < cancelTimeHour){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璺濈璁㈠崟寮�濮嬫椂闂翠笉瓒�"+cancelTimeHour+"灏忔椂,鏃犳硶鍙栨秷璁㈠崟");
- }
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getCancelTime,new Date())
- .set(Orders::getStatus,Constants.ordersStatus.wait.getKey())
- .set(Orders::getAcceptMemberId,null)
- .set(Orders::getAcceptType,null)
- .eq(Orders::getId,orders.getId())
- );
-
- //鍑忓皯鎺ュ崟閲�
- memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" receive_num = receive_num - 1 ").eq(Member::getId,orders.getAcceptMemberId()));
- //鏃ュ織瀛樺偍
- Constants.OrdersLog ordersLog = Constants.OrdersLog.CANCEL;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),member.getId(),null);
-
-
- List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
- .and(i->i.eq(Member::getId,orders.getReleaseMemberId()).or().eq(Member::getId,orders.getAcceptMemberId()))
- );
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(members)){
- List<String> openIdList = members.stream().map(i->i.getOpenid()).collect(Collectors.toList());
- //鍙戦�佸井淇¢�氱煡
- orders.setCancelTime(new Date());
- sendWxMessage.cancelMessage(openIdList,orders,Constants.TWO);
- }
- //鐭俊閫氱煡
- aliSmsService.businessSendSms(Constants.smsContent.receiveCancel.getKey(),member.getTelephone(),orders,null,
- null,categoryMapper);
+ return items;
}
-
/**
- * 瀹屾垚璁㈠崟
- * @param doneOrderDTO
+ * 鐢熸垚32浣嶅敮涓�绗笁鏂硅鍗曠紪鍙凤紙鏃堕棿鎴�17浣� + 闅忔満鏁�15浣嶏級
*/
- @Override
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public OrderReleaseVO doneOrder(DoneOrderDTO doneOrderDTO){
- if(Objects.isNull(doneOrderDTO)||Objects.isNull(doneOrderDTO.getOrderId())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- Orders orders = ordersMapper.selectById(doneOrderDTO.getOrderId());
- if(!Constants.equalsInteger(orders.getType(),Constants.TWO)&&Objects.isNull(doneOrderDTO.getAmount())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
- }
- if(Constants.equalsInteger(orders.getType(),Constants.orderType.scd.getKey())){
- if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.doing.getKey())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜鍙栨秷");
- }
- }else{
- if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.feeconfirm.getKey())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜鍙栨秷");
- }
- }
-
- if(!Constants.equalsInteger(orders.getReleaseMemberId(),doneOrderDTO.getMember().getId())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炴偍鐨勮鍗曟棤娉曡繘琛岃鎿嶄綔");
- }
- Member payMember = memberMapper.selectById(doneOrderDTO.getMember().getId());
- if(Objects.isNull(payMember)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛淇℃伅寮傚父");
- }
-
- OrderReleaseVO orderReleaseVO = new OrderReleaseVO();
- orderReleaseVO.setId(orders.getId());
- Object object = null;
- //鐢ㄩ璁㈠崟
- if(!Constants.equalsInteger(orders.getType(),Constants.TWO)){
- orders.setPayAccount(doneOrderDTO.getAmount());
- //鎻愭垚閲戦
-// Long tcje = (new BigDecimal(orders.getPayAccount().toString()).multiply(Constants.formatBigDecimal(orders.getPlatformRata())).setScale(0,RoundingMode.HALF_UP).longValue());
- Long tcje = Long.valueOf(new BigDecimal(orders.getPayAccount().toString()).multiply(orders.getPlatformRata()).intValue());
- orders.setReceiveAccount(orders.getPayAccount() - tcje);
- orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
- ordersMapper.updateById(orders);
- //鍞よ捣鏀粯涓氬姟
- object = this.getWxPayResponse(orders,payMember.getOpenid());
- orderReleaseVO.setObject(object);
- }else{
- orders.setStatus(Constants.ordersStatus.done.getKey());
- orders.setFinishTime(new Date());
- ordersMapper.updateById(orders);
-
- Member member = memberMapper.selectById(orders.getAcceptMemberId());
-
- //瀛樺偍娴佹按璁板綍
- MemberRevenue memberRevenue = new MemberRevenue();
- memberRevenue.setCreateTime(new Date());
- memberRevenue.setMemberId(orders.getAcceptMemberId());
- memberRevenue.setType(orders.getType());
- memberRevenue.setOptType(Constants.ONE);
- memberRevenue.setBeforeAmount(member.getAmount());
- memberRevenue.setAmount(orders.getReceiveAccount());
- memberRevenue.setAfterAmount(member.getAmount() + orders.getReceiveAccount());
- if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
- memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()) + "-" +
- (Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)?"閲囨憳宸�":(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)?"鍒嗘嫞宸�":"鍖呰宸�")));
- }else{
- memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()));
- }
- memberRevenue.setObjId(orders.getId());
- memberRevenue.setObjType(Constants.ZERO);
- memberRevenue.setStatus(Constants.ZERO);
- memberRevenueMapper.insert(memberRevenue);
-
- //鏃ュ織瀛樺偍
- Constants.OrdersLog ordersLog = Constants.OrdersLog.DONE;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),doneOrderDTO.getMember().getId(),null);
-
- sendWxMessage.revenueMessage(member.getOpenid(),orders);
-
- //鐭俊閫氱煡鎺ュ崟鏂�
- if(Objects.nonNull(orders.getAcceptMemberId())){
- IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,orders.getAcceptMemberId())
- .eq(IdentityInfo::getType,orders.getType())
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- if(Objects.nonNull(wokerIdentityInfo)){
- aliSmsService.businessSendSms(Constants.smsContent.pay.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
- null,categoryMapper);
- }
- }
- }
- return orderReleaseVO;
+ private String generateOrderTradeNo() {
+ return new java.text.SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())
+ + String.format("%015d", Math.abs(new java.util.Random().nextLong() % 1000000000000000L));
}
-
-
-
- @Override
- public OrderReleaseVO reusePay(ReusePayDTO reusePayDTO){
- if(Objects.isNull(reusePayDTO)||Objects.isNull(reusePayDTO.getOrderId())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- Orders orders = ordersMapper.selectById(reusePayDTO.getOrderId());
- if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
- }
- if(!Constants.equalsInteger(orders.getType(),Constants.TWO)&&Objects.isNull(reusePayDTO.getAmount())){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
-
- if(!((( Constants.equalsInteger(orders.getType(),Constants.TWO) && Constants.equalsInteger(orders.getStatus(),Constants.ZERO) )
- || ( !Constants.equalsInteger(orders.getType(),Constants.TWO) && Constants.equalsInteger(orders.getStatus(),Constants.FIVE) ))
- && Constants.equalsInteger(orders.getPayStatus(),Constants.ZERO) )){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆");
- }
- Member payMember = memberMapper.selectById(reusePayDTO.getMember().getId());
- if(Objects.isNull(payMember)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛淇℃伅寮傚父");
- }
-
- OrderReleaseVO orderReleaseVO = new OrderReleaseVO();
- if(!Constants.equalsInteger(orders.getType(),Constants.TWO)){
- orders.setPayAccount(reusePayDTO.getAmount());
- //鎻愭垚閲戦
- Long tcje = Long.valueOf(new BigDecimal(orders.getPayAccount().toString()).multiply(orders.getPlatformRata()).intValue());
- orders.setReceiveAccount(orders.getPayAccount() - tcje);
- orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
- ordersMapper.updateById(orders);
- }
- orders.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
- ordersMapper.updateById(orders);
- //鍞よ捣鏀粯涓氬姟
- Object object = this.getWxPayResponse(orders,payMember.getOpenid());
- orderReleaseVO.setObject(object);
- orderReleaseVO.setId(orders.getId());
- return orderReleaseVO;
- }
-
-
- @Override
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public void platformCancel(Integer orderId, LoginUserInfo loginUserInfo){
- Orders orders = ordersMapper.selectById(orderId);
- if(Objects.isNull(orders)||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
- }
- if(!(Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.wait.getKey())||Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey())
- ||Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.doing.getKey())||Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.waitPay.getKey()))){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜鍙栨秷");
- }
- //濡傛灉宸叉敮浠� 鍒欓渶瑕佽繘琛岄��娆�
- if(Constants.equalsInteger(orders.getPayStatus(),Constants.ONE)){
- WithdrawalOrders withdrawalOrders = new WithdrawalOrders();
- withdrawalOrders.setCreateTime(new Date());
- withdrawalOrders.setMemberId(orders.getReleaseMemberId());
- withdrawalOrders.setAmount(orders.getPayAccount());
- withdrawalOrders.setWxExternalNo("refund_"+orders.getCode());
- withdrawalOrders.setStatus(Constants.ONE);
- withdrawalOrders.setDoneTime(new Date());
- withdrawalOrders.setType(Constants.ONE);
- withdrawalOrders.setObjId(orders.getId());
- wxMiniUtilService.wxRefund(withdrawalOrders,orders);
- }
-
- //鍑忓皯鍙戝崟閲�
- memberMapper.update(new UpdateWrapper<Member>().lambda()
- .setSql("publish_num = ifnull(publish_num,0) - 1")
- .eq(Member::getId,orders.getReleaseMemberId()));
-
- if(Constants.equalsInteger(orders.getStatus(),Constants.TWO)||Constants.equalsInteger(orders.getStatus(),Constants.THREE)){
- //鍑忓皯鎺ュ崟閲�
- memberMapper.update(new UpdateWrapper<Member>().lambda()
- .setSql("receive_num = ifnull(receive_num,0) - 1")
- .eq(Member::getId,orders.getAcceptMemberId()));
- }
- Date date = new Date();
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
- .set(Orders::getUpdateTime,date)
- .set(Orders::getCancelTime,date)
- .set(Orders::getCancelType,Constants.TWO)
- .eq(Orders::getId,orders.getId())
- );
-
- //鏃ュ織瀛樺偍
- Constants.OrdersLog ordersLog = Constants.OrdersLog.SYSTEM_CANCEL;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),null,loginUserInfo.getId());
-
- List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda()
- .and(i->i.eq(Member::getId,orders.getReleaseMemberId()).or().eq(Member::getId,orders.getAcceptMemberId()))
- );
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(members)){
- List<String> openIdList = members.stream().map(i->i.getOpenid()).collect(Collectors.toList());
- orders.setCancelTime(new Date());
- //鍙戦�佸井淇¢�氱煡
- orders.setCancelTime(new Date());
- sendWxMessage.cancelMessage(openIdList,orders,Constants.ZERO);
- }
- //鐭俊閫氱煡鍙戝崟鏂�
- aliSmsService.businessSendSms(Constants.smsContent.platformCancel.getKey(),orders.getLinkPhone(),orders,null,
- null,categoryMapper);
- //鐭俊閫氱煡鎺ュ崟鏂�
- if(Objects.nonNull(orders.getAcceptMemberId())){
- IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,orders.getAcceptMemberId())
- .eq(IdentityInfo::getType,orders.getType())
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- if(Objects.nonNull(wokerIdentityInfo)){
- aliSmsService.businessSendSms(Constants.smsContent.platformCancel2.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
- null,categoryMapper);
- }
- }
-
- }
-
-
-
-
- @Override
- public void comment(CommentDTO commentDTO){
- if(Objects.isNull(commentDTO)
- || Objects.isNull(commentDTO.getOrderId())
- || Objects.isNull(commentDTO.getLevel())
- || commentDTO.getLevel()<1 || commentDTO.getLevel() > 5 ){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- Orders orders = ordersMapper.selectById(commentDTO.getOrderId());
- if(Objects.isNull(orders)
- ||Constants.equalsInteger(orders.getDeleted(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
- }
- if(!Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.done.getKey())){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鐘舵�佸凡娴佽浆,鏃犳硶杩涜璇勪环");
- }
- if(Constants.equalsInteger(orders.getCommentStatus(),Constants.ONE)){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟宸茶瘎浠凤紒");
- }
-
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getCommentStatus,Constants.ONE)
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getCommentTime,new Date())
- .set(Orders::getCommentLevel,commentDTO.getLevel())
- .set(org.apache.commons.lang3.StringUtils.isNotBlank(commentDTO.getInfo()),Orders::getCommentInfo,commentDTO.getInfo())
- .set(Orders::getCommentType,Constants.ZERO)
- .eq(Orders::getId,orders.getId())
- );
- memberMapper.update(new UpdateWrapper<Member>().lambda()
- .setSql(" score = ( ifnull(total_score,0) +" + commentDTO.getLevel() + " ) / (ifnull(score_order_num,0) + 1 )")
- .setSql(" total_score = ifnull(total_score,0) +" + commentDTO.getLevel())
- .setSql(" score_order_num = ifnull(score_order_num,0) + 1 " )
- .eq(Member::getId,orders.getAcceptMemberId())
- );
- //鏃ュ織瀛樺偍
- Constants.OrdersLog ordersLog = Constants.OrdersLog.COMMENT;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),orders.getAcceptMemberId(),null);
- }
-
/**
- * 鏀粯鍥炶皟
- * @param preOrderId
- * @param paymentNo
- * @return
+ * 鐢熸垚6浣嶆暟瀛楁牳閿�鐮侊紙Redis楠岄噸锛�
+ * 浣跨敤 SETNX 鎶㈠崰锛屼繚璇佸敮涓�锛涗娇鐢ㄥ畬姣曞悗璋冪敤 releaseVerifyCode 浠� Redis 绉婚櫎
*/
- @Override
- @Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public String payNotify(String preOrderId,String paymentNo){
- Orders orders = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda().eq(Orders::getOutTradeNo,preOrderId).last("limit 1"));
- if(Constants.equalsInteger(orders.getType(),Constants.TWO)){
- //鐢ㄩ璁㈠崟 濡傛灉宸茬粡娴佽浆鍒板凡鏀粯 鍒欑洿鎺ヨ繑鍥�
- if(!Constants.equalsInteger(orders.getStatus(),Constants.ZERO)){
- return ("澶勭悊鎴愬姛!");
- }else{
- //澶勭悊鏀粯瀹屾垚閫昏緫
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getStatus,Constants.ordersStatus.wait.getKey())
- .set(Orders::getPayStatus,Constants.ONE)
- .set(Orders::getPayTime,new Date())
- .set(Orders::getPayMethod,Constants.ZERO)
- .set(Orders::getWxExternalNo,paymentNo)
- .eq(Orders::getId,orders.getId())
- );
-
- //瀛樺偍鏃ュ織
- Constants.OrdersLog ordersLog = Constants.OrdersLog.PAY;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),orders.getReleaseMemberId(),null);
- }
- }else{
- //闈炵敤椁愮被璁㈠崟
- if(!Constants.equalsInteger(orders.getStatus(),Constants.FIVE)){
- return ("澶勭悊鎴愬姛!");
- }else{
- //澶勭悊鏀粯瀹屾垚閫昏緫
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getStatus,Constants.FOUR)
- .set(Orders::getPayStatus,Constants.ONE)
- .set(Orders::getPayTime,new Date())
- .set(Orders::getPayMethod,Constants.ZERO)
- .set(Orders::getWxExternalNo,paymentNo)
- .set(Orders::getFinishTime,new Date())
- .eq(Orders::getId,orders.getId())
- );
-
- Member member = memberMapper.selectById(orders.getAcceptMemberId());
- //瀛樺偍娴佹按璁板綍
- MemberRevenue memberRevenue = new MemberRevenue();
- memberRevenue.setCreateTime(new Date());
- memberRevenue.setDeleted(Constants.ZERO);
- memberRevenue.setTransactionNo(orders.getCode());
- memberRevenue.setMemberId(orders.getAcceptMemberId());
- memberRevenue.setType(orders.getType());
- memberRevenue.setOptType(Constants.ONE);
- memberRevenue.setBeforeAmount(member.getAmount());
- memberRevenue.setAmount(orders.getReceiveAccount());
- memberRevenue.setAfterAmount(member.getAmount() + orders.getReceiveAccount());
- if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
- memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()) + "-" +
- (Constants.equalsInteger(orders.getWorkType(),Constants.ZERO)?"閲囨憳宸�":(Constants.equalsInteger(orders.getWorkType(),Constants.ONE)?"鍒嗘嫞宸�":"鍖呰宸�")));
- }else{
- memberRevenue.setRemark(Constants.RevenueType.getInfo(memberRevenue.getType()));
- }
- memberRevenue.setObjId(orders.getId());
- memberRevenue.setObjType(Constants.ZERO);
- memberRevenue.setStatus(Constants.ZERO);
- memberRevenueMapper.insert(memberRevenue);
-
- //鏇存柊鎺ュ崟鐢ㄦ埛鐨勪綑棰濅笌鍘嗗彶鎬婚噾棰�
- memberMapper.update(new UpdateWrapper<Member>().lambda()
- .setSql(" amount = ( amount + " + orders.getReceiveAccount() +")" )
- .setSql(" total_amount = ( amount + " + orders.getReceiveAccount() + ")" )
- .eq(Member::getId,member.getId())
- );
-
- //瀛樺偍鏃ュ織
- Constants.OrdersLog ordersLog = Constants.OrdersLog.PAY;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),orders.getReleaseMemberId(),null);
-
- // 閫氱煡鎺ュ崟鏂� 娆鹃」宸插埌璐�
- sendWxMessage.revenueMessage(member.getOpenid(),orders);
-
- //鐭俊閫氱煡鎺ュ崟鏂�
- if(Objects.nonNull(orders.getAcceptMemberId())){
- IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,orders.getAcceptMemberId())
- .eq(IdentityInfo::getType,orders.getType())
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- if(Objects.nonNull(wokerIdentityInfo)){
- aliSmsService.businessSendSms(Constants.smsContent.pay.getKey(),wokerIdentityInfo.getTelephone(),orders,null,
- null,categoryMapper);
- }
- }
-
+ private String generateVerifyCode() {
+ Random random = new Random();
+ String redisKey = Constants.REDIS_VERIFY_CODE_KEY;
+ for (int i = 0; i < 200; i++) {
+ String code = String.format("%06d", random.nextInt(1000000));
+ Boolean success = redisTemplate.opsForValue().setIfAbsent(redisKey + code, "1", 24, TimeUnit.HOURS);
+ if (success != null && success) {
+ return code;
}
}
- return ("澶勭悊鎴愬姛!");
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佺敓鎴愬け璐ワ紝璇烽噸璇�");
}
-
- @Override
- public PageData<Orders> findPageForMini(PageWrap<Orders> pageWrap) {
- IPage<Orders> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
- MPJLambdaWrapper<Orders> queryWrapper = new MPJLambdaWrapper<>();
- Utils.MP.blankToNull(pageWrap.getModel());
- Orders model = pageWrap.getModel();
- if(Objects.isNull(model)
- || Objects.isNull(model.getQueryMyOrderType())
- ){
- throw new BusinessException(ResponseStatus.BAD_REQUEST);
- }
- BigDecimal chefLat = model.getQueryLat();
- BigDecimal chefLgt = model.getQueryLgt();
- BigDecimal driverLat = model.getQueryLat();
- BigDecimal driverLgt = model.getQueryLgt();
- BigDecimal workerLat = model.getQueryLat();
- BigDecimal workerLgt = model.getQueryLgt();
- IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,model.getMember().getId())
- .eq(IdentityInfo::getType,Constants.ZERO)
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- if(Objects.nonNull(wokerIdentityInfo)){
- workerLat = wokerIdentityInfo.getLat();
- workerLgt = wokerIdentityInfo.getLgt();
- }
- IdentityInfo driverIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,model.getMember().getId())
- .eq(IdentityInfo::getType,Constants.ONE)
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- if(Objects.nonNull(driverIdentityInfo)){
- driverLat = driverIdentityInfo.getLat();
- driverLgt = driverIdentityInfo.getLgt();
- }
- IdentityInfo chefIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,model.getMember().getId())
- .eq(IdentityInfo::getType,Constants.TWO)
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- if(Objects.nonNull(chefIdentityInfo)){
- chefLat = chefIdentityInfo.getLat();
- chefLgt = chefIdentityInfo.getLgt();
- }
- queryWrapper.selectAll(Orders.class)
- .select("c1.name",Orders::getCategoryName)
- .select("c2.name",Orders::getTransportTypeName)
- .leftJoin(" category c1 on t.category_id = c1.id ")
- .leftJoin(" category c2 on t.TRANSPORT_TYPE_ID = c2.id ")
- .eq(Objects.nonNull(model.getType()),Orders::getType,model.getType())
- .eq(Objects.nonNull(model.getCommentStatus()),Orders::getCommentStatus,model.getCommentStatus());;
- if(!(Objects.isNull(model.getQueryLat())||Objects.isNull(model.getQueryLgt()))){
- queryWrapper.select(" case when T.LGT IS NULL OR T.LAT IS NULL THEN 0 " +
- " when t.TYPE = 0 then CONVERT( ST_Distance_Sphere ( POINT ( t.LGT, t.LAT ), POINT ( "+workerLgt+", "+workerLat+" )) /1000,DECIMAL(15,2)) " +
- " when t.TYPE = 1 then CONVERT( ST_Distance_Sphere ( POINT ( t.LGT, t.LAT ), POINT ( "+driverLgt+", "+driverLat+" )) /1000,DECIMAL(15,2)) " +
- " else CONVERT( ST_Distance_Sphere ( POINT ( t.LGT, t.LAT ), POINT ( "+chefLgt+", "+chefLat+" )) /1000,DECIMAL(15,2)) end " , Orders::getDistance);
- }
- if(Objects.nonNull(model.getQueryMyOrderType())){
- if(Constants.equalsInteger(model.getQueryMyOrderType(),Constants.ZERO)){
- //鍙戝崟鏂� 鎴戠殑璁㈠崟
- queryWrapper.eq(Orders::getReleaseMemberId,model.getMember().getId());
- queryWrapper.eq(Objects.nonNull(model.getStatus())&&!Constants.equalsInteger(model.getStatus(),Constants.ordersStatus.waitPay.getKey()),Orders::getStatus,model.getStatus());
- queryWrapper.in(Objects.nonNull(model.getStatus())&&Constants.equalsInteger(model.getStatus(),Constants.ordersStatus.waitPay.getKey()),Orders::getStatus,model.getStatus(),Constants.ordersStatus.feeconfirm.getKey());
- queryWrapper.orderByDesc(Orders::getCreateTime);
- }else if(Constants.equalsInteger(model.getQueryMyOrderType(),Constants.ONE)){
- //鎺ュ崟鏂� 鎴戠殑璁㈠崟
- queryWrapper.eq(Orders::getAcceptMemberId,model.getMember().getId());
- queryWrapper.eq(Objects.nonNull(model.getStatus()),Orders::getStatus,model.getStatus());
-// queryWrapper.in(Objects.nonNull(model.getStatus())&&Constants.equalsInteger(model.getStatus(),Constants.ordersStatus.waitPay.getKey()),Orders::getStatus,model.getStatus(),Constants.ordersStatus.feeconfirm.getKey());
- queryWrapper.orderByDesc(Orders::getAcceptTime);
- }else{
- //鏌ヨ鐢ㄦ埛鐨勬帴鍗曟潈閲� 鎺ュ崟澶у巺
- ReceiveWeight receiveWeight = receiveWeightMapper.selectOne(new QueryWrapper<ReceiveWeight>().lambda().eq(ReceiveWeight::getDeleted,Constants.ZERO).apply(" RECEIVE_MIN < "+model.getMember().getReceiveNum()+" and RECEIVE_MAX > " + model.getMember().getReceiveNum()).last(" limit 1 "));
- if(Objects.nonNull(receiveWeight)){
- queryWrapper.apply(" DATE_ADD(t.CREATE_TIME, INTERVAL "+receiveWeight.getDelayTime()+" MINUTE) < now() ");
- }
- queryWrapper.eq(Orders::getStatus,Constants.ordersStatus.wait.getKey());
- queryWrapper.ne(Orders::getReleaseMemberId,model.getMember().getId());
- if(Objects.nonNull(model.getSortType())){
- if(Constants.equalsInteger(model.getSortType(),Constants.ZERO)){
- queryWrapper.orderByDesc(Orders::getCreateTime);
- }else if(Constants.equalsInteger(model.getSortType(),Constants.ONE)){
- queryWrapper.orderByAsc(" distance ");
- }else{
- queryWrapper.orderByDesc(Orders::getEstimatedAccount);
- }
- }
- }
- }
- IPage<Orders> iPage = ordersMapper.selectJoinPage(page,Orders.class,queryWrapper);
- for (Orders orders:iPage.getRecords()) {
- this.getPriceUnit(orders);
- if(Constants.equalsInteger(model.getQueryMyOrderType(),Constants.ZERO)||Constants.equalsInteger(model.getQueryMyOrderType(),Constants.ONE)){
- orders.setStatusName(
- Constants.equalsInteger(model.getQueryMyOrderType(),Constants.ZERO)?Constants.ordersStatus.getName(orders.getStatus()):
- Constants.ordersStatus.getInfo(orders.getStatus())
- );
- }
- }
- return PageData.from(iPage);
- }
-
-
-
-
- //瀹氫綅璺濈
- public void getDistance(Member member,Orders orders){
- try{
- if(Constants.equalsInteger(orders.getType(),Constants.ZERO)){
- if(Objects.nonNull(member.getWorkerIdentityModel())&&Objects.nonNull(member.getWorkerIdentityModel().getLgt())
- &&Objects.nonNull(member.getWorkerIdentityModel().getLat())){
- orders.setDistance(
- GeoUtils.haversineDistance(
- orders.getLgt().doubleValue(),orders.getLat().doubleValue(),
- member.getWorkerIdentityModel().getLgt().doubleValue(),
- member.getWorkerIdentityModel().getLat().doubleValue()
- )
- );
- }
-
- }else if(Constants.equalsInteger(orders.getType(),Constants.ONE)){
- if(Objects.nonNull(member.getDriverIdentityModel())&&Objects.nonNull(member.getDriverIdentityModel().getLgt())
- &&Objects.nonNull(member.getDriverIdentityModel().getLat())) {
- orders.setDistance(
- GeoUtils.haversineDistance(
- orders.getLgt().doubleValue(), orders.getLat().doubleValue(),
- member.getDriverIdentityModel().getLgt().doubleValue(),
- member.getDriverIdentityModel().getLat().doubleValue()
- )
- );
- }
- }else{
- if(Objects.nonNull(member.getChefIdentityModel())&&Objects.nonNull(member.getChefIdentityModel().getLgt())
- &&Objects.nonNull(member.getChefIdentityModel().getLat())) {
- orders.setDistance(
- GeoUtils.haversineDistance(
- orders.getLgt().doubleValue(),orders.getLat().doubleValue(),
- member.getChefIdentityModel().getLgt().doubleValue(),
- member.getChefIdentityModel().getLat().doubleValue()
- )
- );
- }
- }
- }catch (Exception e){
- orders.setDistance(0L);
+ /**
+ * 閲婃斁鏍搁攢鐮佸崰浣嶏紙鏍搁攢瀹屾垚鍚庤皟鐢紝绉婚櫎 Redis 涓殑 key锛�
+ */
+ public void releaseVerifyCode(String code) {
+ if (StringUtils.isNotBlank(code)) {
+ redisTemplate.delete(Constants.REDIS_VERIFY_CODE_KEY + code);
}
}
-
-
- @Override
- public Orders getDetail(Integer id,Member member) {
- Orders orders = ordersMapper.selectJoinOne(Orders.class,new MPJLambdaWrapper<Orders>()
- .selectAll(Orders.class)
- .select(" m1.name " , Orders::getReleaseName)
- .select(" m1.telephone " , Orders::getReleasePhone)
- .select(" case when i.AUTH_TYPE = 0 then i.LINK_NAME else i.COMPANY_NAME end " , Orders::getAcceptName)
- .select(" i.TELEPHONE " , Orders::getAcceptPhone)
- .select("c1.name",Orders::getCategoryName)
- .select("c2.name",Orders::getTransportTypeName)
- .select(" m2.SCORE " , Orders::getScore)
- .select(" m1.PUBLISH_NUM " , Orders::getPublishNum)
- .select(" m2.RECEIVE_NUM " , Orders::getReceiveNum)
- .select(" m1.COVER_IMAGE " , Orders::getReleaseCoverImage)
- .select(" m2.COVER_IMAGE " , Orders::getAcceptCoverImage)
- .leftJoin(" category c1 on t.category_id = c1.id ")
- .leftJoin(" category c2 on t.TRANSPORT_TYPE_ID = c2.id ")
- .leftJoin("member m1 on t.RELEASE_MEMBER_ID = m1.id ")
- .leftJoin("member m2 on t.ACCEPT_MEMBER_ID = m2.id ")
- .leftJoin("identity_info i on m2.id = i.MEMBER_ID and i.TYPE = t.type and i.AUDIT_STATUS = 2 ")
-
- .eq(Orders::getId,id)
- );
- if(Objects.isNull(orders)){
- throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ private String getOrdersPrefix() {
+ try {
+ return systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
+ + systemDictDataBiz.queryByCode(Constants.OSS, Constants.ORDERS_FILES).getCode();
+ } catch (Exception e) {
+ return "";
}
- //澶村儚淇℃伅
- String coverPath = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
- +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MEMBER_FILES).getCode();
- if(org.apache.commons.lang3.StringUtils.isNotBlank(orders.getReleaseCoverImage())){
- orders.setReleaseCoverImage(coverPath + orders.getReleaseCoverImage());
- }
- if(org.apache.commons.lang3.StringUtils.isNotBlank(orders.getAcceptCoverImage())){
- orders.setAcceptCoverImage(coverPath + orders.getAcceptCoverImage());
- }
- List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda().eq(Multifile::getObjId,orders.getId())
- .eq(Multifile::getIsdeleted,Constants.ZERO).eq(Multifile::getObjType,Constants.ONE).orderByAsc(Multifile::getId));
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
- String path = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
- +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ORDERS_FILES).getCode();
- for (Multifile multifile:multifileList) {
- multifile.setFileurlFull(path + multifile.getFileurl());
- }
- orders.setMultifileList(multifileList);
- }
- orders.setStatusName(Constants.ordersStatus.getName(orders.getStatus()));
- orders.setCancelStatus(Constants.ZERO);
- if(Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey())&&Constants.equalsInteger(orders.getIsUpdate(),Constants.ONE)){
- String autoConfirmTime = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.AUTO_CONFIRM).getCode();
- orders.setConfirmCountdown(DateUtil.getXMinuteAfterDate(orders.getIsUpdateTime(),Integer.valueOf(autoConfirmTime)).getTime() - System.currentTimeMillis());
- if(orders.getConfirmCountdown()<=Constants.ZERO){
- orders.setConfirmCountdown(0L);
- }
- }
- if(Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.waitPay.getKey())){
- orders.setCancelCountdown(DateUtil.getXMinuteAfterDate(orders.getCreateTime(),15).getTime() - System.currentTimeMillis());
- if(orders.getCancelCountdown()<=Constants.ZERO){
- orders.setCancelCountdown(0L);
- }
- }
- this.getPriceUnit(orders);
- orders.setCanStart(Constants.ZERO);
- if(orders.getStatus() <= Constants.ordersStatus.accept.getKey()){
- if(Constants.equalsInteger(orders.getReleaseMemberId(),member.getId())){
- if(Constants.equalsInteger(orders.getStatus(),Constants.ordersStatus.accept.getKey())&&orders.getStartDate().getTime() <= System.currentTimeMillis()){
- orders.setCanStart(Constants.ONE);
- }
- //鍒ゆ柇鏄惁鍙慨鏀� 宸插彇娑堟鏁� 涓� 鏃堕棿闄愬埗
- Integer totalCancelTimes = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIMES).getCode());
- Long cancelTimes = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
- .apply(" DATE(cancel_time) = DATE(NOW()) ")
- .eq(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
- .eq(Orders::getReleaseMemberId,orders.getReleaseMemberId()));
- //鏌ヨ鍙栨秷娆℃暟
- if(totalCancelTimes<=cancelTimes){
- orders.setCancelStatus(Constants.ONE);
- return orders;
- }
- Integer cancelTimeHour = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RELEASE_CANCEL_TIME).getCode());
- Long hours = DateUtil.getBetweenHours(new Date(),orders.getStartDate());
- if(hours < cancelTimeHour){
- orders.setCancelStatus(Constants.ONE);
- return orders;
- }
- }else if(Constants.equalsInteger(orders.getAcceptMemberId(),member.getId())){
- //鍒ゆ柇鏄惁鍙慨鏀� 宸插彇娑堟鏁� 涓� 鏃堕棿闄愬埗
- Integer totalCancelTimes = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RECEIVE_CANCEL_TIMES).getCode());
- Long cancelTimes = orderLogMapper.selectCount(new QueryWrapper<OrderLog>().lambda()
- .apply(" DATE(create_time) = DATE(NOW()) ")
- .eq(OrderLog::getObjType,Constants.OrdersLog.CANCEL.getKey())
- .eq(OrderLog::getMemberId,member.getId()));
- //鏌ヨ鍙栨秷娆℃暟
- if(totalCancelTimes<=cancelTimes){
- orders.setCancelStatus(Constants.ONE);
- return orders;
- }
-
- Integer cancelTimeHour = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RECEIVE_CANCEL_TIME).getCode());
- Long hours = DateUtil.getBetweenHours(new Date(),orders.getStartDate());
- if(hours < cancelTimeHour){
- orders.setCancelStatus(Constants.ONE);
- return orders;
- }
- }
- } else{
- orders.setCancelStatus(Constants.ONE);
- }
- return orders;
}
-
-
-
- public synchronized String getNextCode(Integer type){
- String prefix = "YG";
- if(!Constants.equalsInteger(type,Constants.ZERO)){
- prefix = (Constants.equalsInteger(type,Constants.ONE)?"YH-":"DC-");
- }
- prefix = prefix + DateUtil.getCurrDateTimeShort() +"-";
-
- Integer countNum = (Integer) redisTemplate.opsForValue().get(Constants.RedisKeys.ORDER_CODE);//RedisUtil.getObject(redisTemplate, Constants.RedisKeys.ORDER_CODE, Integer.class);
- countNum = Constants.formatIntegerNum(countNum)+1;
- //鏇存柊缂撳瓨
- redisTemplate.opsForValue().set(Constants.RedisKeys.ORDER_CODE,countNum);
- String nextIndex =Integer.toString( countNum );
- return prefix + org.apache.commons.lang3.StringUtils.leftPad(nextIndex,3,"0");
+ private String getPlatformUserName(Integer userId) {
+ SystemUser user = systemUserMapper.selectById(userId);
+ return user != null ? user.getRealname() : null;
}
+ private List<String> getFileUrls(Integer orderId, int objType, String prefix) {
+ List<Multifile> files = multifileMapper.selectList(
+ new QueryWrapper<Multifile>().lambda()
+ .eq(Multifile::getObjId, orderId)
+ .eq(Multifile::getObjType, objType)
+ .eq(Multifile::getIsdeleted, Constants.ZERO)
+ .orderByAsc(Multifile::getSortnum));
+ List<String> urls = new ArrayList<>();
+ if (files != null) {
+ for (Multifile f : files) {
+ if (StringUtils.isNotBlank(f.getFileurl())) {
+ urls.add(prefix + f.getFileurl());
+ }
+ }
+ }
+ return urls;
+ }
- @Override
- @Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public void refundCallback(RefundNotification refundNotification){
- WithdrawalOrders withdrawalOrders = withdrawalOrdersMapper.selectById(refundNotification.getOutRefundNo());
- if(Objects.isNull(withdrawalOrders)||!Constants.equalsInteger(withdrawalOrders.getStatus(),Constants.ZERO)){
+ /**
+ * 璁$畻骞惰缃鍗曡柂閰垎閰嶏紙鍙告満銆佸瓨浠堕棬搴椼�佸彇浠堕棬搴楋級
+ * 浠� pricing_rule (type=4) 璇诲彇鍒嗘垚姣斾緥锛屾牴鎹棬搴椾紒涓�/涓汉绫诲瀷鍖哄垎
+ *
+ * @param orders 璁㈠崟瀹炰綋锛堥渶瑕� totalAmount銆乧ityId 宸茶缃級
+ * @param depositShop 瀵勪欢闂ㄥ簵锛堥渶瑕� companyType锛�
+ * @param takeShop 鍙栦欢闂ㄥ簵锛堥渶瑕� companyType锛屽氨鍦板瓨鍙栨椂涓� depositShop 鐩稿悓锛�
+ */
+ private void calculateAndSetFeeAllocation(Orders orders, ShopInfo depositShop, ShopInfo takeShop) {
+ Long totalAmount = orders.getTotalAmount() != null ? orders.getTotalAmount() : 0L;
+ if (totalAmount <= 0) {
+ orders.setDriverFee(0L);
+ orders.setDepositShopFee(0L);
+ orders.setTakeShopFee(0L);
+ orders.setDriverFeeRata(BigDecimal.ZERO);
+ orders.setDepositShopFeeRata(BigDecimal.ZERO);
+ orders.setTakeShopFeeRata(BigDecimal.ZERO);
return;
}
- withdrawalOrders.setWxExternalNo(refundNotification.getTransactionId());
- withdrawalOrders.setUpdateTime(new Date());
- withdrawalOrders.setDoneTime(withdrawalOrders.getUpdateTime());
- if (!"SUCCESS".equals(refundNotification.getRefundStatus().name())) {
- // 濡傛灉閫�娆剧姸鎬佷笉姝g‘锛屼慨鏀归��娆惧崟鐘舵��
- withdrawalOrders.setStatus(Constants.TWO);
- }else{
- withdrawalOrders.setStatus(Constants.ONE);
- }
- //鏇存柊閫�娆惧崟鐘舵��
- withdrawalOrdersMapper.updateById(withdrawalOrders);
- }
+ Integer cityId = Integer.valueOf(orders.getCityId());
+ // 鍙告満鍗犳瘮锛歠ieldA=4锛堥厤閫佸憳锛�
+ BigDecimal driverRata = getRevenueShareRata(cityId, Constants.FOUR);
+ // 瀵勪欢闂ㄥ簵鍗犳瘮锛歠ieldA=0(浼佷笟瀵�)/1(涓汉瀵�)
+ int depositFieldA = Constants.equalsInteger(depositShop.getCompanyType(), Constants.ONE) ? Constants.ZERO : Constants.ONE;
+ BigDecimal depositShopRata = getRevenueShareRata(cityId, depositFieldA);
+ // 鍙栦欢闂ㄥ簵鍗犳瘮锛歠ieldA=2(浼佷笟鍙�)/3(涓汉鍙�)
+ int takeFieldA = Constants.equalsInteger(takeShop.getCompanyType(), Constants.ONE) ? Constants.TWO : Constants.THREE;
+ BigDecimal takeShopRata = getRevenueShareRata(cityId, takeFieldA);
+
+ // 璁$畻钖叕锛堝垎锛夛細totalAmount 涓哄垎锛宺ata 涓烘瘮渚嬪�硷紙濡� 0.15 琛ㄧず 15%锛�
+ long driverFee = new BigDecimal(totalAmount).multiply(driverRata).longValue();
+ long depositShopFee = new BigDecimal(totalAmount).multiply(depositShopRata).longValue();
+ long takeShopFee = totalAmount - driverFee - depositShopFee;
+
+ orders.setDriverFee(driverFee);
+ orders.setDepositShopFee(depositShopFee);
+ orders.setTakeShopFee(takeShopFee);
+ orders.setDriverFeeRata(driverRata);
+ orders.setDepositShopFeeRata(depositShopRata);
+ orders.setTakeShopFeeRata(takeShopRata);
+ }
/**
- * 鑷姩娲惧崟
+ * 浠� pricing_rule 琛ㄨ幏鍙栧垎鎴愭瘮渚嬶紙type=4锛�
+ *
+ * @param cityId 鍩庡競涓婚敭
+ * @param fieldA 绫诲瀷锛�0=浼佷笟瀵�, 1=涓汉瀵�, 2=浼佷笟鍙�, 3=涓汉鍙�, 4=閰嶉�佸憳
+ * @return 鍒嗘垚姣斾緥锛堝 0.15 琛ㄧず 15%锛�
*/
+ private BigDecimal getRevenueShareRata(Integer cityId, int fieldA) {
+ PricingRule rule = pricingRuleMapper.selectOne(new QueryWrapper<PricingRule>().lambda()
+ .eq(PricingRule::getDeleted, Constants.ZERO)
+ .eq(PricingRule::getType, Constants.FOUR)
+ .eq(PricingRule::getCityId, cityId)
+ .eq(PricingRule::getFieldA, String.valueOf(fieldA))
+ .last("limit 1"));
+ if (rule != null && StringUtils.isNotBlank(rule.getFieldC())) {
+ return new BigDecimal(rule.getFieldC());
+ }
+ return BigDecimal.ZERO;
+ }
+
@Override
- public void autoGrabOrders(){
- String autoConfirmTime = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.AUTO_DISPATCH).getCode();
- List<Orders> ordersList = ordersMapper.selectList(new QueryWrapper<Orders>().lambda().eq(Orders::getDeleted,Constants.ZERO)
- .eq(Orders::getStatus,Constants.ONE).eq(Orders::getCommentStatus,Constants.ZERO)
- .apply(" DATE_ADD(create_time, INTERVAL "+autoConfirmTime+" MINUTE) < now() ")
- .last("limit 100")
- );
- for (Orders orders:ordersList) {
- BigDecimal lat = orders.getLat();
- BigDecimal lgt = orders.getLgt();
- //鏌ヨ鑼冨洿鍐呯殑浼氬憳
- List<Member> memberList = memberMapper.getList(lgt,lat,orders.getType(),orders.getReleaseMemberId());
-// memberMapper.selectList(new MPJLambdaWrapper<Member>()
-// .select(Member::getId,Member::getScore)
-// .select(" ifnull((select r.level from receive_weight r where r.RECEIVE_MAX > RECEIVE_NUM and RECEIVE_NUM > r.RECEIVE_MIN limit 1 ),0) " ,Member::getLevel)
-// .select( " ifnull( (select CONVERT( ST_Distance_Sphere ( POINT ( ii.lgt, ii.lat ), POINT ( "+lgt+", "+lat+" )) /1000,DECIMAL(15,2)) from identity_info ii where ii.AUDIT_STATUS = 2 and type = 0 and ii.member_id = ID limit 1 ),0) ",Member::getDistance )
-////
-// .apply(" id in (" +
-// " select ii.member_id from identity_info ii where ii.AUDIT_STATUS = 2 and type = '"+orders.getType()+"' " +
-// " and ( CONVERT( ST_Distance_Sphere ( POINT ( ii.lgt, ii.lat ), POINT ( "+lgt+", "+lat+" )) /1000,DECIMAL(15,2))) < 100 " +
-// ") ")
-// .orderByDesc(" level , score ")
-// .orderByAsc(Member::getDistance)
-// .last(" limit 1 ")
-// );
- if(CollectionUtils.isEmpty(memberList)){
- continue;
+ public PageData<MyOrderVO> findMyOrderPage(PageWrap<MyOrderDTO> pageWrap, Integer memberId) {
+ MyOrderDTO model = pageWrap.getModel();
+ Integer status = model != null ? model.getStatus() : null;
+ Integer combinedStatus = model != null ? model.getCombinedStatus() : null;
+
+ // 瑙f瀽鍚堝苟鐘舵�佷负鍏蜂綋鐘舵�佸垪琛�
+ List<Integer> statusList = null;
+ if (combinedStatus != null) {
+ Constants.OrderCombinedStatus combined = Constants.OrderCombinedStatus.getByKey(combinedStatus);
+ if (combined != null) {
+ statusList = new ArrayList<>();
+ for (int s : combined.getStatuses()) {
+ statusList.add(s);
+ }
}
+ }
- Member member = memberList.get(Constants.ZERO);
- Member releaseMember = memberMapper.selectById(orders.getReleaseMemberId());
- //鑷姩娲惧崟
- Orders model = ordersMapper.selectById(orders.getId());
- if(!Constants.equalsInteger(model.getStatus(),Constants.ONE) || Constants.equalsInteger(releaseMember.getId(),model.getReleaseMemberId())){
- //濡傛灉璁㈠崟宸插垹闄� 骞朵笖闈炲彂甯冩柟
- continue;
+ IPage<Orders> p = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+ MPJLambdaWrapper<Orders> wrapper = new MPJLambdaWrapper<Orders>()
+ .selectAll(Orders.class)
+ .select("s1.name", Orders::getDepositShopName)
+ .select("s1.link_name", Orders::getDepositShopLinkName)
+ .select("s1.link_phone", Orders::getDepositShopLinkPhone)
+ .select("s2.name", Orders::getTakeShopName)
+ .select("s2.address", Orders::getTakeShopAddress)
+ .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
+ .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID")
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .eq(Orders::getMemberId, memberId)
+ .eq(status != null, Orders::getStatus, status)
+ .in(statusList != null, Orders::getStatus, statusList)
+ .orderByDesc(Orders::getCreateTime);
+
+ IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
+ List<MyOrderVO> voList = new ArrayList<>();
+ if (orderPage != null && orderPage.getRecords() != null) {
+
+ for (Orders o : orderPage.getRecords()) {
+ MyOrderVO vo = new MyOrderVO();
+ vo.setId(o.getId());
+ vo.setCode(o.getCode());
+ vo.setType(o.getType());
+ vo.setStatus(o.getStatus());
+ vo.setCreateTime(o.getCreateTime());
+ vo.setExpectedTakeTime(o.getExpectedTakeTime());
+
+ // 瀛樹欢闂ㄥ簵锛堝叧鑱旀煡璇㈢洿鎺ュ彇鍊硷級
+ vo.setDepositShopName(o.getDepositShopName());
+ vo.setDepositShopLinkName(o.getDepositShopLinkName());
+ vo.setDepositShopPhone(o.getDepositShopLinkPhone());
+
+ // 鍙栦欢淇℃伅锛氭湁鍙栦欢闂ㄥ簵鍙栭棬搴楋紝鏃犲垯鍙栫敤鎴疯嚜閫夊彇浠剁偣
+ if (o.getTakeShopId() != null) {
+ vo.setTakeShopName(o.getTakeShopName());
+ vo.setTakeShopAddress(o.getTakeShopAddress());
+ } else {
+ vo.setTakeLocation(o.getTakeLocation());
+ vo.setTakeLocationRemark(o.getTakeLocationRemark());
+ }
+
+ // 鍙栦欢鑱旂郴浜�
+ vo.setTakeUser(o.getTakeUser());
+ vo.setTakePhone(o.getTakePhone());
+
+ // 璐圭敤锛堝垎锛�
+ vo.setDeclaredFee(o.getDeclaredFee());
+ vo.setEstimatedAmount(o.getEstimatedAmount());
+
+ // 鏌ヨ鐗╁搧鏄庣粏锛堜竴娆℃煡璇紝鍚屾椂鐢ㄤ簬鐗╁搧鍒楄〃鍜岄�炬湡璁$畻锛�
+ List<OrdersDetail> details = ordersDetailMapper.selectList(
+ new QueryWrapper<OrdersDetail>().lambda()
+ .eq(OrdersDetail::getOrderId, o.getId())
+ .eq(OrdersDetail::getDeleted, Constants.ZERO));
+
+ // 鐗╁搧鏄庣粏
+ vo.setDetailList(buildDetailList(details));
+
+ // 閫炬湡淇℃伅锛堜粎寰呭彇浠剁姸鎬佽绠楋級
+ if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) {
+ OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details);
+ vo.setOverdue(overdueInfo.getOverdue());
+ vo.setOverdueDays(overdueInfo.getOverdueDays());
+ vo.setOverdueFee(overdueInfo.getOverdueFee());
+ }
+ voList.add(vo);
}
- ordersMapper.update(new UpdateWrapper<Orders>().lambda().eq(Orders::getId,model.getId())
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getAcceptType,Constants.ONE)
- .set(Orders::getAcceptTime,new Date())
- .set(Orders::getAcceptMemberId,member.getId())
- .set(Orders::getStatus,Constants.ordersStatus.accept.getKey())
- );
+ }
- //鏇存柊鎺ュ崟閲�
- memberMapper.update(new UpdateWrapper<Member>().lambda().setSql(" RECEIVE_NUM = (ifnull(RECEIVE_NUM,0) + 1 )").eq(Member::getId,member.getId()));
+ IPage<MyOrderVO> vPage = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+ PageData<MyOrderVO> pageData = PageData.from(vPage);
+ pageData.setRecords(voList);
+ pageData.setTotal(orderPage.getTotal());
+ pageData.setPage(orderPage.getCurrent());
+ pageData.setCapacity(orderPage.getSize());
+ return pageData;
+ }
- //鍒涘缓鎿嶄綔鏃ュ織
- Constants.OrdersLog ordersLog = Constants.OrdersLog.AUTO;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),member.getId(),null);
+ @Override
+ public PageData<MyOrderVO> findShopOrderPage(PageWrap<MyOrderDTO> pageWrap, Integer shopId) {
+ MyOrderDTO model = pageWrap.getModel();
+ Integer status = model != null ? model.getStatus() : null;
+ Integer combinedStatus = model != null ? model.getCombinedStatus() : null;
- IdentityInfo wokerIdentityInfo = identityInfoMapper.selectOne(new QueryWrapper<IdentityInfo>().lambda()
- .eq(IdentityInfo::getMemberId,member.getId())
- .eq(IdentityInfo::getType,orders.getType())
- .eq(IdentityInfo::getAuditStatus,Constants.TWO)
- .last("limit 1")
- );
- //閫氱煡鍙戝崟鏂�
- if(org.apache.commons.lang3.StringUtils.isNotBlank(releaseMember.getOpenid())&&Objects.nonNull(wokerIdentityInfo)){
- //鍙戦�佸井淇¢�氱煡
- sendWxMessage.acceptMessage(releaseMember.getOpenid(),orders,wokerIdentityInfo.getLinkName(),wokerIdentityInfo.getTelephone());
+ // 瑙f瀽鍚堝苟鐘舵�佷负鍏蜂綋鐘舵�佸垪琛�
+ List<Integer> statusList = null;
+ if (combinedStatus != null) {
+ Constants.OrderCombinedStatus combined = Constants.OrderCombinedStatus.getByKey(combinedStatus);
+ if (combined != null) {
+ statusList = new ArrayList<>();
+ for (int s : combined.getStatuses()) {
+ statusList.add(s);
+ }
}
+ }
- //閫氱煡鎺ュ崟鏂�
- sendWxMessage.autoDispatchMessage(member.getOpenid(),orders,GeoUtils.haversineDistance(
- orders.getLgt().doubleValue(), orders.getLat().doubleValue(),
- wokerIdentityInfo.getLgt().doubleValue(),
- wokerIdentityInfo.getLat().doubleValue()
- ));
-
- aliSmsService.businessSendSms(Constants.smsContent.dispatch.getKey(),orders.getLinkPhone(),orders,null,
- null,categoryMapper);
+ IPage<Orders> p = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+ MPJLambdaWrapper<Orders> wrapper = new MPJLambdaWrapper<Orders>()
+ .selectAll(Orders.class)
+ .select("s1.name", Orders::getDepositShopName)
+ .select("s1.link_name", Orders::getDepositShopLinkName)
+ .select("s1.link_phone", Orders::getDepositShopLinkPhone)
+ .select("s2.name", Orders::getTakeShopName)
+ .select("s2.address", Orders::getTakeShopAddress)
+ .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID")
+ .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID")
+ .eq(Orders::getPayStatus, Constants.ONE)
+ .and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId))
+ .eq(status != null, Orders::getStatus, status)
+ .in(statusList != null, Orders::getStatus, statusList)
+ .orderByDesc(Orders::getCreateTime);
+
+ IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper);
+ List<MyOrderVO> voList = new ArrayList<>();
+ if (orderPage != null && orderPage.getRecords() != null) {
+ for (Orders o : orderPage.getRecords()) {
+ MyOrderVO vo = new MyOrderVO();
+ vo.setId(o.getId());
+ vo.setCode(o.getCode());
+ vo.setType(o.getType());
+ vo.setStatus(o.getStatus());
+ vo.setCreateTime(o.getCreateTime());
+ vo.setExpectedTakeTime(o.getExpectedTakeTime());
+
+ vo.setDepositShopName(o.getDepositShopName());
+ vo.setDepositShopLinkName(o.getDepositShopLinkName());
+ vo.setDepositShopPhone(o.getDepositShopLinkPhone());
+
+ // 闂ㄥ簵瑙掕壊锛氬瓨浠堕棬搴�=1锛屽彇浠堕棬搴�=2
+ if (Constants.equalsInteger(o.getDepositShopId(), shopId)) {
+ vo.setShopRole(Constants.ONE);
+ } else if (Constants.equalsInteger(o.getTakeShopId(), shopId)) {
+ vo.setShopRole(Constants.TWO);
+ }
+
+ if (o.getTakeShopId() != null) {
+ vo.setTakeShopName(o.getTakeShopName());
+ vo.setTakeShopAddress(o.getTakeShopAddress());
+ } else {
+ vo.setTakeLocation(o.getTakeLocation());
+ vo.setTakeLocationRemark(o.getTakeLocationRemark());
+ }
+
+ vo.setTakeUser(o.getTakeUser());
+ vo.setTakePhone(o.getTakePhone());
+ vo.setDeclaredFee(o.getDeclaredFee());
+ vo.setEstimatedAmount(o.getEstimatedAmount());
+
+ List<OrdersDetail> details = ordersDetailMapper.selectList(
+ new QueryWrapper<OrdersDetail>().lambda()
+ .eq(OrdersDetail::getOrderId, o.getId())
+ .eq(OrdersDetail::getDeleted, Constants.ZERO));
+
+ vo.setDetailList(buildDetailList(details));
+
+ if (Integer.valueOf(Constants.OrderStatus.arrived.getStatus()).equals(o.getStatus())) {
+ OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(o, details);
+ vo.setOverdue(overdueInfo.getOverdue());
+ vo.setOverdueDays(overdueInfo.getOverdueDays());
+ vo.setOverdueFee(overdueInfo.getOverdueFee());
+ }
+ voList.add(vo);
+ }
+ }
+
+ IPage<MyOrderVO> vPage = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+ PageData<MyOrderVO> pageData = PageData.from(vPage);
+ pageData.setRecords(voList);
+ pageData.setTotal(orderPage.getTotal());
+ pageData.setPage(orderPage.getCurrent());
+ pageData.setCapacity(orderPage.getSize());
+ return pageData;
+ }
+
+ @Override
+ public MyOrderDetailVO findMyOrderDetail(Integer id, Integer memberId) {
+ Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getId, id)
+ .eq(Orders::getMemberId, memberId)
+ .eq(Orders::getDeleted, Constants.ZERO));
+ if (order == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ }
+ return buildOrderDetailVO(order, true);
+ }
+
+ @Override
+ public MyOrderDetailVO findShopOrderDetail(Integer orderId, String verifyCode) {
+ Orders order = null;
+ if (orderId != null) {
+ order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getId, orderId)
+ .eq(Orders::getDeleted, Constants.ZERO));
+ } else if (StringUtils.isNotBlank(verifyCode)) {
+ order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getMemberVerifyCode, verifyCode)
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (order == null) {
+ order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getDriverVerifyCode, verifyCode)
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ }
+ }
+ if (order == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+ return buildOrderDetailVO(order, false);
+ }
+
+ /**
+ * 鏋勫缓璁㈠崟璇︽儏VO锛堜細鍛樼/闂ㄥ簵绔鐢級
+ *
+ * @param order 璁㈠崟瀹炰綋
+ * @param memberViewMode true=浼氬憳绔紙鎸夋潯浠惰繑鍥炴牳閿�鐮侊級锛宖alse=闂ㄥ簵绔紙濮嬬粓杩斿洖鏍搁攢鐮侊級
+ */
+ private MyOrderDetailVO buildOrderDetailVO(Orders order, boolean memberViewMode) {
+ MyOrderDetailVO vo = new MyOrderDetailVO();
+ vo.setId(order.getId());
+ vo.setStatus(order.getStatus());
+ vo.setType(order.getType());
+ vo.setCode(order.getCode());
+ vo.setOutTradeNo(order.getOutTradeNo());
+ vo.setRemark(order.getRemark());
+ vo.setCreateTime(order.getCreateTime());
+ vo.setPayTime(order.getPayTime());
+ vo.setExpectedDepositTime(order.getExpectedDepositTime());
+ vo.setExpectedTakeTime(order.getExpectedTakeTime());
+ vo.setArriveTime(order.getArriveTime());
+
+ // 璐圭敤锛堝垎锛�
+ vo.setBasicAmount(order.getBasicAmount());
+ vo.setDeclaredAmount(order.getDeclaredAmount());
+ vo.setDeclaredFee(order.getDeclaredFee());
+ vo.setUrgentAmount(order.getUrgentAmount());
+ vo.setActualPayAmount(order.getPayAmount());
+
+ // 鏍囪
+ vo.setExceptionStatus(order.getExceptionStatus());
+
+ // 鏄惁瓒呭嚭鍙栦欢鏃堕棿
+ vo.setPastTakeTime(order.getExpectedTakeTime() != null && new Date().after(order.getExpectedTakeTime()));
+
+ // 璁㈠崟鐘舵�佹弿杩� + 鍊掕鏃�
+ vo.setStatusDesc(buildStatusDesc(order));
+ if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.waitPay.getStatus())) {
+ vo.setPayCountdownMs(calcPayCountdownMs(order));
+ }
+
+ // 瀛樹欢闂ㄥ簵
+ if (order.getDepositShopId() != null) {
+ ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+ if (depositShop != null) {
+ vo.setDepositShopName(depositShop.getName());
+ vo.setDepositShopLinkName(depositShop.getLinkName());
+ vo.setDepositShopPhone(depositShop.getLinkPhone());
+ vo.setDepositShopAddress(depositShop.getAddress());
+ }
+ }
+
+ // 鍙栦欢淇℃伅
+ if (order.getTakeShopId() != null) {
+ ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
+ if (takeShop != null) {
+ vo.setTakeShopName(takeShop.getName());
+ vo.setTakeShopAddress(takeShop.getAddress());
+ }
+ } else {
+ vo.setTakeLocation(order.getTakeLocation());
+ vo.setTakeLocationRemark(order.getTakeLocationRemark());
+ }
+
+ // 鍙栦欢鑱旂郴浜�
+ vo.setTakeUser(order.getTakeUser());
+ vo.setTakePhone(order.getTakePhone());
+
+ // 鐗╁搧绫诲瀷鍚嶇О
+ if (order.getGoodType() != null) {
+ Category category = categoryMapper.selectById(order.getGoodType());
+ if (category != null) {
+ vo.setGoodTypeName(category.getName());
+ }
+ }
+
+ // 涓嬪崟鐓х墖
+ String imgPrefix = getOrdersPrefix();
+ vo.setOrderImages(getFileUrls(order.getId(), Constants.FileType.ORDER_FILE.getKey(), imgPrefix));
+
+ // 鐗╁搧鏄庣粏
+ List<OrdersDetail> details = ordersDetailMapper.selectList(
+ new QueryWrapper<OrdersDetail>().lambda()
+ .eq(OrdersDetail::getOrderId, order.getId())
+ .eq(OrdersDetail::getDeleted, Constants.ZERO));
+ vo.setDetailList(buildDetailList(details));
+
+ // 閫炬湡淇℃伅
+ OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
+ vo.setOverdue(overdueInfo.getOverdue());
+ vo.setOverdueDays(overdueInfo.getOverdueDays());
+ vo.setOverdueFee(overdueInfo.getOverdueFee());
+
+ // 鏍搁攢鐮�
+ Integer status = order.getStatus();
+ if (memberViewMode) {
+ // 浼氬憳绔細寰呭瘎瀛�(1)杩斿洖锛涘緟鍙栦欢(5)鏃讹紝灏卞湴瀵勫瓨鏃犲彇浠堕棬搴椾笉杩斿洖
+ boolean returnCode = false;
+ if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+ returnCode = true;
+ } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+ if (!(Constants.equalsInteger(order.getType(), Constants.ZERO) && order.getTakeShopId() == null)) {
+ returnCode = true;
+ }
+ }
+ if (returnCode) {
+ vo.setMemberVerifyCode(order.getMemberVerifyCode());
+ }
+ } else {
+ // 闂ㄥ簵绔細濮嬬粓杩斿洖浼氬憳鏍搁攢鐮�
+ vo.setMemberVerifyCode(order.getMemberVerifyCode());
+ }
+
+ return vo;
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void cancelOrder(Integer orderId, Integer memberId, String reason) {
+ Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getId, orderId)
+ .eq(Orders::getMemberId, memberId)
+ .eq(Orders::getDeleted, Constants.ZERO));
+ if (order == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ }
+
+ // 浠呭紓鍦板瘎瀛樺彲鍙栨秷
+ if (!Constants.equalsInteger(order.getType(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曞彲鍙栨秷");
+ }
+
+ Integer status = order.getStatus();
+ if (status == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟鐘舵�佸紓甯�");
+ }
+
+ Date now = new Date();
+
+ // 寰呮敮浠橈細鐩存帴鍙栨秷
+ if (Constants.equalsInteger(status, Constants.OrderStatus.waitPay.getStatus())) {
+ order.setStatus(Constants.OrderStatus.cancelled.getStatus());
+ order.setCancelTime(now);
+ ordersMapper.updateById(order);
+ saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟鏀粯锛�", reason, memberId);
+ return;
+ }
+
+ // 寰呭瘎瀛橈細鐩存帴鍙栨秷锛屽叏棰濋��娆�
+ if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+ // 璁板綍閫�娆句俊鎭�
+ OrdersRefund refund = new OrdersRefund();
+ refund.setOrderId(orderId);
+ refund.setType(0); // 鏈瘎瀛樼洿鎺ュ彇娑�
+ refund.setCancelInfo(reason);
+ refund.setCreateTime(now);
+ refund.setDeleted(Constants.ZERO);
+
+ // 璋冪敤寰俊閫�娆撅紝鍏ㄩ閫�娆�
+ String refundCode = wxMiniUtilService.wxRefund(order.getOutTradeNo(), order.getPayAmount(), order.getPayAmount());
+ refund.setRefundCode(refundCode);
+ refund.setRefundTime(new Date());
+ ordersRefundMapper.insert(refund);
+
+ order.setStatus(Constants.OrderStatus.cancelled.getStatus());
+ order.setCancelTime(now);
+ order.setRefundAmount(order.getPayAmount());
+ ordersMapper.updateById(order);
+
+ saveCancelLog(order, "浼氬憳鍙栨秷璁㈠崟锛堝緟瀵勫瓨锛屽叏棰濋��娆撅級", reason, memberId);
+ return;
+ }
+
+ // 宸插瘎瀛�/宸叉帴鍗曪細杩涘叆鍙栨秷涓姸鎬�
+ if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus())
+ || Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+ order.setStatus(Constants.OrderStatus.cancelling.getStatus());
+ order.setCancelTime(now);
+ ordersMapper.updateById(order);
+ saveCancelLog(order, "浼氬憳鐢宠鍙栨秷璁㈠崟锛堝凡瀵勫瓨/宸叉帴鍗曪級", reason, memberId);
+ return;
+ }
+
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鍙栨秷");
+ }
+
+ /**
+ * 淇濆瓨鍙栨秷璁㈠崟鎿嶄綔鏃ュ織
+ */
+ private void saveCancelLog(Orders order, String title, String reason, Integer memberId) {
+ OrderLog log = new OrderLog();
+ log.setOrderId(order.getId());
+ log.setTitle(title);
+ log.setLogInfo(reason);
+ log.setObjType(Constants.ORDER_LOG_CANCEL);
+ log.setOrderStatus(order.getStatus());
+ log.setOptUserId(memberId);
+ log.setOptUserType(0); // 0=鐢ㄦ埛
+ log.setCreateTime(new Date());
+ log.setDeleted(Constants.ZERO);
+ orderLogService.create(log);
+ }
+
+ /**
+ * 淇濆瓨闂ㄥ簵鏍搁攢鏃ュ織
+ */
+ private void saveShopVerifyLog(Orders order, String title, String logInfo, String remark, Integer shopId) {
+ OrderLog log = new OrderLog();
+ log.setOrderId(order.getId());
+ log.setTitle(title);
+ log.setLogInfo(logInfo);
+ log.setRemark(remark);
+ log.setOrderStatus(order.getStatus());
+ log.setOptUserId(shopId);
+ log.setOptUserType(2); // 2=闂ㄥ簵
+ log.setCreateTime(new Date());
+ log.setDeleted(Constants.ZERO);
+ orderLogService.create(log);
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void handleStorageOrderPayNotify(String outTradeNo, String wxTradeNo) {
+ Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getOutTradeNo, outTradeNo)
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (order == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�: " + outTradeNo);
+ }
+ // 骞傜瓑锛氬凡鏀粯鍒欒烦杩�
+ if (Constants.equalsInteger(order.getPayStatus(), Constants.ONE)) {
+ return;
+ }
+ Date now = new Date();
+ order.setStatus(Constants.OrderStatus.waitDeposit.getStatus()); // 寰呭瘎瀛�
+ order.setPayStatus(Constants.ONE); // 宸叉敮浠�
+ order.setPayTime(now);
+ order.setWxExternalNo(wxTradeNo);
+ order.setUpdateTime(now);
+ // 鐢熸垚浼氬憳鏍搁攢鐮�
+ order.setMemberVerifyCode(generateVerifyCode());
+ ordersMapper.updateById(order);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public PayResponse payOverdueFee(Integer orderId, Integer memberId) {
+ // 1. 鏌ヨ瀵勫瓨璁㈠崟
+ Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getId, orderId)
+ .eq(Orders::getMemberId, memberId)
+ .eq(Orders::getDeleted, Constants.ZERO));
+ if (order == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+ // 2. 鏍¢獙鐘舵�侊細寰呭彇浠�(5) + 閫炬湡(1)
+ if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鏀寔閫炬湡鏀粯");
+ }
+ if (!Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉瀛樺湪閫炬湡璐圭敤");
+ }
+ if (order.getOverdueAmount() == null || order.getOverdueAmount() <= 0) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "閫炬湡璐圭敤寮傚父锛屾棤娉曞彂璧锋敮浠�");
+ }
+ // 3. 鏌ヨ浼氬憳
+ Member member = memberMapper.selectById(memberId);
+ if (member == null || StringUtils.isBlank(member.getOpenid())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛淇℃伅寮傚父锛屾棤娉曞彂璧锋敮浠�");
+ }
+ // 4. 鍒涘缓閫炬湡璐圭敤璁㈠崟
+ String outTradeNo = generateOrderTradeNo();
+ Date now = new Date();
+ OtherOrders otherOrders = new OtherOrders();
+ otherOrders.setType(Constants.TWO); // 2=閫炬湡璐圭敤璁㈠崟
+ otherOrders.setMemberId(memberId);
+ otherOrders.setOrderId(orderId);
+ otherOrders.setPayAccount(order.getOverdueAmount());
+ otherOrders.setPayStatus(Constants.ZERO);
+ otherOrders.setCode("OD" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now) + orderId);
+ otherOrders.setOutTradeNo(outTradeNo);
+ otherOrders.setDeleted(Constants.ZERO);
+ otherOrders.setCreateTime(now);
+ otherOrdersMapper.insert(otherOrders);
+
+ // 5. 鍞よ捣寰俊鏀粯
+ return wxPayForOtherOrder(otherOrders, member.getOpenid(), Constants.OrdersAttach.OVERDUE_FEE);
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void handleOverdueFeePayNotify(String outTradeNo, String wxTradeNo) {
+ // 1. 鏌ユ壘閫炬湡璐圭敤璁㈠崟
+ OtherOrders otherOrders = otherOrdersMapper.selectOne(new QueryWrapper<OtherOrders>().lambda()
+ .eq(OtherOrders::getOutTradeNo, outTradeNo)
+ .eq(OtherOrders::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (otherOrders == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "閫炬湡璐圭敤璁㈠崟涓嶅瓨鍦�: " + outTradeNo);
+ }
+ // 2. 骞傜瓑锛氬凡鏀粯鍒欒烦杩�
+ if (Constants.equalsInteger(otherOrders.getPayStatus(), Constants.ONE)) {
+ return;
+ }
+ Date now = new Date();
+ // 3. 鏇存柊閫炬湡璐圭敤璁㈠崟鐘舵��
+ otherOrders.setPayStatus(Constants.ONE);
+ otherOrders.setPayTime(now);
+ otherOrders.setWxExternalNo(wxTradeNo);
+ otherOrders.setUpdateTime(now);
+ otherOrdersMapper.updateById(otherOrders);
+
+ // 4. 鏇存柊瀵勫瓨璁㈠崟閫炬湡鐘舵�佷负宸叉敮浠�(2)锛屾洿鏂版�婚噾棰濓紝閲嶇畻涓夋柟鏀剁泭
+ if (otherOrders.getOrderId() != null) {
+ Orders order = ordersMapper.selectById(otherOrders.getOrderId());
+ if (order != null) {
+ order.setOverdueStatus(Constants.TWO); // 2=宸叉敮浠�
+ // 鎬婚噾棰� = 鍘熼噾棰� + 閫炬湡璐圭敤
+ Long overdueFee = otherOrders.getPayAccount() != null ? otherOrders.getPayAccount() : 0L;
+ long newTotal = (order.getTotalAmount() != null ? order.getTotalAmount() : 0L) + overdueFee;
+ order.setTotalAmount(newTotal);
+ order.setUpdateTime(now);
+ ordersMapper.updateById(order);
+ // 閲嶇畻涓夋柟鏀剁泭
+ calculateAndSaveOrderFees(order.getId());
+ }
}
}
- //鑷姩璇勪环 璁㈠崟瀹屾垚7澶╁悗鑷姩璇勪环4鏄�
@Override
- @Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public void autoComment(){
- List<Orders> ordersList = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
- .eq(Orders::getStatus,Constants.FOUR).eq(Orders::getCommentStatus,Constants.ZERO)
- .apply(" DATE_ADD(finish_time, INTERVAL 7 DAY) < now() ")
- .last("limit 100")
- );
+ public void deleteMyOrder(Integer orderId, Integer memberId) {
+ Orders order = ordersMapper.selectById(orderId);
+ if (order == null || !Constants.equalsInteger(order.getDeleted(), Constants.ZERO)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ }
+ if (!Constants.equalsInteger(order.getMemberId(), memberId)) {
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鏃犳潈鎿嶄綔姝よ鍗�");
+ }
+ // 浠呭凡瀹屾垚(7)銆佸凡鍙栨秷(99)銆佸凡閫�娆�(96)鍙垹闄�
+ int status = Constants.formatIntegerNum(order.getStatus());
+ if (status != Constants.OrderStatus.finished.getStatus()
+ && status != Constants.OrderStatus.cancelled.getStatus()
+ && status != Constants.OrderStatus.closed.getStatus()) {
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍙垹闄�");
+ }
+ ordersMapper.update(new UpdateWrapper<Orders>().lambda()
+ .set(Orders::getDeleted, Constants.ONE)
+ .set(Orders::getUpdateTime, new Date())
+ .eq(Orders::getId, orderId));
+ }
- for (Orders orders:ordersList) {
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public PayResponse payShopDeposit(Integer shopId) {
+ // 1. 鏌ヨ闂ㄥ簵淇℃伅
+ ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+ if (shopInfo == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "闂ㄥ簵涓嶅瓨鍦�");
+ }
+ // 2. 鏍¢獙鐘舵�侊細瀹℃壒閫氳繃(1)鎵嶈兘鏀粯鎶奸噾
+ if (!Constants.equalsInteger(shopInfo.getAuditStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠闂ㄥ簵鐘舵�佷笉鏀寔鏀粯鎶奸噾");
+ }
+ if (shopInfo.getDepositAmount() == null || shopInfo.getDepositAmount() <= 0) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鎶奸噾閲戦寮傚父锛屾棤娉曞彂璧锋敮浠�");
+ }
+ // 3. 鏌ヨ浼氬憳openid
+ Member member = memberMapper.selectById(shopInfo.getRegionMemberId());
+ if (member == null || StringUtils.isBlank(member.getOpenid())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鐢ㄦ埛淇℃伅寮傚父锛屾棤娉曞彂璧锋敮浠�");
+ }
+ // 4. 鍒涘缓鎶奸噾璁㈠崟
+ String outTradeNo = generateOrderTradeNo();
+ Date now = new Date();
+ OtherOrders otherOrders = new OtherOrders();
+ otherOrders.setType(Constants.ZERO); // 0=搴楅摵鎶奸噾璁㈠崟
+ otherOrders.setMemberId(shopInfo.getRegionMemberId());
+ otherOrders.setPayAccount(shopInfo.getDepositAmount());
+ otherOrders.setPayStatus(Constants.ZERO);
+ otherOrders.setCode("SD" + new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(now) + shopId);
+ otherOrders.setOutTradeNo(outTradeNo);
+ otherOrders.setDeleted(Constants.ZERO);
+ otherOrders.setCreateTime(now);
+ otherOrdersMapper.insert(otherOrders);
+
+ // 5. 鍞よ捣寰俊鏀粯
+ return wxPayForOtherOrder(otherOrders, member.getOpenid(), Constants.OrdersAttach.SHOP_DEPOSIT);
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void handleShopDepositPayNotify(String outTradeNo, String wxTradeNo) {
+ // 1. 鏌ユ壘鎶奸噾璁㈠崟
+ OtherOrders otherOrders = otherOrdersMapper.selectOne(new QueryWrapper<OtherOrders>().lambda()
+ .eq(OtherOrders::getOutTradeNo, outTradeNo)
+ .eq(OtherOrders::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (otherOrders == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鎶奸噾璁㈠崟涓嶅瓨鍦�: " + outTradeNo);
+ }
+ // 2. 骞傜瓑锛氬凡鏀粯鍒欒烦杩�
+ if (Constants.equalsInteger(otherOrders.getPayStatus(), Constants.ONE)) {
+ return;
+ }
+ Date now = new Date();
+ // 3. 鏇存柊鎶奸噾璁㈠崟鐘舵��
+ otherOrders.setPayStatus(Constants.ONE);
+ otherOrders.setPayTime(now);
+ otherOrders.setWxExternalNo(wxTradeNo);
+ otherOrders.setUpdateTime(now);
+ otherOrdersMapper.updateById(otherOrders);
+
+ // 4. 鏌ヨ闂ㄥ簵淇℃伅锛堥�氳繃娉ㄥ唽浼氬憳涓婚敭鍏宠仈锛�
+ ShopInfo shopInfo = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
+ .eq(ShopInfo::getRegionMemberId, otherOrders.getMemberId())
+ .eq(ShopInfo::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (shopInfo == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "闂ㄥ簵涓嶅瓨鍦�");
+ }
+ // 5. 鏇存柊闂ㄥ簵鐘舵�侊細宸叉敮浠樻娂閲�
+ shopInfo.setAuditStatus(Constants.THREE); // 3=宸叉敮浠樻娂閲�
+ shopInfo.setPayStatus(Constants.ONE);
+ shopInfo.setPayTime(now);
+ shopInfo.setWxExternalNo(wxTradeNo);
+ shopInfo.setCode(otherOrders.getCode());
+ Member member = memberMapper.selectById(otherOrders.getMemberId());
+ if (member != null) {
+ shopInfo.setPayMemberOpenId(member.getOpenid());
+ }
+ shopInfo.setUpdateTime(now);
+ shopInfoMapper.updateById(shopInfo);
+
+ // 6. 鎶奸噾鏀粯瀹屾垚鍚庯紝鑻ュ煄甯傛湭寮�閫氬垯鑷姩寮�閫�
+ if (shopInfo.getAreaId() != null) {
+ Areas shopArea = areasBiz.resolveArea(shopInfo.getAreaId());
+ if (shopArea != null && shopArea.getParentId() != null) {
+ Areas cityArea = areasBiz.resolveArea(shopArea.getParentId());
+ if (cityArea != null && !Constants.equalsInteger(cityArea.getStatus(), Constants.ONE)) {
+ cityArea.setStatus(Constants.ONE);
+ cityArea.setEditDate(now);
+ areasService.updateById(cityArea);
+ areasService.cacheData();
+ }
+ }
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void settleOrders() {
+ // 1. 璇诲彇缁撶畻澶╂暟閰嶇疆
+ SystemDictData settlementConfig = systemDictDataBiz.queryByCode(Constants.OPERATION_CONFIG, Constants.OP_SETTLEMENT_DATE);
+ if (settlementConfig == null || StringUtils.isBlank(settlementConfig.getCode())) {
+ return;
+ }
+ int days = Integer.parseInt(settlementConfig.getCode());
+ // 缁撶畻鎴鏃堕棿 = 褰撳墠鏃堕棿 - N澶�
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DAY_OF_MONTH, -days);
+ Date deadline = cal.getTime();
+
+ // 2. 鏌ヨ宸插畬鎴愮殑寰呯粨绠楄鍗曪紙瀹屾垚鏃堕棿 <= 鎴鏃堕棿锛�
+ List<Orders> ordersList = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .eq(Orders::getStatus, Constants.OrderStatus.finished.getStatus())
+ .eq(Orders::getSettlementStatus, Constants.ZERO)
+ .le(Orders::getFinishTime, deadline));
+ if (ordersList == null || ordersList.isEmpty()) {
+ return;
+ }
+
+ Date now = new Date();
+ for (Orders order : ordersList) {
+ // 3. 鏇存柊璁㈠崟缁撶畻鐘舵��
ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getCommentStatus,Constants.ONE)
- .set(Orders::getUpdateTime,new Date())
- .set(Orders::getCommentTime,new Date())
- .set(Orders::getCommentLevel,Constants.FOUR)
- .set(Orders::getCommentType,Constants.ZERO)
- .eq(Orders::getId,orders.getId())
- );
+ .set(Orders::getSettlementStatus, Constants.ONE)
+ .set(Orders::getSettlementTime, now)
+ .set(Orders::getUpdateTime, now)
+ .eq(Orders::getId, order.getId()));
- memberMapper.update(new UpdateWrapper<Member>().lambda()
- .setSql(" score = ( ( total_score +" + Constants.FOUR + " ) / (score_order_num + 1 ) ) ")
- .setSql(" total_score = ( total_score +" + Constants.FOUR + ")")
- .setSql(" score_order_num = ( score_order_num + 1 ) " ).eq(Member::getId,orders.getAcceptMemberId())
- );
+ // 4. 鏌ヨ鍏宠仈鐨勫緟鍏ヨ处 Revenue 璁板綍
+ List<Revenue> revenues = revenueMapper.selectList(new QueryWrapper<Revenue>().lambda()
+ .eq(Revenue::getObjId, order.getId())
+ .eq(Revenue::getObjType, Constants.ZERO)
+ .eq(Revenue::getVaildStatus, Constants.ZERO)
+ .eq(Revenue::getDeleted, Constants.ZERO));
- //鏃ュ織瀛樺偍
- Constants.OrdersLog ordersLog = Constants.OrdersLog.AUTO_COMMENT;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),orders.getAcceptMemberId(),null);
- }
- }
+ for (Revenue revenue : revenues) {
+ Long amount = revenue.getAmount() != null ? revenue.getAmount() : 0L;
+ // 鏇存柊 Revenue 涓哄凡鍏ヨ处
+ revenueMapper.update(new UpdateWrapper<Revenue>().lambda()
+ .set(Revenue::getVaildStatus, Constants.ONE)
+ .set(Revenue::getUpdateTime, now)
+ .eq(Revenue::getId, revenue.getId()));
-
- //鑷姩纭 璁㈠崟淇敼鍚庤嫢鏈鐞� 鏍规嵁閰嶇疆鑷姩澶勭悊
- @Override
- @Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public void autoConfirm(){
- String autoConfirmTime = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.AUTO_CONFIRM).getCode();
- List<Orders> ordersList = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
- .eq(Orders::getStatus,Constants.ordersStatus.accept.getKey())
- .eq(Orders::getIsUpdate,Constants.ONE)
- .apply(" DATE_ADD(IS_UPDATE_TIME, INTERVAL "+autoConfirmTime+" MINUTE) < now() ")
- .last("limit 100")
- );
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ordersList)){
- for (Orders orders:ordersList) {
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getIsUpdate,Constants.TWO)
- .set(Orders::getUpdateTime,new Date())
- .eq(Orders::getId,orders.getId())
- );
- //璁板綍鍚屾剰淇敼鐨勬棩蹇�
- Constants.OrdersLog ordersLog = Constants.OrdersLog.AUTO_AGREE;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),null,null);
+ // 鏍规嵁 memberType 鏇存柊浣欓
+ if (Constants.equalsInteger(revenue.getMemberType(), Constants.ONE)) {
+ // 鍙告満锛氶�氳繃 memberId 鏌� DriverInfo锛屾洿鏂� balance / totalBalance
+ DriverInfo driver = driverInfoMapper.selectOne(new QueryWrapper<DriverInfo>().lambda()
+ .eq(DriverInfo::getMemberId, revenue.getMemberId())
+ .eq(DriverInfo::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (driver != null) {
+ driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
+ .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amount)
+ .setSql(" TOTAL_BALANCE = IFNULL(TOTAL_BALANCE, 0) + " + amount)
+ .eq(DriverInfo::getId, driver.getId()));
+ }
+ } else if (Constants.equalsInteger(revenue.getMemberType(), Constants.TWO)) {
+ // 闂ㄥ簵锛氶�氳繃 memberId 鏌� ShopInfo(regionMemberId)锛屾洿鏂� balance / totalBalance
+ ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
+ .eq(ShopInfo::getRegionMemberId, revenue.getMemberId())
+ .eq(ShopInfo::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (shop != null) {
+ shopInfoMapper.update(new UpdateWrapper<ShopInfo>().lambda()
+ .setSql(" BALANCE = IFNULL(BALANCE, 0) + " + amount)
+ .setSql(" TOTAL_BALANCE = IFNULL(TOTAL_BALANCE, 0) + " + amount)
+ .eq(ShopInfo::getId, shop.getId()));
+ }
+ }
}
}
}
-
-
- //鑷姩鍙栨秷 璁㈠崟鏈敮浠�
@Override
- @Transactional(rollbackFor = {Exception.class,BusinessException.class})
- public void autoCancelWaitPay(){
- List<Orders> ordersList = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
- .eq(Orders::getStatus,Constants.ordersStatus.waitPay)
- .apply(" DATE_ADD(CREATE_TIME, INTERVAL 15 MINUTE) < now() ")
- .last("limit 100")
- );
- if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(ordersList)){
- for (Orders orders:ordersList) {
- ordersMapper.update(new UpdateWrapper<Orders>().lambda()
- .set(Orders::getStatus,Constants.ordersStatus.cancel.getKey())
- .set(Orders::getUpdateTime,DateUtil.getCurrDateTime())
- .set(Orders::getCancelTime,DateUtil.getCurrDateTime())
- .set(Orders::getCancelType,Constants.TWO)
- .eq(Orders::getId,orders.getId())
- );
- //璁板綍鍚屾剰淇敼鐨勬棩蹇�
- Constants.OrdersLog ordersLog = Constants.OrdersLog.SYSTEM_CANCEL;
- this.saveOrderLog(orders,ordersLog,
- ordersLog.getInfo(),orders.getAcceptMemberId(),null);
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void commentOrder(CommentOrderDTO dto, Integer memberId) {
+ // 1. 鏍¢獙璁㈠崟
+ Orders order = ordersMapper.selectById(dto.getOrderId());
+ if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+ if (!Constants.equalsInteger(order.getMemberId(), memberId)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏃犳潈璇勪环璇ヨ鍗�");
+ }
+ if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.finished.getStatus())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鏀寔璇勪环");
+ }
+ if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曞凡璇勪环");
+ }
+
+ // 2. 寮傚湴瀵勫瓨璁㈠崟锛氬彇浠堕棬搴楀拰鍙告満璇勫垎鏍¢獙
+ boolean isRemote = Constants.equalsInteger(order.getType(), Constants.ONE);
+ if (isRemote) {
+ if (dto.getDriverScore() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "寮傚湴瀵勫瓨璁㈠崟蹇呴』璇勪环鍙告満");
+ }
+ if (order.getTakeShopId() != null && dto.getTakeScore() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇疯瘎浠峰彇浠堕棬搴�");
+ }
+ }
+
+ Date now = new Date();
+
+ // 3. 鏇存柊璁㈠崟璇勪环鐘舵��
+ order.setCommentStatus(Constants.ONE);
+ order.setCommentInfo(dto.getContent());
+ order.setCommentDepositLevel(dto.getDepositScore());
+ order.setCommentTakeLevel(dto.getTakeScore());
+ order.setCommentDriverLevel(dto.getDriverScore());
+ order.setCommentTime(now);
+ order.setUpdateTime(now);
+ ordersMapper.updateById(order);
+
+ // 4. 鍒涘缓璇勪环璁板綍
+ // 4.1 瀛樹欢闂ㄥ簵
+ OrderComment depositComment = new OrderComment();
+ depositComment.setOrderId(order.getId());
+ depositComment.setOrderCode(order.getCode());
+ depositComment.setMemberId(memberId);
+ depositComment.setTargetType(Constants.ONE); // 1=瀛樹欢闂ㄥ簵
+ depositComment.setTargetId(order.getDepositShopId());
+ depositComment.setScore(dto.getDepositScore());
+ depositComment.setContent(dto.getContent());
+ depositComment.setDeleted(Constants.ZERO);
+ depositComment.setCreateTime(now);
+ orderCommentMapper.insert(depositComment);
+
+ // 4.2 鍙栦欢闂ㄥ簵锛堝紓鍦板瘎瀛樹笖鏈夊彇浠堕棬搴楋級
+ if (isRemote && order.getTakeShopId() != null && dto.getTakeScore() != null) {
+ OrderComment takeComment = new OrderComment();
+ takeComment.setOrderId(order.getId());
+ takeComment.setOrderCode(order.getCode());
+ takeComment.setMemberId(memberId);
+ takeComment.setTargetType(Constants.TWO); // 2=鍙栦欢闂ㄥ簵
+ takeComment.setTargetId(order.getTakeShopId());
+ takeComment.setScore(dto.getTakeScore());
+ takeComment.setContent(dto.getContent());
+ takeComment.setDeleted(Constants.ZERO);
+ takeComment.setCreateTime(now);
+ orderCommentMapper.insert(takeComment);
+ }
+
+ // 4.3 鍙告満锛堝紓鍦板瘎瀛橈級
+ if (isRemote && order.getAcceptDriver() != null && dto.getDriverScore() != null) {
+ OrderComment driverComment = new OrderComment();
+ driverComment.setOrderId(order.getId());
+ driverComment.setOrderCode(order.getCode());
+ driverComment.setMemberId(memberId);
+ driverComment.setTargetType(Constants.THREE); // 3=鍙告満
+ driverComment.setTargetId(order.getAcceptDriver());
+ driverComment.setScore(dto.getDriverScore());
+ driverComment.setContent(dto.getContent());
+ driverComment.setDeleted(Constants.ZERO);
+ driverComment.setCreateTime(now);
+ orderCommentMapper.insert(driverComment);
+ }
+
+ // 5. 鏇存柊闂ㄥ簵/鍙告満骞冲潎璇勫垎
+ updateTargetScore(Constants.ONE, order.getDepositShopId());
+ if (isRemote && order.getTakeShopId() != null) {
+ updateTargetScore(Constants.TWO, order.getTakeShopId());
+ }
+ if (isRemote && order.getAcceptDriver() != null) {
+ updateTargetScore(Constants.THREE, order.getAcceptDriver());
+ }
+ }
+
+ /**
+ * 鏇存柊璇勪环瀵硅薄锛堥棬搴�/鍙告満锛夌殑骞冲潎璇勫垎
+ */
+ private void updateTargetScore(Integer targetType, Integer targetId) {
+ List<OrderComment> comments = orderCommentMapper.selectList(new QueryWrapper<OrderComment>().lambda()
+ .eq(OrderComment::getDeleted, Constants.ZERO)
+ .eq(OrderComment::getTargetType, targetType)
+ .eq(OrderComment::getTargetId, targetId));
+ if (comments.isEmpty()) {
+ return;
+ }
+ double avg = comments.stream()
+ .mapToInt(OrderComment::getScore)
+ .average()
+ .orElse(0.0);
+ BigDecimal score = BigDecimal.valueOf(avg).setScale(1, BigDecimal.ROUND_HALF_UP);
+ Date now = new Date();
+ if (Constants.equalsInteger(targetType, Constants.ONE) || Constants.equalsInteger(targetType, Constants.TWO)) {
+ ShopInfo shopInfo = shopInfoMapper.selectById(targetId);
+ if (shopInfo != null) {
+ shopInfo.setScore(score);
+ shopInfo.setUpdateTime(now);
+ shopInfoMapper.updateById(shopInfo);
+ }
+ } else if (Constants.equalsInteger(targetType, Constants.THREE)) {
+ DriverInfo driverInfo = driverInfoMapper.selectById(targetId);
+ if (driverInfo != null) {
+ driverInfo.setScore(score);
+ driverInfo.setUpdateTime(now);
+ driverInfoMapper.updateById(driverInfo);
}
}
}
+ /**
+ * 鍞よ捣寰俊鏀粯锛堝叾浠栬鍗曪級
+ */
+ private PayResponse wxPayForOtherOrder(OtherOrders otherOrders, String openid, Constants.OrdersAttach ordersAttach) {
+ try {
+ WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
+ request.setBody(ordersAttach.getName());
+ request.setAttach(ordersAttach.getKey());
+ request.setOutTradeNo(otherOrders.getOutTradeNo());
+ long totalFee = otherOrders.getPayAccount() != null ? otherOrders.getPayAccount() : 0L;
+ request.setTotalFee((int) totalFee);
+ request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss"));
+ request.setSpbillCreateIp(Constants.getIpAddr());
+ request.setOpenid(openid);
- @Override
- public void initializeCode(){
- //鏇存柊缂撳瓨
- redisTemplate.opsForValue().set(Constants.RedisKeys.ORDER_CODE,0);
+ Object response = WxMiniConfig.wxPayService.createOrder(request);
+
+ PayResponse payResponse = new PayResponse();
+ payResponse.setResponse(response);
+ payResponse.setOrderId(otherOrders.getId());
+ return payResponse;
+ } catch (WxPayException e) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏀粯璋冭捣澶辫触锛�" + e.getMessage());
+ }
}
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void shopVerifyOrder(String verifyCode, Integer shopId, List<String> images, String remark) {
+ if (StringUtils.isBlank(verifyCode)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佷笉鑳戒负绌�");
+ }
+ // 鏍规嵁鏍搁攢鐮佹煡鎵捐鍗曪紙浼氬憳鏍搁攢鐮侊級
+ Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getMemberVerifyCode, verifyCode)
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (order == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鏍搁攢鐮佹棤鏁�");
+ }
+ // 鏌ヨ闂ㄥ簵鍚嶇О鐢ㄤ簬鏃ュ織
+ String shopName = "";
+ ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+ if (shopInfo != null) {
+ shopName = shopInfo.getName() != null ? shopInfo.getName() : "";
+ }
+
+ Integer status = order.getStatus();
+ Date now = new Date();
+ if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+ // 寰呭瘎瀛�(1) 鈫� 宸插瘎瀛�(2)锛屼袱绉嶇被鍨嬮�氱敤
+ // 鏍¢獙褰撳墠闂ㄥ簵鏄惁涓鸿鍗曠殑瀛樹欢闂ㄥ簵
+ if (!shopId.equals(order.getDepositShopId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+ }
+ order.setStatus(Constants.OrderStatus.deposited.getStatus());
+ order.setDepositTime(now);
+ // 閲婃斁褰撳墠鏍搁攢鐮侊紝鐢熸垚鏂扮殑鏍搁攢鐮佷緵鍙栦欢鏃朵娇鐢�
+ releaseVerifyCode(verifyCode);
+ order.setMemberVerifyCode(generateVerifyCode());
+ ordersMapper.updateById(order);
+ // 淇濆瓨瀵勫瓨鍥剧墖锛坥bj_type=2 璁㈠崟瀵勫瓨鍥剧墖锛屾渶澶�3寮狅級
+ saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_DEPOSIT.getKey(), shopId);
+ // 璁板綍璁㈠崟鏃ュ織
+ saveShopVerifyLog(order, "闂ㄥ簵纭瀵勫瓨", "闂ㄥ簵銆�" + shopName + "銆戠‘璁ゅ瘎瀛�", remark, shopId);
+ } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+ // 寮傚湴瀵勫瓨 + 鏃犲彇浠堕棬搴� 鈫� 鏃犳硶鏍搁攢锛堝鎴疯嚜鍙栵紝鏃犻棬搴楁搷浣滐級
+ if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤娉曟牳閿�");
+ }
+ // 鏍¢獙鍙栦欢闂ㄥ簵涓庡綋鍓嶇櫥褰曢棬搴椾竴鑷�
+ if (!shopId.equals(order.getTakeShopId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵锛屾棤娉曟牳閿�");
+ }
+ // 寰呭彇浠�(5) 鈫� 宸插畬鎴�(7)
+ order.setStatus(Constants.OrderStatus.finished.getStatus());
+ order.setConfirmArriveTime(now);
+ ordersMapper.updateById(order);
+ // 璁㈠崟瀹屾垚锛岄噴鏀炬牳閿�鐮�
+ releaseVerifyCode(verifyCode);
+ // 淇濆瓨鍑哄簱鍥剧墖锛坥bj_type=13 闂ㄥ簵鍑哄簱鍥剧墖锛屾渶澶�3寮狅級
+ saveVerifyImages(order.getId(), images, Constants.FileType.STORE_OUT.getKey(), shopId);
+ // 鐢熸垚鏀剁泭璁板綍
+ calculateAndSaveOrderFees(order.getId());
+ generateRevenueRecords(order.getId());
+ // 璁板綍璁㈠崟鏃ュ織
+ saveShopVerifyLog(order, "闂ㄥ簵纭鍙栦欢", "闂ㄥ簵銆�" + shopName + "銆戠‘璁ゅ彇浠讹紝璁㈠崟瀹屾垚", remark, shopId);
+ } else {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鏍搁攢");
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void confirmStoreOut(Integer orderId, Integer shopId, List<String> images, String remark) {
+ // 1. 鏌ヨ璁㈠崟
+ Orders order = ordersMapper.selectById(orderId);
+ if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+ // 2. 鏍¢獙鐘舵�侊細寰呭彇浠�(5)
+ if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鍑哄簱");
+ }
+ // 3. 鏍¢獙閫炬湡鐘舵�侊細0=鏈�炬湡 鎴� 2=宸叉敮浠�
+ if (order.getOverdueStatus() != null && Constants.equalsInteger(order.getOverdueStatus(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟瀛樺湪閫炬湡鏈敮浠樿垂鐢紝璇峰厛瀹屾垚閫炬湡璐圭敤鏀粯");
+ }
+ // 4. 鏍¢獙纭鍒板簵鏃堕棿涓嶄负绌�
+ if (order.getConfirmArriveTime() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璁㈠崟灏氭湭纭鍒板簵锛屾棤娉曞嚭搴�");
+ }
+ // 5. 鏍¢獙闂ㄥ簵涓庤鍗曞叧绯�
+ if (Constants.equalsInteger(order.getType(), Constants.ZERO)) {
+ // 灏卞湴瀵勫瓨锛氬彇浠堕棬搴楀嵆瀛樹欢闂ㄥ簵
+ if (!shopId.equals(order.getDepositShopId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵");
+ }
+ } else {
+ // 寮傚湴瀵勫瓨锛氭牎楠屽彇浠堕棬搴�
+ if (order.getTakeShopId() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤娉曞嚭搴�");
+ }
+ if (!shopId.equals(order.getTakeShopId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵");
+ }
+ }
+
+ // 6. 鏌ヨ闂ㄥ簵鍚嶇О
+ String shopName = "";
+ ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+ if (shopInfo != null) {
+ shopName = shopInfo.getName() != null ? shopInfo.getName() : "";
+ }
+
+ // 7. 鏇存柊璁㈠崟鐘舵�佷负宸插畬鎴�
+ Date now = new Date();
+ order.setStatus(Constants.OrderStatus.finished.getStatus());
+ order.setFinishTime(now);
+ order.setUpdateTime(now);
+ ordersMapper.updateById(order);
+
+ // 8. 閲婃斁鏍搁攢鐮�
+ if (StringUtils.isNotBlank(order.getMemberVerifyCode())) {
+ releaseVerifyCode(order.getMemberVerifyCode());
+ }
+
+ // 9. 淇濆瓨鍑哄簱鍥剧墖锛坥bj_type=13 闂ㄥ簵鍑哄簱鍥剧墖锛屾渶澶�3寮狅級
+ saveVerifyImages(order.getId(), images, Constants.FileType.STORE_OUT.getKey(), shopId);
+
+ // 10. 濡傛灉瀛樺湪閫�娆鹃噾棰濓紝鍏堜繚瀛橀��娆捐褰曞啀璋冪敤寰俊閫�娆�
+ // 閫�娆捐褰曞湪閫�娆捐皟鐢ㄥ墠钀藉簱锛岄伩鍏嶉��娆炬垚鍔熶絾鏈湴寮傚父瀵艰嚧鏃犺褰�
+ if (order.getRefundAmount() != null && order.getRefundAmount() > 0
+ && StringUtils.isNotBlank(order.getOutTradeNo())
+ && order.getPayAmount() != null && order.getPayAmount() > 0) {
+ OrdersRefund refundRecord = new OrdersRefund();
+ refundRecord.setOrderId(orderId);
+ refundRecord.setType(3); // 鍑哄簱閫�娆�
+ refundRecord.setCreateTime(now);
+ refundRecord.setRefundRemark(remark);
+ refundRecord.setDeleted(Constants.ZERO);
+ ordersRefundMapper.insert(refundRecord);
+
+ // 璋冪敤寰俊閫�娆撅紙鏀惧湪鏈�鍚庯紝纭繚鍓嶇疆鎿嶄綔鍏ㄩ儴鎴愬姛锛�
+ String refundCode = wxMiniUtilService.wxRefund(
+ order.getOutTradeNo(), order.getPayAmount(), order.getRefundAmount());
+
+ // 閫�娆炬垚鍔熷悗鍥炲~閫�娆惧崟鍙峰拰鏃堕棿
+ refundRecord.setRefundCode(refundCode);
+ refundRecord.setRefundTime(new Date());
+ ordersRefundMapper.updateById(refundRecord);
+ }
+
+ // 11. 鐢熸垚鏀剁泭璁板綍
+ calculateAndSaveOrderFees(orderId);
+ generateRevenueRecords(orderId);
+
+ // 12. 璁板綍璁㈠崟鏃ュ織
+ String logInfo = "闂ㄥ簵銆�" + shopName + "銆戠‘璁ゅ嚭搴擄紝璁㈠崟瀹屾垚";
+ if (order.getRefundAmount() != null && order.getRefundAmount() > 0) {
+ logInfo += "锛岄��娆�" + Constants.getFormatMoney(order.getRefundAmount()) + "鍏�";
+ }
+ saveShopVerifyLog(order, "闂ㄥ簵纭鍑哄簱", logInfo, remark, shopId);
+ }
+
+ @Override
+ public void calculateAndSaveOrderFees(Integer orderId) {
+ Orders order = ordersMapper.selectById(orderId);
+ if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+
+ Long totalAmount = order.getTotalAmount() != null ? order.getTotalAmount() : 0L;
+ // 璐圭巼锛堜负绌烘椂榛樿0锛�
+ BigDecimal depositRate = order.getDepositShopFeeRata() != null ? order.getDepositShopFeeRata() : BigDecimal.ZERO;
+ BigDecimal takeRate = order.getTakeShopFeeRata() != null ? order.getTakeShopFeeRata() : BigDecimal.ZERO;
+ BigDecimal driverRate = order.getDriverFeeRata() != null ? order.getDriverFeeRata() : BigDecimal.ZERO;
+ Long exceptionFeeVal = order.getExceptionFee() != null ? order.getExceptionFee() : 0L;
+
+ //瀛樹欢闂ㄥ簵鏀剁泭
+ Long depositShopFee = new BigDecimal(totalAmount)
+ .multiply(depositRate)
+ .setScale(0, RoundingMode.HALF_UP)
+ .longValue();
+
+ Long takeShopFee = 0L;
+ Long driverFee = 0L;
+
+ if (Constants.equalsInteger(order.getType(), Constants.TWO)) {
+ // 寮傚湴瀵勫瓨锛氬瓨浠堕棬搴� + 鍙告満
+ driverFee = new BigDecimal(totalAmount)
+ .multiply(driverRate)
+ .setScale(0, RoundingMode.HALF_UP)
+ .longValue()
+ + exceptionFeeVal;
+
+ // 寮傚湴瀵勫瓨涓旀湁鍙栦欢闂ㄥ簵锛氬姞涓婂彇浠堕棬搴楁敹鐩�
+ if (order.getTakeShopId() != null) {
+ takeShopFee = new BigDecimal(totalAmount)
+ .multiply(takeRate)
+ .setScale(0, RoundingMode.HALF_UP)
+ .longValue();
+ }
+ }
+
+ ordersMapper.update(new UpdateWrapper<Orders>().lambda()
+ .eq(Orders::getId, orderId)
+ .set(Orders::getDepositShopFee, depositShopFee)
+ .set(Orders::getTakeShopFee, takeShopFee)
+ .set(Orders::getDriverFee, driverFee)
+ .set(Orders::getUpdateTime, new Date()));
+ }
+
+ /**
+ * 鐢熸垚闂ㄥ簵/鍙告満鏀剁泭璁板綍锛堟湭缁撶畻锛�
+ * 璁㈠崟瀹屾垚鏃惰皟鐢紝璇诲彇璁㈠崟涓婂凡璁$畻濂界殑璐圭敤瀛楁
+ */
+ private void generateRevenueRecords(Integer orderId) {
+ Orders order = ordersMapper.selectById(orderId);
+ if (order == null) {
+ return;
+ }
+ Date now = new Date();
+ Long depositShopFee = order.getDepositShopFee() != null ? order.getDepositShopFee() : 0L;
+ Long takeShopFee = order.getTakeShopFee() != null ? order.getTakeShopFee() : 0L;
+ Long driverFee = order.getDriverFee() != null ? order.getDriverFee() : 0L;
+
+ // 瀛樹欢闂ㄥ簵鏀剁泭
+ if (depositShopFee > 0 && order.getDepositShopId() != null) {
+ ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId());
+ if (depositShop != null && depositShop.getRegionMemberId() != null) {
+ revenueMapper.insert(buildRevenue(depositShop.getRegionMemberId(), Constants.TWO,
+ depositShopFee, orderId, order.getCode()));
+ }
+ }
+
+ // 鍙栦欢闂ㄥ簵鏀剁泭锛堝紓鍦板瘎瀛樹笖鏈夊彇浠堕棬搴楋級
+ if (takeShopFee > 0 && order.getTakeShopId() != null) {
+ ShopInfo takeShop = shopInfoMapper.selectById(order.getTakeShopId());
+ if (takeShop != null && takeShop.getRegionMemberId() != null) {
+ revenueMapper.insert(buildRevenue(takeShop.getRegionMemberId(), Constants.TWO,
+ takeShopFee, orderId, order.getCode()));
+ }
+ }
+
+ // 鍙告満鏀剁泭锛堝紓鍦板瘎瀛橈級
+ if (driverFee > 0 && order.getAcceptDriver() != null) {
+ DriverInfo driver = driverInfoMapper.selectById(order.getAcceptDriver());
+ if (driver != null && driver.getMemberId() != null) {
+ revenueMapper.insert(buildRevenue(driver.getMemberId(), Constants.ONE,
+ driverFee, orderId, order.getCode()));
+ }
+ }
+ }
+
+ /**
+ * 鏋勫缓鏀剁泭璁板綍
+ */
+ private Revenue buildRevenue(Integer memberId, Integer memberType, Long amount, Integer orderId, String orderNo) {
+ Revenue revenue = new Revenue();
+ revenue.setMemberId(memberId);
+ revenue.setMemberType(memberType); // 1=鍙告満, 2=闂ㄥ簵
+ revenue.setType(Constants.ZERO); // 0=瀹屾垚璁㈠崟
+ revenue.setOptType(Constants.ONE); // 1=鏀跺叆
+ revenue.setAmount(amount);
+ revenue.setVaildStatus(Constants.ZERO); // 0=鍏ヨ处涓紙鏈粨绠楋級
+ revenue.setObjId(orderId);
+ revenue.setObjType(Constants.ZERO); // 0=璁㈠崟涓氬姟
+ revenue.setStatus(Constants.ZERO); // 0=鎴愬姛
+ revenue.setOrderNo(orderNo);
+ revenue.setDeleted(Constants.ZERO);
+ revenue.setCreateTime(new Date());
+ return revenue;
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void driverVerifyOrder(String verifyCode, List<String> images, String remark, Integer driverId) {
+ if (StringUtils.isBlank(verifyCode)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鏍搁攢鐮佷笉鑳戒负绌�");
+ }
+ // 鏍规嵁鍙告満鏍搁攢鐮佹煡鎵捐鍗�
+ Orders order = ordersMapper.selectOne(new QueryWrapper<Orders>().lambda()
+ .eq(Orders::getDriverVerifyCode, verifyCode)
+ .eq(Orders::getDeleted, Constants.ZERO)
+ .last("limit 1"));
+ if (order == null) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鏍搁攢鐮佹棤鏁�");
+ }
+
+ // 浠呭紓鍦板瘎瀛� + 鏈夊彇浠堕棬搴� + 娲鹃�佷腑(4) 鍙牳閿�
+ if (!Constants.equalsInteger(order.getType(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "浠呭紓鍦板瘎瀛樿鍗曟敮鎸佸徃鏈烘牳閿�");
+ }
+ if (order.getTakeShopId() == null) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤闇�鍙告満鏍搁攢");
+ }
+ if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽鏍搁攢");
+ }
+
+ // 娲鹃�佷腑(4) 鈫� 宸插埌搴�(5)
+ order.setStatus(Constants.OrderStatus.arrived.getStatus());
+ order.setArriveTime(new Date());
+ if (StringUtils.isNotBlank(remark)) {
+ order.setRemark(remark);
+ }
+ ordersMapper.updateById(order);
+
+ // 閲婃斁鍙告満鏍搁攢鐮�
+ releaseVerifyCode(verifyCode);
+
+ // 淇濆瓨闄勪欢锛坥bj_type=3 闂ㄥ簵鍏ュ簱鍥剧墖锛屾渶澶�3寮狅級
+ saveVerifyImages(order.getId(), images, Constants.FileType.ORDER_TAKE.getKey(), driverId);
+ }
+
+ /**
+ * 淇濆瓨鏍搁攢闄勪欢鍒� multifile 琛�
+ *
+ * @param orderId 璁㈠崟涓婚敭
+ * @param images 鍥剧墖鍦板潃鍒楄〃锛堟渶澶�3寮狅級
+ * @param objType 闄勪欢绫诲瀷
+ * @param creator 鍒涘缓浜虹紪鐮�
+ */
+ private void saveVerifyImages(Integer orderId, List<String> images, int objType, Integer creator) {
+ if (images == null || images.isEmpty()) return;
+ List<String> saveImages = images.size() > 3 ? images.subList(0, 3) : images;
+ Date now = new Date();
+ int sortNum = 1;
+ for (String imgUrl : saveImages) {
+ if (StringUtils.isBlank(imgUrl)) continue;
+ Multifile multifile = new Multifile();
+ multifile.setObjId(orderId);
+ multifile.setObjType(objType);
+ multifile.setFileurl(imgUrl);
+ multifile.setType(Constants.ZERO);
+ multifile.setCreator(creator);
+ multifile.setCreateDate(now);
+ multifile.setIsdeleted(Constants.ZERO);
+ multifile.setSortnum(sortNum++);
+ multifileMapper.insert(multifile);
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class, BusinessException.class})
+ public void confirmCustomerArrived(Integer orderId, Integer shopId) {
+ // 1. 鏌ヨ璁㈠崟
+ Orders order = ordersMapper.selectById(orderId);
+ if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "璁㈠崟涓嶅瓨鍦�");
+ }
+
+ // 2. 鏍¢獙璁㈠崟鐘舵�侊細寰呭彇浠�(5)
+ if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠璁㈠崟鐘舵�佷笉鍏佽璇ユ搷浣�");
+ }
+
+ // 3. 鏍¢獙闂ㄥ簵涓庤鍗曞叧绯�
+ if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() != null) {
+ // 寮傚湴瀵勫瓨鏈夊彇浠堕棬搴楋細鏍¢獙鍙栦欢闂ㄥ簵
+ if (!shopId.equals(order.getTakeShopId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵");
+ }
+ } else if (Constants.equalsInteger(order.getType(), Constants.ZERO)) {
+ // 灏卞湴瀵勫瓨锛氭牎楠屽瓨浠堕棬搴楋紙鍙栦欢闂ㄥ簵鍚屽瓨浠堕棬搴楋級
+ if (!shopId.equals(order.getDepositShopId())) {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曚笉灞炰簬褰撳墠闂ㄥ簵");
+ }
+ } else {
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "璇ヨ鍗曟棤鍙栦欢闂ㄥ簵锛屾棤娉曠‘璁ゅ埌搴�");
+ }
+
+ // 4. 鏌ヨ闂ㄥ簵鍚嶇О锛堢敤浜庢棩蹇楋級
+ String shopName = "";
+ ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+ if (shopInfo != null) {
+ shopName = shopInfo.getName() != null ? shopInfo.getName() : "";
+ }
+
+ // 5. 璁$畻閫炬湡璐圭敤
+ List<OrdersDetail> details = ordersDetailMapper.selectList(
+ new QueryWrapper<OrdersDetail>().lambda()
+ .eq(OrdersDetail::getOrderId, orderId)
+ .eq(OrdersDetail::getDeleted, Constants.ZERO));
+ OverdueFeeVO overdueInfo = calculateOverdueFeeInternal(order, details);
+
+ Date now = new Date();
+
+ if (overdueInfo.getOverdue() && overdueInfo.getOverdueDays() > 0) {
+ // 瀛樺湪閫炬湡锛氭爣璁伴�炬湡鐘舵�侊紝璁㈠崟淇濇寔褰撳墠鐘舵��
+ order.setConfirmArriveTime(now);
+ order.setOverdueStatus(Constants.ONE);
+ order.setOverdueDays(overdueInfo.getOverdueDays());
+ order.setOverdueAmount(overdueInfo.getOverdueFee());
+ order.setUpdateTime(now);
+ ordersMapper.updateById(order);
+
+ // 璁板綍璁㈠崟鏃ュ織
+ saveShopVerifyLog(order, "纭椤惧鍒板簵锛堥�炬湡锛�",
+ "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝閫炬湡" + overdueInfo.getOverdueDays()
+ + "澶╋紝閫炬湡璐圭敤" + Constants.getFormatMoney(overdueInfo.getOverdueFee()) + "鍏�",
+ null, shopId);
+ } else {
+ // 鏈�炬湡锛氭爣璁伴�炬湡鐘舵�佷负0锛岃鍗曚繚鎸佸綋鍓嶇姸鎬�
+ order.setConfirmArriveTime(now);
+ order.setOverdueStatus(Constants.ZERO);
+
+ // 灏卞湴瀵勫瓨锛氳绠楁槸鍚﹂渶瑕侀��娆�
+ if (Constants.equalsInteger(order.getType(), Constants.ZERO) && !CollectionUtils.isEmpty(details)) {
+ int actualDays = calcActualDepositDays(now, order.getDepositTime());
+ order.setDepositDays(actualDays);
+
+ int estimatedDays = order.getEstimatedDepositDays() != null ? order.getEstimatedDepositDays() : 1;
+ int refundDays = estimatedDays - actualDays;
+ if (refundDays > 0) {
+ // 閫�娆鹃噾棰� = 閫�娆惧ぉ鏁� 脳 危(鐗╁搧鍗曚环 脳 鏁伴噺)
+ long dailyBaseFee = 0L;
+ for (OrdersDetail d : details) {
+ dailyBaseFee += (d.getUnitPrice() != null ? d.getUnitPrice() : 0L)
+ * (d.getNum() != null ? d.getNum() : 0);
+ }
+ long refundAmount = (long) refundDays * dailyBaseFee;
+ order.setRefundAmount(refundAmount);
+ }
+ }
+
+ order.setUpdateTime(now);
+ ordersMapper.updateById(order);
+
+ // 閫�娆惧鑷存�婚噾棰濆彉鍖栵紝閲嶇畻涓夋柟鏀剁泭
+ if (order.getRefundAmount() != null && order.getRefundAmount() > 0) {
+ long newTotal = (order.getTotalAmount() != null ? order.getTotalAmount() : 0L) - order.getRefundAmount();
+ order.setTotalAmount(newTotal);
+ ordersMapper.update(new UpdateWrapper<Orders>().lambda()
+ .eq(Orders::getId, orderId)
+ .set(Orders::getTotalAmount, newTotal));
+ calculateAndSaveOrderFees(orderId);
+ }
+
+ // 璁板綍璁㈠崟鏃ュ織
+ String logInfo = "闂ㄥ簵銆�" + shopName + "銆戠‘璁ら【瀹㈠埌搴楋紝鏈�炬湡";
+ if (order.getRefundAmount() != null && order.getRefundAmount() > 0) {
+ logInfo += "锛岄渶閫�娆�" + Constants.getFormatMoney(order.getRefundAmount()) + "鍏�";
+ }
+ saveShopVerifyLog(order, "纭椤惧鍒板簵", logInfo, null, shopId);
+ }
+ }
+
+ /**
+ * 鏋勫缓璁㈠崟鐘舵�佹弿杩�
+ */
+ private String buildStatusDesc(Orders order) {
+ boolean isLocal = Constants.equalsInteger(order.getType(), Constants.ZERO);
+ Integer status = order.getStatus();
+ if (status == null) return "";
+
+ if (Constants.equalsInteger(status, Constants.OrderStatus.waitPay.getStatus())) {
+ String minutes = "";
+ try {
+ minutes = operationConfigBiz.getConfig().getAutoCancelTime();
+ } catch (Exception ignored) {}
+ return "璇峰湪" + (StringUtils.isNotBlank(minutes) ? minutes : "") + "鍒嗛挓鍐呭畬鎴愭敮浠橈紝瓒呮椂璁㈠崟灏嗚嚜鍔ㄥ彇娑�";
+ }
+ if (Constants.equalsInteger(status, Constants.OrderStatus.waitDeposit.getStatus())) {
+ return isLocal ? "璁㈠崟宸叉敮浠橈紝璇风瓑寰呴棬搴楃‘璁ゆ帴鍗�" : "璁㈠崟宸叉敮浠橈紝璇风瓑寰呴棬搴楃‘璁ゆ帴鍗�";
+ }
+ if (Constants.equalsInteger(status, Constants.OrderStatus.deposited.getStatus())) {
+ return isLocal ? "琛屾潕宸插瘎瀛橈紝璇峰嚟鍙栦欢鐮佸墠寰�鎸囧畾闂ㄥ簵鍙栦欢" : "闂ㄥ簵宸叉帴鍗曪紝姝e湪涓烘偍瀹夋帓鍙栦欢鍙告満";
+ }
+ if (Constants.equalsInteger(status, Constants.OrderStatus.accepted.getStatus())) {
+ return isLocal ? "琛屾潕宸插瘎瀛橈紝璇峰嚟鍙栦欢鐮佸墠寰�鎸囧畾闂ㄥ簵鍙栦欢" : "宸叉湁鍙告満鎶㈠崟锛屾鍓嶅線鍙栦欢鍦扮偣";
+ }
+ if (Constants.equalsInteger(status, Constants.OrderStatus.delivering.getStatus())) {
+ return "鍙告満宸插彇浠讹紝姝h繍寰�鐩殑鍦�";
+ }
+ if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) {
+ return "琛屾潕宸查�佽揪鏈嶅姟鐐癸紝璇峰強鏃跺墠寰�鍙栦欢";
+ }
+ if (Constants.equalsInteger(status, Constants.OrderStatus.finished.getStatus())) {
+ if (Constants.equalsInteger(order.getCommentStatus(), Constants.ONE)) {
+ return "鎰熻阿鎮ㄧ殑鐢ㄥ績璇勪环锛岀鎮ㄥ嚭琛岄『鍒╋紝鏃呴�旀剦蹇紒";
+ }
+ return "璁㈠崟宸插畬鎴愶紝鎰熻阿鎮ㄧ殑鏀寔锛岃瀵规湰娆℃湇鍔″仛鍑鸿瘎浠�";
+ }
+ if (Constants.equalsInteger(status, Constants.OrderStatus.cancelled.getStatus())) {
+ return "璁㈠崟宸插彇娑堬紝鎰熻阿鎮ㄧ殑鏀寔锛屾杩庝笅娆″啀浼氾紒";
+ }
+ if (Constants.equalsInteger(status, Constants.OrderStatus.cancelling.getStatus())) {
+ return "閫�娆剧敵璇峰凡鎻愪氦锛屽钩鍙颁細灏藉揩涓烘偍澶勭悊閫�娆�";
+ }
+ if (Constants.equalsInteger(status, Constants.OrderStatus.closed.getStatus())) {
+ return "閫�娆惧凡鎴愬姛鍘熻矾杩斿洖锛岃娉ㄦ剰鏌ユ敹";
+ }
+ return "";
+ }
+
+ /**
+ * 璁$畻鏀粯鍊掕鏃舵绉�
+ */
+ private Long calcPayCountdownMs(Orders order) {
+ try {
+ String minutesStr = operationConfigBiz.getConfig().getAutoCancelTime();
+ if (StringUtils.isBlank(minutesStr)) return -1L;
+ int minutes = Integer.parseInt(minutesStr);
+ long deadline = order.getCreateTime().getTime() + minutes * 60 * 1000L;
+ long remaining = deadline - System.currentTimeMillis();
+ return remaining > 0 ? remaining : -1L;
+ } catch (Exception e) {
+ return -1L;
+ }
+ }
+ public OverdueFeeVO calculateOverdueFee(Integer orderId) {
+ Orders order = ordersMapper.selectById(orderId);
+ if (order == null || Constants.equalsInteger(order.getDeleted(), Constants.ONE)) {
+ throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ }
+
+ // 鏌ヨ璁㈠崟鏄庣粏
+ List<OrdersDetail> details = ordersDetailMapper.selectList(
+ new QueryWrapper<OrdersDetail>().lambda()
+ .eq(OrdersDetail::getOrderId, orderId)
+ .eq(OrdersDetail::getDeleted, Constants.ZERO));
+
+ return calculateOverdueFeeInternal(order, details);
+ }
+
+ /**
+ * 閫炬湡璐圭敤鍐呴儴璁$畻锛堜笉鏌ュ簱锛屾帴鍙楅鏌ヨ鐨勬暟鎹級
+ * 渚涘垎椤电瓑宸叉煡璇㈡槑缁嗙殑涓氬姟鍦烘櫙澶嶇敤锛岄伩鍏嶉噸澶嶆煡璇�
+ */
+ private OverdueFeeVO calculateOverdueFeeInternal(Orders order, List<OrdersDetail> details) {
+ if (CollectionUtils.isEmpty(details)) {
+ OverdueFeeVO vo = new OverdueFeeVO();
+ vo.setOverdue(false);
+ vo.setOverdueDays(0);
+ vo.setOverdueFee(0L);
+ vo.setDailyBaseFee(0L);
+ return vo;
+ }
+
+ // 鐗╁搧鍩虹鏃ヨ垂鐢� = 危(鍗曚环 脳 鏁伴噺)
+ long dailyBaseFee = 0L;
+ for (OrdersDetail d : details) {
+ dailyBaseFee += (d.getUnitPrice() != null ? d.getUnitPrice() : 0L)
+ * (d.getNum() != null ? d.getNum() : 0);
+ }
+
+ Date now = new Date();
+ int overdueDays;
+ long overdueFee;
+
+ if (Constants.equalsInteger(order.getType(), Constants.ZERO)) {
+ // ========== 灏卞湴瀵勫瓨 ==========
+ overdueDays = calcLocalOverdueDays(now, order.getExpectedTakeTime());
+ overdueFee = (long) overdueDays * dailyBaseFee;
+
+ OverdueFeeVO vo = new OverdueFeeVO();
+ vo.setOverdue(overdueDays > 0);
+ vo.setOverdueDays(overdueDays);
+ vo.setOverdueFee(overdueFee);
+ vo.setDailyBaseFee(dailyBaseFee);
+ return vo;
+
+ } else {
+ // ========== 寮傚湴瀵勫瓨 ==========
+ // 鏉′欢锛氬瓨鍦ㄥ彇浠堕棬搴� 涓� 璁㈠崟澶勪簬宸插埌搴楃姸鎬�(5)
+ if (order.getTakeShopId() == null
+ || !Constants.equalsInteger(order.getStatus(), Constants.FIVE)) {
+ OverdueFeeVO vo = new OverdueFeeVO();
+ vo.setOverdue(false);
+ vo.setOverdueDays(0);
+ vo.setOverdueFee(0L);
+ vo.setDailyBaseFee(dailyBaseFee);
+ vo.setDiscountRate(null);
+ return vo;
+ }
+
+ overdueDays = calcRemoteOverdueDays(now, order.getArriveTime());
+
+ // 鎶樻墸姣旂巼
+ String discountStr = operationConfigBiz.getConfig().getUnpickedDiscount();
+ BigDecimal discountRate = StringUtils.isNotBlank(discountStr)
+ ? new BigDecimal(discountStr) : BigDecimal.ONE;
+
+ overdueFee = new BigDecimal(overdueDays)
+ .multiply(new BigDecimal(dailyBaseFee))
+ .multiply(discountRate)
+ .setScale(0, RoundingMode.HALF_UP)
+ .longValue();
+
+ OverdueFeeVO vo = new OverdueFeeVO();
+ vo.setOverdue(overdueDays > 0);
+ vo.setOverdueDays(overdueDays);
+ vo.setOverdueFee(overdueFee);
+ vo.setDailyBaseFee(dailyBaseFee);
+ vo.setDiscountRate(discountStr);
+ return vo;
+ }
+ }
+
+ /**
+ * 璁$畻瀹為檯瀵勫瓨澶╂暟锛坉epositTime 鍒� now 鐨勫ぉ鏁板樊锛屾渶灏�1澶╋級
+ */
+ private int calcActualDepositDays(Date now, Date depositTime) {
+ if (depositTime == null || now == null) {
+ return 1;
+ }
+ Calendar depositCal = Calendar.getInstance();
+ depositCal.setTime(depositTime);
+ depositCal.set(Calendar.HOUR_OF_DAY, 0);
+ depositCal.set(Calendar.MINUTE, 0);
+ depositCal.set(Calendar.SECOND, 0);
+ depositCal.set(Calendar.MILLISECOND, 0);
+
+ Calendar nowCal = Calendar.getInstance();
+ nowCal.setTime(now);
+ nowCal.set(Calendar.HOUR_OF_DAY, 0);
+ nowCal.set(Calendar.MINUTE, 0);
+ nowCal.set(Calendar.SECOND, 0);
+ nowCal.set(Calendar.MILLISECOND, 0);
+
+ long diffMs = nowCal.getTimeInMillis() - depositCal.getTimeInMillis();
+ int days = (int) (diffMs / (1000 * 60 * 60 * 24));
+ return Math.max(days, 1);
+ }
+
+ /**
+ * 灏卞湴瀵勫瓨閫炬湡澶╂暟璁$畻
+ * 杩囦簡棰勮鍙栦欢鏃堕棿褰撳ぉ鐨�12鐐瑰悗鎵嶇畻涓�澶�
+ */
+ private int calcLocalOverdueDays(Date now, Date expectedTakeTime) {
+ if (expectedTakeTime == null || !now.after(expectedTakeTime)) {
+ return 0;
+ }
+ // 鍩哄噯鏃堕棿 = 棰勮鍙栦欢鏃ユ湡鐨�12:00
+ Calendar baseCal = Calendar.getInstance();
+ baseCal.setTime(expectedTakeTime);
+ baseCal.set(Calendar.HOUR_OF_DAY, 12);
+ baseCal.set(Calendar.MINUTE, 0);
+ baseCal.set(Calendar.SECOND, 0);
+ baseCal.set(Calendar.MILLISECOND, 0);
+ Date baseTime = baseCal.getTime();
+
+ if (!now.after(baseTime)) {
+ return 0;
+ }
+ // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡锛堟寜澶╁彇宸級
+ Calendar nowCal = Calendar.getInstance();
+ nowCal.setTime(now);
+ nowCal.set(Calendar.HOUR_OF_DAY, 0);
+ nowCal.set(Calendar.MINUTE, 0);
+ nowCal.set(Calendar.SECOND, 0);
+ nowCal.set(Calendar.MILLISECOND, 0);
+
+ Calendar baseDateCal = Calendar.getInstance();
+ baseDateCal.setTime(baseTime);
+ baseDateCal.set(Calendar.HOUR_OF_DAY, 0);
+ baseDateCal.set(Calendar.MINUTE, 0);
+ baseDateCal.set(Calendar.SECOND, 0);
+ baseDateCal.set(Calendar.MILLISECOND, 0);
+
+ long diffMs = nowCal.getTimeInMillis() - baseDateCal.getTimeInMillis();
+ int days = (int) (diffMs / (1000 * 60 * 60 * 24));
+ return Math.max(days, 0);
+ }
+
+ /**
+ * 寮傚湴瀵勫瓨閫炬湡澶╂暟璁$畻
+ * 杩囦簡杞Щ鍒板簵鏃堕棿褰撳ぉ鐨勬櫄涓�12鐐癸紙24:00锛夊悗鎵嶇畻绗竴澶�
+ */
+ private int calcRemoteOverdueDays(Date now, Date arriveTime) {
+ if (arriveTime == null || !now.after(arriveTime)) {
+ return 0;
+ }
+ // 鍩哄噯鏃堕棿 = 杞Щ鍒板簵鏃ユ湡鐨勬鏃� 00:00锛堝嵆褰撳ぉ24:00锛�
+ Calendar baseCal = Calendar.getInstance();
+ baseCal.setTime(arriveTime);
+ baseCal.set(Calendar.HOUR_OF_DAY, 0);
+ baseCal.set(Calendar.MINUTE, 0);
+ baseCal.set(Calendar.SECOND, 0);
+ baseCal.set(Calendar.MILLISECOND, 0);
+ baseCal.add(Calendar.DAY_OF_MONTH, 1); // 娆℃棩00:00 = 褰撳ぉ24:00
+ Date baseTime = baseCal.getTime();
+
+ if (!now.after(baseTime)) {
+ return 0;
+ }
+ // 閫炬湡澶╂暟 = 褰撳墠鏃ユ湡 - 鍩哄噯鏃ユ湡
+ Calendar nowCal = Calendar.getInstance();
+ nowCal.setTime(now);
+ nowCal.set(Calendar.HOUR_OF_DAY, 0);
+ nowCal.set(Calendar.MINUTE, 0);
+ nowCal.set(Calendar.SECOND, 0);
+ nowCal.set(Calendar.MILLISECOND, 0);
+
+ Calendar baseDateCal = Calendar.getInstance();
+ baseDateCal.setTime(baseTime);
+ baseDateCal.set(Calendar.HOUR_OF_DAY, 0);
+ baseDateCal.set(Calendar.MINUTE, 0);
+ baseDateCal.set(Calendar.SECOND, 0);
+ baseDateCal.set(Calendar.MILLISECOND, 0);
+
+ long diffMs = nowCal.getTimeInMillis() - baseDateCal.getTimeInMillis();
+ int days = (int) (diffMs / (1000 * 60 * 60 * 24));
+ return Math.max(days, 0);
+ }
}
--
Gitblit v1.9.3