收款汇总导出
This commit is contained in:
@@ -6,7 +6,6 @@ import com.zmzm.finance.common.service.*;
|
||||
import com.zmzm.finance.util.R;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.lang.time.DateUtils;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
@@ -75,6 +74,24 @@ public class StatisticsController {
|
||||
.groupBy("type"));
|
||||
return R.ok().putData("paymentSummary",paymentSummary).putData("physicalAndTraining",physicalAndTraining);
|
||||
}
|
||||
//汇总明细导出
|
||||
@RequestMapping("/statisticsInfoExport")
|
||||
public R statisticsInfoExport(HttpServletResponse response,@RequestBody Map<String,Object> params) throws ParseException {
|
||||
String fileName = params.get("year")+""+params.get("month")+"汇总明细";
|
||||
XSSFWorkbook wb = new XSSFWorkbook();
|
||||
Sheet sheet1 = wb.createSheet("天医币");
|
||||
exportCommon(sheet1 ,ordersService.coinInfoExportList(params));
|
||||
Sheet sheet2 = wb.createSheet("VIP");
|
||||
exportCommon(sheet2 ,ordersService.vipInfoExportList(params));
|
||||
Sheet sheet3 = wb.createSheet("课程");
|
||||
exportCommon(sheet3 ,ordersService.courseInfoExportList(params));
|
||||
Sheet sheet4 = wb.createSheet("实物");
|
||||
exportCommon(sheet4 ,ordersService.physicalInfoExportList(params));
|
||||
Sheet sheet5 = wb.createSheet("培训班");
|
||||
exportCommon(sheet5 ,ordersService.trainingClassInfoExportList(params));
|
||||
exportTem(response,wb,fileName+".xlsx");
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
//天医币统计
|
||||
@RequestMapping("/pointStatistics")
|
||||
@@ -126,196 +143,45 @@ public class StatisticsController {
|
||||
//天医币明细导出
|
||||
@RequestMapping("/pointInfoExport")
|
||||
public R pointInfoExport(HttpServletResponse response,@RequestBody Map<String,Object> params){
|
||||
List<Map<String,Object>> coinInfoList = ordersService.listMaps(new MPJLambdaWrapper<Orders>()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.eq(Orders::getUseFlag,1).and(t->t.eq(Orders::getType,0).or().eq(Orders::getPayType,1))
|
||||
.apply("DATE_FORMAT(t.order_time, '%Y-%m') = '"+params.get("year")+"-"+params.get("month")+"'")
|
||||
.select("DATE_FORMAT(t.order_time, '%Y-%m-%d %H:%i:%s') orderTime,if(t.source=0,'一路健康',if(t.source=1,'吴门医述','管理员')) source," +
|
||||
"if(t.type=0,'充值',IF(t.type=1,'vip',IF(t.type=2,'课程',IF(t.type=3,'实物','培训班')))) type," +
|
||||
"IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行')) payType,t.tel,t.order_sn,t.fee,t.point")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
String fileName = params.get("year")+""+params.get("month")+"天医币明细";
|
||||
XSSFWorkbook wb = new XSSFWorkbook();
|
||||
Sheet sheet = wb.createSheet(fileName);
|
||||
Row titleRow = sheet.createRow(0);
|
||||
titleRow.createCell(0).setCellValue("时间");
|
||||
titleRow.createCell(1).setCellValue("来源");
|
||||
titleRow.createCell(2).setCellValue("支付方式");
|
||||
titleRow.createCell(3).setCellValue("类型");
|
||||
titleRow.createCell(4).setCellValue("电话");
|
||||
titleRow.createCell(5).setCellValue("订单号");
|
||||
titleRow.createCell(6).setCellValue("金额");
|
||||
titleRow.createCell(7).setCellValue("天医币");
|
||||
int cell = 1;
|
||||
for (Map<String,Object> map : coinInfoList) {
|
||||
Row row = sheet.createRow(cell);
|
||||
row.createCell(0).setCellValue(map.get("orderTime").toString());
|
||||
row.createCell(1).setCellValue(map.get("source").toString());
|
||||
row.createCell(2).setCellValue(map.get("payType").toString());
|
||||
row.createCell(3).setCellValue(map.get("type").toString());
|
||||
row.createCell(4).setCellValue(map.get("tel").toString());
|
||||
row.createCell(5).setCellValue(map.get("order_sn").toString());
|
||||
row.createCell(6).setCellValue(map.get("fee").toString());
|
||||
row.createCell(7).setCellValue(map.get("point").toString());
|
||||
//序号自增
|
||||
cell++;
|
||||
}
|
||||
exportCommon(sheet ,ordersService.coinInfoExportList(params));
|
||||
exportTem(response,wb,fileName+".xlsx");
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
public void exportCommon(Sheet sheet ,List<Map<String,Object>> list) {
|
||||
if (list.size()>0){
|
||||
Row titleRow = sheet.createRow(0);
|
||||
Map<String,Object> title = new TreeMap<>(list.get(0));
|
||||
int i=0;
|
||||
for (Map.Entry<String,Object> m:title.entrySet()){
|
||||
titleRow.createCell(i).setCellValue(m.getKey().toString().substring(2));
|
||||
i++;
|
||||
}
|
||||
int cell = 1;
|
||||
for (Map<String,Object> map : list) {
|
||||
map = new TreeMap<>(map);
|
||||
Row row = sheet.createRow(cell);
|
||||
int q=0;
|
||||
for (Map.Entry<String,Object> m:map.entrySet()){
|
||||
row.createCell(q).setCellValue(m.getValue().toString());
|
||||
q++;
|
||||
}
|
||||
//序号自增
|
||||
cell++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//vip明细导出
|
||||
@RequestMapping("/vipInfoExport")
|
||||
public R vipInfoExport(HttpServletResponse response, @RequestBody Map<String,Object> params) throws ParseException {
|
||||
String date = params.get("year")+"-"+params.get("month");
|
||||
List<Map<String,Object>> vipOrders = ordersService.listMaps(new MPJLambdaWrapper<Orders>()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.disableSubLogicDel()
|
||||
.eq(Orders::getUseFlag,1).eq(Orders::getType,1)
|
||||
.select("DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') orderTime,if(source=0,'一路健康',if(source=1,'吴门医述','管理员')) source,order_old_id orderOldId," +
|
||||
"IF(t.pay_type=1,'天医币',IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行'))) type,tel,order_sn,t.fee realMoney")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
//吴门医述订单
|
||||
List<String> wumenOrderIds = vipOrders.stream().filter(o -> o.get("source").equals("吴门医述"))
|
||||
.map(map->map.get("orderOldId").toString()).collect(Collectors.toList());
|
||||
List<Map<String,Object>> buyOrders = buyOrderService.listMaps(new MPJLambdaWrapper<BuyOrder>()
|
||||
.leftJoin(UserVipLog.class,UserVipLog::getOrderSn,BuyOrder::getOrderSn)
|
||||
.leftJoin(UserVip.class,UserVip::getId,UserVipLog::getUserVipId)
|
||||
.disableSubLogicDel()
|
||||
.in(BuyOrder::getOrderId,wumenOrderIds)
|
||||
.select("t.order_id oid,if(t2.type=4,'中医学vip',if(t2.type=5,'针灸学vip',if(t2.type=6,'肿瘤学vip',if(t2.type=7,'国学vip',if(t2.type=8,'心理学vip',if(t2.type=9,'中西汇通vip','其他')))))) vipType," +
|
||||
"t1.price fee,DATE_FORMAT(t1.start_time, '%Y-%m-%d') startTime,DATE_FORMAT(t1.end_time, '%Y-%m-%d') endTime"));
|
||||
Map<String,Object> buyOrdersMap = new HashMap<>();
|
||||
for (Map<String,Object> m : buyOrders) {
|
||||
List<Map<String,Object>> l = new ArrayList<>();
|
||||
if(buyOrdersMap.get(m.get("oid").toString())!=null){
|
||||
l = (List<Map<String, Object>>) buyOrdersMap.get(m.get("oid").toString());
|
||||
}
|
||||
l.add(m);
|
||||
buyOrdersMap.put(m.get("oid").toString(),l);
|
||||
}
|
||||
YearMonth yearMonth = YearMonth.parse(date);
|
||||
SimpleDateFormat sdfday = new SimpleDateFormat("yyyy-MM-dd");
|
||||
SimpleDateFormat sdfmonth = new SimpleDateFormat("yyyy-MM");
|
||||
String day = date+"-"+yearMonth.lengthOfMonth();
|
||||
String month = date;
|
||||
List<Map<String,Object>> result = new ArrayList<>();
|
||||
for(Map<String,Object> vipOrder:vipOrders){
|
||||
if (vipOrder.get("source").equals("吴门医述")){
|
||||
List<Map<String,Object>> l = (List<Map<String, Object>>) buyOrdersMap.get(vipOrder.get("orderOldId"));
|
||||
for (Map<String,Object> m : l) {
|
||||
Map<String,Object> res = new HashMap<>();
|
||||
if (m.get("fee")!=null){
|
||||
res.put("fee",m.get("fee"));
|
||||
res.put("startTime",m.get("startTime"));
|
||||
res.put("endTime",m.get("endTime"));
|
||||
}else {
|
||||
res.put("fee",vipOrder.get("realMoney"));
|
||||
res.put("startTime",vipOrder.get("orderTime"));
|
||||
res.put("endTime",vipOrder.get("orderTime"));
|
||||
}
|
||||
res.put("vipType",m.get("vipType"));
|
||||
res.putAll(vipOrder);
|
||||
result.add(res);
|
||||
}
|
||||
}else {
|
||||
FinanceOrder financeOrder = financeOrderService.getById(vipOrder.get("orderOldId").toString());
|
||||
vipOrder.put("fee",financeOrder.getRealMoney());
|
||||
vipOrder.put("startTime",sdfday.format(financeOrder.getStartTime()));
|
||||
vipOrder.put("endTime",sdfday.format(financeOrder.getEndTime()));
|
||||
vipOrder.put("vipType",financeOrder.getProductName());
|
||||
result.add(vipOrder);
|
||||
}
|
||||
}
|
||||
for (Map<String,Object> map:result){
|
||||
map.put("now",BigDecimal.ZERO);
|
||||
map.put("already",BigDecimal.ZERO);
|
||||
map.put("notyet",BigDecimal.ZERO);
|
||||
BigDecimal fee = (BigDecimal) map.get("fee");
|
||||
String startTime = (String) map.get("startTime");
|
||||
String endTime = (String) map.get("endTime");
|
||||
if (startTime.equals(endTime)){
|
||||
if (map.get("orderTime").toString().contains(month)){
|
||||
map.put("now",fee);
|
||||
} else if (sdfmonth.parse(startTime).getTime()<sdfmonth.parse(month).getTime()) {
|
||||
map.put("already",fee);
|
||||
}
|
||||
//摊销完成
|
||||
}else if (sdfmonth.parse(day).getTime()>sdfmonth.parse(endTime).getTime()){
|
||||
map.put("already",fee);
|
||||
//未开始摊销
|
||||
}else if (sdfday.parse(day).getTime()<sdfday.parse(startTime).getTime()){
|
||||
if (sdfmonth.parse(map.get("orderTime").toString()).getTime()<=sdfmonth.parse(month).getTime()){
|
||||
map.put("notyet",fee);
|
||||
}
|
||||
//摊销中
|
||||
}else {
|
||||
//总天数
|
||||
int totalDays = Math.toIntExact((sdfday.parse(endTime).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24)+1;
|
||||
//日摊销
|
||||
BigDecimal dayAmount = fee.divide(new BigDecimal(totalDays),2, BigDecimal.ROUND_HALF_UP);
|
||||
//已摊销天数
|
||||
int alreadyDays = Math.toIntExact((sdfmonth.parse(month).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24);
|
||||
if (alreadyDays>0){
|
||||
map.put("already",dayAmount.multiply(new BigDecimal(alreadyDays)));
|
||||
}else {
|
||||
alreadyDays = 0;
|
||||
}
|
||||
//当前月天数
|
||||
int nowDays = Integer.parseInt(day.substring(8, 10));
|
||||
BigDecimal now = BigDecimal.ZERO;
|
||||
//如果开始时间是当前月,月天数-开始日=当月摊销天数
|
||||
if (startTime.contains(month)){
|
||||
nowDays = Integer.parseInt(day.substring(8, 10))-Integer.parseInt(startTime.substring(8, 10))+1;
|
||||
now = dayAmount.multiply(new BigDecimal(nowDays));
|
||||
} else if (endTime.contains(month)) {
|
||||
now = fee.subtract(dayAmount.multiply(new BigDecimal(alreadyDays)));
|
||||
}else {
|
||||
now = dayAmount.multiply(new BigDecimal(nowDays));
|
||||
}
|
||||
map.put("now",now);
|
||||
//剩余未摊销
|
||||
map.put("notyet",fee.subtract(now).subtract(dayAmount.multiply(new BigDecimal(alreadyDays))));
|
||||
}
|
||||
}
|
||||
String fileName = params.get("year")+""+params.get("month")+"vip明细";
|
||||
XSSFWorkbook wb = new XSSFWorkbook();
|
||||
Sheet sheet = wb.createSheet(fileName);
|
||||
Row titleRow = sheet.createRow(0);
|
||||
titleRow.createCell(0).setCellValue("时间");
|
||||
titleRow.createCell(1).setCellValue("来源");
|
||||
titleRow.createCell(2).setCellValue("类型");
|
||||
titleRow.createCell(3).setCellValue("电话");
|
||||
titleRow.createCell(4).setCellValue("订单号");
|
||||
titleRow.createCell(5).setCellValue("缴费金额");
|
||||
titleRow.createCell(6).setCellValue("金额");
|
||||
titleRow.createCell(7).setCellValue("VIP类型");
|
||||
titleRow.createCell(8).setCellValue("开始时间");
|
||||
titleRow.createCell(9).setCellValue("结束时间");
|
||||
titleRow.createCell(10).setCellValue("已摊销");
|
||||
titleRow.createCell(11).setCellValue("当前摊销");
|
||||
titleRow.createCell(12).setCellValue("剩余摊销");
|
||||
int cell = 1;
|
||||
for (Map<String,Object> map : result) {
|
||||
Row row = sheet.createRow(cell);
|
||||
row.createCell(0).setCellValue(map.get("orderTime").toString());
|
||||
row.createCell(1).setCellValue(map.get("source").toString());
|
||||
row.createCell(2).setCellValue(map.get("type").toString());
|
||||
row.createCell(3).setCellValue(map.get("tel").toString());
|
||||
row.createCell(4).setCellValue(map.get("order_sn").toString());
|
||||
row.createCell(5).setCellValue(map.get("realMoney").toString());
|
||||
row.createCell(6).setCellValue(map.get("fee").toString());
|
||||
row.createCell(7).setCellValue(map.get("vipType").toString());
|
||||
row.createCell(8).setCellValue(map.get("startTime").toString());
|
||||
row.createCell(9).setCellValue(map.get("endTime").toString());
|
||||
row.createCell(10).setCellValue(map.get("already").toString());
|
||||
row.createCell(11).setCellValue(map.get("now").toString());
|
||||
row.createCell(12).setCellValue(map.get("notyet").toString());
|
||||
//序号自增
|
||||
cell++;
|
||||
}
|
||||
exportCommon(sheet ,ordersService.vipInfoExportList(params));
|
||||
exportTem(response,wb,fileName+".xlsx");
|
||||
return R.ok();
|
||||
}
|
||||
@@ -441,217 +307,10 @@ public class StatisticsController {
|
||||
//课程明细导出
|
||||
@RequestMapping("/courseInfoExport")
|
||||
public R courseInfoExport(HttpServletResponse response,@RequestBody Map<String,Object> params) throws ParseException {
|
||||
String date = params.get("year")+"-"+params.get("month");
|
||||
//所有课程订单
|
||||
List<Map<String,Object>> courseOrders = ordersService.listMaps(new MPJLambdaWrapper<Orders>()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.disableSubLogicDel()
|
||||
.eq(Orders::getUseFlag,1).eq(Orders::getType,2)
|
||||
.select("DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') orderTime,if(source=0,'一路健康',if(source=1,'吴门医述','管理员')) source,order_old_id orderOldId," +
|
||||
"IF(t.pay_type=1,'天医币',IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行'))) type,tel,order_sn,t.fee realMoney")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
//一路健康订单课程
|
||||
List<String> taihuOrderIds = courseOrders.stream().filter(o -> o.get("source").equals("一路健康"))
|
||||
.map(map->map.get("orderOldId").toString()).collect(Collectors.toList());
|
||||
Map<String,Map<String,Object>> taihuClassMap = customerApplyCurriculumService.listMaps(new MPJLambdaWrapper<TCustomerApplyCurriculum>()
|
||||
.in("t.oid", taihuOrderIds)
|
||||
.apply("t.valid=1 and t.status = '50'")
|
||||
.select("t.oid,if(t.point>0,t.point,t.money) fee,curriculumID"))
|
||||
.stream().collect(Collectors.toMap(m -> m.get("oid").toString(), m -> m));
|
||||
//订单开课记录
|
||||
Map<String,Map<String,Object>> ctc = customerTaihuClassService.listMaps(new MPJLambdaWrapper<TCustomerTaihuClass>()
|
||||
.like(TCustomerTaihuClass::getDescription,"KC20")
|
||||
.in(TCustomerTaihuClass::getStatus,10)
|
||||
.gt(TCustomerTaihuClass::getStudydays,0)
|
||||
.select("SUBSTRING(description, LOCATE('KC', description), 16) description,oid,DATE_FORMAT(startDate, '%Y-%m-%d') startDate,studyDays"))
|
||||
.stream().collect(Collectors.toMap(m -> m.get("description").toString()+"-"+m.get("oid").toString(), m -> m));
|
||||
//吴门医述订单课程
|
||||
List<String> wumenOrderIds = courseOrders.stream().filter(o -> o.get("source").equals("吴门医述"))
|
||||
.map(map->map.get("orderOldId").toString()).collect(Collectors.toList());
|
||||
List<Map<String,Object>> buyOrdersList = buyOrderService.listMaps(new MPJLambdaWrapper<BuyOrder>()
|
||||
.leftJoin("user_course_buy_log t1 on (t1.order_sn = t.order_sn )")
|
||||
.leftJoin("user_course_buy t2 on t2.id = t1.user_course_buy_id")
|
||||
.in("t.order_id",wumenOrderIds)
|
||||
.gt(BuyOrder::getRealMoney,0)
|
||||
.select("t.order_id oid,t1.id ucblid,if(t1.fee is null,t.real_money,t1.fee) fee,t1.days,t1.begin_day," +
|
||||
"DATE_FORMAT(t2.start_time, '%Y-%m-%d %H:%i:%s') startTime,t.order_sn"));
|
||||
Map<String,Object> buyOrdersMap = new HashMap<>();
|
||||
for (Map<String,Object> m : buyOrdersList) {
|
||||
List<Map<String,Object>> l = new ArrayList<>();
|
||||
if(buyOrdersMap.get(m.get("oid").toString())!=null){
|
||||
l = (List<Map<String, Object>>) buyOrdersMap.get(m.get("oid").toString());
|
||||
}
|
||||
l.add(m);
|
||||
buyOrdersMap.put(m.get("oid").toString(),l);
|
||||
}
|
||||
YearMonth yearMonth = YearMonth.parse(date);
|
||||
SimpleDateFormat sdfday = new SimpleDateFormat("yyyy-MM-dd");
|
||||
SimpleDateFormat sdfmonth = new SimpleDateFormat("yyyy-MM");
|
||||
String day = date+"-"+yearMonth.lengthOfMonth();
|
||||
String month = date;
|
||||
List<Map<String,Object>> result = new ArrayList<>();
|
||||
for(Map<String,Object> courseOrder:courseOrders){
|
||||
String orderTime = courseOrder.get("orderTime").toString().substring(0,10);
|
||||
if (courseOrder.get("source").equals("一路健康")){
|
||||
Map<String,Object> res = new HashMap<>();
|
||||
Map<String,Object> taihuClass = taihuClassMap.get(courseOrder.get("orderOldId").toString());
|
||||
Map<String, Object> tc = ctc.entrySet().stream().filter(e -> e.getKey()
|
||||
.contains(taihuClass.get("curriculumID").toString())).map(Map.Entry::getValue).findFirst().orElse(null);
|
||||
res.put("fee",courseOrder.get("realMoney"));
|
||||
if (tc != null&&tc.get("startDate")!=null) {
|
||||
res.put("startTime",tc.get("startDate"));
|
||||
res.put("endTime",sdfday.format(DateUtils.addDays(sdfday.parse(tc.get("startDate").toString()), (Integer) tc.get("studyDays"))));
|
||||
}else {
|
||||
res.put("startTime",orderTime);
|
||||
res.put("endTime",orderTime);
|
||||
}
|
||||
res.putAll(courseOrder);
|
||||
result.add(res);
|
||||
}else if(courseOrder.get("source").equals("吴门医述")){
|
||||
List<Map<String,Object>> l = (List<Map<String, Object>>) buyOrdersMap.get(courseOrder.get("orderOldId"));
|
||||
if (l!=null){
|
||||
for (int i=0;i<l.size();i++) {
|
||||
Map<String,Object> res = new HashMap<>();
|
||||
Map<String,Object> m = l.get(i);
|
||||
if (m.get("ucblid")!=null){
|
||||
if (new BigDecimal(m.get("fee").toString()).compareTo(BigDecimal.ZERO)>0){
|
||||
res.put("fee",m.get("fee"));
|
||||
}else {
|
||||
BigDecimal one = new BigDecimal(courseOrder.get("realMoney").toString()).divide(new BigDecimal(l.size()),2,BigDecimal.ROUND_HALF_UP);
|
||||
if (i==l.size()-1){
|
||||
res.put("fee",new BigDecimal(courseOrder.get("realMoney").toString()).subtract(one.multiply(new BigDecimal(l.size()-1))));
|
||||
}else {
|
||||
res.put("fee",one);
|
||||
}
|
||||
}
|
||||
if (m.get("startTime")==null){
|
||||
res.put("startTime",null);
|
||||
res.put("endTime",null);
|
||||
}else {
|
||||
if (Integer.parseInt(m.get("begin_day").toString())==0){
|
||||
res.put("startTime",m.get("startTime").toString());
|
||||
res.put("endTime",sdfday.format(DateUtils.addDays(sdfday.parse(m.get("startTime").toString()),
|
||||
Integer.parseInt(m.get("days").toString())-1)));
|
||||
}else {
|
||||
res.put("startTime",sdfday.format(DateUtils.addDays(sdfday.parse(m.get("startTime").toString()),
|
||||
Integer.parseInt(m.get("days").toString()))));
|
||||
res.put("endTime",sdfday.format(DateUtils.addDays(sdfday.parse(res.get("startTime").toString()),
|
||||
Integer.parseInt(m.get("days").toString())-1)));
|
||||
}
|
||||
}
|
||||
}else {
|
||||
res.put("fee",courseOrder.get("realMoney"));
|
||||
res.put("startTime",orderTime);
|
||||
res.put("endTime",orderTime);
|
||||
}
|
||||
res.putAll(courseOrder);
|
||||
result.add(res);
|
||||
}
|
||||
}else {
|
||||
Map<String,Object> res = new HashMap<>();
|
||||
res.put("fee",courseOrder.get("realMoney"));
|
||||
res.put("startTime",orderTime);
|
||||
res.put("endTime",orderTime);
|
||||
res.putAll(courseOrder);
|
||||
result.add(res);
|
||||
}
|
||||
}else {
|
||||
FinanceOrder financeOrder = financeOrderService.getById(courseOrder.get("orderOldId").toString());
|
||||
courseOrder.put("fee",financeOrder.getRealMoney());
|
||||
courseOrder.put("startTime",sdfday.format(financeOrder.getStartTime()));
|
||||
courseOrder.put("endTime",sdfday.format(financeOrder.getEndTime()));
|
||||
result.add(courseOrder);
|
||||
}
|
||||
}
|
||||
for (Map<String,Object> map:result) {
|
||||
map.put("now", BigDecimal.ZERO);
|
||||
map.put("already", BigDecimal.ZERO);
|
||||
map.put("notyet", BigDecimal.ZERO);
|
||||
BigDecimal fee = (BigDecimal) map.get("fee");
|
||||
String startTime = (String) map.get("startTime");
|
||||
String endTime = (String) map.get("endTime");
|
||||
if (startTime==null){
|
||||
if (sdfmonth.parse(map.get("orderTime").toString()).getTime()<=sdfmonth.parse(month).getTime()){
|
||||
map.put("notyet",fee);
|
||||
}
|
||||
}else if (startTime.equals(endTime)){
|
||||
if (startTime.contains(month)){
|
||||
map.put("now",fee);
|
||||
} else if (sdfmonth.parse(startTime).getTime()<sdfmonth.parse(month).getTime()) {
|
||||
map.put("already",fee);
|
||||
}
|
||||
//摊销中
|
||||
}else if (sdfmonth.parse(day).getTime()>sdfmonth.parse(endTime).getTime()){
|
||||
map.put("already",fee);
|
||||
//未开始摊销
|
||||
}else if (sdfday.parse(day).getTime()<sdfday.parse(startTime).getTime()){
|
||||
if (sdfmonth.parse(map.get("orderTime").toString()).getTime()<=sdfmonth.parse(month).getTime()){
|
||||
map.put("notyet",fee);
|
||||
}
|
||||
}else {
|
||||
//总天数
|
||||
int totalDays = Math.toIntExact((sdfday.parse(endTime).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24)+1;
|
||||
//日摊销
|
||||
BigDecimal dayAmount = fee.divide(new BigDecimal(totalDays),2, BigDecimal.ROUND_HALF_UP);
|
||||
//已摊销天数
|
||||
int alreadyDays = Math.toIntExact((sdfmonth.parse(month).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24);
|
||||
if (alreadyDays>0){
|
||||
map.put("already",dayAmount.multiply(new BigDecimal(alreadyDays)));
|
||||
}else {
|
||||
alreadyDays = 0;
|
||||
}
|
||||
//当前月天数
|
||||
int nowDays = Integer.parseInt(day.substring(8, 10));
|
||||
BigDecimal now = BigDecimal.ZERO;
|
||||
//如果开始时间是当前月,月天数-开始日=当月摊销天数
|
||||
if (startTime.contains(month)){
|
||||
nowDays = Integer.parseInt(day.substring(8, 10))-Integer.parseInt(startTime.substring(8, 10))+1;
|
||||
now = dayAmount.multiply(new BigDecimal(nowDays));
|
||||
} else if (endTime.contains(month)) {
|
||||
now = fee.subtract(dayAmount.multiply(new BigDecimal(alreadyDays)));
|
||||
}else {
|
||||
now = dayAmount.multiply(new BigDecimal(nowDays));
|
||||
}
|
||||
map.put("now",now);
|
||||
//剩余未摊销
|
||||
map.put("notyet",fee.subtract(now).subtract(dayAmount.multiply(new BigDecimal(alreadyDays))));
|
||||
}
|
||||
}
|
||||
String fileName = params.get("year")+""+params.get("month")+"课程明细";
|
||||
XSSFWorkbook wb = new XSSFWorkbook();
|
||||
Sheet sheet = wb.createSheet(fileName);
|
||||
Row titleRow = sheet.createRow(0);
|
||||
titleRow.createCell(0).setCellValue("时间");
|
||||
titleRow.createCell(1).setCellValue("来源");
|
||||
titleRow.createCell(2).setCellValue("类型");
|
||||
titleRow.createCell(3).setCellValue("电话");
|
||||
titleRow.createCell(4).setCellValue("订单号");
|
||||
titleRow.createCell(5).setCellValue("缴费金额");
|
||||
titleRow.createCell(6).setCellValue("金额");
|
||||
titleRow.createCell(7).setCellValue("开始时间");
|
||||
titleRow.createCell(8).setCellValue("结束时间");
|
||||
titleRow.createCell(9).setCellValue("已摊销");
|
||||
titleRow.createCell(10).setCellValue("当前摊销");
|
||||
titleRow.createCell(11).setCellValue("剩余摊销");
|
||||
int cell = 1;
|
||||
for (Map<String,Object> map : result) {
|
||||
Row row = sheet.createRow(cell);
|
||||
row.createCell(0).setCellValue(map.get("orderTime").toString());
|
||||
row.createCell(1).setCellValue(map.get("source").toString());
|
||||
row.createCell(2).setCellValue(map.get("type").toString());
|
||||
row.createCell(3).setCellValue(map.get("tel").toString());
|
||||
row.createCell(4).setCellValue(map.get("order_sn").toString());
|
||||
row.createCell(5).setCellValue(map.get("realMoney").toString());
|
||||
row.createCell(6).setCellValue(map.get("fee").toString());
|
||||
row.createCell(7).setCellValue(map.get("startTime")==null?"":map.get("startTime").toString());
|
||||
row.createCell(8).setCellValue(map.get("endTime")==null?"":map.get("endTime").toString());
|
||||
row.createCell(9).setCellValue(map.get("already").toString());
|
||||
row.createCell(10).setCellValue(map.get("now").toString());
|
||||
row.createCell(11).setCellValue(map.get("notyet").toString());
|
||||
//序号自增
|
||||
cell++;
|
||||
}
|
||||
exportCommon(sheet ,ordersService.courseInfoExportList(params));
|
||||
exportTem(response,wb,fileName+".xlsx");
|
||||
return R.ok();
|
||||
}
|
||||
@@ -815,7 +474,7 @@ public class StatisticsController {
|
||||
//总天数
|
||||
int totalDays = Math.toIntExact((sdfday.parse(endTime).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24)+1;
|
||||
//日摊销
|
||||
BigDecimal dayAmount = fee.divide(new BigDecimal(totalDays),2, BigDecimal.ROUND_HALF_UP);
|
||||
BigDecimal dayAmount = fee.divide(new BigDecimal(totalDays),3, BigDecimal.ROUND_HALF_UP);
|
||||
//已摊销天数
|
||||
int alreadyDays = Math.toIntExact((sdfmonth.parse(month).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24);
|
||||
if (alreadyDays>0){
|
||||
@@ -827,7 +486,9 @@ public class StatisticsController {
|
||||
int nowDays = Integer.parseInt(day.substring(8, 10));
|
||||
BigDecimal now = BigDecimal.ZERO;
|
||||
//如果开始时间是当前月,月天数-开始日=当月摊销天数
|
||||
if (startTime.contains(month)){
|
||||
if (startTime.contains(month)&&endTime.contains(month)){
|
||||
now = fee;
|
||||
} else if (startTime.contains(month)){
|
||||
nowDays = Integer.parseInt(day.substring(8, 10))-Integer.parseInt(startTime.substring(8, 10))+1;
|
||||
now = dayAmount.multiply(new BigDecimal(nowDays));
|
||||
} else if (endTime.contains(month)) {
|
||||
@@ -859,39 +520,13 @@ public class StatisticsController {
|
||||
//实物明细导出
|
||||
@RequestMapping("/physicalInfoExport")
|
||||
public R physicalInfoExport(HttpServletResponse response,@RequestBody Map<String,Object> params){
|
||||
List<Map<String,Object>> coinInfoList = ordersService.listMaps(new MPJLambdaWrapper<Orders>()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.disableSubLogicDel()
|
||||
.eq(Orders::getUseFlag,1).eq(Orders::getType,3)
|
||||
.apply("DATE_FORMAT(t.order_time, '%Y-%m') = '"+params.get("year")+"-"+params.get("month")+"'")
|
||||
.select("DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') orderTime,if(source=0,'一路健康',if(source=1,'吴门医述','管理员')) source," +
|
||||
"IF(t.pay_type=1,'天医币',IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行'))) type,tel,order_sn,t.fee")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
List<Map<String,Object>> physicalInfoList = ordersService.physicalInfoExportList(params);
|
||||
String fileName = params.get("year")+""+params.get("month")+"实物明细";
|
||||
XSSFWorkbook wb = new XSSFWorkbook();
|
||||
Sheet sheet = wb.createSheet(fileName);
|
||||
Row titleRow = sheet.createRow(0);
|
||||
titleRow.createCell(0).setCellValue("时间");
|
||||
titleRow.createCell(1).setCellValue("来源");
|
||||
titleRow.createCell(2).setCellValue("类型");
|
||||
titleRow.createCell(3).setCellValue("电话");
|
||||
titleRow.createCell(4).setCellValue("订单号");
|
||||
titleRow.createCell(5).setCellValue("金额");
|
||||
int cell = 1;
|
||||
for (Map<String,Object> map : coinInfoList) {
|
||||
Row row = sheet.createRow(cell);
|
||||
row.createCell(0).setCellValue(map.get("orderTime").toString());
|
||||
row.createCell(1).setCellValue(map.get("source").toString());
|
||||
row.createCell(2).setCellValue(map.get("type").toString());
|
||||
row.createCell(3).setCellValue(map.get("tel").toString());
|
||||
row.createCell(4).setCellValue(map.get("order_sn").toString());
|
||||
row.createCell(5).setCellValue(map.get("fee").toString());
|
||||
//序号自增
|
||||
cell++;
|
||||
}
|
||||
exportCommon(sheet,physicalInfoList);
|
||||
exportTem(response,wb,fileName+".xlsx");
|
||||
return R.ok().put("infoList",coinInfoList);
|
||||
return R.ok().put("infoList",physicalInfoList);
|
||||
}
|
||||
|
||||
//培训班
|
||||
@@ -910,39 +545,13 @@ public class StatisticsController {
|
||||
//培训班明细导出
|
||||
@RequestMapping("/trainingClassInfoExport")
|
||||
public R trainingClassInfoExport(HttpServletResponse response,@RequestBody Map<String,Object> params){
|
||||
List<Map<String,Object>> coinInfoList = ordersService.listMaps(new MPJLambdaWrapper<Orders>()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.disableSubLogicDel()
|
||||
.eq(Orders::getUseFlag,1).eq(Orders::getType,4)
|
||||
.apply("DATE_FORMAT(t.order_time, '%Y-%m') = '"+params.get("year")+"-"+params.get("month")+"'")
|
||||
.select("DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') orderTime,if(source=0,'一路健康',if(source=1,'吴门医述','管理员')) source," +
|
||||
"IF(t.pay_type=1,'天医币',IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行'))) type,tel,order_sn,t.fee")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
List<Map<String,Object>> trainingClassInfoList = ordersService.trainingClassInfoExportList(params);
|
||||
String fileName = params.get("year")+""+params.get("month")+"培训班明细";
|
||||
XSSFWorkbook wb = new XSSFWorkbook();
|
||||
Sheet sheet = wb.createSheet(fileName);
|
||||
Row titleRow = sheet.createRow(0);
|
||||
titleRow.createCell(0).setCellValue("时间");
|
||||
titleRow.createCell(1).setCellValue("来源");
|
||||
titleRow.createCell(2).setCellValue("支付类型");
|
||||
titleRow.createCell(3).setCellValue("电话");
|
||||
titleRow.createCell(4).setCellValue("订单号");
|
||||
titleRow.createCell(5).setCellValue("金额");
|
||||
int cell = 1;
|
||||
for (Map<String,Object> map : coinInfoList) {
|
||||
Row row = sheet.createRow(cell);
|
||||
row.createCell(0).setCellValue(map.get("orderTime").toString());
|
||||
row.createCell(1).setCellValue(map.get("source").toString());
|
||||
row.createCell(2).setCellValue(map.get("type").toString());
|
||||
row.createCell(3).setCellValue(map.get("tel").toString());
|
||||
row.createCell(4).setCellValue(map.get("order_sn").toString());
|
||||
row.createCell(5).setCellValue(map.get("fee").toString());
|
||||
//序号自增
|
||||
cell++;
|
||||
}
|
||||
exportCommon(sheet,trainingClassInfoList);
|
||||
exportTem(response,wb,fileName+".xlsx");
|
||||
return R.ok().put("infoList",coinInfoList);
|
||||
return R.ok().put("infoList",trainingClassInfoList);
|
||||
}
|
||||
|
||||
public void exportTem(HttpServletResponse response, XSSFWorkbook wb, String fileName){
|
||||
|
||||
@@ -3,6 +3,10 @@ package com.zmzm.finance.common.service;
|
||||
import com.zmzm.finance.common.entity.Orders;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 订单表,从我们各个系统读取的数据 服务类
|
||||
@@ -17,4 +21,14 @@ public interface IOrdersService extends IService<Orders> {
|
||||
|
||||
void updatePoint(Integer ordersId);
|
||||
|
||||
List<Map<String,Object>> coinInfoExportList(Map<String,Object> params);
|
||||
|
||||
List<Map<String,Object>> vipInfoExportList(Map<String,Object> params) throws ParseException;
|
||||
|
||||
List<Map<String,Object>> courseInfoExportList(Map<String,Object> params) throws ParseException;
|
||||
|
||||
List<Map<String,Object>> physicalInfoExportList(Map<String,Object> params);
|
||||
|
||||
List<Map<String,Object>> trainingClassInfoExportList(Map<String,Object> params);
|
||||
|
||||
}
|
||||
|
||||
@@ -2,19 +2,23 @@ package com.zmzm.finance.common.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||
import com.zmzm.finance.common.dao.BuyOrderMapper;
|
||||
import com.zmzm.finance.common.dao.TCustomerApplyBuyMapper;
|
||||
import com.zmzm.finance.common.dao.UserMapper;
|
||||
import com.zmzm.finance.common.dao.*;
|
||||
import com.zmzm.finance.common.entity.*;
|
||||
import com.zmzm.finance.common.dao.OrdersMapper;
|
||||
import com.zmzm.finance.common.service.IOrdersService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.apache.commons.lang.time.DateUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.YearMonth;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@@ -30,9 +34,13 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> impleme
|
||||
@Autowired
|
||||
private BuyOrderMapper buyOrderMapper;
|
||||
@Autowired
|
||||
private TCustomerApplyBuyMapper customerApplyBuyMapper;
|
||||
@Autowired
|
||||
private UserMapper userMapper;
|
||||
@Autowired
|
||||
private FinanceOrderMapper financeOrderMapper;
|
||||
@Autowired
|
||||
private TCustomerApplyCurriculumMapper customerApplyCurriculumMapper;
|
||||
@Autowired
|
||||
private TCustomerTaihuClassMapper customerTaihuClassMapper;
|
||||
|
||||
@Override
|
||||
public void importWumenOrder() {
|
||||
@@ -119,4 +127,383 @@ public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> impleme
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Map<String, Object>> coinInfoExportList(Map<String, Object> params) {
|
||||
List<Map<String,Object>> coinInfoList = this.baseMapper.selectMaps(new MPJLambdaWrapper<Orders>()
|
||||
.disableSubLogicDel()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.eq(Orders::getUseFlag,1).and(t->t.eq(Orders::getType,0).or().eq(Orders::getPayType,1))
|
||||
.apply("DATE_FORMAT(t.order_time, '%Y-%m') = '"+params.get("year")+"-"+params.get("month")+"'")
|
||||
.select("DATE_FORMAT(t.order_time, '%Y-%m-%d %H:%i:%s') 01时间,if(t.source=0,'一路健康',if(t.source=1,'吴门医述','管理员')) 02来源," +
|
||||
"IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行')) 03支付方式,t.tel 04电话,t.order_sn 05订单号," +
|
||||
"if(t.type=0,'充值',IF(t.type=1,'vip',IF(t.type=2,'课程',IF(t.type=3,'实物','培训班')))) 06类型, +t.fee 07金额,t.point 08充值天医币")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
return coinInfoList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Map<String, Object>> vipInfoExportList(Map<String, Object> params) throws ParseException {
|
||||
String date = params.get("year")+"-"+params.get("month");
|
||||
List<Map<String,Object>> vipOrders = this.baseMapper.selectMaps(new MPJLambdaWrapper<Orders>()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.disableSubLogicDel()
|
||||
.eq(Orders::getUseFlag,1).eq(Orders::getType,1)
|
||||
.select("DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') orderTime,if(source=0,'一路健康',if(source=1,'吴门医述','管理员')) source,order_old_id orderOldId," +
|
||||
"IF(t.pay_type=1,'天医币',IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行'))) type,tel,order_sn,t.fee realMoney")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
//吴门医述订单
|
||||
List<String> wumenOrderIds = vipOrders.stream().filter(o -> o.get("source").equals("吴门医述"))
|
||||
.map(map->map.get("orderOldId").toString()).collect(Collectors.toList());
|
||||
List<Map<String,Object>> buyOrders = buyOrderMapper.selectMaps(new MPJLambdaWrapper<BuyOrder>()
|
||||
.leftJoin(UserVipLog.class,UserVipLog::getOrderSn,BuyOrder::getOrderSn)
|
||||
.leftJoin(UserVip.class,UserVip::getId,UserVipLog::getUserVipId)
|
||||
.disableSubLogicDel()
|
||||
.in(BuyOrder::getOrderId,wumenOrderIds)
|
||||
.select("t.order_id oid,if(t2.type=4,'中医学vip',if(t2.type=5,'针灸学vip',if(t2.type=6,'肿瘤学vip',if(t2.type=7,'国学vip',if(t2.type=8,'心理学vip',if(t2.type=9,'中西汇通vip','其他')))))) vipType," +
|
||||
"t1.price fee,DATE_FORMAT(t1.start_time, '%Y-%m-%d') startTime,DATE_FORMAT(t1.end_time, '%Y-%m-%d') endTime"));
|
||||
Map<String,Object> buyOrdersMap = new HashMap<>();
|
||||
for (Map<String,Object> m : buyOrders) {
|
||||
List<Map<String,Object>> l = new ArrayList<>();
|
||||
if(buyOrdersMap.get(m.get("oid").toString())!=null){
|
||||
l = (List<Map<String, Object>>) buyOrdersMap.get(m.get("oid").toString());
|
||||
}
|
||||
l.add(m);
|
||||
buyOrdersMap.put(m.get("oid").toString(),l);
|
||||
}
|
||||
YearMonth yearMonth = YearMonth.parse(date);
|
||||
SimpleDateFormat sdfday = new SimpleDateFormat("yyyy-MM-dd");
|
||||
SimpleDateFormat sdfmonth = new SimpleDateFormat("yyyy-MM");
|
||||
String day = date+"-"+yearMonth.lengthOfMonth();
|
||||
String month = date;
|
||||
List<Map<String,Object>> result = new ArrayList<>();
|
||||
for(Map<String,Object> vipOrder:vipOrders){
|
||||
if (vipOrder.get("source").equals("吴门医述")){
|
||||
List<Map<String,Object>> l = (List<Map<String, Object>>) buyOrdersMap.get(vipOrder.get("orderOldId"));
|
||||
for (Map<String,Object> m : l) {
|
||||
Map<String,Object> res = new HashMap<>();
|
||||
if (m.get("fee")!=null){
|
||||
res.put("fee",m.get("fee"));
|
||||
res.put("startTime",m.get("startTime"));
|
||||
res.put("endTime",m.get("endTime"));
|
||||
}else {
|
||||
res.put("fee",vipOrder.get("realMoney"));
|
||||
res.put("startTime",vipOrder.get("orderTime"));
|
||||
res.put("endTime",vipOrder.get("orderTime"));
|
||||
}
|
||||
res.put("vipType",m.get("vipType"));
|
||||
res.putAll(vipOrder);
|
||||
result.add(res);
|
||||
}
|
||||
}else {
|
||||
FinanceOrder financeOrder = financeOrderMapper.selectById(vipOrder.get("orderOldId").toString());
|
||||
vipOrder.put("fee",financeOrder.getRealMoney());
|
||||
vipOrder.put("startTime",sdfday.format(financeOrder.getStartTime()));
|
||||
vipOrder.put("endTime",sdfday.format(financeOrder.getEndTime()));
|
||||
vipOrder.put("vipType",financeOrder.getProductName());
|
||||
result.add(vipOrder);
|
||||
}
|
||||
}
|
||||
for (Map<String,Object> map:result){
|
||||
map.put("now",BigDecimal.ZERO);
|
||||
map.put("already",BigDecimal.ZERO);
|
||||
map.put("notyet",BigDecimal.ZERO);
|
||||
BigDecimal fee = (BigDecimal) map.get("fee");
|
||||
String startTime = (String) map.get("startTime");
|
||||
String endTime = (String) map.get("endTime");
|
||||
if (startTime.equals(endTime)){
|
||||
if (map.get("orderTime").toString().contains(month)){
|
||||
map.put("now",fee);
|
||||
} else if (sdfmonth.parse(startTime).getTime()<sdfmonth.parse(month).getTime()) {
|
||||
map.put("already",fee);
|
||||
}
|
||||
//摊销完成
|
||||
}else if (sdfmonth.parse(day).getTime()>sdfmonth.parse(endTime).getTime()){
|
||||
map.put("already",fee);
|
||||
//未开始摊销
|
||||
}else if (sdfday.parse(day).getTime()<sdfday.parse(startTime).getTime()){
|
||||
if (sdfmonth.parse(map.get("orderTime").toString()).getTime()<=sdfmonth.parse(month).getTime()){
|
||||
map.put("notyet",fee);
|
||||
}
|
||||
//摊销中
|
||||
}else {
|
||||
//总天数
|
||||
int totalDays = Math.toIntExact((sdfday.parse(endTime).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24)+1;
|
||||
//日摊销
|
||||
BigDecimal dayAmount = fee.divide(new BigDecimal(totalDays),2, BigDecimal.ROUND_HALF_UP);
|
||||
//已摊销天数
|
||||
int alreadyDays = Math.toIntExact((sdfmonth.parse(month).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24);
|
||||
if (alreadyDays>0){
|
||||
map.put("already",dayAmount.multiply(new BigDecimal(alreadyDays)));
|
||||
}else {
|
||||
alreadyDays = 0;
|
||||
}
|
||||
//当前月天数
|
||||
int nowDays = Integer.parseInt(day.substring(8, 10));
|
||||
BigDecimal now = BigDecimal.ZERO;
|
||||
//如果开始时间是当前月,月天数-开始日=当月摊销天数
|
||||
if (startTime.contains(month)){
|
||||
nowDays = Integer.parseInt(day.substring(8, 10))-Integer.parseInt(startTime.substring(8, 10))+1;
|
||||
now = dayAmount.multiply(new BigDecimal(nowDays));
|
||||
} else if (endTime.contains(month)) {
|
||||
now = fee.subtract(dayAmount.multiply(new BigDecimal(alreadyDays)));
|
||||
}else {
|
||||
now = dayAmount.multiply(new BigDecimal(nowDays));
|
||||
}
|
||||
map.put("now",now);
|
||||
//剩余未摊销
|
||||
map.put("notyet",fee.subtract(now).subtract(dayAmount.multiply(new BigDecimal(alreadyDays))));
|
||||
}
|
||||
}
|
||||
List<Map<String,Object>> exportList = new ArrayList<>();
|
||||
for (Map<String,Object> map:result){
|
||||
Map<String,Object> m = new HashMap<>();
|
||||
m.put("01时间",map.get("orderTime"));
|
||||
m.put("02来源",map.get("source"));
|
||||
m.put("03类型",map.get("type"));
|
||||
m.put("04电话",map.get("tel"));
|
||||
m.put("05订单编号",map.get("order_sn"));
|
||||
m.put("06订单金额",map.get("realMoney"));
|
||||
m.put("07金额",map.get("fee"));
|
||||
m.put("08VIP类型",map.get("vipType"));
|
||||
m.put("09开始时间",map.get("startTime"));
|
||||
m.put("10结束时间",map.get("endTime"));
|
||||
m.put("11已摊销",map.get("already"));
|
||||
m.put("12当前摊销",map.get("now"));
|
||||
m.put("13剩余摊销",map.get("notyet"));
|
||||
exportList.add(m);
|
||||
}
|
||||
return exportList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Map<String, Object>> courseInfoExportList(Map<String, Object> params) throws ParseException {
|
||||
String date = params.get("year")+"-"+params.get("month");
|
||||
//所有课程订单
|
||||
List<Map<String,Object>> courseOrders = this.baseMapper.selectMaps(new MPJLambdaWrapper<Orders>()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.disableSubLogicDel()
|
||||
.eq(Orders::getUseFlag,1).eq(Orders::getType,2)
|
||||
.select("DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') orderTime,if(source=0,'一路健康',if(source=1,'吴门医述','管理员')) source,order_old_id orderOldId," +
|
||||
"IF(t.pay_type=1,'天医币',IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行'))) type,tel,order_sn,t.fee realMoney")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
//一路健康订单课程
|
||||
List<String> taihuOrderIds = courseOrders.stream().filter(o -> o.get("source").equals("一路健康"))
|
||||
.map(map->map.get("orderOldId").toString()).collect(Collectors.toList());
|
||||
Map<String,Map<String,Object>> taihuClassMap = customerApplyCurriculumMapper.selectMaps(new MPJLambdaWrapper<TCustomerApplyCurriculum>()
|
||||
.in("t.oid", taihuOrderIds)
|
||||
.apply("t.valid=1 and t.status = '50'")
|
||||
.select("t.oid,if(t.point>0,t.point,t.money) fee,curriculumID"))
|
||||
.stream().collect(Collectors.toMap(m -> m.get("oid").toString(), m -> m));
|
||||
//订单开课记录
|
||||
Map<String,Map<String,Object>> ctc = customerTaihuClassMapper.selectMaps(new MPJLambdaWrapper<TCustomerTaihuClass>()
|
||||
.like(TCustomerTaihuClass::getDescription,"KC20")
|
||||
.in(TCustomerTaihuClass::getStatus,10)
|
||||
.gt(TCustomerTaihuClass::getStudydays,0)
|
||||
.select("SUBSTRING(description, LOCATE('KC', description), 16) description,oid,DATE_FORMAT(startDate, '%Y-%m-%d') startDate,studyDays"))
|
||||
.stream().collect(Collectors.toMap(m -> m.get("description").toString()+"-"+m.get("oid").toString(), m -> m));
|
||||
//吴门医述订单课程
|
||||
List<String> wumenOrderIds = courseOrders.stream().filter(o -> o.get("source").equals("吴门医述"))
|
||||
.map(map->map.get("orderOldId").toString()).collect(Collectors.toList());
|
||||
List<Map<String,Object>> buyOrdersList = buyOrderMapper.selectMaps(new MPJLambdaWrapper<BuyOrder>()
|
||||
.leftJoin("user_course_buy_log t1 on (t1.order_sn = t.order_sn )")
|
||||
.leftJoin("user_course_buy t2 on t2.id = t1.user_course_buy_id")
|
||||
.in("t.order_id",wumenOrderIds)
|
||||
.gt(BuyOrder::getRealMoney,0)
|
||||
.select("t.order_id oid,t1.id ucblid,if(t1.fee is null,t.real_money,t1.fee) fee,t1.days,t1.begin_day," +
|
||||
"DATE_FORMAT(t2.start_time, '%Y-%m-%d %H:%i:%s') startTime,t.order_sn"));
|
||||
Map<String,Object> buyOrdersMap = new HashMap<>();
|
||||
for (Map<String,Object> m : buyOrdersList) {
|
||||
List<Map<String,Object>> l = new ArrayList<>();
|
||||
if(buyOrdersMap.get(m.get("oid").toString())!=null){
|
||||
l = (List<Map<String, Object>>) buyOrdersMap.get(m.get("oid").toString());
|
||||
}
|
||||
l.add(m);
|
||||
buyOrdersMap.put(m.get("oid").toString(),l);
|
||||
}
|
||||
YearMonth yearMonth = YearMonth.parse(date);
|
||||
SimpleDateFormat sdfday = new SimpleDateFormat("yyyy-MM-dd");
|
||||
SimpleDateFormat sdfmonth = new SimpleDateFormat("yyyy-MM");
|
||||
String day = date+"-"+yearMonth.lengthOfMonth();
|
||||
String month = date;
|
||||
List<Map<String,Object>> result = new ArrayList<>();
|
||||
for(Map<String,Object> courseOrder:courseOrders){
|
||||
String orderTime = courseOrder.get("orderTime").toString().substring(0,10);
|
||||
if (courseOrder.get("source").equals("一路健康")){
|
||||
Map<String,Object> res = new HashMap<>();
|
||||
Map<String,Object> taihuClass = taihuClassMap.get(courseOrder.get("orderOldId").toString());
|
||||
Map<String, Object> tc = ctc.entrySet().stream().filter(e -> e.getKey()
|
||||
.contains(taihuClass.get("curriculumID").toString())).map(Map.Entry::getValue).findFirst().orElse(null);
|
||||
res.put("fee",courseOrder.get("realMoney"));
|
||||
if (tc != null&&tc.get("startDate")!=null) {
|
||||
res.put("startTime",tc.get("startDate"));
|
||||
res.put("endTime",sdfday.format(DateUtils.addDays(sdfday.parse(tc.get("startDate").toString()), (Integer) tc.get("studyDays"))));
|
||||
}else {
|
||||
res.put("startTime",orderTime);
|
||||
res.put("endTime",orderTime);
|
||||
}
|
||||
res.putAll(courseOrder);
|
||||
result.add(res);
|
||||
}else if(courseOrder.get("source").equals("吴门医述")){
|
||||
List<Map<String,Object>> l = (List<Map<String, Object>>) buyOrdersMap.get(courseOrder.get("orderOldId"));
|
||||
if (l!=null){
|
||||
for (int i=0;i<l.size();i++) {
|
||||
Map<String,Object> res = new HashMap<>();
|
||||
Map<String,Object> m = l.get(i);
|
||||
if (m.get("ucblid")!=null){
|
||||
if (new BigDecimal(m.get("fee").toString()).compareTo(BigDecimal.ZERO)>0){
|
||||
res.put("fee",m.get("fee"));
|
||||
}else {
|
||||
BigDecimal one = new BigDecimal(courseOrder.get("realMoney").toString()).divide(new BigDecimal(l.size()),2,BigDecimal.ROUND_HALF_UP);
|
||||
if (i==l.size()-1){
|
||||
res.put("fee",new BigDecimal(courseOrder.get("realMoney").toString()).subtract(one.multiply(new BigDecimal(l.size()-1))));
|
||||
}else {
|
||||
res.put("fee",one);
|
||||
}
|
||||
}
|
||||
if (m.get("startTime")==null){
|
||||
res.put("startTime",null);
|
||||
res.put("endTime",null);
|
||||
}else {
|
||||
if (Integer.parseInt(m.get("begin_day").toString())==0){
|
||||
res.put("startTime",m.get("startTime").toString());
|
||||
res.put("endTime",sdfday.format(DateUtils.addDays(sdfday.parse(m.get("startTime").toString()),
|
||||
Integer.parseInt(m.get("days").toString())-1)));
|
||||
}else {
|
||||
res.put("startTime",sdfday.format(DateUtils.addDays(sdfday.parse(m.get("startTime").toString()),
|
||||
Integer.parseInt(m.get("days").toString()))));
|
||||
res.put("endTime",sdfday.format(DateUtils.addDays(sdfday.parse(res.get("startTime").toString()),
|
||||
Integer.parseInt(m.get("days").toString())-1)));
|
||||
}
|
||||
}
|
||||
}else {
|
||||
res.put("fee",courseOrder.get("realMoney"));
|
||||
res.put("startTime",orderTime);
|
||||
res.put("endTime",orderTime);
|
||||
}
|
||||
res.putAll(courseOrder);
|
||||
result.add(res);
|
||||
}
|
||||
}else {
|
||||
Map<String,Object> res = new HashMap<>();
|
||||
res.put("fee",courseOrder.get("realMoney"));
|
||||
res.put("startTime",orderTime);
|
||||
res.put("endTime",orderTime);
|
||||
res.putAll(courseOrder);
|
||||
result.add(res);
|
||||
}
|
||||
}else {
|
||||
FinanceOrder financeOrder = financeOrderMapper.selectById(courseOrder.get("orderOldId").toString());
|
||||
courseOrder.put("fee",financeOrder.getRealMoney());
|
||||
courseOrder.put("startTime",sdfday.format(financeOrder.getStartTime()));
|
||||
courseOrder.put("endTime",sdfday.format(financeOrder.getEndTime()));
|
||||
result.add(courseOrder);
|
||||
}
|
||||
}
|
||||
for (Map<String,Object> map:result) {
|
||||
map.put("now", BigDecimal.ZERO);
|
||||
map.put("already", BigDecimal.ZERO);
|
||||
map.put("notyet", BigDecimal.ZERO);
|
||||
BigDecimal fee = (BigDecimal) map.get("fee");
|
||||
String startTime = (String) map.get("startTime");
|
||||
String endTime = (String) map.get("endTime");
|
||||
if (startTime==null){
|
||||
if (sdfmonth.parse(map.get("orderTime").toString()).getTime()<=sdfmonth.parse(month).getTime()){
|
||||
map.put("notyet",fee);
|
||||
}
|
||||
}else if (startTime.equals(endTime)){
|
||||
if (startTime.contains(month)){
|
||||
map.put("now",fee);
|
||||
} else if (sdfmonth.parse(startTime).getTime()<sdfmonth.parse(month).getTime()) {
|
||||
map.put("already",fee);
|
||||
}
|
||||
//摊销中
|
||||
}else if (sdfmonth.parse(day).getTime()>sdfmonth.parse(endTime).getTime()){
|
||||
map.put("already",fee);
|
||||
//未开始摊销
|
||||
}else if (sdfday.parse(day).getTime()<sdfday.parse(startTime).getTime()){
|
||||
if (sdfmonth.parse(map.get("orderTime").toString()).getTime()<=sdfmonth.parse(month).getTime()){
|
||||
map.put("notyet",fee);
|
||||
}
|
||||
}else {
|
||||
//总天数
|
||||
int totalDays = Math.toIntExact((sdfday.parse(endTime).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24)+1;
|
||||
//日摊销
|
||||
BigDecimal dayAmount = fee.divide(new BigDecimal(totalDays),3, BigDecimal.ROUND_HALF_UP);
|
||||
//已摊销天数
|
||||
int alreadyDays = Math.toIntExact((sdfmonth.parse(month).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24);
|
||||
if (alreadyDays>0){
|
||||
map.put("already",dayAmount.multiply(new BigDecimal(alreadyDays)));
|
||||
}else {
|
||||
alreadyDays = 0;
|
||||
}
|
||||
//当前月天数
|
||||
int nowDays = Integer.parseInt(day.substring(8, 10));
|
||||
BigDecimal now = BigDecimal.ZERO;
|
||||
//如果开始时间是当前月,月天数-开始日=当月摊销天数
|
||||
if (startTime.contains(month)&&endTime.contains(month)){
|
||||
now = fee;
|
||||
} else if (startTime.contains(month)){
|
||||
nowDays = Integer.parseInt(day.substring(8, 10))-Integer.parseInt(startTime.substring(8, 10))+1;
|
||||
now = dayAmount.multiply(new BigDecimal(nowDays));
|
||||
} else if (endTime.contains(month)) {
|
||||
now = fee.subtract(dayAmount.multiply(new BigDecimal(alreadyDays)));
|
||||
}else {
|
||||
now = dayAmount.multiply(new BigDecimal(nowDays));
|
||||
}
|
||||
map.put("now",now);
|
||||
//剩余未摊销
|
||||
map.put("notyet",fee.subtract(now).subtract(dayAmount.multiply(new BigDecimal(alreadyDays))));
|
||||
}
|
||||
}
|
||||
List<Map<String,Object>> exportList = new ArrayList<>();
|
||||
for (Map<String,Object> map:result){
|
||||
Map<String,Object> m = new HashMap<>();
|
||||
m.put("01时间",map.get("orderTime"));
|
||||
m.put("02来源",map.get("source"));
|
||||
m.put("03类型",map.get("type"));
|
||||
m.put("04电话",map.get("tel"));
|
||||
m.put("05订单编号",map.get("order_sn"));
|
||||
m.put("06订单金额",map.get("realMoney"));
|
||||
m.put("07金额",map.get("fee"));
|
||||
m.put("09开始时间",map.get("startTime")==null?"":map.get("startTime").toString());
|
||||
m.put("10结束时间",map.get("endTime")==null?"":map.get("endTime").toString());
|
||||
m.put("11已摊销",map.get("already"));
|
||||
m.put("12当前摊销",map.get("now"));
|
||||
m.put("13剩余摊销",map.get("notyet"));
|
||||
exportList.add(m);
|
||||
}
|
||||
return exportList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Map<String, Object>> physicalInfoExportList(Map<String, Object> params) {
|
||||
List<Map<String,Object>> physicalInfoList = this.baseMapper.selectMaps(new MPJLambdaWrapper<Orders>()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.disableSubLogicDel()
|
||||
.eq(Orders::getUseFlag,1).eq(Orders::getType,3)
|
||||
.apply("DATE_FORMAT(t.order_time, '%Y-%m') = '"+params.get("year")+"-"+params.get("month")+"'")
|
||||
.select("DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') 01时间,if(source=0,'一路健康',if(source=1,'吴门医述','管理员')) 02来源," +
|
||||
"IF(t.pay_type=1,'天医币',IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行'))) 03类型,tel 04电话,order_sn 05订单号,t.fee 06金额")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
return physicalInfoList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Map<String, Object>> trainingClassInfoExportList(Map<String, Object> params) {
|
||||
List<Map<String,Object>> trainingClassInfoList = this.baseMapper.selectMaps(new MPJLambdaWrapper<Orders>()
|
||||
.leftJoin(PaymentToOrder.class,PaymentToOrder::getOrderId,Orders::getId)
|
||||
.leftJoin(Payment.class,Payment::getId,PaymentToOrder::getPaymentId)
|
||||
.disableSubLogicDel()
|
||||
.eq(Orders::getUseFlag,1).eq(Orders::getType,4)
|
||||
.apply("DATE_FORMAT(t.order_time, '%Y-%m') = '"+params.get("year")+"-"+params.get("month")+"'")
|
||||
.select("DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') 01时间,if(source=0,'一路健康',if(source=1,'吴门医述','管理员')) 02来源," +
|
||||
"IF(t.pay_type=1,'天医币',IF(t2.type=0,'微信',IF(t2.type=1,'支付宝','银行'))) 03支付类型,tel 04电话,order_sn 05订单号,t.fee 06金额")
|
||||
.orderByAsc(Orders::getOrderTime));
|
||||
return trainingClassInfoList;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user