package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.entity.FebsResponse;
|
import cc.mrbird.febs.common.enumerates.*;
|
import cc.mrbird.febs.common.properties.XcxProperties;
|
import cc.mrbird.febs.common.utils.LoginUserUtil;
|
import cc.mrbird.febs.common.utils.ShareCodeUtil;
|
import cc.mrbird.febs.common.utils.SpringContextHolder;
|
import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion;
|
import cc.mrbird.febs.mall.conversion.MallTeamLeaderConversion;
|
import cc.mrbird.febs.mall.dto.*;
|
import cc.mrbird.febs.mall.entity.*;
|
import cc.mrbird.febs.mall.mapper.*;
|
import cc.mrbird.febs.mall.service.IAdminMallOrderService;
|
import cc.mrbird.febs.mall.service.IApiMallTeamLeaderService;
|
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
|
import cc.mrbird.febs.mall.vo.ApiLeaderInfoVo;
|
import cc.mrbird.febs.mall.vo.ApiLeaderListVo;
|
import cc.mrbird.febs.mall.vo.ApiMallleaderStateVo;
|
import cc.mrbird.febs.mall.vo.OrderListVo;
|
import cc.mrbird.febs.pay.model.OrderStateDto;
|
import cc.mrbird.febs.pay.service.IXcxPayService;
|
import cc.mrbird.febs.pay.util.WechatConfigure;
|
import cc.mrbird.febs.pay.util.WeixinServiceUtil;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.collections.CollectionUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.util.Arrays;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class ApiMallTeamLeaderServiceImpl extends ServiceImpl<MallTeamLeaderMapper, MallTeamLeader> implements IApiMallTeamLeaderService {
|
|
|
private final MallOrderInfoMapper mallOrderInfoMapper;
|
private final MallTeamLeaderMapper mallTeamLeaderMapper;
|
private final MallMemberMapper mallMemberMapper;
|
private final IXcxPayService iXcxPayService;
|
private final SpringContextHolder springContextHolder;
|
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
|
private final MallOrderItemMapper mallOrderItemMapper;
|
private final MallRefundMapper mallRefundMapper;
|
|
@Override
|
@Transactional
|
public FebsResponse applyLeader(ApiApplayLeaderDto apiApplayLeaderDto) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
Long memberId = member.getId();
|
List<MallTeamLeader> mallTeamLeaders = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_ING);
|
if(CollUtil.isNotEmpty(mallTeamLeaders)){
|
return new FebsResponse().fail().message("正在申请中");
|
}
|
List<MallTeamLeader> mallTeamLeaderCancel = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_CANCEL);
|
if(CollUtil.isNotEmpty(mallTeamLeaderCancel)){
|
return new FebsResponse().fail().message("当前用户无法申请");
|
}
|
MallTeamLeader mallTeamLeader = MallTeamLeaderConversion.INSTANCE.dtoToEntity(apiApplayLeaderDto);
|
mallTeamLeader.setMemberId(memberId);
|
mallTeamLeader.setState(MallTeamLeader.STATE_ING);
|
mallTeamLeader.setUniqueCode(member.getInviteId());
|
this.baseMapper.insert(mallTeamLeader);
|
return new FebsResponse().success().message("申请成功");
|
}
|
|
@Override
|
public List<ApiLeaderListVo> findLeaderListInPage(ApiLeaderListDto apiLeaderListDto) {
|
Page<MallTeamLeader> page = new Page<>(apiLeaderListDto.getPageNum(), apiLeaderListDto.getPageSize());
|
IPage<MallTeamLeader> mallTeamLeaderIPage = this.baseMapper.selectApiLeaderListInPage(page, apiLeaderListDto);
|
return MallTeamLeaderConversion.INSTANCE.entitysToVos(mallTeamLeaderIPage.getRecords());
|
}
|
|
@Override
|
public FebsResponse leaderState() {
|
MallMember member = LoginUserUtil.getLoginUser();
|
Long memberId = member.getId();
|
ApiMallleaderStateVo apiMallleaderStateVo = new ApiMallleaderStateVo();
|
List<MallTeamLeader> mallTeamLeadersIng = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_ING);
|
List<MallTeamLeader> mallTeamLeadersNo = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_NO);
|
List<MallTeamLeader> mallTeamLeadersYes = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_YES);
|
List<MallTeamLeader> mallTeamLeadersCancel = this.baseMapper.selectListByMemberIdAndState(memberId, MallTeamLeader.STATE_CANCEL);
|
if(CollUtil.isNotEmpty(mallTeamLeadersIng) ||CollUtil.isNotEmpty(mallTeamLeadersYes)){
|
apiMallleaderStateVo.setState(2);
|
}else if(CollUtil.isNotEmpty(mallTeamLeadersNo)){
|
apiMallleaderStateVo.setState(1);
|
}else if(CollUtil.isNotEmpty(mallTeamLeadersCancel)){
|
apiMallleaderStateVo.setState(2);
|
}else{
|
apiMallleaderStateVo.setState(1);
|
}
|
return new FebsResponse().success().data(apiMallleaderStateVo);
|
}
|
|
@Override
|
public FebsResponse getApiLeaderInfoVoById(Long id) {
|
MallTeamLeader mallTeamLeader = this.baseMapper.selectById(id);
|
ApiLeaderInfoVo apiLeaderInfoVo = new ApiLeaderInfoVo();
|
apiLeaderInfoVo.setId(mallTeamLeader.getId());
|
apiLeaderInfoVo.setName(mallTeamLeader.getName());
|
apiLeaderInfoVo.setPhone(mallTeamLeader.getPhone());
|
apiLeaderInfoVo.setAddressPic(mallTeamLeader.getAddressPic());
|
apiLeaderInfoVo.setUniqueCode(mallTeamLeader.getUniqueCode());
|
apiLeaderInfoVo.setProvince(mallTeamLeader.getProvince());
|
apiLeaderInfoVo.setCity(mallTeamLeader.getCity());
|
apiLeaderInfoVo.setTownship(mallTeamLeader.getTownship());
|
apiLeaderInfoVo.setDetailAddress(mallTeamLeader.getDetailAddress());
|
apiLeaderInfoVo.setAddressArea(mallTeamLeader.getAddressArea());
|
return new FebsResponse().success().data(apiLeaderInfoVo);
|
}
|
|
@Override
|
public List<OrderListVo> findLeaderOrderListInPage(ApiLeaderOrderListDto apiLeaderOrderListDto) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
IPage<MallOrderInfo> page = new Page<>(apiLeaderOrderListDto.getPageNum(), apiLeaderOrderListDto.getPageSize());
|
apiLeaderOrderListDto.setMemberId(member.getId());
|
IPage<MallOrderInfo> mallOrderInfos = this.baseMapper.selectApiLeaderOrderListInPage(page, apiLeaderOrderListDto);
|
return MallOrderInfoConversion.INSTANCE.entitysToVos(mallOrderInfos.getRecords());
|
}
|
|
@Override
|
@Transactional
|
public FebsResponse leaderOrderConfirm(ApiLeaderOrderConfirmDto apiLeaderOrderConfirmDto) {
|
log.info("确认到达"+apiLeaderOrderConfirmDto.getIds());
|
List<String> idsStr = StrUtil.splitTrim(apiLeaderOrderConfirmDto.getIds(),",");
|
if(CollUtil.isEmpty(idsStr)){
|
return new FebsResponse().fail().message("请选择订单");
|
}
|
for(String orderIdStr : idsStr){
|
long orderId = Long.parseLong(orderIdStr);
|
MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
|
if(ObjectUtil.isEmpty(mallOrderInfo)){
|
continue;
|
// return new FebsResponse().fail().message("订单不存在");
|
}
|
Integer status = mallOrderInfo.getStatus() == null ? 0 : mallOrderInfo.getStatus();
|
Integer deliveryState = mallOrderInfo.getDeliveryState() == null ? 0 : mallOrderInfo.getDeliveryState();
|
if(OrderStatusEnum.WAIT_FINISH.getValue() != status || 2 != deliveryState){
|
continue;
|
// return new FebsResponse().fail().message("订单不是待确认到货状态");
|
}
|
mallOrderInfo.setDeliveryState(OrderDeliveryStateEnum.DELIVERY_FINISH.getValue());
|
mallOrderInfoMapper.updateById(mallOrderInfo);
|
|
OrderStateDto orderStateDto = new OrderStateDto();
|
orderStateDto.setOrderNo(mallOrderInfo.getOrderNo());
|
String productNames = getProductNames(mallOrderInfo.getMemberId(), mallOrderInfo.getId());
|
orderStateDto.setGoodsName(StrUtil.sub(productNames,0,10)+"...");
|
orderStateDto.setOrderState("已送达");
|
orderStateDto.setTakeCode(mallOrderInfo.getTakeCode());
|
String takeUniqueCode = mallOrderInfo.getTakeUniqueCode();
|
MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(takeUniqueCode);
|
orderStateDto.setAddressArea(StrUtil.sub(mallTeamLeader.getAddressArea(),0,10)+"...");
|
orderStateDto.setOpenId(mallMemberMapper.selectById(mallOrderInfo.getMemberId()).getOpenId());
|
DataDictionaryCustom dataDictionaryCustom = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.WX_TEMPLATE_ID_ONE.getType(), DataDictionaryEnum.WX_TEMPLATE_ID_ONE.getCode());
|
orderStateDto.setTemplateId(dataDictionaryCustom.getValue());
|
iXcxPayService.pushOrderToAddress(orderStateDto);
|
}
|
return new FebsResponse().success().message("确认成功");
|
}
|
|
/**
|
* 根据用户ID和订单ID获取所购买商品名称
|
* @return 所含商品名称(多个以","隔开)
|
*/
|
public String getProductNames(Long memberId, Long orderId) {
|
MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectOrderByMemberIdAndId(memberId, orderId);
|
List<MallOrderItem> details = mallOrderInfo.getItems();
|
if (CollectionUtils.isEmpty(details)) {
|
return "";
|
}
|
StringBuffer productNameBuffer = new StringBuffer();
|
Integer maxLength = 30;
|
for (int i = 0; i< details.size(); i++) {
|
MallOrderItem mallOrderItem = details.get(i);
|
String goodsName = mallOrderItem.getGoodsName();
|
if (goodsName == null) {
|
continue;
|
}
|
if (i == 0 && goodsName.length() > maxLength) {
|
productNameBuffer.append(goodsName.substring(0, maxLength) + "...");
|
break;
|
}
|
if ((productNameBuffer.length() + goodsName.length()) > maxLength) {
|
productNameBuffer.append("等");
|
break;
|
}
|
productNameBuffer.append(goodsName + ",");
|
}
|
String productNames = productNameBuffer.toString();
|
if (productNames.endsWith(",")) {
|
productNames = productNames.substring(0, productNames.length() - 1);
|
}
|
if (productNames.endsWith(",等")) {
|
productNames = productNames.substring(0, productNames.length() - 2) + "等";
|
}
|
return productNames;
|
}
|
|
@Override
|
public FebsResponse leaderTitle(ApiLeaderTitleDto apiLeaderTitleDto) {
|
String uniqueCode = apiLeaderTitleDto.getUniqueCode();
|
Double longitude = apiLeaderTitleDto.getLongitude() == null ? 0 : apiLeaderTitleDto.getLongitude();
|
Double latitude = apiLeaderTitleDto.getLatitude() == null ? 0 : apiLeaderTitleDto.getLatitude();
|
ApiLeaderInfoVo apiLeaderInfoVo = new ApiLeaderInfoVo();
|
MallTeamLeader mallTeamLeader = new MallTeamLeader();
|
//特征码扫码
|
if(StrUtil.isNotEmpty(uniqueCode)){
|
mallTeamLeader = this.baseMapper.selectLeaderByUniqueCode(uniqueCode);
|
|
//经纬度定位
|
}else if(longitude != 0 && latitude != 0){
|
mallTeamLeader = this.baseMapper.selectLeaderByLonAndLat(longitude,latitude);
|
|
//直接进入,默认选择列表第一个
|
}else{
|
List<MallTeamLeader> mallTeamLeaderList = this.baseMapper.getMallTeamLeaderList();
|
if(CollUtil.isNotEmpty(mallTeamLeaderList)){
|
mallTeamLeader = mallTeamLeaderList.get(0);
|
}
|
}
|
if(ObjectUtil.isNotEmpty(mallTeamLeader)){
|
apiLeaderInfoVo.setId(mallTeamLeader.getId());
|
apiLeaderInfoVo.setName(mallTeamLeader.getName());
|
apiLeaderInfoVo.setPhone(mallTeamLeader.getPhone());
|
apiLeaderInfoVo.setAddressPic(mallTeamLeader.getAddressPic());
|
apiLeaderInfoVo.setUniqueCode(mallTeamLeader.getUniqueCode());
|
apiLeaderInfoVo.setProvince(mallTeamLeader.getProvince());
|
apiLeaderInfoVo.setCity(mallTeamLeader.getCity());
|
apiLeaderInfoVo.setTownship(mallTeamLeader.getTownship());
|
apiLeaderInfoVo.setDetailAddress(mallTeamLeader.getDetailAddress());
|
apiLeaderInfoVo.setAddressArea(mallTeamLeader.getAddressArea());
|
}
|
return new FebsResponse().success().data(apiLeaderInfoVo);
|
}
|
|
@Override
|
public FebsResponse findTeamOrderMarkCnt() {
|
MallMember loginUser = LoginUserUtil.getLoginUser();
|
Long memberId = loginUser.getId();
|
MallMember mallMember = mallMemberMapper.selectById(memberId);
|
|
log.info(mallMember.getInviteId());
|
MallTeamLeader mallTeamLeader = this.baseMapper.selectLeaderByUniqueCode(mallMember.getInviteId());
|
if(ObjectUtil.isEmpty(mallTeamLeader)){
|
return new FebsResponse().success();
|
}
|
String uniqueCode = mallTeamLeader.getUniqueCode();
|
List<Map<String, Integer>> maps = mallOrderInfoMapper.selectMemberOrderStatusCntByUniquecode(uniqueCode);
|
Map<Integer, Integer> orderCnt = new HashMap<>();
|
if (CollUtil.isNotEmpty(maps)) {
|
for (Map<String, Integer> map : maps) {
|
orderCnt.put(map.get("status"), map.get("cnt"));
|
}
|
}
|
Map<String, Object> result = new HashMap<>();
|
result.put("order", orderCnt);
|
return new FebsResponse().success().data(result);
|
}
|
|
|
|
@Autowired
|
private WeixinServiceUtil weixinServiceUtil;
|
private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
|
private final IMallMoneyFlowService mallMoneyFlowService;
|
|
@Override
|
@Transactional
|
public FebsResponse leaderRefundOrder(ApiLeaderRefundOrderDto apiLeaderRefundOrderDto) {
|
//获取退款订单信息
|
Long orderId = apiLeaderRefundOrderDto.getOrderId();
|
Long itemId = apiLeaderRefundOrderDto.getItemId();
|
|
MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
|
MallOrderItem mallOrderItem = mallOrderItemMapper.selectById(itemId);
|
List<MallRefundEntity> mallRefundEntities = mallRefundMapper.selectByItemIdAndOrderIdAndState(itemId, orderId, 3);
|
if(CollUtil.isEmpty(mallRefundEntities)){
|
return new FebsResponse().fail().message("退款失败,请联系客服人员");
|
}
|
MallRefundEntity mallRefundEntity = mallRefundEntities.get(0);
|
|
Integer agreeState = apiLeaderRefundOrderDto.getAgreeState() == null? 2:apiLeaderRefundOrderDto.getAgreeState();
|
if(2 == agreeState){
|
//更新订单详情
|
mallOrderItem.setState(1);
|
mallOrderItemMapper.updateById(mallOrderItem);
|
//更新退款订单
|
mallRefundEntity.setState(2);
|
mallRefundEntity.setUpdatedTime(DateUtil.date());
|
mallRefundMapper.updateById(mallRefundEntity);
|
}
|
//退款订单编号
|
String orderNo = mallOrderInfo.getOrderNo();
|
//退款退款编号
|
String refundNo = mallRefundEntity.getRefundNo();
|
//退款订单金额
|
BigDecimal orderAmount = mallOrderInfo.getAmount();
|
BigDecimal aa = new BigDecimal(100);
|
int orderMoney = orderAmount.multiply(aa).intValue();
|
|
//退款退款金额
|
BigDecimal refundAmount = mallRefundEntity.getAmount();
|
BigDecimal bb = new BigDecimal(100);
|
int refundMoney = refundAmount.multiply(bb).intValue();
|
|
Boolean flag = false;
|
Boolean debug = xcxProperties.getDebug();
|
if (debug) {
|
boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, null);
|
flag = b;
|
} else {
|
log.info("开始调用退款接口。。。退款编号为{}", refundNo);
|
boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orderMoney, refundMoney, null);
|
flag = b;
|
}
|
|
if(flag){
|
//更新订单详情
|
mallOrderItem.setState(3);
|
mallOrderItemMapper.updateById(mallOrderItem);
|
//更新退款订单
|
mallRefundEntity.setState(1);
|
mallRefundEntity.setUpdatedTime(DateUtil.date());
|
mallRefundMapper.updateById(mallRefundEntity);
|
mallMoneyFlowService.addMoneyFlow(mallOrderInfo.getMemberId(), refundAmount, MoneyFlowTypeEnum.REFUND.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue());
|
|
List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByStateAndOrderId(1,orderId);
|
if(CollUtil.isEmpty(mallOrderItemList)){
|
MallOrderInfo mallOrderRefund = mallOrderInfoMapper.selectById(orderId);
|
mallOrderRefund.setStatus(6);
|
mallOrderInfoMapper.updateById(mallOrderRefund);
|
}
|
}else{
|
mallRefundEntity.setState(2);
|
mallRefundMapper.updateById(mallRefundEntity);
|
return new FebsResponse().fail().message("退款失败,请联系客服人员");
|
}
|
return new FebsResponse().success().message("退款成功");
|
}
|
|
@Override
|
public FebsResponse refundOrderInfo(ApiRefundOrderInfoDto apiRefundOrderInfoDto) {
|
Long orderId = apiRefundOrderInfoDto.getOrderId();
|
Long itemId = apiRefundOrderInfoDto.getItemId();
|
|
List<MallRefundEntity> mallRefundEntities = mallRefundMapper.selectByItemIdAndOrderIdAndState(itemId, orderId, null);
|
if(CollUtil.isEmpty(mallRefundEntities)){
|
return new FebsResponse().fail().message("退款信息不存在");
|
}
|
return new FebsResponse().success().data(mallRefundEntities.get(0));
|
}
|
|
}
|