|
@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.convert.Convert;
|
|
|
import cn.hutool.core.lang.Validator;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
@@ -22,6 +23,7 @@ import com.zhongzheng.modules.course.bo.CourseModuleChapterQueryBo;
|
|
|
import com.zhongzheng.modules.course.bo.CourseSectionQueryBo;
|
|
|
import com.zhongzheng.modules.course.domain.CourseSection;
|
|
|
import com.zhongzheng.modules.course.domain.CourseSubject;
|
|
|
+import com.zhongzheng.modules.course.domain.MajorCategory;
|
|
|
import com.zhongzheng.modules.course.service.*;
|
|
|
import com.zhongzheng.modules.course.vo.CourseChapterSectionVo;
|
|
|
import com.zhongzheng.modules.course.vo.CourseMenuVo;
|
|
@@ -96,7 +98,18 @@ import com.zhongzheng.modules.polyv.domain.PolyvVideo;
|
|
|
import com.zhongzheng.modules.polyv.mapper.PolyvVideoMapper;
|
|
|
import com.zhongzheng.modules.polyv.service.IPolyvLiveService;
|
|
|
import com.zhongzheng.modules.schedule.service.IScheduleService;
|
|
|
+import com.zhongzheng.modules.system.bo.SysTenantBadBillConfigBo;
|
|
|
+import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
|
|
|
+import com.zhongzheng.modules.system.service.ISysTenantService;
|
|
|
import com.zhongzheng.modules.system.service.ISysUserService;
|
|
|
+import com.zhongzheng.modules.system.vo.SysTenantVo;
|
|
|
+import com.zhongzheng.modules.top.financial.bo.TopDivideOrderAddBo;
|
|
|
+import com.zhongzheng.modules.top.financial.bo.TopDivideOrderQueryBo;
|
|
|
+import com.zhongzheng.modules.top.financial.domain.TopDivideLog;
|
|
|
+import com.zhongzheng.modules.top.financial.service.ITopDivideLogService;
|
|
|
+import com.zhongzheng.modules.top.financial.service.ITopDivideOrderService;
|
|
|
+import com.zhongzheng.modules.top.financial.vo.TopDivideOrderVo;
|
|
|
+import com.zhongzheng.modules.top.user.service.ITopSysConfigService;
|
|
|
import com.zhongzheng.modules.user.bo.*;
|
|
|
import com.zhongzheng.modules.user.domain.*;
|
|
|
import com.zhongzheng.modules.user.mapper.UserPlanMapper;
|
|
@@ -112,6 +125,7 @@ import org.apache.commons.lang3.time.DateFormatUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
@@ -274,6 +288,9 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
|
|
|
@Autowired
|
|
|
private IWisdomService iWisdomService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ITopSysConfigService topConfigService;
|
|
|
+
|
|
|
@Autowired
|
|
|
private IDistributionRebateService iDistributionRebateService;
|
|
|
|
|
@@ -283,6 +300,15 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
|
|
|
@Autowired
|
|
|
private IDistributionSellerService iDistributionSellerService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ITopDivideOrderService iTopDivideOrderService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ITopDivideLogService iTopDivideLogService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ISysTenantService iSysTenantService;
|
|
|
+
|
|
|
@Value("${aliyun.sms.OpenTheGoodsCode}")
|
|
|
private String OpenTheGoodsCode;
|
|
|
|
|
@@ -1156,6 +1182,235 @@ public class ScheduleServiceImpl extends ServiceImpl<PolyvVideoMapper, PolyvVide
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void makeDivideMonthBill() {
|
|
|
+ //生成机构分成
|
|
|
+ // 上月起始
|
|
|
+ Calendar cal1 = new GregorianCalendar();
|
|
|
+ cal1.add(Calendar.MONTH, -1);
|
|
|
+ cal1.set(Calendar.DAY_OF_MONTH, 1);
|
|
|
+ cal1.set(Calendar.HOUR_OF_DAY, 0);
|
|
|
+ cal1.set(Calendar.MINUTE, 0);
|
|
|
+ cal1.set(Calendar.SECOND, 0);
|
|
|
+
|
|
|
+ // 上月末尾
|
|
|
+ Calendar cal2 = Calendar.getInstance();
|
|
|
+ cal2.add(Calendar.MONTH, -1);
|
|
|
+ cal2.set(
|
|
|
+ Calendar.DAY_OF_MONTH, cal2.getActualMaximum(Calendar.DAY_OF_MONTH));
|
|
|
+ cal2.set(Calendar.HOUR_OF_DAY, 23);
|
|
|
+ cal2.set(Calendar.MINUTE, 59);
|
|
|
+ cal2.set(Calendar.SECOND, 59);
|
|
|
+ //所有机构列表
|
|
|
+ SysTenantQueryBo tenantQueryBo = new SysTenantQueryBo();
|
|
|
+ tenantQueryBo.setStatus(1);
|
|
|
+ List< SysTenantVo > companyList = iSysTenantService.queryList(tenantQueryBo);
|
|
|
+ //生成月度记录
|
|
|
+ for(SysTenantVo tenantVo : companyList){
|
|
|
+ TopDivideLog divideLog = new TopDivideLog();
|
|
|
+ divideLog.setTenantId(tenantVo.getTenantId().toString());
|
|
|
+ divideLog.setDivideType(1);
|
|
|
+ divideLog.setPayStatus(2);
|
|
|
+ divideLog.setMonthTime(cal1.getTimeInMillis()/1000);
|
|
|
+ int year = cal1.get(Calendar.YEAR);
|
|
|
+ int month = cal1.get(Calendar.MONTH) + 1;
|
|
|
+ divideLog.setYear(year);
|
|
|
+ divideLog.setMonth(month);
|
|
|
+ divideLog.setCreateTime(DateUtils.getNowTime());
|
|
|
+ divideLog.setUpdateTime(DateUtils.getNowTime());
|
|
|
+ //判断账单是否生成
|
|
|
+ TopDivideLog nowMonth = iTopDivideLogService.getOne(new LambdaQueryWrapper<TopDivideLog>()
|
|
|
+ .eq(TopDivideLog::getTenantId,tenantVo.getTenantId())
|
|
|
+ .eq(TopDivideLog::getDivideType,1)
|
|
|
+ .eq(TopDivideLog::getYear,year)
|
|
|
+ .eq(TopDivideLog::getMonth,month)
|
|
|
+ .last("limit 1"));
|
|
|
+ if(Validator.isNotEmpty(nowMonth)){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //获取上个账单
|
|
|
+ LambdaQueryWrapper<TopDivideLog> lqw = Wrappers.lambdaQuery();
|
|
|
+ TopDivideLog divideLogLast = iTopDivideLogService.getOne(lqw.eq(TopDivideLog::getTenantId,tenantVo.getTenantId()).eq(TopDivideLog::getDivideType,1).orderByDesc(TopDivideLog::getId).last("limit 1"));
|
|
|
+ divideLog.setDeductMoney(new BigDecimal(0));
|
|
|
+ if(Validator.isNotEmpty(divideLogLast)){
|
|
|
+ //上个月流入未扣金额
|
|
|
+ divideLog.setDeductMoney(divideLogLast.getUnDeductMoney());
|
|
|
+ }
|
|
|
+ //创建账单
|
|
|
+ if(iTopDivideLogService.save(divideLog)){
|
|
|
+ TopDivideOrderQueryBo queryBo1 = new TopDivideOrderQueryBo();
|
|
|
+ queryBo1.setAccomplishStartTime(cal1.getTimeInMillis()/1000);
|
|
|
+ queryBo1.setAccomplishEndTime(cal2.getTimeInMillis()/1000);
|
|
|
+ queryBo1.setDivideModel(1);
|
|
|
+ queryBo1.setTenantId(tenantVo.getTenantId());
|
|
|
+ //订单总待付分成
|
|
|
+ BigDecimal totalPayMoney = new BigDecimal(0);
|
|
|
+ List<TopDivideOrderVo> list1 = iTopDivideOrderService.getMonthFinishList(queryBo1);
|
|
|
+ for(TopDivideOrderVo vo : list1){
|
|
|
+ totalPayMoney = totalPayMoney.add(vo.getDivideCompanyMoney());
|
|
|
+ TopDivideOrderAddBo addBo = new TopDivideOrderAddBo();
|
|
|
+ addBo.setDivideLogId(divideLog.getId());
|
|
|
+ addBo.setOrderSn(vo.getOrderSn());
|
|
|
+ addBo.setOrderType(1);
|
|
|
+ iTopDivideOrderService.insertByAddBo(addBo);
|
|
|
+ }
|
|
|
+ divideLog.setTotalPayMoney(totalPayMoney);
|
|
|
+ //退款待扣分成
|
|
|
+ queryBo1.setRefundTimeStartTime(cal1.getTimeInMillis()/1000);
|
|
|
+ queryBo1.setRefundTimeEndTime(cal2.getTimeInMillis()/1000);
|
|
|
+ List<TopDivideOrderVo> reList = iTopDivideOrderService.getMonthRefundList(queryBo1);
|
|
|
+ //退款待扣分成
|
|
|
+ BigDecimal deductMoney = new BigDecimal(0);
|
|
|
+ for(TopDivideOrderVo vo : reList){
|
|
|
+ deductMoney = deductMoney.add(vo.getDivideMoney());
|
|
|
+ TopDivideOrderAddBo addBo = new TopDivideOrderAddBo();
|
|
|
+ addBo.setDivideLogId(divideLog.getId());
|
|
|
+ addBo.setOrderSn(vo.getOrderSn());
|
|
|
+ addBo.setRefundSn(vo.getRefundSn());
|
|
|
+ addBo.setOrderType(2);
|
|
|
+ iTopDivideOrderService.insertByAddBo(addBo);
|
|
|
+ }
|
|
|
+ //加上上个月流入待扣分成
|
|
|
+ divideLog.setDeductMoney(divideLog.getDeductMoney().add(deductMoney));
|
|
|
+
|
|
|
+ if(divideLog.getTotalPayMoney().compareTo(divideLog.getDeductMoney()) == 0){
|
|
|
+ divideLog.setRealDeductMoney(divideLog.getDeductMoney());
|
|
|
+ divideLog.setUnDeductMoney(new BigDecimal(0));
|
|
|
+ divideLog.setPayMoney(new BigDecimal(0));
|
|
|
+ }
|
|
|
+ else if(divideLog.getTotalPayMoney().compareTo(divideLog.getDeductMoney()) == -1){
|
|
|
+ //小于
|
|
|
+ divideLog.setRealDeductMoney(divideLog.getTotalPayMoney());
|
|
|
+ divideLog.setUnDeductMoney(divideLog.getDeductMoney().subtract(divideLog.getTotalPayMoney()));
|
|
|
+ divideLog.setPayMoney(new BigDecimal(0));
|
|
|
+ }
|
|
|
+ else if(divideLog.getTotalPayMoney().compareTo(divideLog.getDeductMoney()) == 1){
|
|
|
+ //大于
|
|
|
+ divideLog.setRealDeductMoney(divideLog.getDeductMoney());
|
|
|
+ divideLog.setUnDeductMoney(new BigDecimal(0));
|
|
|
+ divideLog.setPayMoney(divideLog.getTotalPayMoney().subtract(divideLog.getDeductMoney()));
|
|
|
+ }
|
|
|
+ iTopDivideLogService.updateById(divideLog);
|
|
|
+ //坏账
|
|
|
+ String badBillJson = topConfigService.selectConfigByKeyNoCache("bad_bill");
|
|
|
+ if(Validator.isNotEmpty(badBillJson)){
|
|
|
+ Calendar c = Calendar.getInstance();
|
|
|
+ c.add(Calendar.YEAR, -1);
|
|
|
+ Long year1 = c.getTimeInMillis()/1000;
|
|
|
+ c.add(Calendar.YEAR, -1);
|
|
|
+ Long year2 = c.getTimeInMillis()/1000;
|
|
|
+ c.add(Calendar.YEAR, -1);
|
|
|
+ Long year3 = c.getTimeInMillis()/1000;
|
|
|
+ c.add(Calendar.YEAR, -1);
|
|
|
+ Long year4 = c.getTimeInMillis()/1000;
|
|
|
+ c.add(Calendar.YEAR, -1);
|
|
|
+ Long year5 = c.getTimeInMillis()/1000;
|
|
|
+ List<SysTenantBadBillConfigBo> configList = JSONArray.parseArray(badBillJson, SysTenantBadBillConfigBo.class);
|
|
|
+ BigDecimal badPrice = new BigDecimal(0);
|
|
|
+ for(SysTenantBadBillConfigBo configBo : configList){
|
|
|
+ if(configBo.getYearType()==1){
|
|
|
+ TopDivideOrderQueryBo orderQueryBo1 = new TopDivideOrderQueryBo();
|
|
|
+ orderQueryBo1.setTenantId(tenantVo.getTenantId());
|
|
|
+ orderQueryBo1.setBuyStartTime(year1);
|
|
|
+ BigDecimal price1 = iTopDivideOrderService.getMonthBadSum(orderQueryBo1);
|
|
|
+ BigDecimal value1 = price1.divide(new BigDecimal(100)).multiply(new BigDecimal(configBo.getDetainRate()));
|
|
|
+ badPrice = badPrice.add(value1);
|
|
|
+ }
|
|
|
+ else if(configBo.getYearType()==2){
|
|
|
+ TopDivideOrderQueryBo orderQueryBo2 = new TopDivideOrderQueryBo();
|
|
|
+ orderQueryBo2.setTenantId(tenantVo.getTenantId());
|
|
|
+ orderQueryBo2.setBuyStartTime(year1);
|
|
|
+ orderQueryBo2.setBuyEndTime(year2);
|
|
|
+ BigDecimal price2 = iTopDivideOrderService.getMonthBadSum(orderQueryBo2);
|
|
|
+ BigDecimal value2 = price2.divide(new BigDecimal(100)).multiply(new BigDecimal(configBo.getDetainRate()));
|
|
|
+ badPrice = badPrice.add(value2);
|
|
|
+ }
|
|
|
+ else if(configBo.getYearType()==3){
|
|
|
+ TopDivideOrderQueryBo orderQueryBo3 = new TopDivideOrderQueryBo();
|
|
|
+ orderQueryBo3.setTenantId(tenantVo.getTenantId());
|
|
|
+ orderQueryBo3.setBuyStartTime(year2);
|
|
|
+ orderQueryBo3.setBuyEndTime(year3);
|
|
|
+ BigDecimal price3 = iTopDivideOrderService.getMonthBadSum(orderQueryBo3);
|
|
|
+ BigDecimal value3 = price3.divide(new BigDecimal(100)).multiply(new BigDecimal(configBo.getDetainRate()));
|
|
|
+ badPrice = badPrice.add(value3);
|
|
|
+ }
|
|
|
+ else if(configBo.getYearType()==4){
|
|
|
+ TopDivideOrderQueryBo orderQueryBo4 = new TopDivideOrderQueryBo();
|
|
|
+ orderQueryBo4.setTenantId(tenantVo.getTenantId());
|
|
|
+ orderQueryBo4.setBuyStartTime(year3);
|
|
|
+ orderQueryBo4.setBuyEndTime(year4);
|
|
|
+ BigDecimal price4 = iTopDivideOrderService.getMonthBadSum(orderQueryBo4);
|
|
|
+ BigDecimal value4 = price4.divide(new BigDecimal(100)).multiply(new BigDecimal(configBo.getDetainRate()));
|
|
|
+ badPrice = badPrice.add(value4);
|
|
|
+ }
|
|
|
+ else if(configBo.getYearType()==5){
|
|
|
+ TopDivideOrderQueryBo orderQueryBo5 = new TopDivideOrderQueryBo();
|
|
|
+ orderQueryBo5.setTenantId(tenantVo.getTenantId());
|
|
|
+ orderQueryBo5.setBuyStartTime(year4);
|
|
|
+ orderQueryBo5.setBuyEndTime(year5);
|
|
|
+ BigDecimal price5 = iTopDivideOrderService.getMonthBadSum(orderQueryBo5);
|
|
|
+ BigDecimal value5 = price5.divide(new BigDecimal(100)).multiply(new BigDecimal(configBo.getDetainRate()));
|
|
|
+ badPrice.add(value5);
|
|
|
+ }
|
|
|
+ else if(configBo.getYearType()==6){
|
|
|
+ TopDivideOrderQueryBo orderQueryBo6 = new TopDivideOrderQueryBo();
|
|
|
+ orderQueryBo6.setTenantId(tenantVo.getTenantId());
|
|
|
+ orderQueryBo6.setBuyStartTime(year5);
|
|
|
+ BigDecimal price6 = iTopDivideOrderService.getMonthBadSum(orderQueryBo6);
|
|
|
+ BigDecimal value6 = price6.divide(new BigDecimal(100)).multiply(new BigDecimal(configBo.getDetainRate()));
|
|
|
+ badPrice = badPrice.add(value6);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ divideLog.setBadMoney(badPrice);
|
|
|
+ BigDecimal lastBadPrice = new BigDecimal(0);
|
|
|
+ //和上个账单坏账比较
|
|
|
+ if(Validator.isNotEmpty(divideLogLast)){
|
|
|
+ lastBadPrice = divideLogLast.getRealBadMoney();
|
|
|
+ }
|
|
|
+ if(badPrice.compareTo(lastBadPrice) == 0){
|
|
|
+ //等于互相抵消
|
|
|
+ divideLog.setRealBadMoney(badPrice);
|
|
|
+ }
|
|
|
+ else if(badPrice.compareTo(lastBadPrice) == -1){
|
|
|
+ //小于
|
|
|
+ BigDecimal diffBad = lastBadPrice.multiply(badPrice);
|
|
|
+ divideLog.setPayMoney(divideLog.getPayMoney().add(diffBad));
|
|
|
+ divideLog.setRealBadMoney(badPrice);
|
|
|
+ }
|
|
|
+ else if(badPrice.compareTo(lastBadPrice) == 1){
|
|
|
+ //大于
|
|
|
+ BigDecimal diffBad = badPrice.multiply(lastBadPrice);
|
|
|
+ if(divideLog.getPayMoney().compareTo(diffBad) == 0){
|
|
|
+ divideLog.setPayMoney(new BigDecimal(0));
|
|
|
+ divideLog.setRealBadMoney(badPrice);
|
|
|
+ }
|
|
|
+ if(divideLog.getPayMoney().compareTo(diffBad) == -1){
|
|
|
+ //小于
|
|
|
+ divideLog.setPayMoney(new BigDecimal(0));
|
|
|
+ divideLog.setRealBadMoney(lastBadPrice.add(divideLog.getPayMoney()));
|
|
|
+ }
|
|
|
+ if(divideLog.getPayMoney().compareTo(diffBad) == 1){
|
|
|
+ //大于
|
|
|
+ divideLog.setPayMoney(divideLog.getPayMoney().multiply(diffBad));
|
|
|
+ divideLog.setRealBadMoney(badPrice);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ iTopDivideLogService.updateById(divideLog);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*for(SysTenantVo tenantVo : companyList){
|
|
|
+
|
|
|
+
|
|
|
+ //获取上个账单
|
|
|
+ TopDivideLog divideLog = iTopDivideLogService.getOne(lqw.eq(TopDivideLog::getTenantId,tenantVo.getTenantId()).eq(TopDivideLog::getDivideType,1).orderByDesc(TopDivideLog::getId).last("limit 1"));
|
|
|
+
|
|
|
+ }*/
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void closeTimeOutOrder() {
|
|
|
OrderQueryBo bo = new OrderQueryBo();
|