优化店铺结算单、店铺流水生成规则。

优化分销申请逻辑,分销佣金不转入预存款
This commit is contained in:
pikachu1995@126.com 2024-07-02 14:55:19 +08:00
parent 1b316baac6
commit cf623f6756
37 changed files with 905 additions and 464 deletions

View File

@ -1,2 +0,0 @@
ALTER TABLE `li_order`
ADD COLUMN `seller_remark` varchar(255) NULL COMMENT '商家订单备注' AFTER `remark`;

View File

@ -1,10 +0,0 @@
/**
*/
ALTER TABLE li_order_item ADD `is_refund` varchar(255) DEFAULT NULL COMMENT '是否退款';
/**
*/
ALTER TABLE li_order_item ADD `refund_price` decimal(10,2) DEFAULT NULL COMMENT '退款金额';

View File

@ -1,20 +0,0 @@
/**
*/
ALTER TABLE li_file ADD `owner_name` varchar(255) DEFAULT NULL COMMENT '拥有者名称';
/**
*/
UPDATE li_file f JOIN li_store s ON f.owner_id = s.id
SET f.owner_name = s.store_name
WHERE user_enums = 'STORE';
UPDATE li_file f JOIN li_admin_user a ON f.owner_id = a.id
SET f.owner_name = a.nick_name
WHERE user_enums = 'MANAGER';
UPDATE li_file f JOIN li_member m ON f.owner_id = m.id
SET f.owner_name = m.nick_name
WHERE user_enums = 'MEMBER';

View File

@ -119,3 +119,60 @@ SET b.kanjia_refund_settlement_price =IFNULL((
AND sf.create_time BETWEEN b.start_time
AND b.end_time),0);
/**
*/
ALTER TABLE li_order_item ADD `is_refund` varchar(255) DEFAULT NULL COMMENT '是否退款';
/**
*/
ALTER TABLE li_order_item ADD `refund_price` decimal(10,2) DEFAULT NULL COMMENT '退款金额';
/**
*/
ALTER TABLE li_file ADD `owner_name` varchar(255) DEFAULT NULL COMMENT '拥有者名称';
/**
*/
UPDATE li_file f JOIN li_store s ON f.owner_id = s.id
SET f.owner_name = s.store_name
WHERE user_enums = 'STORE';
UPDATE li_file f JOIN li_admin_user a ON f.owner_id = a.id
SET f.owner_name = a.nick_name
WHERE user_enums = 'MANAGER';
UPDATE li_file f JOIN li_member m ON f.owner_id = m.id
SET f.owner_name = m.nick_name
WHERE user_enums = 'MEMBER';
ALTER TABLE `li_order`
ADD COLUMN `seller_remark` varchar(255) NULL COMMENT '商家订单备注' AFTER `remark`;
ALTER TABLE `li_distribution_cash`
ADD COLUMN `name` varchar(255) NULL COMMENT '会员姓名';
ALTER TABLE `li_distribution_cash`
ADD COLUMN `id_number` varchar(255) NULL COMMENT '身份证号' ;
ALTER TABLE `li_distribution_cash`
ADD COLUMN `settlement_bank_account_name` varchar(255) NULL COMMENT '结算银行开户行名称' ;
ALTER TABLE `li_distribution_cash`
ADD COLUMN `settlement_bank_account_num` varchar(255) NULL COMMENT '结算银行开户账号' ;
ALTER TABLE `li_distribution_cash`
ADD COLUMN `settlement_bank_branch_name` varchar(255) NULL COMMENT '结算银行开户支行名称' ;
ALTER TABLE `li_distribution` ADD `distribution_order_price` decimal(10,2) DEFAULT NULL COMMENT '分销订单金额';
ALTER TABLE `li_distribution_order` ADD `refund_num` int DEFAULT NULL COMMENT '退款商品数量';
ALTER TABLE `li_store_flow` ADD `bill_time` datetime(6) DEFAULT NULL COMMENT '结算时间';
ALTER TABLE `li_store_flow` ADD `full_refund` bit(1) DEFAULT NULL COMMENT '是否全部退款';
ALTER TABLE `li_store_flow` ADD `profit_sharing_status` varchar(255) NULL COMMENT '分账状态';
ALTER TABLE `li_store_flow` ADD `profit_sharing` varchar(255) NULL COMMENT '分账详情';

View File

@ -27,7 +27,7 @@ import org.springframework.stereotype.Service;
*/
@Slf4j
@Service
public class DistributionOrderExecute implements OrderStatusChangeEvent, EveryDayExecute, AfterSaleStatusChangeEvent {
public class DistributionOrderExecute implements OrderStatusChangeEvent, AfterSaleStatusChangeEvent {
/**
* 分销订单
@ -35,10 +35,6 @@ public class DistributionOrderExecute implements OrderStatusChangeEvent, EveryDa
@Autowired
private DistributionOrderService distributionOrderService;
@Autowired
private SettingService settingService;
@Override
public void orderChange(OrderMessage orderMessage) {
@ -62,21 +58,6 @@ public class DistributionOrderExecute implements OrderStatusChangeEvent, EveryDa
}
}
@Override
public void execute() {
log.info("分销订单定时开始执行");
//设置结算天数(解冻日期)
Setting setting = settingService.get(SettingEnum.DISTRIBUTION_SETTING.name());
DistributionSetting distributionSetting = JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class);
//解冻时间
DateTime dateTime = new DateTime();
//当前时间-结算天数=最终结算时间
dateTime = dateTime.offsetNew(DateField.DAY_OF_MONTH, -distributionSetting.getCashDay());
//分销人员订单结算
distributionOrderService.updateRebate(dateTime, DistributionOrderStatusEnum.WAIT_BILL.name());
}
@Override
public void afterSaleStatusChange(AfterSale afterSale) {
if (afterSale.getServiceStatus().equals(AfterSaleStatusEnum.COMPLETE.name())) {

View File

@ -8,6 +8,7 @@ import cn.lili.modules.order.order.entity.dto.OrderMessage;
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.order.order.service.StoreFlowService;
import cn.lili.modules.payment.entity.RefundLog;
import cn.lili.modules.payment.kit.Payment;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
@ -30,6 +31,8 @@ public class PaymentExecute implements OrderStatusChangeEvent {
*/
@Autowired
private OrderService orderService;
@Autowired
private StoreFlowService storeFlowService;
@Override
public void orderChange(OrderMessage orderMessage) {
@ -60,6 +63,8 @@ public class PaymentExecute implements OrderStatusChangeEvent {
.refundReason("订单取消")
.build();
payment.refund(refundLog);
}
}
}

View File

@ -1,60 +0,0 @@
package cn.lili.timetask.handler.impl.bill;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.lili.modules.store.entity.dto.StoreSettlementDay;
import cn.lili.modules.store.service.BillService;
import cn.lili.modules.store.service.StoreDetailService;
import cn.lili.timetask.handler.EveryDayExecute;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 店铺结算执行
*
* @author Bulbasaur
* @since 2021/2/18 3:45 下午
*/
@Component
public class BillExecute implements EveryDayExecute {
/**
* 结算单
*/
@Autowired
private BillService billService;
/**
* 店铺详情
*/
@Autowired
private StoreDetailService storeDetailService;
/**
* 1.查询今日待结算的商家
* 2.查询商家上次结算日期生成本次结算单
* 3.记录商家结算日
*/
@Override
public void execute() {
//获取当前天数
int day = DateUtil.date().dayOfMonth();
//获取待结算商家列表
List<StoreSettlementDay> storeList = storeDetailService.getSettlementStore(day);
//获取当前时间
DateTime endTime = DateUtil.date();
//批量商家结算
for (StoreSettlementDay storeSettlementDay : storeList) {
//生成结算单
billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay(), endTime);
//修改店铺结算时间
storeDetailService.updateSettlementDay(storeSettlementDay.getStoreId(), endTime);
}
}
}

View File

@ -18,6 +18,10 @@ import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
import cn.lili.modules.order.order.service.OrderItemService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.order.order.service.StoreFlowService;
import cn.lili.modules.store.entity.dto.StoreSettlementDay;
import cn.lili.modules.store.service.BillService;
import cn.lili.modules.store.service.StoreDetailService;
import cn.lili.modules.system.entity.dos.Setting;
import cn.lili.modules.system.entity.dto.OrderSetting;
import cn.lili.modules.system.entity.enums.SettingEnum;
@ -29,6 +33,7 @@ import java.util.List;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@ -65,6 +70,20 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute {
@Autowired
private DistributionOrderService distributionOrderService;
@Autowired
private StoreFlowService storeFlowService;
/**
* 结算单
*/
@Autowired
private BillService billService;
/**
* 店铺详情
*/
@Autowired
private StoreDetailService storeDetailService;
/**
* 执行每日任务
*/
@ -102,6 +121,22 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute {
} catch (Exception e) {
log.error(e.getMessage(), e);
}
//修改分账状态
try {
storeFlowService.updateProfitSharingStatus();
} catch (Exception e) {
log.error("修改分账状态失败", e);
}
//生成店铺结算单
try {
createBill();
} catch (Exception e) {
log.error("生成店铺结算单", e);
}
}
/**
@ -186,8 +221,6 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute {
// List<OrderItem> orderItems = orderItemService.waitOperationOrderItem(build);
//关闭售后订单=未售后订单+小于订单关闭售后申请时间
orderItemService.expiredAfterSaleStatus(receiveTime);
//修改对应分销订单状态
distributionOrderService.updateDistributionOrderStatus();
}
@ -225,4 +258,29 @@ public class OrderEveryDayTaskExecute implements EveryDayExecute {
}
/**
* 1.查询今日待结算的商家
* 2.查询商家上次结算日期生成本次结算单
* 3.记录商家结算日
*/
private void createBill() {
//获取当前天数
int day = DateUtil.date().dayOfMonth();
//获取待结算商家列表
List<StoreSettlementDay> storeList = storeDetailService.getSettlementStore(day);
//获取当前时间
DateTime endTime = DateUtil.date();
//批量商家结算
for (StoreSettlementDay storeSettlementDay : storeList) {
//生成结算单
billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay(), endTime);
//修改店铺结算时间
storeDetailService.updateSettlementDay(storeSettlementDay.getStoreId(), endTime);
}
}
}

View File

@ -174,6 +174,7 @@ public enum ResultCode {
DISTRIBUTION_RETREAT_ERROR(22004, "分销员清退失败"),
DISTRIBUTION_CASH_NOT_EXIST(22005, "分销员提现记录不存在"),
DISTRIBUTION_GOODS_DOUBLE(22006, "不能重复添加分销商品"),
DISTRIBUTION_EDIT_ERROR(22007, "修改分销员失败"),
/**
* 购物车

View File

@ -36,6 +36,7 @@ public class Distribution extends BaseEntity {
this.rebateTotal=0D;
this.canRebate=0D;
this.commissionFrozen=0D;
this.distributionOrderPrice=0D;
this.distributionStatus = DistributionStatusEnum.APPLY.name();
BeanUtil.copyProperties(distributionApplyDTO, this);
}
@ -85,4 +86,7 @@ public class Distribution extends BaseEntity {
@ApiModelProperty(value = "结算银行开户支行名称")
private String settlementBankBranchName;
@ApiModelProperty(value = "分销订单金额")
private Double distributionOrderPrice;
}

View File

@ -9,9 +9,11 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import java.util.Date;
/**
@ -51,11 +53,30 @@ public class DistributionCash extends BaseEntity {
@ApiModelProperty(value = "状态")
private String distributionCashStatus;
public DistributionCash(String sn, String distributionId, Double price, String memberName) {
@ApiModelProperty(value = "会员姓名")
private String name;
@ApiModelProperty(value = "身份证号")
private String idNumber;
@ApiModelProperty(value = "结算银行开户行名称")
private String settlementBankAccountName;
@ApiModelProperty(value = "结算银行开户账号")
private String settlementBankAccountNum;
@ApiModelProperty(value = "结算银行开户支行名称")
private String settlementBankBranchName;
public DistributionCash(String sn,Double price, Distribution distribution) {
this.sn = sn;
this.distributionId = distributionId;
this.distributionId = distribution.getId();
this.price = price;
this.distributionCashStatus = WithdrawStatusEnum.APPLY.name();
this.distributionName = memberName;
this.distributionName = distribution.getMemberName();
this.name = distribution.getName();
this.idNumber = distribution.getIdNumber();
this.settlementBankAccountName = distribution.getSettlementBankAccountName();
this.settlementBankAccountNum = distribution.getSettlementBankAccountNum();
this.settlementBankBranchName = distribution.getSettlementBankBranchName();
}
}

View File

@ -79,6 +79,8 @@ public class DistributionOrder extends BaseIdEntity {
private String image;
@ApiModelProperty(value = "商品数量")
private Integer num;
@ApiModelProperty(value = "退款商品数量")
private Integer refundNum;
public DistributionOrder(StoreFlow storeFlow) {
distributionOrderStatus = DistributionOrderStatusEnum.NO_COMPLETED.name();
@ -95,6 +97,8 @@ public class DistributionOrder extends BaseIdEntity {
specs = storeFlow.getSpecs();
image = storeFlow.getImage();
num = storeFlow.getNum();
refundNum=0;
sellBackRebate=0D;
}
}

View File

@ -6,16 +6,10 @@ package cn.lili.modules.distribution.entity.enums;
* @author pikachu
*/
public enum DistributionOrderStatusEnum {
//未完成
NO_COMPLETED("未完成"),
//待结算冻结
WAIT_BILL("待结算"),
//待提现
WAIT_CASH("待提现"),
//已提现
COMPLETE_CASH("提现完成"),
//订单取消
CANCEL("订单取消"),
//完成
COMPLETE("完成"),
//订单取消
REFUND("退款");

View File

@ -13,25 +13,32 @@ import org.apache.ibatis.annotations.Update;
*/
public interface DistributionMapper extends BaseMapper<Distribution> {
/**
* 修改分销员可提现金额
*
* @param commissionFrozen 分销金额
* @param distributionId 分销员ID
*/
@Update("UPDATE li_distribution set commission_frozen = (IFNULL(commission_frozen,0)+#{commissionFrozen}) " +
", rebate_total=(IFNULL(rebate_total,0)+#{commissionFrozen}) WHERE id = #{distributionId}")
void subCanRebate(Double commissionFrozen, String distributionId);
@Update("UPDATE li_distribution set commission_frozen = (IFNULL(commission_frozen,0) - #{commissionFrozen}) " +
", rebate_total=(IFNULL(rebate_total,0) - #{commissionFrozen}) " +
", distribution_order_count=(IFNULL(distribution_order_count,0)-1) " +
" WHERE id = #{distributionId}")
void subRebate(Double commissionFrozen, String distributionId, Double distributionOrderPrice);
/**
* 添加分销金额
*
* @param commissionFrozen 分销金额
* @param distributionId 分销员ID
*/
@Update("UPDATE li_distribution set commission_frozen = (IFNULL(commission_frozen,0)+#{commissionFrozen}) " +
", rebate_total=(IFNULL(rebate_total,0)+#{commissionFrozen}) " +
", distribution_order_count=(IFNULL(distribution_order_count,0)+1) WHERE id = #{distributionId}")
void addCanRebate(Double commissionFrozen, String distributionId);
", distribution_order_price=(IFNULL(distribution_order_price,0)+#{distributionOrderPrice}) " +
", distribution_order_count=(IFNULL(distribution_order_count,0)+1) " +
" WHERE id = #{distributionId}")
void addRebate(Double commissionFrozen, String distributionId, Double distributionOrderPrice);
@Update("UPDATE li_distribution SET commission_frozen = (IFNULL(commission_frozen,0) - #{rebate}) " +
",can_rebate=(IFNULL(can_rebate,0) + #{rebate}) " +
" WHERE id = #{distributionId}")
void addCanRebate(Double rebate, String distributionId);
@Update("UPDATE li_distribution SET can_rebate=(IFNULL(can_rebate,0) - #{rebate}),cash_rebate=(IFNULL(cash_rebate,0) + #{rebate}) " +
" WHERE id = #{distributionId}")
void addCashRebate(Double rebate, String distributionId);
@Update("UPDATE li_distribution SET cash_rebate=(IFNULL(cash_rebate,0) - #{rebate}) " +
" WHERE id = #{distributionId}")
void subCashRebate(Double rebate, String distributionId);
}

View File

@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
/**
* 分销佣金业务层
*
@ -40,6 +42,9 @@ public interface DistributionCashService extends IService<DistributionCash> {
*/
IPage<DistributionCash> getDistributionCash(DistributionCashSearchParams distributionCashSearchParams);
void queryExport(HttpServletResponse response,DistributionCashSearchParams distributionCashSearchParams);
/**
* 审核分销提现申请
*

View File

@ -5,6 +5,7 @@ import cn.lili.modules.distribution.entity.dos.DistributionOrder;
import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.entity.dos.StoreFlow;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@ -49,14 +50,8 @@ public interface DistributionOrderService extends IService<DistributionOrder> {
void refundOrder(AfterSale afterSale);
/**
* 分销订单状态修改
* 分销订单完成
*/
void updateDistributionOrderStatus();
void completeOrder(StoreFlow storeFlow);
/**
* 分销订单结算
* @param dateTime
* @param distributionOrderStatus
*/
void updateRebate(DateTime dateTime, String distributionOrderStatus);
}

View File

@ -78,18 +78,42 @@ public interface DistributionService extends IService<Distribution> {
void checkDistributionSetting();
/**
* 修改可提现金额
*
* @param canRebate 修改金额
* @param distributionId 分销员ID
*/
void subCanRebate(Double canRebate, String distributionId);
/**
* 添加分销金额
* 添加分销冻结金额
* 创建分销订单时进行调用
*
* @param rebate 金额
* @param distributionId 分销员ID
* @param distributionOrderPrice 分销订单金额
*/
void addRebate(Double rebate, String distributionId);
void addRebate(Double rebate, String distributionId, Double distributionOrderPrice);
/**
* 扣减分销冻结金额
* 订单取消/退款时进行调用
*
* @param rebate 佣金
* @param distributionId 分销员ID
*/
void subRebate(Double rebate, String distributionId, Double distributionOrderPrice);
/**
* 添加分销可提现金额
* 订单完成时进行调用
* @param rebate 佣金
* @param distributionId 分销员ID
*/
void addCanRebate(Double rebate, String distributionId);
/**
* 添加提现金额
* @param rebate
* @param distributionId
*/
void addCashRebate(Double rebate, String distributionId);
/**
* 扣减提现金额
* @param rebate
* @param distributionId
*/
void subCashRebate(Double rebate, String distributionId);
}

View File

@ -1,5 +1,12 @@
package cn.lili.modules.distribution.serviceimpl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties;
@ -13,6 +20,14 @@ import cn.lili.modules.distribution.entity.vos.DistributionCashSearchParams;
import cn.lili.modules.distribution.mapper.DistributionCashMapper;
import cn.lili.modules.distribution.service.DistributionCashService;
import cn.lili.modules.distribution.service.DistributionService;
import cn.lili.modules.order.order.entity.dto.OrderExportDTO;
import cn.lili.modules.order.order.entity.dto.OrderExportDetailDTO;
import cn.lili.modules.order.order.entity.dto.OrderSearchParams;
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderTypeEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.modules.wallet.entity.dto.MemberWalletUpdateDTO;
import cn.lili.modules.wallet.entity.dto.MemberWithdrawalMessage;
import cn.lili.modules.wallet.entity.enums.DepositServiceTypeEnum;
@ -25,12 +40,23 @@ import cn.lili.rocketmq.tags.MemberTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@ -76,7 +102,7 @@ public class DistributionCashServiceImpl extends ServiceImpl<DistributionCashMap
distribution.setCommissionFrozen(CurrencyUtil.add(distribution.getCommissionFrozen(), applyMoney));
distributionService.updateById(distribution);
//提现申请记录
DistributionCash distributionCash = new DistributionCash("D" + SnowFlake.getId(), distribution.getId(), applyMoney, distribution.getMemberName());
DistributionCash distributionCash = new DistributionCash("D" + SnowFlake.getId(),applyMoney, distribution);
boolean result = this.save(distributionCash);
if (result) {
//发送提现消息
@ -109,6 +135,28 @@ public class DistributionCashServiceImpl extends ServiceImpl<DistributionCashMap
return this.page(PageUtil.initPage(distributionCashSearchParams), distributionCashSearchParams.queryWrapper());
}
@Override
public void queryExport(HttpServletResponse response, DistributionCashSearchParams distributionCashSearchParams) {
XSSFWorkbook workbook = initExportData(this.list(distributionCashSearchParams.queryWrapper()));
try {
// 设置响应头
String fileName = URLEncoder.encode("分销提现列表", "UTF-8");
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
ServletOutputStream out = response.getOutputStream();
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public DistributionCash audit(String id, String result) {
@ -123,17 +171,12 @@ public class DistributionCashServiceImpl extends ServiceImpl<DistributionCashMap
//获取分销员
Distribution distribution = distributionService.getById(distributorCash.getDistributionId());
if (distribution != null && distribution.getDistributionStatus().equals(DistributionStatusEnum.PASS.name())) {
MemberWithdrawalMessage memberWithdrawalMessage = new MemberWithdrawalMessage();
//审核通过
if (result.equals(WithdrawStatusEnum.VIA_AUDITING.name())) {
memberWithdrawalMessage.setStatus(WithdrawStatusEnum.VIA_AUDITING.name());
//分销记录操作
distributorCash.setDistributionCashStatus(WithdrawStatusEnum.VIA_AUDITING.name());
distributorCash.setPayTime(new Date());
//提现到余额
memberWalletService.increase(new MemberWalletUpdateDTO(distributorCash.getPrice(), distribution.getMemberId(), "分销[" + distributorCash.getSn() + "]佣金提现到余额[" + distributorCash.getPrice() + "]", DepositServiceTypeEnum.WALLET_COMMISSION.name()));
} else {
memberWithdrawalMessage.setStatus(WithdrawStatusEnum.FAIL_AUDITING.name());
//分销员可提现金额退回
distribution.setCanRebate(CurrencyUtil.add(distribution.getCanRebate(), distributorCash.getPrice()));
distributorCash.setDistributionCashStatus(WithdrawStatusEnum.FAIL_AUDITING.name());
@ -142,14 +185,7 @@ public class DistributionCashServiceImpl extends ServiceImpl<DistributionCashMap
//分销员金额相关处理
distributionService.updateById(distribution);
//修改分销提现申请
boolean bool = this.updateById(distributorCash);
//if (bool) {
// //组织会员提现审核消息
// memberWithdrawalMessage.setMemberId(distribution.getMemberId());
// memberWithdrawalMessage.setPrice(distributorCash.getPrice());
// String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_WITHDRAWAL.name();
// rocketMQTemplate.asyncSend(destination, memberWithdrawalMessage, RocketmqSendCallbackBuilder.commonCallback());
//}
this.updateById(distributorCash);
return distributorCash;
}
throw new ServiceException(ResultCode.DISTRIBUTION_NOT_EXIST);
@ -157,4 +193,38 @@ public class DistributionCashServiceImpl extends ServiceImpl<DistributionCashMap
throw new ServiceException(ResultCode.DISTRIBUTION_CASH_NOT_EXIST);
}
/**
* 初始化填充导出数据
*
* @param distributionCashList 导出的数据
* @return 填充导出数据
*/
private XSSFWorkbook initExportData(List<DistributionCash> distributionCashList) {
XSSFWorkbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("订单列表");
// 创建表头
Row header = sheet.createRow(0);
String[] headers = {"编号", "姓名", "身份证号", "结算银行开户行名称", "结算银行开户账号", "结算银行开户支行名称"};
for (int i = 0; i < headers.length; i++) {
Cell cell = header.createCell(i);
cell.setCellValue(headers[i]);
}
// 填充数据
for (int i = 0; i < distributionCashList.size(); i++) {
DistributionCash distributionCash = distributionCashList.get(i);
Row row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(distributionCash.getSn());
row.createCell(1).setCellValue(distributionCash.getName());
row.createCell(2).setCellValue(distributionCash.getIdNumber());
row.createCell(3).setCellValue(distributionCash.getSettlementBankAccountName());
row.createCell(4).setCellValue(distributionCash.getSettlementBankAccountNum());
row.createCell(5).setCellValue(distributionCash.getSettlementBankBranchName());
}
return workbook;
}
}

View File

@ -1,15 +1,10 @@
package cn.lili.modules.distribution.serviceimpl;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.modules.distribution.entity.dos.Distribution;
import cn.lili.modules.distribution.entity.dos.DistributionOrder;
import cn.lili.modules.distribution.entity.enums.DistributionOrderStatusEnum;
import cn.lili.modules.distribution.entity.enums.DistributionStatusEnum;
import cn.lili.modules.distribution.entity.vos.DistributionOrderSearchParams;
import cn.lili.modules.distribution.mapper.DistributionOrderMapper;
import cn.lili.modules.distribution.service.DistributionOrderService;
@ -17,29 +12,26 @@ import cn.lili.modules.distribution.service.DistributionService;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dos.StoreFlow;
import cn.lili.modules.order.order.entity.dto.StoreFlowProfitSharingDTO;
import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO;
import cn.lili.modules.order.order.entity.enums.FlowTypeEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.order.order.service.StoreFlowService;
import cn.lili.modules.system.entity.dos.Setting;
import cn.lili.modules.system.entity.dto.DistributionSetting;
import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
* 分销订单接口实现
*
@ -49,7 +41,7 @@ import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderMapper, DistributionOrder>
implements DistributionOrderService {
implements DistributionOrderService {
/**
* 订单
@ -66,22 +58,19 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
*/
@Autowired
private DistributionService distributionService;
/**
* 系统设置
*/
@Autowired
private SettingService settingService;
@Override
public IPage<DistributionOrder> getDistributionOrderPage(
DistributionOrderSearchParams distributionOrderSearchParams) {
DistributionOrderSearchParams distributionOrderSearchParams) {
return this.page(PageUtil.initPage(distributionOrderSearchParams),
distributionOrderSearchParams.queryWrapper());
distributionOrderSearchParams.queryWrapper());
}
/**
* 1.查看订单是否为分销订单 2.查看店铺流水计算分销总佣金 3.修改分销员的分销总金额冻结金额
* 1.查看订单是否为分销订单
* 2.查看店铺流水计算分销总佣金
* 3.修改分销员的分销总金额冻结金额
*
* @param orderSn 订单编号
*/
@ -96,7 +85,7 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
if (order.getDistributionId() != null) {
//根据订单编号获取有分销金额的店铺流水记录
List<StoreFlow> storeFlowList = storeFlowService.listStoreFlow(
StoreFlowQueryDTO.builder().justDistribution(true).orderSn(orderSn).build());
StoreFlowQueryDTO.builder().justDistribution(true).orderSn(orderSn).build());
double rebate = 0.0;
//循环店铺流水记录判断是否包含分销商品
//包含分销商品则进行记录分销订单计算分销总额
@ -111,27 +100,12 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
Distribution distribution = distributionService.getById(order.getDistributionId());
distributionOrder.setDistributionName(distribution.getMemberName());
//设置结算天数(解冻日期)
Setting setting = settingService.get(SettingEnum.DISTRIBUTION_SETTING.name());
DistributionSetting distributionSetting =
JSONUtil.toBean(setting.getSettingValue(), DistributionSetting.class);
//添加分销订单
this.save(distributionOrder);
//记录会员的分销总额
if (rebate != 0.0) {
distributionService.addRebate(rebate, order.getDistributionId());
//如果天数写0则立即进行结算
// if (distributionSetting.getCashDay().equals(0)) {
// DateTime dateTime = new DateTime();
// dateTime = dateTime.offsetNew(DateField.DAY_OF_MONTH, -distributionSetting.getCashDay());
// //防止事务失效采用上下文获取bean
// DistributionOrderService bean = SpringContextUtil.getBean(DistributionOrderService.class);
// //分销订单结算
// bean.updateRebate(dateTime, DistributionOrderStatusEnum.WAIT_BILL.name());
// }
distributionService.addRebate(rebate, order.getDistributionId(), storeFlow.getFinalPrice());
}
}
@ -155,42 +129,34 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
//根据订单编号获取有分销金额的店铺流水记录
List<DistributionOrder> distributionOrderList =
this.list(new LambdaQueryWrapper<DistributionOrder>().eq(DistributionOrder::getOrderSn, orderSn));
this.list(new LambdaQueryWrapper<DistributionOrder>().eq(DistributionOrder::getOrderSn, orderSn));
//如果没有分销定单则直接返回
if (distributionOrderList.isEmpty()) {
return;
}
//分销金额
double rebate = 0.0;
//包含分销商品则进行记录分销订单计算分销总额
for (DistributionOrder distributionOrder : distributionOrderList) {
rebate = CurrencyUtil.add(rebate, distributionOrder.getRebate());
}
//如果包含分销商品则记录会员的分销总额
if (rebate != 0.0) {
distributionService.subCanRebate(CurrencyUtil.sub(0, rebate), order.getDistributionId());
distributionService.subRebate(distributionOrder.getRebate(), order.getDistributionId(), distributionOrder.getSellBackRebate());
}
}
//修改分销订单的状态
this.update(new LambdaUpdateWrapper<DistributionOrder>().eq(DistributionOrder::getOrderSn, orderSn)
.set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.CANCEL.name()));
.set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.REFUND.name()));
}
@Override
public void refundOrder(AfterSale afterSale) {
//判断是否为分销订单
StoreFlow refundStoreFlow = storeFlowService.queryOne(
StoreFlowQueryDTO.builder().justDistribution(true).refundSn(afterSale.getSn()).build());
StoreFlowQueryDTO.builder().justDistribution(true).refundSn(afterSale.getSn()).build());
if (refundStoreFlow != null) {
//获取收款分销订单
DistributionOrder distributionOrder = this.getOne(
new LambdaQueryWrapper<DistributionOrder>().eq(DistributionOrder::getOrderItemSn,
afterSale.getOrderItemSn()));
new LambdaQueryWrapper<DistributionOrder>().eq(DistributionOrder::getOrderItemSn,
afterSale.getOrderItemSn()));
//分销订单不存在则直接返回
if (distributionOrder == null) {
return;
@ -199,114 +165,40 @@ public class DistributionOrderServiceImpl extends ServiceImpl<DistributionOrderM
distributionOrder.setSellBackRebate(refundStoreFlow.getDistributionRebate());
} else {
distributionOrder.setSellBackRebate(
CurrencyUtil.add(distributionOrder.getSellBackRebate(), refundStoreFlow.getDistributionRebate()));
CurrencyUtil.add(distributionOrder.getSellBackRebate(), refundStoreFlow.getDistributionRebate()));
}
distributionOrder.setRebate(
CurrencyUtil.sub(distributionOrder.getRebate(), refundStoreFlow.getDistributionRebate()));
distributionOrder.setRebate(CurrencyUtil.sub(distributionOrder.getRebate(), refundStoreFlow.getDistributionRebate()));
if (distributionOrder.getRebate() == 0) {
distributionOrder.setDistributionOrderStatus(DistributionOrderStatusEnum.REFUND.name());
}
distributionOrder.setRefundNum(distributionOrder.getRefundNum() + afterSale.getNum());
this.updateById(distributionOrder);
// 修改分销员提成金额
distributionService.subCanRebate(CurrencyUtil.sub(0, refundStoreFlow.getDistributionRebate()),
distributionOrder.getDistributionId());
// 修改分销员提成金额
if (refundStoreFlow.getDistributionRebate() != 0.0) {
distributionService.subRebate(refundStoreFlow.getDistributionRebate(), distributionOrder.getDistributionId(), refundStoreFlow.getFinalPrice());
}
}
}
@Override
public void updateDistributionOrderStatus() {
//获取未完成分销订单
baseMapper.distributionSettlementOrder(new Date());
public void completeOrder(StoreFlow storeFlow) {
if (storeFlow.getFlowType().equals(FlowTypeEnum.PAY.name())
&&storeFlow.getDistributionRebate() != null
&& storeFlow.getDistributionRebate() != 0) {
//获取分账内容
StoreFlowProfitSharingDTO storeFlowProfitSharingDTO = JSONUtil.toBean(storeFlow.getProfitSharing(), StoreFlowProfitSharingDTO.class);
//获取分销订单
DistributionOrder distributionOrder = this.getOne(new LambdaQueryWrapper<DistributionOrder>().eq(DistributionOrder::getOrderItemSn, storeFlow.getOrderItemSn()));
//解冻分销金额
distributionService.addCanRebate(storeFlowProfitSharingDTO.getDistributionPrice(), distributionOrder.getDistributionId());
// 订单完成
this.update(new LambdaUpdateWrapper<DistributionOrder>()
.eq(DistributionOrder::getId, distributionOrder.getId())
.set(DistributionOrder::getDistributionOrderStatus, DistributionOrderStatusEnum.COMPLETE.name()));
}
}
@Override
public void updateRebate(DateTime dateTime, String distributionOrderStatus) {
//结算时间延后五分钟
dateTime = dateTime.offsetNew(DateField.MINUTE, 5);
//获取待结算订单
List<DistributionOrder> distributionOrderList = this.list(
new LambdaQueryWrapper<DistributionOrder>().eq(DistributionOrder::getDistributionOrderStatus,
distributionOrderStatus).isNotNull(DistributionOrder::getSettleCycle)
.le(DistributionOrder::getSettleCycle, dateTime));
//校验待结算订单
if (ObjectUtil.isNotNull(distributionOrderList) && distributionOrderList.size() > 0) {
//结算分销人员信息列表
List<Distribution> distributionUpdateList = new ArrayList<>();
//获取分销员信息
List<Distribution> distributionList = distributionService.list(
new LambdaQueryWrapper<Distribution>().eq(Distribution::getDistributionStatus,
DistributionStatusEnum.PASS.name()));
//根据销人员获取对应分销订单
Map<String, List<DistributionOrder>> distributionOrderList1 =
distributionOrderList.stream().collect(Collectors.groupingBy(DistributionOrder::getDistributionId));
//校验分销订单不为空
if (ObjectUtil.isNotNull(distributionOrderList1) && distributionOrderList1.size() > 0) {
//遍历分销订单map
distributionOrderList1.forEach((key, value) -> {
//计算分销结算金额
distributionUpdateList.add(checkDistribution(key, value, distributionList));
});
}
//校验分销信息列表不为空
if (ObjectUtil.isNotNull(distributionUpdateList) && !distributionUpdateList.isEmpty()) {
//修改分销员收益
distributionService.updateBatchById(distributionUpdateList);
distributionOrderList.stream().forEach(distributionOrder -> {
//修改分销订单状态为待提现
distributionOrder.setDistributionOrderStatus(DistributionOrderStatusEnum.WAIT_CASH.name());
});
}
//修改分销订单状态
this.updateBatchById(distributionOrderList);
}
}
/**
* 计算分销结算金额
*
* @param distributionId 分销ID
* @param list 分销订单
* @param distributionList 分销列表
* @return
*/
public Distribution checkDistribution(String distributionId, List<DistributionOrder> list,
List<Distribution> distributionList) {
//获取所有待结算订单分销人员信息
Distribution distribution =
distributionList.parallelStream().filter(a -> StrUtil.equals(a.getId(), distributionId))
.collect(Collectors.toList()).get(0);
//获取分销订单总金额
double rebate = list.stream().mapToDouble(DistributionOrder::getRebate).sum();
//检验单分销人员冻结金额为负数时.扣除负数冻结金额后再结算
if (distribution.getCommissionFrozen() < 0) {
rebate =
CurrencyUtil.add(distribution.getCommissionFrozen() == null ? 0.0 : distribution.getCommissionFrozen(),
rebate);
}
//结算订单总金额+分销可提现金额
Double canRebate =
CurrencyUtil.add(rebate, distribution.getCanRebate() == null ? 0.0 : distribution.getCanRebate());
//结算金额小于0
if (canRebate < 0) {
//结算订单总金额+分销可提现金额
distribution.setCanRebate(0.0);
//冻结金额
distribution.setCommissionFrozen(canRebate);
} else {
//结算订单总金额+分销可提现金额
distribution.setCanRebate(canRebate);
//冻结金额
distribution.setCommissionFrozen(0.0);
}
return distribution;
}
}

View File

@ -90,7 +90,7 @@ public class DistributionServiceImpl extends ServiceImpl<DistributionMapper, Dis
default:
throw new ServiceException(ResultCode.DISTRIBUTION_IS_APPLY);
}
}else{
} else {
//如果未申请分销员则新增进行申请
//获取当前登录用户
Member member = memberService.getUserInfo();
@ -181,14 +181,30 @@ public class DistributionServiceImpl extends ServiceImpl<DistributionMapper, Dis
}
}
@Override
public void subCanRebate(Double canRebate, String distributionId) {
this.baseMapper.subCanRebate(canRebate, distributionId);
public void subRebate(Double canRebate, String distributionId, Double distributionOrderPrice) {
this.baseMapper.subRebate(canRebate, distributionId, distributionOrderPrice);
}
@Override
public void addRebate(Double rebate, String distributionId) {
public void addRebate(Double rebate, String distributionId, Double distributionOrderPrice) {
this.baseMapper.addRebate(rebate, distributionId, distributionOrderPrice);
}
@Override
public void addCanRebate(Double rebate, String distributionId) {
this.baseMapper.addCanRebate(rebate, distributionId);
}
@Override
public void addCashRebate(Double rebate, String distributionId) {
this.baseMapper.addCashRebate(rebate, distributionId);
}
@Override
public void subCashRebate(Double rebate, String distributionId) {
this.baseMapper.subCashRebate(rebate, distributionId);
}
}

View File

@ -24,13 +24,16 @@ public class MemberGrade extends BaseEntity {
private String gradeName;
@NotNull
@ApiModelProperty(value = "等级图片")
@ApiModelProperty(value = "等级图片 1029*498")
private String gradeImage;
@NotNull
@ApiModelProperty(value = "所需经验值")
private Integer experienceValue;
@ApiModelProperty(value = "会员等级")
private Integer level;
@ApiModelProperty(value = "是否为默认等级")
private Boolean isDefault;
@ApiModelProperty(value = "累计实付")
private Double payPrice;
@ApiModelProperty(value = "累计购买次数")
private Integer count;
}

View File

@ -5,6 +5,7 @@ import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.event.TransactionCommitSendMQEvent;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser;
@ -40,6 +41,7 @@ import cn.lili.modules.system.service.LogisticsService;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.AfterSaleTagsEnum;
import cn.lili.rocketmq.tags.OrderTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -48,6 +50,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -100,6 +103,9 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
*/
@Autowired
private RocketMQTemplate rocketMQTemplate;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Override
public IPage<AfterSaleVO> getAfterSalePages(AfterSaleSearchParams saleSearchParams) {
@ -580,11 +586,10 @@ public class AfterSaleServiceImpl extends ServiceImpl<AfterSaleMapper, AfterSale
*
* @param afterSale 售后对象
*/
private void sendAfterSaleMessage(AfterSale afterSale) {
//发送售后创建消息
String destination = rocketmqCustomProperties.getAfterSaleTopic() + ":" + AfterSaleTagsEnum.AFTER_SALE_STATUS_CHANGE.name();
//发送订单变更mq消息
rocketMQTemplate.asyncSend(destination, JSONUtil.toJsonStr(afterSale), RocketmqSendCallbackBuilder.commonCallback());
@Transactional(rollbackFor = Exception.class)
public void sendAfterSaleMessage(AfterSale afterSale) {
applicationEventPublisher.publishEvent(new TransactionCommitSendMQEvent("发送售后单状态变更MQ消息", rocketmqCustomProperties.getAfterSaleTopic(),
AfterSaleTagsEnum.AFTER_SALE_STATUS_CHANGE.name(), JSONUtil.toJsonStr(afterSale)));
}
/**

View File

@ -1,5 +1,6 @@
package cn.lili.modules.order.order.entity.dos;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.utils.BeanUtil;
@ -8,6 +9,7 @@ import cn.lili.common.utils.SnowFlake;
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
import cn.lili.modules.order.order.entity.enums.FlowTypeEnum;
import cn.lili.modules.order.order.entity.enums.OrderPromotionTypeEnum;
import cn.lili.modules.order.order.entity.enums.ProfitSharingStatusEnum;
import cn.lili.modules.payment.entity.enums.PaymentMethodEnum;
import cn.lili.mybatis.BaseIdEntity;
import com.baomidou.mybatisplus.annotation.FieldFill;
@ -141,6 +143,24 @@ public class StoreFlow extends BaseIdEntity {
@ApiModelProperty(value = "创建时间", hidden = true)
private Date createTime;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty(value = "结算时间", hidden = true)
private Date billTime;
@ApiModelProperty(value = "是否全部退款true为全部退款")
private Boolean fullRefund;
/**
* @see ProfitSharingStatusEnum
*/
@ApiModelProperty(value = "分账状态")
private String profitSharingStatus;
@ApiModelProperty(value = "实际分账金额DTO", hidden = true)
private String profitSharing;
public StoreFlow(Order order, OrderItem item, FlowTypeEnum flowTypeEnum) {
//获取订单促销类型,如果为促销订单则获取促销商品并获取结算价
@ -196,6 +216,10 @@ public class StoreFlow extends BaseIdEntity {
this.setPaymentName(order.getPaymentMethod());
//添加第三方支付流水号
this.setTransactionId(order.getReceivableNo());
//默认结算时间180天
if (flowTypeEnum.equals(FlowTypeEnum.PAY)) {
this.billTime = DateUtil.offsetDay(new Date(), 180);
this.fullRefund = false;
}
}
}

View File

@ -0,0 +1,20 @@
package cn.lili.modules.order.order.entity.dto;
import lombok.Data;
/**
* 流水-实际分账DTO
*/
@Data
public class StoreFlowProfitSharingDTO {
//平台获取金额
private Double platformPrice;
//店铺获取金额
private Double storePrice;
//分销员获取金额
private Double distributionPrice;
//合计金额 --剩余金额
private Double price;
//补差金额
private Double subsidies;
}

View File

@ -0,0 +1,22 @@
package cn.lili.modules.order.order.entity.enums;
/**
* 分账状态 枚举
*/
public enum ProfitSharingStatusEnum {
ORDER_CANCEL("订单取消"),
WAIT_COMPLETE("待订单完成"),
PROCESSING("处理中"),
FINISHED("分账完成");
// FAIL("分账失败"),
// ARTIFICIAL("人工处理");
private String description;
ProfitSharingStatusEnum(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}

View File

@ -107,11 +107,8 @@ public class AllowOperation implements Serializable {
}
//取消判定
if (CharSequenceUtil.equalsAny(status, OrderStatusEnum.UNPAID.name(), OrderStatusEnum.PAID.name(), OrderStatusEnum.UNDELIVERED.name(),
OrderStatusEnum.STAY_PICKED_UP.name(),
OrderStatusEnum.TAKE.name())) {
if (CharSequenceUtil.equalsAny(status, OrderStatusEnum.UNPAID.name(), OrderStatusEnum.PAID.name(), OrderStatusEnum.UNDELIVERED.name())) {
this.cancel = true;
}
//新订单允许支付
this.pay = status.equals(OrderStatusEnum.UNPAID.name());

View File

@ -1,13 +1,16 @@
package cn.lili.modules.order.order.mapper;
import cn.lili.modules.order.order.entity.dos.StoreFlow;
import cn.lili.modules.store.entity.dos.Bill;
import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO;
import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
@ -34,4 +37,84 @@ public interface StoreFlowMapper extends BaseMapper<StoreFlow> {
*/
@Select("SELECT * FROM li_store_flow ${ew.customSqlSegment}")
List<StoreFlowRefundDownloadVO> getStoreFlowRefundDownloadVO(@Param(Constants.WRAPPER) Wrapper<StoreFlow> queryWrapper);
@Update("UPDATE li_store_flow "+
"SET profit_sharing_status = 'PROCESSING', "+
"bill_time=NOW() "+
"WHERE order_item_sn IN ( "+
"SELECT o.order_item_sn "+
"FROM ( "+
"SELECT lof.order_item_sn "+
"FROM li_store_flow lof "+
"LEFT JOIN ( "+
"SELECT order_sn "+
"FROM li_order_item "+
"WHERE after_sale_status <> 'EXPIRED' "+
"GROUP BY order_sn "+
") oi ON lof.order_sn = oi.order_sn "+
"WHERE lof.profit_sharing_status = 'WAIT_COMPLETE' "+
"AND oi.order_sn IS NULL "+
") o "+
")")
void updateProfitSharingStatus();
@Select("SELECT * FROM li_store_flow "+
"WHERE order_item_sn IN ( "+
"SELECT o.order_item_sn "+
"FROM ( "+
"SELECT lof.order_item_sn "+
"FROM li_store_flow lof "+
"LEFT JOIN ( "+
"SELECT order_sn "+
"FROM li_order_item "+
"WHERE after_sale_status <> 'EXPIRED' "+
"GROUP BY order_sn "+
") oi ON lof.order_sn = oi.order_sn "+
"WHERE lof.profit_sharing_status = 'WAIT_COMPLETE' "+
"AND oi.order_sn IS NULL "+
") o "+
")")
List<StoreFlow> completeList();
/**
* 查询订单货物退款数量
* @param orderItemSn
* @return
*/
@Select("SELECT SUM(num) AS num FROM li_store_flow WHERE flow_type = 'REFUND' AND order_item_sn = #{orderItemSn}")
Integer getRefundNum(String orderItemSn);
/**
* 查询退款结算单
*
* @param queryWrapper 查询条件
* @return 结算单
*/
@Select("SELECT IFNULL(SUM( final_price ),0) AS refundPrice,IFNULL(SUM( commission_price ),0) AS refundCommissionPrice" +
",IFNULL(SUM( distribution_rebate ),0) AS distributionRefundCommission" +
",IFNULL(SUM( site_coupon_commission ),0) AS siteCouponRefundCommission" +
",IFNULL(SUM( point_settlement_price ),0) AS pointSettlementPrice " +
",IFNULL(SUM( kanjia_settlement_price ),0) AS kanjiaSettlementPrice " +
",IFNULL(SUM( bill_price ),0) AS billPrice " +
"FROM li_store_flow ${ew.customSqlSegment}")
Bill getRefundBill(@Param(Constants.WRAPPER) QueryWrapper<Bill> queryWrapper);
/**
* 查询订单结算
*
* @param queryWrapper 查询条件
* @return 结算单
*/
@Select("SELECT IFNULL(SUM( final_price ),0) AS orderPrice" +
",IFNULL(SUM( commission_price ),0) AS commissionPrice" +
",IFNULL(SUM( distribution_rebate ),0) AS distributionCommission" +
",IFNULL(SUM( site_coupon_commission ),0) AS siteCouponCommission" +
",IFNULL(SUM( point_settlement_price ),0) AS pointSettlementPrice " +
",IFNULL(SUM( kanjia_settlement_price ),0) AS kanjiaSettlementPrice " +
",IFNULL(SUM( bill_price ),0) AS billPrice " +
"FROM li_store_flow ${ew.customSqlSegment}")
Bill getOrderBill(@Param(Constants.WRAPPER) QueryWrapper<Bill> queryWrapper);
}

View File

@ -4,6 +4,8 @@ import cn.lili.common.vo.PageVO;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.order.entity.dos.StoreFlow;
import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO;
import cn.lili.modules.store.entity.dos.Bill;
import cn.lili.modules.store.entity.dto.BillSearchParams;
import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO;
import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -26,6 +28,12 @@ public interface StoreFlowService extends IService<StoreFlow> {
*/
void payOrder(String orderSn);
/**
* 订单取消
* @param orderSn 订单
*/
void orderCancel(String orderSn);
/**
* 订单退款
*
@ -93,4 +101,24 @@ public interface StoreFlowService extends IService<StoreFlow> {
* @return 商家流水集合
*/
List<StoreFlow> listStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO);
/**
* 修改分账状态
*/
void updateProfitSharingStatus();
/**
* 获取退款的流水
*
* @param searchParams
* @return
*/
Bill getRefundBill(BillSearchParams searchParams);
/**
* 获取订单的流水
*
* @param searchParams
* @return
*/
Bill getOrderBill(BillSearchParams searchParams);
}

View File

@ -168,6 +168,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
@Autowired
private SettingService settingService;
@Override
@Transactional(rollbackFor = Exception.class)
public void intoDB(TradeDTO tradeDTO) {
@ -351,7 +352,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
//修改订单
this.updateById(order);
//生成店铺退款流水
this.generatorStoreRefundFlow(order);
storeFlowService.orderCancel(orderSn);
//发送消息
orderStatusMessage(order);
return order;
} else {
@ -370,7 +372,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
this.updateById(order);
if (refundMoney) {
//生成店铺退款流水
this.generatorStoreRefundFlow(order);
storeFlowService.orderCancel(orderSn);
orderStatusMessage(order);
}
}
@ -978,24 +980,24 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
this.sendUpdateStatusMessage(orderMessage);
}
/**
* 生成店铺退款流水
*
* @param order 订单信息
*/
private void generatorStoreRefundFlow(Order order) {
// 判断订单是否是付款
if (!PayStatusEnum.PAID.name().equals((order.getPayStatus()))) {
return;
}
List<OrderItem> items = orderItemService.getByOrderSn(order.getSn());
List<StoreFlow> storeFlows = new ArrayList<>();
for (OrderItem item : items) {
StoreFlow storeFlow = new StoreFlow(order, item, FlowTypeEnum.REFUND);
storeFlows.add(storeFlow);
}
storeFlowService.saveBatch(storeFlows);
}
// /**
// * 生成店铺退款流水
// *
// * @param order 订单信息
// */
// private void generatorStoreRefundFlow(Order order) {
// // 判断订单是否是付款
// if (!PayStatusEnum.PAID.name().equals((order.getPayStatus()))) {
// return;
// }
// List<OrderItem> items = orderItemService.getByOrderSn(order.getSn());
// List<StoreFlow> storeFlows = new ArrayList<>();
// for (OrderItem item : items) {
// StoreFlow storeFlow = new StoreFlow(order, item, FlowTypeEnum.REFUND);
// storeFlows.add(storeFlow);
// }
// storeFlowService.saveBatch(storeFlows);
// }
/**
* 此方法只提供内部调用调用前应该做好权限处理

View File

@ -1,16 +1,20 @@
package cn.lili.modules.order.order.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.json.JSONUtil;
import cn.lili.common.utils.CurrencyUtil;
import cn.lili.common.utils.SnowFlake;
import cn.lili.common.vo.PageVO;
import cn.lili.modules.distribution.service.DistributionOrderService;
import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
import cn.lili.modules.order.aftersale.service.AfterSaleService;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dos.OrderItem;
import cn.lili.modules.order.order.entity.dos.StoreFlow;
import cn.lili.modules.order.order.entity.dto.StoreFlowProfitSharingDTO;
import cn.lili.modules.order.order.entity.dto.StoreFlowQueryDTO;
import cn.lili.modules.order.order.entity.enums.FlowTypeEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import cn.lili.modules.order.order.entity.enums.ProfitSharingStatusEnum;
import cn.lili.modules.order.order.mapper.StoreFlowMapper;
import cn.lili.modules.order.order.service.OrderItemService;
import cn.lili.modules.order.order.service.OrderService;
@ -18,9 +22,11 @@ import cn.lili.modules.order.order.service.StoreFlowService;
import cn.lili.modules.payment.entity.RefundLog;
import cn.lili.modules.payment.service.RefundLogService;
import cn.lili.modules.store.entity.dos.Bill;
import cn.lili.modules.store.entity.dto.BillSearchParams;
import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO;
import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO;
import cn.lili.modules.store.service.BillService;
import cn.lili.modules.system.entity.dto.payment.WechatPaymentSetting;
import cn.lili.mybatis.util.PageUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -31,6 +37,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@ -63,7 +71,8 @@ public class StoreFlowServiceImpl extends ServiceImpl<StoreFlowMapper, StoreFlow
private BillService billService;
@Autowired
private AfterSaleService afterSaleService;
private DistributionOrderService distributionOrderService;
/**
* 店铺订单支付流水
*
@ -79,11 +88,42 @@ public class StoreFlowServiceImpl extends ServiceImpl<StoreFlowMapper, StoreFlow
//循环子订单记录流水
for (OrderItem item : orderItems) {
StoreFlow storeFlow = new StoreFlow(order, item, FlowTypeEnum.PAY);
saveProfitSharing(storeFlow);
//添加付款交易流水
this.save(storeFlow);
}
}
@Override
public void orderCancel(String orderSn) {
//根据订单编号获取订单数据
Order order = orderService.getBySn(orderSn);
// 判断订单是否是付款
if (!PayStatusEnum.PAID.name()
.equals((order.getPayStatus()))) {
return;
}
List<OrderItem> items = orderItemService.getByOrderSn(order.getSn());
List<StoreFlow> storeFlows = new ArrayList<>();
//修改付款记录
this.update(new LambdaUpdateWrapper<StoreFlow>()
.eq(StoreFlow::getOrderSn, order.getSn())
.set(StoreFlow::getBillTime, new Date())
.set(StoreFlow::getProfitSharingStatus, ProfitSharingStatusEnum.ORDER_CANCEL.name())
.set(StoreFlow::getFullRefund, true));
//记录退款记录
for (OrderItem item : items) {
StoreFlow storeFlow = new StoreFlow(order, item, FlowTypeEnum.REFUND);
storeFlow.setProfitSharingStatus(ProfitSharingStatusEnum.ORDER_CANCEL.name());
storeFlow.setBillTime(new Date());
storeFlows.add(storeFlow);
}
this.saveBatch(storeFlows);
}
/**
* 店铺订单退款流水
@ -110,6 +150,7 @@ public class StoreFlowServiceImpl extends ServiceImpl<StoreFlowMapper, StoreFlow
storeFlow.setSpecs(afterSale.getSpecs());
//获取付款信息
StoreFlow payStoreFlow = this.getOne(new LambdaUpdateWrapper<StoreFlow>().eq(StoreFlow::getOrderItemSn, afterSale.getOrderItemSn())
.eq(StoreFlow::getFlowType, FlowTypeEnum.PAY));
@ -149,14 +190,58 @@ public class StoreFlowServiceImpl extends ServiceImpl<StoreFlowMapper, StoreFlow
storeFlow.setTransactionId(refundLog.getReceivableNo());
//支付方式
storeFlow.setPaymentName(refundLog.getPaymentName());
//修改付款的StoreFlow
StoreFlowProfitSharingDTO storeFlowProfitSharingDTO = JSONUtil.toBean(payStoreFlow.getProfitSharing(), StoreFlowProfitSharingDTO.class);
if (storeFlow.getBillPrice()
.equals(payStoreFlow.getFinalPrice())) {
payStoreFlow.setFullRefund(true);
storeFlowProfitSharingDTO.setPrice(0D);
storeFlowProfitSharingDTO.setStorePrice(0D);
storeFlowProfitSharingDTO.setPlatformPrice(0D);
storeFlowProfitSharingDTO.setDistributionPrice(0D);
storeFlowProfitSharingDTO.setSubsidies(0D);
payStoreFlow.setBillTime(new Date());
payStoreFlow.setProfitSharingStatus(ProfitSharingStatusEnum.ORDER_CANCEL.name());
//设置退款时间
storeFlow.setBillTime(new Date());
} else {
//计算 累计订单退款金额修改分账信息
Integer refundNum = this.baseMapper.getRefundNum(payStoreFlow.getOrderItemSn());
refundNum = refundNum == null ? 0 : refundNum;
int allNum = storeFlow.getNum() + refundNum;
Double proportion = CurrencyUtil.div((payStoreFlow.getNum() - allNum), payStoreFlow.getNum());
if (proportion.equals(0D)) {
payStoreFlow.setFullRefund(true);
storeFlowProfitSharingDTO.setPrice(0D);
storeFlowProfitSharingDTO.setStorePrice(0D);
storeFlowProfitSharingDTO.setPlatformPrice(0D);
storeFlowProfitSharingDTO.setDistributionPrice(0D);
storeFlowProfitSharingDTO.setSubsidies(0D);
payStoreFlow.setBillTime(new Date());
payStoreFlow.setProfitSharingStatus(ProfitSharingStatusEnum.ORDER_CANCEL.name());
//设置退款时间
storeFlow.setBillTime(new Date());
} else {
storeFlowProfitSharingDTO.setPrice(CurrencyUtil.mul(payStoreFlow.getFinalPrice(), proportion));
storeFlowProfitSharingDTO.setStorePrice(CurrencyUtil.mul(payStoreFlow.getBillPrice(), proportion));
storeFlowProfitSharingDTO.setPlatformPrice(CurrencyUtil.mul(payStoreFlow.getCommissionPrice(), proportion));
storeFlowProfitSharingDTO.setSubsidies(CurrencyUtil.mul(payStoreFlow.getSiteCouponCommission(), proportion));
storeFlowProfitSharingDTO.setDistributionPrice(CurrencyUtil.mul(payStoreFlow.getDistributionRebate(), proportion));
}
}
payStoreFlow.setProfitSharing(JSONUtil.toJsonStr(storeFlowProfitSharingDTO));
//修改付款流水
this.updateById(payStoreFlow);
//保存退款流水·
this.save(storeFlow);
}
@Override
public IPage<StoreFlow> getStoreFlow(StoreFlowQueryDTO storeFlowQueryDTO) {
return this.page(PageUtil.initPage(storeFlowQueryDTO.getPageVO()), generatorQueryWrapper(storeFlowQueryDTO));
}
@ -193,6 +278,28 @@ public class StoreFlowServiceImpl extends ServiceImpl<StoreFlowMapper, StoreFlow
return this.list(generatorQueryWrapper(storeFlowQueryDTO));
}
@Override
public void updateProfitSharingStatus() {
//获取已完成的列表进行相关的处理
List<StoreFlow> storeFlowList = this.baseMapper.completeList();
for (StoreFlow storeFlow : storeFlowList) {
distributionOrderService.completeOrder(storeFlow);
}
this.baseMapper.updateProfitSharingStatus();
}
@Override
public Bill getRefundBill(BillSearchParams searchParams) {
return this.baseMapper.getRefundBill(searchParams.queryWrapper());
}
@Override
public Bill getOrderBill(BillSearchParams searchParams) {
return this.baseMapper.getOrderBill(searchParams.queryWrapper());
}
/**
* 生成查询wrapper
*
@ -227,10 +334,36 @@ public class StoreFlowServiceImpl extends ServiceImpl<StoreFlowMapper, StoreFlow
Bill bill = storeFlowQueryDTO.getBill();
lambdaQueryWrapper.eq(CharSequenceUtil.isNotEmpty(bill.getStoreId()), StoreFlow::getStoreId, bill.getStoreId());
lambdaQueryWrapper.ge(bill.getStartTime() != null && bill.getEndTime() != null,
StoreFlow::getCreateTime, bill.getStartTime());
StoreFlow::getBillTime, bill.getStartTime());
lambdaQueryWrapper.lt(bill.getStartTime() != null && bill.getEndTime() != null,
StoreFlow::getCreateTime, bill.getEndTime());
StoreFlow::getBillTime, bill.getEndTime());
}
return lambdaQueryWrapper;
}
/**
* 添加分账内容
*
* @param storeFlow 店铺流水
*/
private void saveProfitSharing(StoreFlow storeFlow) {
StoreFlowProfitSharingDTO storeFlowProfitSharingDTO = new StoreFlowProfitSharingDTO();
//店铺获取
storeFlowProfitSharingDTO.setStorePrice(storeFlow.getBillPrice());
//平台佣金
storeFlowProfitSharingDTO.setPlatformPrice(storeFlow.getCommissionPrice());
//分销佣金
storeFlowProfitSharingDTO.setDistributionPrice(storeFlow.getDistributionRebate());
//总金额
storeFlowProfitSharingDTO.setPrice(storeFlow.getFinalPrice());
//平台补差
storeFlowProfitSharingDTO.setSubsidies(storeFlow.getSiteCouponCommission());
//分账详情
storeFlow.setProfitSharing(JSONUtil.toJsonStr(storeFlowProfitSharingDTO));
//分账状态
storeFlow.setProfitSharingStatus(ProfitSharingStatusEnum.WAIT_COMPLETE.name());
}
}

View File

@ -1,5 +1,6 @@
package cn.lili.modules.store.entity.dto;
import cn.hutool.core.text.CharSequenceUtil;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
import cn.lili.common.utils.StringUtils;
@ -8,9 +9,14 @@ import cn.lili.modules.store.entity.enums.BillStatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 结算单搜索参数
*
@ -18,6 +24,9 @@ import org.springframework.format.annotation.DateTimeFormat;
* @since 2021/3/17 6:08 下午
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BillSearchParams extends PageVO {
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@ -39,32 +48,99 @@ public class BillSearchParams extends PageVO {
@ApiModelProperty(value = "状态OUT(已出账),CHECK(已对账),EXAMINE(已审核),PAY(已付款)")
private String billStatus;
@ApiModelProperty(value = "流水类型")
private String flowType;
@ApiModelProperty(value = "店铺名称")
private String storeName;
@ApiModelProperty(value = "店铺ID", hidden = true)
@ApiModelProperty(value = "店铺ID")
private String storeId;
@ApiModelProperty(value = "支付方式")
private String paymentName;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "起始日期")
private Date startTime;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "起始日期")
private Date endTime;
public <T> QueryWrapper<T> queryWrapper() {
QueryWrapper<T> wrapper = new QueryWrapper<>();
//创建时间
if (StringUtils.isNotEmpty(startDate) && StringUtils.isNotEmpty(endDate)) {
if (CharSequenceUtil.isNotEmpty(startDate) && CharSequenceUtil.isNotEmpty(endDate)) {
wrapper.between("bill_time", startDate, endDate);
} else if (CharSequenceUtil.isNotEmpty(startDate)) {
wrapper.ge("bill_time", startDate);
} else if (CharSequenceUtil.isNotEmpty(endDate)) {
wrapper.le("bill_time", endDate);
}
//账单号
wrapper.eq(CharSequenceUtil.isNotEmpty(sn), "sn", sn);
//结算状态
wrapper.eq(CharSequenceUtil.isNotEmpty(billStatus), "bill_status", billStatus);
//店铺名称
wrapper.eq(CharSequenceUtil.isNotEmpty(storeName), "store_name", storeName);
//按卖家查询
wrapper.eq(CharSequenceUtil.isNotEmpty(storeId),
"store_id", storeId);
//按卖家查询
wrapper.eq(CharSequenceUtil.isNotEmpty(paymentName),
"payment_name", paymentName);
wrapper.eq(CharSequenceUtil.isNotEmpty(flowType), "flow_type", flowType);
if (startTime != null && endTime != null) {
wrapper.between("bill_time", startTime, endTime);
} else if (startTime != null) {
wrapper.ge("bill_time", startTime);
} else if (endTime != null) {
wrapper.le("bill_time", endTime);
}
return wrapper;
}
public <T> QueryWrapper<T> queryWrapperBillList() {
QueryWrapper<T> wrapper = new QueryWrapper<>();
//创建时间
if (CharSequenceUtil.isNotEmpty(startDate) && CharSequenceUtil.isNotEmpty(endDate)) {
wrapper.between("create_time", startDate, endDate);
} else if (StringUtils.isNotEmpty(startDate)) {
} else if (CharSequenceUtil.isNotEmpty(startDate)) {
wrapper.ge("create_time", startDate);
} else if (StringUtils.isNotEmpty(endDate)) {
} else if (CharSequenceUtil.isNotEmpty(endDate)) {
wrapper.le("create_time", endDate);
}
//账单号
wrapper.eq(StringUtils.isNotEmpty(sn), "sn", sn);
wrapper.eq(CharSequenceUtil.isNotEmpty(sn), "sn", sn);
//结算状态
wrapper.eq(StringUtils.isNotEmpty(billStatus), "bill_status", billStatus);
wrapper.eq(CharSequenceUtil.isNotEmpty(billStatus), "bill_status", billStatus);
//店铺名称
wrapper.eq(StringUtils.isNotEmpty(storeName), "store_name", storeName);
wrapper.eq(CharSequenceUtil.isNotEmpty(storeName), "store_name", storeName);
//按卖家查询
wrapper.eq(StringUtils.equals(UserContext.getCurrentUser().getRole().name(), UserEnums.STORE.name()),
"store_id", UserContext.getCurrentUser().getStoreId());
wrapper.eq(CharSequenceUtil.isNotEmpty(storeId),
"store_id", storeId);
//按卖家查询
wrapper.eq(CharSequenceUtil.isNotEmpty(paymentName),
"payment_name", paymentName);
wrapper.eq(CharSequenceUtil.isNotEmpty(flowType), "flow_type", flowType);
if (startTime != null && endTime != null) {
wrapper.between("create_time", startTime, endTime);
} else if (startTime != null) {
wrapper.ge("create_time", startTime);
} else if (endTime != null) {
wrapper.le("create_time", endTime);
}
return wrapper;
}

View File

@ -29,34 +29,6 @@ public interface BillMapper extends BaseMapper<Bill> {
@Select("select b.id,b.sn,b.start_time,b.end_time,b.bill_status,b.store_name,b.bill_price,b.create_time from li_bill as b ${ew.customSqlSegment}")
IPage<BillListVO> queryBillPage(IPage<BillListVO> page, @Param(Constants.WRAPPER) Wrapper<BillListVO> queryWrapper);
/**
* 查询订单结算
*
* @param queryWrapper 查询条件
* @return 结算单
*/
@Select("SELECT IFNULL(SUM( final_price ),0) AS orderPrice" +
",IFNULL(SUM( commission_price ),0) AS commissionPrice" +
",IFNULL(SUM( distribution_rebate ),0) AS distributionCommission" +
",IFNULL(SUM( site_coupon_commission ),0) AS siteCouponCommission" +
",IFNULL(SUM( point_settlement_price ),0) AS pointSettlementPrice " +
",IFNULL(SUM( kanjia_settlement_price ),0) AS kanjiaSettlementPrice " +
",IFNULL(SUM( bill_price ),0) AS billPrice " +
"FROM li_store_flow ${ew.customSqlSegment}")
Bill getOrderBill(@Param(Constants.WRAPPER) QueryWrapper<Bill> queryWrapper);
/**
* 查询退款结算单
*
* @param queryWrapper 查询条件
* @return 结算单
*/
@Select("SELECT IFNULL(SUM( final_price ),0) AS refundPrice" +
",IFNULL(SUM( commission_price ),0) AS refundCommissionPrice" +
",IFNULL(SUM( distribution_rebate ),0) AS distributionRefundCommission" +
",IFNULL(SUM( site_coupon_commission ),0) AS siteCouponRefundCommission" +
",IFNULL(SUM( kanjia_settlement_price ),0) AS kanjiaRefundSettlementPrice" +
",IFNULL(SUM( point_settlement_price ),0) AS pointRefundSettlementPrice" +
",IFNULL(SUM( bill_price ),0) AS billPrice FROM li_store_flow ${ew.customSqlSegment}")
Bill getRefundBill(@Param(Constants.WRAPPER) QueryWrapper<Bill> queryWrapper);
}

View File

@ -30,10 +30,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
@ -41,9 +37,11 @@ import org.springframework.transaction.annotation.Transactional;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* 结算单业务层实现
@ -92,8 +90,30 @@ public class BillServiceImpl extends ServiceImpl<BillMapper, Bill> implements Bi
//店铺结算单号
bill.setSn(SnowFlake.createStr("B"));
//结算金额初始化
initBillPrice(bill, storeId, startTime, endTime);
//添加结算单
this.save(bill);
}
/**
* 结算单金额初始化
*
* @param bill 结算单
* @param storeId 店铺ID
* @param startTime 开始时间
* @param endTime 结束时间
*/
private void initBillPrice(Bill bill, String storeId, Date startTime, DateTime endTime) {
//退款结算信息
Bill refundBill = this.baseMapper.getRefundBill(new QueryWrapper<Bill>().eq("store_id", storeId).eq("flow_type", FlowTypeEnum.REFUND.name()).between("create_time", startTime, endTime));
Bill refundBill = storeFlowService.getRefundBill(BillSearchParams.builder()
.storeId(storeId)
.flowType(FlowTypeEnum.REFUND.name())
.startTime(startTime)
.endTime(endTime)
.build());
//店铺退款金额
if (refundBill != null) {
//退单金额
@ -112,10 +132,13 @@ public class BillServiceImpl extends ServiceImpl<BillMapper, Bill> implements Bi
}
/**
* @TODO 入账结算信息
*/
Bill orderBill = this.baseMapper.getOrderBill(new QueryWrapper<Bill>().eq("store_id", storeId).eq("flow_type", FlowTypeEnum.PAY.name()).between("create_time", startTime, endTime));
//入账
Bill orderBill = this.storeFlowService.getOrderBill(BillSearchParams.builder()
.storeId(storeId)
.flowType(FlowTypeEnum.PAY.name())
.startTime(startTime)
.endTime(endTime)
.build());
//店铺入款结算金额
if (orderBill != null) {
@ -131,16 +154,12 @@ public class BillServiceImpl extends ServiceImpl<BillMapper, Bill> implements Bi
bill.setPointSettlementPrice(orderBill.getPointSettlementPrice() != null ? orderBill.getPointSettlementPrice() : 0D);
//砍价商品结算价格
bill.setKanjiaSettlementPrice(orderBill.getKanjiaSettlementPrice() != null ? orderBill.getKanjiaSettlementPrice() : 0D);
}
//最终结算金额=入款结算金额-退款结算金额
Double finalPrice = CurrencyUtil.sub(orderBill.getBillPrice(), refundBill.getBillPrice());
//店铺最终结算金额=最终结算金额
bill.setBillPrice(finalPrice);
//添加结算单
this.save(bill);
}
@ -222,54 +241,53 @@ public class BillServiceImpl extends ServiceImpl<BillMapper, Bill> implements Bi
//创建Excel工作薄对象
ExcelWriter writer = ExcelUtil.getWriterWithSheet("店铺结算单");
writer.setSheet("店铺结算单");
Map<String,Object> map=new LinkedHashMap<>();
map.put("创建时间",DateUtil.format(bill.getCreateTime(), "yyyy-MM-dd"));
Map<String, Object> map = new LinkedHashMap<>();
map.put("创建时间", DateUtil.format(bill.getCreateTime(), "yyyy-MM-dd"));
writer.setColumnWidth(0, 15);
map.put("账单号",bill.getSn());
map.put("账单号", bill.getSn());
writer.setColumnWidth(1, 30);
map.put("结算开始时间",DateUtil.format(bill.getStartTime(), "yyyy-MM-dd"));
map.put("结算开始时间", DateUtil.format(bill.getStartTime(), "yyyy-MM-dd"));
writer.setColumnWidth(2, 15);
map.put("结算结束时间",DateUtil.format(bill.getEndTime(), "yyyy-MM-dd"));
map.put("结算结束时间", DateUtil.format(bill.getEndTime(), "yyyy-MM-dd"));
writer.setColumnWidth(3, 15);
map.put("账单状态",BillStatusEnum.valueOf(bill.getBillStatus()).description());
map.put("店铺名称",bill.getStoreName());
map.put("账单状态", BillStatusEnum.valueOf(bill.getBillStatus()).description());
map.put("店铺名称", bill.getStoreName());
writer.setColumnWidth(5, 15);
map.put("平台付款时间",DateUtil.format(bill.getPayTime(), "yyyy-MM-dd"));
map.put("平台付款时间", DateUtil.format(bill.getPayTime(), "yyyy-MM-dd"));
writer.setColumnWidth(6, 15);
map.put("银行开户名",bill.getBankAccountName());
map.put("银行开户名", bill.getBankAccountName());
writer.setColumnWidth(7, 15);
map.put("银行账号",bill.getBankAccountNumber());
map.put("银行账号", bill.getBankAccountNumber());
writer.setColumnWidth(8, 15);
map.put("开户行",bill.getBankName());
map.put("开户行", bill.getBankName());
writer.setColumnWidth(9, 15);
map.put("联行号",bill.getBankCode());
map.put("订单金额",bill.getOrderPrice());
map.put("退单金额",bill.getRefundPrice());
map.put("平台收取服务费",bill.getCommissionPrice());
map.put("联行号", bill.getBankCode());
map.put("订单金额", bill.getOrderPrice());
map.put("退单金额", bill.getRefundPrice());
map.put("平台收取服务费", bill.getCommissionPrice());
writer.setColumnWidth(13, 15);
map.put("退单退回平台服务费",bill.getRefundCommissionPrice());
map.put("退单退回平台服务费", bill.getRefundCommissionPrice());
writer.setColumnWidth(14, 25);
map.put("分销佣金",bill.getDistributionCommission());
map.put("退单退还分销佣金",bill.getDistributionRefundCommission());
map.put("分销佣金", bill.getDistributionCommission());
map.put("退单退还分销佣金", bill.getDistributionRefundCommission());
writer.setColumnWidth(16, 20);
map.put("平台优惠券补贴",bill.getSiteCouponCommission());
map.put("平台优惠券补贴", bill.getSiteCouponCommission());
writer.setColumnWidth(17, 15);
map.put("退单退回平台优惠券补贴",bill.getSiteCouponRefundCommission());
map.put("退单退回平台优惠券补贴", bill.getSiteCouponRefundCommission());
writer.setColumnWidth(18, 25);
map.put("积分商品补贴",bill.getSiteCouponCommission());
map.put("积分商品补贴", bill.getSiteCouponCommission());
writer.setColumnWidth(19, 15);
map.put("积分商品补贴",bill.getPointSettlementPrice());
map.put("积分商品补贴", bill.getPointSettlementPrice());
writer.setColumnWidth(20, 15);
map.put("退单退回积分商品补贴",bill.getPointRefundSettlementPrice());
map.put("退单退回积分商品补贴", bill.getPointRefundSettlementPrice());
writer.setColumnWidth(21, 25);
map.put("砍价商品补贴",bill.getKanjiaSettlementPrice());
map.put("砍价商品补贴", bill.getKanjiaSettlementPrice());
writer.setColumnWidth(22, 15);
map.put("退单退回砍价补贴",bill.getKanjiaRefundSettlementPrice());
map.put("退单退回砍价补贴", bill.getKanjiaRefundSettlementPrice());
writer.setColumnWidth(23, 25);
map.put("最终结算金额",bill.getBillPrice());
map.put("最终结算金额", bill.getBillPrice());
writer.setColumnWidth(24, 15);
writer.writeRow(map,true);
writer.writeRow(map, true);
writer.setSheet("入账订单");

View File

@ -23,9 +23,5 @@ public class DistributionSetting implements Serializable {
* 分销关系绑定天数
*/
private Integer distributionDay;
/**
* 分销结算天数
*/
private Integer cashDay;
}

View File

@ -1,11 +1,13 @@
package cn.lili.controller.distribution;
import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.distribution.entity.dos.DistributionCash;
import cn.lili.modules.distribution.entity.vos.DistributionCashSearchParams;
import cn.lili.modules.distribution.service.DistributionCashService;
import cn.lili.modules.order.order.entity.dto.OrderSearchParams;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@ -14,6 +16,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
/**
@ -54,5 +57,13 @@ public class DistributionCashManagerController {
public ResultMessage<DistributionCash> audit(@PathVariable String id, @NotNull String result) {
return ResultUtil.data(distributorCashService.audit(id, result));
}
@ApiOperation(value = "查询分销提现导出列表")
@GetMapping("/queryExport")
public void queryExport(DistributionCashSearchParams distributionCashSearchParams) {
HttpServletResponse response = ThreadContextHolder.getHttpResponse();
distributorCashService.queryExport(response,distributionCashSearchParams);
}
}

View File

@ -9,6 +9,7 @@ import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.distribution.entity.dos.Distribution;
import cn.lili.modules.distribution.entity.dto.DistributionSearchParams;
import cn.lili.modules.distribution.service.DistributionService;
import cn.lili.modules.goods.entity.vos.BrandVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@ -17,6 +18,7 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
/**
@ -83,6 +85,17 @@ public class DistributionManagerController {
} else {
throw new ServiceException(ResultCode.DISTRIBUTION_AUDIT_ERROR);
}
}
@ApiOperation(value = "更新数据")
@ApiImplicitParam(name = "id", value = "品牌ID", required = true, dataType = "String", paramType = "path")
@PutMapping("/{id}")
public ResultMessage<Distribution> update(@PathVariable String id, @Valid Distribution distribution) {
distribution.setId(id);
if (distributionService.updateById(distribution)) {
return ResultUtil.data(distribution);
}
throw new ServiceException(ResultCode.DISTRIBUTION_EDIT_ERROR);
}
}

View File

@ -2,7 +2,6 @@ package cn.lili.controller.member;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.vo.PageVO;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.MemberGrade;
@ -51,11 +50,11 @@ public class MemberGradeManagerController {
@ApiImplicitParam(name = "id", value = "会员等级ID", required = true, paramType = "path")
})
@PostMapping(value = "/add")
public ResultMessage<Object> daa(@Validated MemberGrade memberGrade) {
public ResultMessage<Object> daa(@Validated MemberGrade memberGrade) {
if (memberGradeService.save(memberGrade)) {
return ResultUtil.success(ResultCode.SUCCESS);
}
throw new ServiceException(ResultCode.ERROR);
return ResultUtil.error(ResultCode.ERROR);
}
@ApiOperation(value = "修改会员等级")
@ -63,24 +62,21 @@ public class MemberGradeManagerController {
@ApiImplicitParam(name = "id", value = "会员等级ID", required = true, paramType = "path")
})
@PutMapping(value = "/update/{id}")
public ResultMessage<Object> update(@PathVariable String id,MemberGrade memberGrade) {
public ResultMessage<Object> update(@PathVariable String id, MemberGrade memberGrade) {
if (memberGradeService.updateById(memberGrade)) {
return ResultUtil.success(ResultCode.SUCCESS);
}
throw new ServiceException(ResultCode.ERROR);
return ResultUtil.error(ResultCode.ERROR);
}
@ApiOperation(value = "删除会员等级")
@ApiImplicitParam(name = "id", value = "会员等级ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping(value = "/delete/{id}")
public ResultMessage<IPage<Object>> delete(@PathVariable String id) {
if(memberGradeService.getById(id).getIsDefault()){
throw new ServiceException(ResultCode.USER_GRADE_IS_DEFAULT);
}else if(memberGradeService.removeById(id)){
if (memberGradeService.removeById(id)) {
return ResultUtil.success(ResultCode.SUCCESS);
}
throw new ServiceException(ResultCode.ERROR);
return ResultUtil.error(ResultCode.ERROR);
}
}