优化店铺结算单、店铺流水生成规则。
优化分销申请逻辑,分销佣金不转入预存款
This commit is contained in:
parent
1b316baac6
commit
cf623f6756
@ -1,2 +0,0 @@
|
||||
ALTER TABLE `li_order`
|
||||
ADD COLUMN `seller_remark` varchar(255) NULL COMMENT '商家订单备注' AFTER `remark`;
|
@ -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 '退款金额';
|
@ -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';
|
@ -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 '分账详情';
|
||||
|
@ -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())) {
|
||||
|
@ -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);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -174,6 +174,7 @@ public enum ResultCode {
|
||||
DISTRIBUTION_RETREAT_ERROR(22004, "分销员清退失败"),
|
||||
DISTRIBUTION_CASH_NOT_EXIST(22005, "分销员提现记录不存在"),
|
||||
DISTRIBUTION_GOODS_DOUBLE(22006, "不能重复添加分销商品"),
|
||||
DISTRIBUTION_EDIT_ERROR(22007, "修改分销员失败"),
|
||||
|
||||
/**
|
||||
* 购物车
|
||||
|
@ -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;
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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("退款");
|
||||
|
||||
|
@ -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);
|
||||
|
||||
}
|
@ -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);
|
||||
|
||||
/**
|
||||
* 审核分销提现申请
|
||||
*
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
@ -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)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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());
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
// }
|
||||
|
||||
/**
|
||||
* 此方法只提供内部调用,调用前应该做好权限处理
|
||||
|
@ -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());
|
||||
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
}
|
@ -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("入账订单");
|
||||
|
@ -23,9 +23,5 @@ public class DistributionSetting implements Serializable {
|
||||
* 分销关系绑定天数
|
||||
*/
|
||||
private Integer distributionDay;
|
||||
/**
|
||||
* 分销结算天数
|
||||
*/
|
||||
private Integer cashDay;
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user