package com.stylefeng.guns.modular.system.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
import com.stylefeng.guns.core.util.ToolUtil;
|
import com.stylefeng.guns.modular.call.model.OrderCall;
|
import com.stylefeng.guns.modular.call.server.IOrderCallService;
|
import com.stylefeng.guns.modular.crossCity.model.Line;
|
import com.stylefeng.guns.modular.crossCity.model.OrderCrossCity;
|
import com.stylefeng.guns.modular.crossCity.server.ILineService;
|
import com.stylefeng.guns.modular.crossCity.server.IOrderCrossCityService;
|
import com.stylefeng.guns.modular.smallLogistics.model.OrderLogistics;
|
import com.stylefeng.guns.modular.smallLogistics.server.IOrderLogisticsService;
|
import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
|
import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
|
import com.stylefeng.guns.modular.system.dao.IncomeMapper;
|
import com.stylefeng.guns.modular.system.model.Company;
|
import com.stylefeng.guns.modular.system.model.Driver;
|
import com.stylefeng.guns.modular.system.model.Income;
|
import com.stylefeng.guns.modular.system.service.ICompanyService;
|
import com.stylefeng.guns.modular.system.service.IDriverService;
|
import com.stylefeng.guns.modular.system.service.IIncomeService;
|
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
|
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.math.MathContext;
|
import java.math.RoundingMode;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
|
@Service
|
public class IncomeServiceImpl extends ServiceImpl<IncomeMapper, Income> implements IIncomeService {
|
|
@Autowired
|
private ICompanyService companyService;
|
|
@Autowired
|
private IOrderPrivateCarService orderPrivateCarService;
|
|
@Autowired
|
private IOrderTaxiService orderTaxiService;
|
|
@Autowired
|
private IOrderCrossCityService orderCrossCityService;
|
|
@Autowired
|
private ILineService lineService;
|
|
@Autowired
|
private IOrderLogisticsService orderLogisticsService;
|
|
@Autowired
|
private IOrderCallService orderCallService;
|
|
@Autowired
|
private IDriverService driverService;
|
|
|
|
|
|
|
/**
|
* 添加数据
|
* @param userType
|
* @param objectId
|
* @param type
|
* @param incomeId
|
* @param money
|
* @throws Exception
|
*/
|
@Override
|
public void saveData(Integer userType, Integer objectId, Integer type, Integer incomeId, Integer orderType, Double money) throws Exception {
|
Income income = new Income();
|
income.setUserType(userType);
|
income.setObjectId(objectId);
|
income.setType(type);
|
income.setIncomeId(incomeId);
|
income.setOrderType(orderType);
|
income.setMoney(new BigDecimal(money).setScale(2, RoundingMode.HALF_EVEN).doubleValue());
|
income.setInsertTime(new Date());
|
income.setActivityType(2);
|
this.insert(income);
|
}
|
|
|
|
@Override
|
public Map<String, Object> saveIncome(Integer orderId, Integer orderType, Double payMoney) throws Exception {
|
Company company = null;
|
Integer orderNumber = 0;
|
Integer driverId = null;
|
JSONObject jsonObject = null;
|
JSONArray rules = null;
|
JSONArray time_rules = null;
|
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
|
String startTime = sdf1.format(new Date()) + " 00:00:00";
|
String endTime = sdf1.format(new Date()) + " 23:59:59";
|
Map<String, Object> map = new HashMap<>();
|
switch (orderType){
|
case 1:
|
OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
|
driverId = orderPrivateCar.getDriverId();
|
company = companyService.selectById(orderPrivateCar.getCompanyId());
|
jsonObject = JSON.parseObject(company.getSpe());
|
rules = jsonObject.getJSONArray("rules");
|
time_rules = jsonObject.getJSONArray("time_rules");
|
//按天查询当天的订单量
|
//按时间段
|
if(time_rules.size() > 0){
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
for (int i = 0; i < time_rules.size(); i++) {
|
JSONArray jsonArray = time_rules.getJSONArray(i);
|
JSONObject jsonObject2 = jsonArray.getJSONObject(0);
|
String time = jsonObject2.getString("time");
|
if( ToolUtil.isNotEmpty(time)){
|
String[] split = time.split(" - ");
|
Date start = sdf.parse(split[0] + " 00:00:00");
|
Date end = sdf.parse(split[1] + " 23:59:59");
|
if(System.currentTimeMillis() >= start.getTime() && System.currentTimeMillis() < end.getTime()){
|
startTime = split[0] + " 00:00:00";
|
endTime = split[1] + " 23:59:59";
|
break;
|
}
|
}
|
}
|
}
|
orderNumber = orderPrivateCarService.selectCount(new EntityWrapper<OrderPrivateCar>()
|
.eq("driverId", orderPrivateCar.getDriverId())
|
.eq("isDelete", 1)
|
.in("state", Arrays.asList(7, 8, 9))
|
.last(" and DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i%m') between '" + startTime + "' and '" + endTime + "'")
|
);
|
map.put("orderNumber", orderNumber);
|
map.put("disposition", company.getSpe());
|
break;
|
case 2:
|
OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
|
driverId = orderTaxi.getDriverId();
|
company = companyService.selectById(orderTaxi.getCompanyId());
|
jsonObject = JSON.parseObject(company.getTaxi());
|
rules = jsonObject.getJSONArray("rules");
|
time_rules = jsonObject.getJSONArray("time_rules");
|
//按天查询当天的订单量
|
//按时间段
|
if(time_rules.size() > 0){
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
for (int i = 0; i < time_rules.size(); i++) {
|
JSONArray jsonArray = time_rules.getJSONArray(i);
|
JSONObject jsonObject2 = jsonArray.getJSONObject(0);
|
String time = jsonObject2.getString("time");
|
if(ToolUtil.isNotEmpty(time)){
|
String[] split = time.split(" - ");
|
Date start = sdf.parse(split[0] + " 00:00:00");
|
Date end = sdf.parse(split[1] + " 23:59:59");
|
if(System.currentTimeMillis() >= start.getTime() && System.currentTimeMillis() < end.getTime()){
|
startTime = split[0] + " 00:00:00";
|
endTime = split[1] + " 23:59:59";
|
break;
|
}
|
}
|
}
|
}
|
orderNumber = orderTaxiService.selectCount(new EntityWrapper<OrderTaxi>()
|
.eq("driverId", orderTaxi.getDriverId())
|
.eq("isDelete", 1)
|
.in("state", Arrays.asList(7, 8, 9))
|
.last(" and DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i%m') between '" + startTime + "' and '" + endTime + "'")
|
);
|
map.put("orderNumber", orderNumber);
|
map.put("disposition", company.getTaxi());
|
break;
|
case 3:
|
OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
|
Line line = lineService.selectById(orderCrossCity.getLineId());
|
driverId = orderCrossCity.getDriverId();
|
jsonObject = JSON.parseObject(line.getOutSetting());
|
rules = jsonObject.getJSONArray("rules");
|
time_rules = jsonObject.getJSONArray("time_rules");
|
//按天查询当天的订单量
|
//按时间段
|
if(time_rules.size() > 0){
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
for (int i = 0; i < time_rules.size(); i++) {
|
JSONArray jsonArray = time_rules.getJSONArray(i);
|
JSONObject jsonObject2 = jsonArray.getJSONObject(0);
|
String time = jsonObject2.getString("time");
|
if(ToolUtil.isNotEmpty(time)){
|
String[] split = time.split(" - ");
|
Date start = sdf.parse(split[0] + " 00:00:00");
|
Date end = sdf.parse(split[1] + " 23:59:59");
|
if(System.currentTimeMillis() >= start.getTime() && System.currentTimeMillis() < end.getTime()){
|
startTime = split[0] + " 00:00:00";
|
endTime = split[1] + " 23:59:59";
|
break;
|
}
|
}
|
}
|
}
|
orderNumber = orderCrossCityService.selectCount(new EntityWrapper<OrderCrossCity>()
|
.eq("driverId", orderCrossCity.getDriverId())
|
.eq("isDelete", 1)
|
.in("state", Arrays.asList(8, 9))
|
.last(" and DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i%m') between '" + startTime + "' and '" + endTime + "'")
|
);
|
map.put("orderNumber", orderNumber);
|
map.put("disposition", line.getOutSetting());
|
break;
|
case 4:
|
OrderLogistics orderLogistics = orderLogisticsService.selectById(orderId);
|
driverId = orderLogistics.getDriverId();
|
company = companyService.selectById(orderLogistics.getCompanyId());
|
jsonObject = JSON.parseObject(company.getSameLogistics());
|
rules = jsonObject.getJSONArray("rules");
|
time_rules = jsonObject.getJSONArray("time_rules");
|
//按天查询当天的订单量
|
//按时间段
|
if(time_rules.size() > 0){
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
for (int i = 0; i < time_rules.size(); i++) {
|
JSONArray jsonArray = time_rules.getJSONArray(i);
|
JSONObject jsonObject2 = jsonArray.getJSONObject(0);
|
String time = jsonObject2.getString("time");
|
if(ToolUtil.isNotEmpty(time)){
|
String[] split = time.split(" - ");
|
Date start = sdf.parse(split[0] + " 00:00:00");
|
Date end = sdf.parse(split[1] + " 23:59:59");
|
if(System.currentTimeMillis() >= start.getTime() && System.currentTimeMillis() < end.getTime()){
|
startTime = split[0] + " 00:00:00";
|
endTime = split[1] + " 23:59:59";
|
break;
|
}
|
}
|
}
|
}
|
orderNumber = orderLogisticsService.selectCount(new EntityWrapper<OrderLogistics>()
|
.eq("driverId", orderLogistics.getDriverId())
|
.eq("type", 4)
|
.eq("isDelete", 1)
|
.in("state", Arrays.asList(6, 9))
|
.last(" and DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i%m') between '" + startTime + "' and '" + endTime + "'")
|
);
|
map.put("orderNumber", orderNumber);
|
map.put("disposition", company.getSameLogistics());
|
break;
|
case 5:
|
OrderLogistics orderLogistics1 = orderLogisticsService.selectById(orderId);
|
driverId = orderLogistics1.getDriverId();
|
company = companyService.selectById(orderLogistics1.getCompanyId());
|
jsonObject = JSON.parseObject(company.getCrossLogistics());
|
rules = jsonObject.getJSONArray("rules");
|
time_rules = jsonObject.getJSONArray("time_rules");
|
//按天查询当天的订单量
|
//按时间段
|
if(time_rules.size() > 0){
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
for (int i = 0; i < time_rules.size(); i++) {
|
JSONArray jsonArray = time_rules.getJSONArray(i);
|
JSONObject jsonObject2 = jsonArray.getJSONObject(0);
|
String time = jsonObject2.getString("time");
|
if(ToolUtil.isNotEmpty(time)){
|
String[] split = time.split(" - ");
|
Date start = sdf.parse(split[0] + " 00:00:00");
|
Date end = sdf.parse(split[1] + " 23:59:59");
|
if(System.currentTimeMillis() >= start.getTime() && System.currentTimeMillis() < end.getTime()){
|
startTime = split[0] + " 00:00:00";
|
endTime = split[1] + " 23:59:59";
|
break;
|
}
|
}
|
}
|
}
|
orderNumber = orderLogisticsService.selectCount(new EntityWrapper<OrderLogistics>()
|
.eq("driverId", orderLogistics1.getDriverId())
|
.eq("type", 5)
|
.eq("isDelete", 1)
|
.in("state", Arrays.asList(6, 9))
|
.last(" and DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i%m') between '" + startTime + "' and '" + endTime + "'")
|
);
|
map.put("orderNumber", orderNumber);
|
map.put("disposition", company.getCrossLogistics());
|
break;
|
case 7:
|
OrderCall orderCall = orderCallService.selectById(orderId);
|
driverId = orderCall.getDriverId();
|
company = companyService.selectById(orderCall.getCompanyId());
|
jsonObject = JSON.parseObject(company.getOnCall());
|
rules = jsonObject.getJSONArray("rules");
|
time_rules = jsonObject.getJSONArray("time_rules");
|
//按天查询当天的订单量
|
//按时间段
|
if(time_rules.size() > 0){
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
for (int i = 0; i < time_rules.size(); i++) {
|
JSONArray jsonArray = time_rules.getJSONArray(i);
|
JSONObject jsonObject2 = jsonArray.getJSONObject(0);
|
String time = jsonObject2.getString("time");
|
if(ToolUtil.isNotEmpty(time)){
|
String[] split = time.split(" - ");
|
Date start = sdf.parse(split[0] + " 00:00:00");
|
Date end = sdf.parse(split[1] + " 23:59:59");
|
if(System.currentTimeMillis() >= start.getTime() && System.currentTimeMillis() < end.getTime()){
|
startTime = split[0] + " 00:00:00";
|
endTime = split[1] + " 23:59:59";
|
break;
|
}
|
}
|
}
|
}
|
|
orderNumber = orderCallService.selectCount(new EntityWrapper<OrderCall>()
|
.eq("driverId", orderCall.getDriverId())
|
.eq("isDelete", 1)
|
.in("state", Arrays.asList(7, 8, 9))
|
.last(" and DATE_FORMAT(insertTime, '%Y-%m-%d %H:%i%m') between '" + startTime + "' and '" + endTime + "'")
|
);
|
map.put("orderNumber", orderNumber);
|
map.put("disposition", company.getOnCall());
|
break;
|
}
|
|
BigDecimal money = BigDecimal.ZERO;
|
//{"rules":[],"time_rules":[[{"order":"1,3","percent":"20","MemberCoins":"1.1,2"},{"order":"3,10","percent":"40","MemberCoins":"2,5"}]]}
|
//按天
|
if(rules.size() > 0){
|
for (int i = 0; i < rules.size(); i++) {
|
JSONObject jsonObject1 = rules.getJSONObject(i);
|
money = getDriverMoney(orderNumber, payMoney, driverId, orderId, orderType, jsonObject1);
|
if(money.compareTo(BigDecimal.ZERO) >= 0){
|
break;
|
}
|
}
|
}
|
//按时间段
|
if(time_rules.size() > 0){
|
boolean b = false;
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
for (int i = 0; i < time_rules.size(); i++) {
|
JSONArray jsonArray = time_rules.getJSONArray(i);
|
JSONObject jsonObject2 = jsonArray.getJSONObject(0);
|
String time = jsonObject2.getString("time");
|
if(!b && ToolUtil.isNotEmpty(time)){
|
String[] split = time.split(" - ");
|
Date start = sdf.parse(split[0] + " 00:00:00");
|
Date end = sdf.parse(split[1] + " 23:59:59");
|
if(System.currentTimeMillis() >= start.getTime() && System.currentTimeMillis() < end.getTime()){
|
for (int j = 0; j < jsonArray.size(); j++) {
|
JSONObject jsonObject1 = jsonArray.getJSONObject(j);
|
money = getDriverMoney(orderNumber, payMoney, driverId, orderId, orderType, jsonObject1);
|
if(money.compareTo(BigDecimal.ZERO) < 0){
|
continue;
|
}
|
b = true;
|
break;
|
}
|
}
|
}
|
if(b){
|
break;
|
}
|
}
|
|
if(!b){
|
JSONArray jsonArray = time_rules.getJSONArray(0);
|
for (int j = 0; j < jsonArray.size(); j++) {
|
JSONObject jsonObject1 = jsonArray.getJSONObject(j);
|
money = getDriverMoney(orderNumber, payMoney, driverId, orderId, orderType, jsonObject1);
|
if(money.compareTo(BigDecimal.ZERO) < 0){
|
continue;
|
}
|
break;
|
}
|
}
|
}
|
if(money.compareTo(BigDecimal.ZERO) > 0){
|
Driver driver = driverService.selectById(driverId);
|
driver.setBusinessMoney(new BigDecimal(null != driver.getBusinessMoney() ? driver.getBusinessMoney() : 0).add(money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
driver.setLaveBusinessMoney(new BigDecimal(null != driver.getLaveBusinessMoney() ? driver.getLaveBusinessMoney() : 0).add(money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
driver.setBalance(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0).add(money).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
driverService.updateById(driver);
|
}
|
return map;
|
}
|
|
|
|
public BigDecimal getDriverMoney(Integer orderNumber, Double payMoney, Integer driverId, Integer orderId, Integer orderType, JSONObject jsonObject1) throws Exception{
|
String order = jsonObject1.getString("order");
|
Double percent = jsonObject1.getDouble("percent");
|
String MemberCoins = jsonObject1.getString("MemberCoins");
|
String[] split = order.split(",");
|
if(Integer.valueOf(split[0]).compareTo(orderNumber) <= 0 && Integer.valueOf(split[1]).compareTo(orderNumber) > 0){
|
String[] split1 = MemberCoins.split(",");
|
Double d = Double.valueOf(split1[0]);
|
Double g = Double.valueOf(split1[1]);
|
|
//平台抽成金额
|
BigDecimal multiply1 = new BigDecimal(payMoney).multiply(new BigDecimal(percent / 100));
|
//抽成金额小于最低金额,司机收入为0
|
if(multiply1.compareTo(new BigDecimal(d)) < 0){
|
saveData(1, 1, 2, orderId, orderType, d);
|
//司机收入
|
BigDecimal subtract = new BigDecimal(payMoney).subtract(new BigDecimal(d));
|
if(subtract.compareTo(BigDecimal.ZERO) > 0){
|
saveData(2, driverId, 2, orderId, orderType, subtract.doubleValue());
|
return subtract;
|
}
|
return new BigDecimal(0);
|
}
|
if(multiply1.compareTo(new BigDecimal(d)) >= 0 && multiply1.compareTo(new BigDecimal(g)) < 0){
|
//司机收入
|
BigDecimal subtract = new BigDecimal(payMoney).subtract(multiply1);
|
saveData(2, driverId, 2, orderId, orderType, subtract.doubleValue());
|
saveData(1, 1, 2, orderId, orderType, multiply1.doubleValue());
|
return subtract;
|
}
|
if(multiply1.compareTo(new BigDecimal(g)) >= 0){
|
//司机收入
|
BigDecimal subtract = new BigDecimal(payMoney).subtract(new BigDecimal(g));
|
saveData(2, driverId, 2, orderId, orderType, subtract.doubleValue());
|
saveData(1, 1, 2, orderId, orderType, g);
|
return subtract;
|
}
|
}
|
return new BigDecimal(-1);
|
}
|
|
|
|
}
|