package com.stylefeng.guns.modular.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import com.amazonaws.services.dynamodbv2.xspec.M;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.system.dao.*;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.model.vo.OrderDetailVo;
import com.stylefeng.guns.modular.system.model.vo.OrderInfoVo;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.utils.GoogleMap.FindPlaceFromTextVo;
import com.stylefeng.guns.modular.system.utils.GoogleMap.GeocodeVo;
import com.stylefeng.guns.modular.system.utils.GoogleMap.GoogleMapUtil;
import com.stylefeng.guns.modular.system.utils.UserInfoUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author stylefeng
* @since 2023-02-03
*/
@Service
public class TOrderServiceImpl extends ServiceImpl implements ITOrderService {
@Resource
private TUserMapper tUserMapper;
@Resource
private UserMapper userMapper;
@Resource
private TGoodsMapper tGoodsMapper;
@Resource
private TCompanyMapper tCompanyMapper;
@Resource
private TPriceMapper priceMapper;
@Resource
private TGroupMapper tGroupMapper;
@Resource
private TQuoteMapper tQuoteMapper;
@Autowired
private ITBoxSizeService sizeService;
@Autowired
private GoogleMapUtil googleMapUtil;
@Resource
private TPortMapper portMapper;
@Resource
private WareHouseMapper wareHouseMapper;
@Resource
private DriverNoteMapper driverNoteMapper;
@Autowired
private ITDriverService driverService;
@Resource
private TCarriersMapper carriersMapper;
@Override
public List getReceivable(Page receivableVoPage, String time, String name) {
//TODO 时间保留
List list = this.baseMapper.getReceivable(receivableVoPage,name);
Calendar instance = Calendar.getInstance();
instance.setTime(new Date());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String format = simpleDateFormat.format(new Date())+" 23:59:59";
// 30天
instance.add(Calendar.DATE,-30);
String time1 = simpleDateFormat.format(instance.getTime())+" 00:00:01";
// 60tian
instance.add(Calendar.DATE,-30);
String time2 = simpleDateFormat.format(instance.getTime())+" 00:00:01";
// 90tian
instance.add(Calendar.DATE,-30);
String time3 = simpleDateFormat.format(instance.getTime())+" 00:00:01";
for (ReceivableVo receivableVo : list) {
// 根据id获取30天内的金额
receivableVo.setTwentyDay(this.baseMapper.getTwentyDay(receivableVo.getUserId(),format,time1)==null?0:this.baseMapper.getTwentyDay(receivableVo.getUserId(),format,time1));
// 30-60tian
receivableVo.setThirtyDay(this.baseMapper.getTwentyDay(receivableVo.getUserId(),time1,time2)==null?0:this.baseMapper.getTwentyDay(receivableVo.getUserId(),time1,time2));
receivableVo.setSixtyDay(this.baseMapper.getTwentyDay(receivableVo.getUserId(),time2,time3)==null?0:this.baseMapper.getTwentyDay(receivableVo.getUserId(),time2,time3));
receivableVo.setNinetyDay(this.baseMapper.getNineDay(receivableVo.getUserId(),time3)==null?0:this.baseMapper.getNineDay(receivableVo.getUserId(),time3));
}
return list;
}
@Override
public List getPayList(Page receivableVoPage, String time, String name) {
List list = this.baseMapper.getPayList(receivableVoPage,name);
Calendar instance = Calendar.getInstance();
instance.setTime(new Date());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
String format = simpleDateFormat.format(new Date())+" 23:59:59";
// 30天
instance.add(Calendar.DATE,-30);
String time1 = simpleDateFormat.format(instance.getTime())+" 00:00:01";
// 60tian
instance.add(Calendar.DATE,-30);
String time2 = simpleDateFormat.format(instance.getTime())+" 00:00:01";
// 90tian
instance.add(Calendar.DATE,-30);
String time3 = simpleDateFormat.format(instance.getTime())+" 00:00:01";
for (ShouldPayVo shouldPayVo : list) {
shouldPayVo.setTwentyDay(this.baseMapper.getTwentyDayPay(shouldPayVo.getUserId(),format,time1)==null?0:this.baseMapper.getTwentyDayPay(shouldPayVo.getUserId(),format,time1));
// 30-60tian
shouldPayVo.setThirtyDay(this.baseMapper.getTwentyDayPay(shouldPayVo.getUserId(),time1,time2)==null?0:this.baseMapper.getTwentyDayPay(shouldPayVo.getUserId(),time1,time2));
shouldPayVo.setSixtyDay(this.baseMapper.getTwentyDayPay(shouldPayVo.getUserId(),time2,time3)==null?0:this.baseMapper.getTwentyDayPay(shouldPayVo.getUserId(),time2,time3));
shouldPayVo.setNinetyDay(this.baseMapper.getNineDayPay(shouldPayVo.getUserId(),time3)==null?0:this.baseMapper.getNineDayPay(shouldPayVo.getUserId(),time3));
}
return list;
}
@Override
public List listOfReceivables(Page receivableVoPage, String time, String name, Integer invoicesId, Integer orderId, Integer state) {
String sTime=null;
String eTime =null;
if(Objects.nonNull(time)){
sTime = time.split(" - ")[0]+" 00:00:01";
eTime = time.split(" - ")[1]+" 23:59:59";
}
List receivablesLists = this.baseMapper.listOfReceivables(receivableVoPage, sTime, eTime, name, invoicesId, orderId, state);
for (ReceivablesList receivablesList : receivablesLists) {
Integer id= this.baseMapper.getPayStatus(receivablesList.getOrderId());
if(id==null){
receivablesList.setPayStatus(1);
}else {
receivablesList.setPayStatus(2);
}
}
return receivablesLists;
}
@Override
public List listOfPay(Page receivableVoPage, String time, String name, Integer billId, Integer orderId, Integer state) {
String sTime=null;
String eTime =null;
if(Objects.nonNull(time)){
sTime = time.split(" - ")[0]+" 00:00:01";
eTime = time.split(" - ")[1]+" 23:59:59";
}
List list = this.baseMapper.listOfPay(receivableVoPage, sTime, eTime, name, billId, orderId, state);
return list;
}
@Override
public InvoicesCarVo listOPayInfo(Long number) {
InvoicesVo info1 = tUserMapper.getOrderInfo(number);
InvoicesCarVo info = new InvoicesCarVo();
BeanUtil.copyProperties(info1,info);
// 根据订单id 获取货物信息
Long id = info.getId();
TOrder tOrder = this.baseMapper.selectById(id);
List orders = tGoodsMapper.selectList(new EntityWrapper().eq("order_id", id));
ArrayList tGoodsVos = new ArrayList<>();
TCompany tCompany = tCompanyMapper.selectById(info.getCompanyId());
List tBoxSizes = sizeService.selectList(null);
for (TGoods order : orders) {
TGoodsVo tGoodsVo = new TGoodsVo();
tGoodsVo.setName(tCompany.getName());
tGoodsVo.setSize(order.getSize());
tGoodsVo.setKg(order.getKg());
String size = order.getSize();
for (TBoxSize tBoxSize : tBoxSizes) {
if(size.equals(tBoxSize.getBoxName())){
tGoodsVo.setLength(tBoxSize.getBoxLength());
tGoodsVo.setWidth(tBoxSize.getBoxWidth());
tGoodsVo.setHeight(tBoxSize.getBoxHigh());
}
}
tGoodsVos.add(tGoodsVo);
}
// 付卡车公司钱
BigDecimal payMoney = tOrder.getPayMoney();
Integer carriersId = tOrder.getCarriersId();
TCarriers tCarriers = carriersMapper.selectById(carriersId);
Double commission = tCarriers.getCommission();
BigDecimal multiply = new BigDecimal(commission).multiply(new BigDecimal(0.01));
BigDecimal multiply1 = payMoney.multiply(multiply);
info.setGoodsVos(tGoodsVos);
info.setAmount(multiply1.doubleValue());
return info;
}
@Override
public Boolean confirmationOfPayment(Long number, int type, String remark) {
Boolean b =false;
// 同意
if(type==1){
b = this.baseMapper.agreePay(number);
}else {
b = this.baseMapper.noAgreePay(number,remark);
}
return b;
}
@Override
public Boolean agreeOfPayment(Long number) {
return this.baseMapper.agreeOfPayment(number);
}
@Resource
private TDriverMapper driverMapper;
@Resource
private TPowerUnitsMapper powerUnitsMapper;
@Override
public IndexInfo indexList(String time) {
IndexInfo indexInfo = new IndexInfo();
// 卡车公司收入时间
String sTime=null;
String eTime=null;
if(ToolUtil.isNotEmpty(time)){
sTime=time.split(" - ")[0]+" 00:00:01";
eTime=time.split(" - ")[1]+" 23:59:59";
}
Integer companyId = UserInfoUtil.getId();
// 获取卡车公司收入
Double companyIncome = this.baseMapper.getCompanyIncome(companyId, sTime, eTime);
indexInfo.setAccountsReceivable(new BigDecimal(companyIncome));
// 获取卡车公司支出-》 是否存在承运商 -》算价格
EntityWrapper wrapper = new EntityWrapper<>();
wrapper.eq("company_id",companyId);
wrapper.eq("carriers_pay_status",1);
if(sTime!=null){
wrapper.between("success_time",sTime,eTime);
}
List orders = this.baseMapper.selectList(wrapper);
// 找出有承运商的订单
List collect = orders.stream().filter(o -> ToolUtil.isNotEmpty(o.getCarriersId())).collect(Collectors.toList());
// 付给承运商的钱
BigDecimal disburse = new BigDecimal(BigInteger.ZERO);
for (TOrder tOrder : collect) {
TCarriers tCarriers = carriersMapper.selectById(tOrder.getCarriersId());
Double commission = tCarriers.getCommission();
BigDecimal payMoney = tOrder.getPayMoney();
if(ToolUtil.isNotEmpty(commission)){
BigDecimal bigDecimal = new BigDecimal(commission);
BigDecimal multiply = payMoney.multiply(bigDecimal).setScale(2, BigDecimal.ROUND_HALF_UP);
disburse = disburse.add(multiply);
}
}
indexInfo.setAccountsPayable(disburse);
indexInfo.setPlatformRevenue(indexInfo.getAccountsReceivable().subtract(indexInfo.getAccountsPayable()));
// 所有的信息
// 所有司机
Integer integer = driverMapper.selectCount(new EntityWrapper().eq("company_id", companyId).eq("remove",0));
indexInfo.setDriver(integer);
//车头
Integer integer1 = powerUnitsMapper.selectCount(new EntityWrapper().eq("company_id", companyId).eq("type", 1));
indexInfo.setPowerUnits(integer1);
// 车架
indexInfo.setChassises(powerUnitsMapper.selectCount(new EntityWrapper().eq("company_id", companyId).eq("type", 2)));
// 总订单
indexInfo.setOrdersTotal(this.baseMapper.selectCount(new EntityWrapper().eq("company_id",companyId)));
//
indexInfo.setInTransit(this.baseMapper.selectCount(new EntityWrapper().eq("company_id",companyId).eq("status","7")));
indexInfo.setDispatching(this.baseMapper.selectCount(new EntityWrapper().eq("company_id",companyId).eq("status","0")));
indexInfo.setCanceled(this.baseMapper.selectCount(new EntityWrapper().eq("company_id",companyId).eq("status","16")));
indexInfo.setCompleted(this.baseMapper.selectCount(new EntityWrapper().eq("company_id",companyId).eq("status","1")));
//获取当前公司的订单数量 根据当前月推算前12个月
ArrayList indexMonths = new ArrayList<>();
//获取当前月份
Calendar instance = Calendar.getInstance();
instance.setTime(new Date());
for (int i = 0; i <12; i++) {
if(i==0){
IndexMonth indexMonth = new IndexMonth();
int month = DateUtil.thisMonth();
indexMonth.setMonth(month);
indexMonth.setOrderNumber(this.baseMapper.selectCount(new EntityWrapper().eq("company_id",companyId).between("pay_time",DateUtil.beginOfMonth(new Date()),DateUtil.endOfMonth(new Date()))));
indexMonths.add(indexMonth);
}else {
IndexMonth indexMonth = new IndexMonth();
instance.add(Calendar.MONTH, -1);
Date time1 = instance.getTime();
int month = DateUtil.month(time1);
indexMonth.setMonth(month);
indexMonth.setOrderNumber(this.baseMapper.selectCount(new EntityWrapper().eq("company_id",companyId).between("pay_time",DateUtil.beginOfMonth(time1),DateUtil.endOfMonth(time1))));
indexMonths.add(indexMonth);
}
}
indexInfo.setList(indexMonths);
return indexInfo;
}
@Override
public InvoicesVoTwo listOfReceivablesInfo(Long orderId) {
InvoicesVoTwo invoicesVoTwo = new InvoicesVoTwo();
TOrder tOrder = this.baseMapper.selectById(orderId);
invoicesVoTwo.setId(tOrder.getId());
invoicesVoTwo.setPickupDate(tOrder.getShipmentDate());
invoicesVoTwo.setDeliveryDate(tOrder.getDeliveryDate());
invoicesVoTwo.setInvoiceNumber(tOrder.getInvoiceNumber());
invoicesVoTwo.setRemark(tOrder.getRemark());
// 根据订单id 获取价格
List prices = priceMapper.selectList(new EntityWrapper().eq("order_id", tOrder.getId()));
ArrayList priceVos = new ArrayList();
for (TPrice price : prices) {
TPriceVo tPriceVo = new TPriceVo();
tPriceVo.setId(price.getId());
tPriceVo.setPrice(price.getCarPrice());
tPriceVo.setType(price.getType());
priceVos.add(tPriceVo);
}
invoicesVoTwo.setPriceVos(priceVos);
return invoicesVoTwo;
}
@Override
public InvoicesVoOne listOfReceivablesInfoOne(Long orderId) {
InvoicesVoOne info = tUserMapper.getOrderInfoOne(orderId);
// 根据订单id 获取货物信息
Long id = info.getId();
TOrder tOrder = this.baseMapper.selectById(id);
List orders = tGoodsMapper.selectList(new EntityWrapper().eq("order_id", id));
ArrayList tGoodsVos = new ArrayList<>();
TCompany tCompany = tCompanyMapper.selectById(info.getCompanyId());
List tBoxSizes = sizeService.selectList(null);
for (TGoods order : orders) {
TGoodsVo tGoodsVo = new TGoodsVo();
tGoodsVo.setName(tCompany.getName());
tGoodsVo.setSize(order.getSize());
tGoodsVo.setKg(order.getKg());
String size = order.getSize();
for (TBoxSize tBoxSize : tBoxSizes) {
if(size.equals(tBoxSize.getBoxName())){
tGoodsVo.setLength(tBoxSize.getBoxLength());
tGoodsVo.setWidth(tBoxSize.getBoxWidth());
tGoodsVo.setHeight(tBoxSize.getBoxHigh());
}
}
tGoodsVos.add(tGoodsVo);
}
// 根据订单id 获取价格
List prices = priceMapper.selectList(new EntityWrapper().eq("order_id", tOrder.getId()));
ArrayList priceVos = new ArrayList();
for (TPrice price : prices) {
TPriceVo tPriceVo = new TPriceVo();
tPriceVo.setId(price.getId());
tPriceVo.setPrice(price.getCarPrice());
tPriceVo.setType(price.getType());
priceVos.add(tPriceVo);
}
info.setGoodsVos(tGoodsVos);
info.setPriceVos(priceVos);
return info;
}
@Override
public List getOrderList(Page orderListVoPage, OrderListDto dto) {
String sTime =null;
String eTime = null;
if(ToolUtil.isNotEmpty(dto.getDateRange())){
String[] split = dto.getDateRange().split(" - ");
sTime=split[0]+" 00:00:01";
eTime=split[1]+" 23:59:59";
}
Integer id = UserInfoUtil.getId();
List list = this.baseMapper.getOrderListOne(orderListVoPage,sTime,eTime,dto.getCustomerName(),dto.getId(),dto.getGroupId(),dto.getSaleId(),dto.getState(),id,dto.getType());
for (OrderListVo orderListVo : list) {
// TODO 对接第三方 看是否能提柜
if(Objects.nonNull(dto.getState())){
if(dto.getState()==1){
}else {
}
}
}
return list;
}
@Override
public List getGoodsInfo(Long orderId) {
TOrder tOrder = this.baseMapper.selectById(orderId);
ArrayList goodsInfoVos = new ArrayList<>();
List goods = tGoodsMapper.selectList(new EntityWrapper().eq("order_id", orderId));
for (TGoods g : goods) {
GoodsInfoVo goodsInfoVo = new GoodsInfoVo();
goodsInfoVo.setAwbNo(g.getBillNumber());
goodsInfoVo.setContainer(g.getContainerNumber());
goodsInfoVo.setHazmat(g.getDanger());
goodsInfoVo.setOverWeight(g.getWeight());
goodsInfoVo.setShippingLine(g.getShippingLine());
goodsInfoVo.setSize(g.getSize());
goodsInfoVo.setType(g.getType());
goodsInfoVo.setTypeClass(g.getTypeClass());
goodsInfoVo.setWeight(g.getKg());
goodsInfoVos.add(goodsInfoVo);
}
return goodsInfoVos;
}
@Override
public OrderInfo getOrderInfo(Long orderId) {
OrderInfo orderInfo = new OrderInfo();
ArrayList lonLats = new ArrayList<>();
TOrder tOrder = this.baseMapper.selectById(orderId);
orderInfo.setSlat(tOrder.getStartLat());
orderInfo.setSlon(tOrder.getStartLon());
LonLat lonLat = new LonLat();
lonLat.setLat(tOrder.getStartLat());
lonLat.setLng(tOrder.getStartLon());
lonLats.add(lonLat);
String s = tOrder.geteAddress();
GeocodeVo geocode = googleMapUtil.getGeocode(s);
orderInfo.setElat(String.valueOf(geocode.getLat()));
orderInfo.setElon(String.valueOf(geocode.getLng()));
// lonLat=new LonLat();
// lonLat.setLng("-113.066919618184");
// lonLat.setLat("37.684389618184");
lonLats.add(lonLat);
// orderInfo.setElat("37.684389618184");
// orderInfo.setElon("-113.066919618184");
//
orderInfo.setLonLats(lonLats);
Long quoteId = tQuoteMapper.selectList(new EntityWrapper().eq("order_id", tOrder.geteZipZ())).get(0).getId();
orderInfo.setType(tOrder.getType());
orderInfo.setQuoteId(quoteId);
// 获取用户
Integer userId = tOrder.getUserId();
TUser tUser = tUserMapper.selectById(userId);
orderInfo.setCustomer(tUser.getCompanyName());
// 获取组
Integer groupId = tUser.getGroupId();
if(groupId!=null) {
TGroup tGroup = tGroupMapper.selectById(groupId);
orderInfo.setSalesGroup(tGroup.getName());
Integer salesId = tGroup.getSalesId();
User user = userMapper.selectById(salesId);
orderInfo.setSales(user.getName());
}
// 获取码头id 获取码头地址 pickup信息
Integer portId = tOrder.getPort();
TPort tPort = portMapper.selectById(portId);
orderInfo.setAddress(tOrder.geteAddress());
orderInfo.setContactName(tOrder.getsName());
orderInfo.setContactPhone(tOrder.getsPhone());
orderInfo.setContactEmail(tOrder.getsEmail());
orderInfo.setShipmentDate(tOrder.getShipmentDate());
orderInfo.setResidentitalPickUp(tOrder.getAccessorialStr());
String warehouse = tOrder.getWarehouse();
// 是仓库
if(!"0".equals(warehouse)){
TWarehouse tWarehouse = wareHouseMapper.selectList(new EntityWrapper().eq("company_id", tOrder.getCompanyId()).eq("code", warehouse)).get(0);
orderInfo.setWareHouse(tWarehouse.getAddress());
}
// destination信息
orderInfo.setEndAddress(tOrder.geteAddress());
orderInfo.setECompanyName(tOrder.geteCompanyName());
orderInfo.setEContactName(tOrder.geteName());
orderInfo.setEContactPhone(tOrder.getePhone());
orderInfo.setEContactEmail(tOrder.geteEmail());
orderInfo.setDeliveryDate(tOrder.getDeliveryDate());
orderInfo.setDeliverStr(tOrder.getDeliveryStr());
orderInfo.setCarrierQuoteNumber(quoteId);
// 根据订单id获取货物
List goods = tGoodsMapper.selectList(new EntityWrapper().eq("order_id", orderId));
ArrayList strings = new ArrayList<>();
goods.forEach(e->{
strings.add(e.getContainerNumber());
orderInfo.setBl(e.getBillNumber());
});
orderInfo.setContainer(strings);
ArrayList driverNoteVos = new ArrayList<>();
ArrayList driverNoteVos1 = new ArrayList<>();
// 获取司机note 和 trouble
List driverNotes = driverNoteMapper.selectList(new EntityWrapper().eq("order_id", orderId));
for (DriverNote driverNote : driverNotes) {
DriverNoteVo driverNoteVo = new DriverNoteVo();
BeanUtil.copyProperties(driverNote,driverNoteVo);
TDriver tDriver = driverService.selectById(driverNoteVo.getDriverId());
driverNoteVo.setDriverName(tDriver.getDriverName());
if(driverNoteVo.getType()==1){
driverNoteVos.add(driverNoteVo);
}else {
driverNoteVos1.add(driverNoteVo);
}
}
orderInfo.setNote(driverNoteVos);
orderInfo.setTrouble(driverNoteVos1);
orderInfo.setState(tOrder.getState());
return orderInfo;
}
@Override
public Boolean addOrderFile(Long orderId, String url, String name) {
return this.baseMapper.addOrderFile(orderId,url,name);
}
@Override
public List getOrderListIndex(Page orderInfoVoPage, int id, String containerNo, String sTime, String eTime,int type) {
List orderListIndex = this.baseMapper.getOrderListIndex(orderInfoVoPage, id, containerNo, sTime, eTime,type);
for (OrderInfoVo listIndex : orderListIndex) {
if(listIndex.getStatus()==6&&listIndex.getSendType().equals("Live Unload")){
TTransportation tTransportation = tTransportationService.selectOne(new EntityWrapper().eq("order_id", listIndex.getOrderId()).eq("type", 4));
if(tTransportation!=null){
Integer portId = tTransportation.getPortId();
TPort tPort = portMapper.selectById(portId);
listIndex.setPortName(tPort.getName());
listIndex.setReturnTime(tTransportation.getReturnDate());
}
}
}
return orderListIndex;
}
@Resource
private TTransportationService tTransportationService;
@Resource
private ITExamSiteService examSiteService;
@Resource
private TYardService yardService;
@Override
public Map orderInfo(Long id, int did) {
OrderDetailVo orderDetailVo = new OrderDetailVo();
List