puzhibing
2023-08-22 ed3ea6f50a8dcd01bfa7f2a13ec457873d9015f7
更新接口
9个文件已修改
21个文件已添加
1667 ■■■■■ 已修改文件
DriverIGOTravel/guns-admin/pom.xml 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SettlementRecordController.java 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java 401 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SettlementAllocationMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SettlementDetailMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SettlementRecordMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SettlementAllocationMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SettlementDetailMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SettlementRecordMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SettlementAllocation.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SettlementDetail.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SettlementRecord.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISettlementAllocationService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISettlementDetailService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISettlementRecordService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SettlementAllocationServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SettlementDetailServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SettlementRecordServiceImpl.java 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/itextpdf/HtmlToPdfUtils.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/itextpdf/WaterMarkEventHandler.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/QueryHistoricalSettlement.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/QuerySettlementAmount.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/QuerySettlementAmountDetails.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RegisteredWarpper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/src/main/resources/application.yml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverIGOTravel/guns-admin/pom.xml
@@ -13,7 +13,7 @@
    <name>guns-admin</name>
    <description>guns 的spring boot版本</description>
    <packaging>war</packaging>
    <packaging>jar</packaging>
    <dependencies>
@@ -268,45 +268,58 @@
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>
        <!-- itext7html转pdf  -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>html2pdf</artifactId>
            <version>3.0.2</version>
        </dependency>
        <!-- 中文字体支持 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>font-asian</artifactId>
            <version>7.1.13</version>
        </dependency>
    </dependencies>
    <build>
        <!--打包jar包方式-->
        <!--<plugins>-->
            <!--<plugin>-->
                <!--<groupId>org.springframework.boot</groupId>-->
                <!--<artifactId>spring-boot-maven-plugin</artifactId>-->
                <!--<configuration>-->
                    <!--<fork>true</fork>&lt;!&ndash; 如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart &ndash;&gt;-->
                <!--</configuration>-->
            <!--</plugin>-->
        <!--</plugins>-->
        <!--打包war包引入本地jar的打包方式-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 设置成false,否则检查web.xml是否存在。因为springboot是没有web.xml的 -->
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <!--打包后的项目名-->
                    <!--<warName>example</warName>-->
                    <!--<webResources>-->
                        <!--<resource>-->
                            <!--把本地lib里面的jar复制到lib-->
                            <!--<directory>${project.basedir}/lib</directory>-->
                            <!--<targetPath>WEB-INF/lib/</targetPath>-->
                            <!--<includes>-->
                                <!--<include>**/*.jar</include>-->
                            <!--</includes>-->
                        <!--</resource>-->
                    <!--</webResources>-->
                    <fork>true</fork><!-- 如果没有该项配置,肯呢个devtools不会起作用,即应用不会restart -->
                </configuration>
            </plugin>
        </plugins>
        <!--打包war包引入本地jar的打包方式-->
        <!--<plugins>-->
            <!--<plugin>-->
                <!--<groupId>org.apache.maven.plugins</groupId>-->
                <!--<artifactId>maven-war-plugin</artifactId>-->
                <!--<configuration>-->
                    <!--&lt;!&ndash; 设置成false,否则检查web.xml是否存在。因为springboot是没有web.xml的 &ndash;&gt;-->
                    <!--<failOnMissingWebXml>false</failOnMissingWebXml>-->
                    <!--&lt;!&ndash;打包后的项目名&ndash;&gt;-->
                    <!--&lt;!&ndash;<warName>example</warName>&ndash;&gt;-->
                    <!--&lt;!&ndash;<webResources>&ndash;&gt;-->
                        <!--&lt;!&ndash;<resource>&ndash;&gt;-->
                            <!--&lt;!&ndash;把本地lib里面的jar复制到lib&ndash;&gt;-->
                            <!--&lt;!&ndash;<directory>${project.basedir}/lib</directory>&ndash;&gt;-->
                            <!--&lt;!&ndash;<targetPath>WEB-INF/lib/</targetPath>&ndash;&gt;-->
                            <!--&lt;!&ndash;<includes>&ndash;&gt;-->
                                <!--&lt;!&ndash;<include>**/*.jar</include>&ndash;&gt;-->
                            <!--&lt;!&ndash;</includes>&ndash;&gt;-->
                        <!--&lt;!&ndash;</resource>&ndash;&gt;-->
                    <!--&lt;!&ndash;</webResources>&ndash;&gt;-->
                <!--</configuration>-->
            <!--</plugin>-->
        <!--</plugins>-->
        <resources>
            <resource>
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
@@ -40,9 +40,6 @@
    public static void main(String[] args) {
        SpringApplication.run(GunsApplication.class, args);
        logger.info("GunsApplication is success!");
        GDFalconUtil gdFalconUtil = new GDFalconUtil();
        gdFalconUtil.init();//初始化猎鹰服务
    }
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/DriverController.java
@@ -231,6 +231,20 @@
            if(phone.indexOf("233") < 0){
                phone = "233" + phone;
            }
            switch (phoneOperator){
                case "MTN":
                    phoneOperator = "GH-MTN-B2C";
                    break;
                case "TIGO":
                    phoneOperator = "GH-TIGO-B2C";
                    break;
                case "VODAFONE":
                    phoneOperator = "GH-VODAFONE-B2C";
                    break;
                case "AIRTEL":
                    phoneOperator = "GH-AIRTEL-B2C";
                    break;
            }
            return driverService.registeredDriver(phoneOperator, phone, code, password, uid, type, userType, language);
        }catch (Exception e){
            e.printStackTrace();
@@ -266,6 +280,20 @@
            }
            if(phone.indexOf("233") < 0){
                phone = "233" + phone;
            }
            switch (phoneOperator){
                case "MTN":
                    phoneOperator = "GH-MTN-B2C";
                    break;
                case "TIGO":
                    phoneOperator = "GH-TIGO-B2C";
                    break;
                case "VODAFONE":
                    phoneOperator = "GH-VODAFONE-B2C";
                    break;
                case "AIRTEL":
                    phoneOperator = "GH-AIRTEL-B2C";
                    break;
            }
            return driverService.registeredDriver(phoneOperator, phone, code, password, uid, type, userType, language);
        }catch (Exception e){
@@ -784,6 +812,20 @@
            if(phone.indexOf("233") < 0){
                phone = "233" + phone;
            }
            switch (phoneOperator){
                case "MTN":
                    phoneOperator = "GH-MTN-B2C";
                    break;
                case "TIGO":
                    phoneOperator = "GH-TIGO-B2C";
                    break;
                case "VODAFONE":
                    phoneOperator = "GH-VODAFONE-B2C";
                    break;
                case "AIRTEL":
                    phoneOperator = "GH-AIRTEL-B2C";
                    break;
            }
            return driverService.updatePhone(phoneOperator, phone, code, uid, language);
        }catch (Exception e){
            e.printStackTrace();
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/SettlementRecordController.java
New file
@@ -0,0 +1,187 @@
package com.stylefeng.guns.modular.api;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.system.model.SettlementRecord;
import com.stylefeng.guns.modular.system.service.IDriverService;
import com.stylefeng.guns.modular.system.service.ISettlementRecordService;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.Tingg.model.CallbackRequest;
import com.stylefeng.guns.modular.system.util.Tingg.model.CallbackResponse;
import com.stylefeng.guns.modular.system.util.Tingg.model.Payments;
import com.stylefeng.guns.modular.system.util.UUIDUtil;
import com.stylefeng.guns.modular.system.warpper.QueryHistoricalSettlement;
import com.stylefeng.guns.modular.system.warpper.QuerySettlementAmount;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:39
 */
@RestController
@RequestMapping("")
public class SettlementRecordController {
    @Autowired
    private ISettlementRecordService settlementRecordService;
    @Autowired
    private IDriverService driverService;
    @ResponseBody
    @PostMapping("/api/settlementRecord/querySettlementAmount")
    @ApiOperation(value = "获取个人中心待结算金额和明细", tags = {"司机端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResultUtil<QuerySettlementAmount> querySettlementAmount(HttpServletRequest request){
        try {
            Integer uid = driverService.getUserIdFormRedis(request);
            if(null == uid){
                return ResultUtil.tokenErr();
            }
            QuerySettlementAmount querySettlementAmount = settlementRecordService.querySettlementAmount(uid);
            return ResultUtil.success(querySettlementAmount);
        }catch (Exception e){
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    @ResponseBody
    @PostMapping("/api/settlementRecord/paymentSettlementAmount")
    @ApiOperation(value = "支付结算费用", tags = {"司机端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "支付方式(1=手机支付,2=银行卡支付,3=余额)", name = "payType", required = true, dataType = "int"),
            @ApiImplicitParam(value = "银行卡id", name = "bankCardId", required = false, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResultUtil paymentSettlementAmount(Integer payType, Integer bankCardId, Integer language, HttpServletRequest request){
        try {
            Integer uid = driverService.getUserIdFormRedis(request);
            if(null == uid){
                return ResultUtil.tokenErr();
            }
            return settlementRecordService.paymentSettlementAmount(uid, payType, bankCardId, language);
        }catch (Exception e){
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    @ResponseBody
    @PostMapping("/api/settlementRecord/queryHistoricalSettlement")
    @ApiOperation(value = "获取结算历史记录", tags = {"司机端-个人中心"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "页码,首页1", name = "pageNum", required = true, dataType = "int"),
            @ApiImplicitParam(value = "页条数", name = "size", required = true, dataType = "int"),
            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResultUtil<List<QueryHistoricalSettlement>> queryHistoricalSettlement(Integer pageNum, Integer size, HttpServletRequest request){
        try {
            Integer uid = driverService.getUserIdFormRedis(request);
            if(null == uid){
                return ResultUtil.tokenErr();
            }
            List<QueryHistoricalSettlement> queryHistoricalSettlements = settlementRecordService.queryHistoricalSettlement(uid, pageNum, size);
            return ResultUtil.success(queryHistoricalSettlements);
        }catch (Exception e){
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    @ResponseBody
    @PostMapping("/api/settlementRecord/needToSettle")
    @ApiOperation(value = "判断司机是否需要结算费用", tags = {"司机端-首页"}, notes = "")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "Authorization", value = "Bearer +token", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
    })
    public ResultUtil<Boolean> needToSettle(HttpServletRequest request){
        try {
            Integer uid = driverService.getUserIdFormRedis(request);
            if(null == uid){
                return ResultUtil.tokenErr();
            }
            boolean b = settlementRecordService.needToSettle(uid);
            return ResultUtil.success(b);
        }catch (Exception e){
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    /**
     * 结算线上支付回调
     * @param callbackRequest
     * @return
     */
    @ResponseBody
    @PostMapping("/base/settlementRecord/querySettlementAmount")
    public CallbackResponse paymentSettlementAmountCallback(@RequestBody CallbackRequest callbackRequest){
        CallbackResponse callbackResponse = new CallbackResponse();
        try {
            /**
             * 指示服务是否成功或付费的总体请求代码。。
             * 177-部分付费请求
             * 178-表明请求已全额支付
             * 179-表示请求已部分支付但已过期。
             * 129-请求已过期,未付款。
             * 180.商户拒绝请求
             * 183-商户接受请求,我们可以结算资金
             * 188-商户收到请求。
             */
            String request_status_code = callbackRequest.getRequest_status_code();
            String out_trade_no = callbackRequest.getMerchant_transaction_id();
            if("177".equals(request_status_code) || "178".equals(request_status_code)){
                Payments payments = callbackRequest.getPayments().get(0);
                String order_id = payments.getPayer_transaction_id();
                if(ToolUtil.isNotEmpty(out_trade_no)){
                    Integer language = Integer.valueOf(out_trade_no.substring(17, 18));
                    Integer id = Integer.valueOf(out_trade_no.substring(18));
                    SettlementRecord settlementRecord = settlementRecordService.selectById(id);
                    settlementRecord.setPaymentStatus(2);
                    settlementRecord.setPayTime(new Date());
                    settlementRecord.setCode(order_id);
                    settlementRecordService.updateById(settlementRecord);
                    callbackResponse.setCheckout_request_id(order_id);
                    callbackResponse.setMerchant_transaction_id(out_trade_no);
                    callbackResponse.setStatus_code("183");
                    callbackResponse.setStatus_description("Payment processed successfully");
                    callbackResponse.setReceipt_number(UUIDUtil.getRandomCode(16));
                }
            }else{
                callbackResponse.setCheckout_request_id(UUIDUtil.getRandomCode(16));
                callbackResponse.setMerchant_transaction_id(out_trade_no);
                callbackResponse.setStatus_code("180");
                callbackResponse.setStatus_description("means payment rejected.");
                callbackResponse.setReceipt_number(UUIDUtil.getRandomCode(16));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return callbackResponse;
    }
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/smallLogistics/server/impl/OrderLogisticsServiceImpl.java
@@ -13,19 +13,25 @@
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.*;
import com.stylefeng.guns.modular.system.util.itextpdf.HtmlToPdfUtils;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -251,6 +257,399 @@
                pushUtil.pushOrderState(2, orderLogistics.getDriverId(), orderLogistics.getId(), orderLogistics.getType(), orderLogistics.getState());
            }
        }).start();
        if(state == 6){
            UserInfo userInfo = userInfoMapper.selectById(orderLogistics.getUserId());
            if(orderLogistics.getPayType() == 1){
                if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                    String path = templatePath + "user/receiptLogistics.html";
                    Document document = Jsoup.parse(new File(path), "UTF-8");
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
                    Driver driver = driverService.selectById(orderLogistics.getDriverId());
                    if(1 == language){
                        document.getElementById("english").remove();
                        document.getElementById("french").remove();
                        Element title_chinese = document.getElementById("title_chinese");
                        title_chinese.text(sdf.format(orderLogistics.getTravelTime()) + ",您在I-GO1个订单消费GHS " + orderLogistics.getPayMoney());
                        Element xcf_chinese = document.getElementById("xcf_chinese");
                        xcf_chinese.text("GHS " + orderLogistics.getOrderMoney());
                        Element xj_chinese = document.getElementById("xj_chinese");
                        xj_chinese.text("GHS " + orderLogistics.getOrderMoney());
                        Element pay_type_chinese = document.getElementById("pay_type_chinese");
                        pay_type_chinese.text("手机");
                        Element pay_money_chinese = document.getElementById("pay_money_chinese");
                        pay_money_chinese.text("GHS " + orderLogistics.getPayMoney());
                        Element pdf_chinese = document.getElementById("pdf_chinese");
                        pdf_chinese.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                        Element lost_item_chinese = document.getElementById("lost_item_chinese");
                        lost_item_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_chinese = document.getElementById("track_chinese");
//                    track_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                        Element pay_time_chinese = document.getElementById("pay_time_chinese");
                        pay_time_chinese.text(sdf1.format(orderLogistics.getTravelTime()));
                        Elements driver_chinese = document.getElementsByClass("driver_chinese");
                        for (int i = 0; i < driver_chinese.size(); i++) {
                            Element element = driver_chinese.get(i);
                            element.text(driver.getFirstName() + "." + driver.getLastName());
                        }
                        Element start_address_chinese = document.getElementById("start_address_chinese");
                        start_address_chinese.text(orderLogistics.getStartAddress());
                        Element end_address_chinese = document.getElementById("end_address_chinese");
                        end_address_chinese.text(orderLogistics.getEndAddress());
                    }
                    if(2 == language){
                        document.getElementById("chinese").remove();
                        document.getElementById("french").remove();
                        Element title_english = document.getElementById("title_english");
                        title_english.text(sdf.format(orderLogistics.getTravelTime()) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
                        Element xcf_english = document.getElementById("xcf_english");
                        xcf_english.text("GHS " + orderLogistics.getOrderMoney());
                        Element xj_english = document.getElementById("xj_english");
                        xj_english.text("GHS " + orderLogistics.getOrderMoney());
                        Element pay_type_english = document.getElementById("pay_type_english");
                        pay_type_english.text("Mobile");
                        Element pay_money_english = document.getElementById("pay_money_english");
                        pay_money_english.text("GHS " + orderLogistics.getPayMoney());
                        Element pdf_english = document.getElementById("pdf_english");
                        pdf_english.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                        Element lost_item_english = document.getElementById("lost_item_english");
                        lost_item_english.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_english = document.getElementById("track_english");
//                    track_english.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                        Element pay_time_english = document.getElementById("pay_time_english");
                        pay_time_english.text(sdf1.format(orderLogistics.getTravelTime()));
                        Elements driver_english = document.getElementsByClass("driver_english");
                        for (int i = 0; i < driver_english.size(); i++) {
                            Element element = driver_english.get(i);
                            element.text(driver.getFirstName() + "." + driver.getLastName());
                        }
                        Element start_address_english = document.getElementById("start_address_english");
                        start_address_english.text(orderLogistics.getStartAddress());
                        Element end_address_english = document.getElementById("end_address_english");
                        end_address_english.text(orderLogistics.getEndAddress());
                    }
                    if(3 == language){
                        document.getElementById("chinese").remove();
                        document.getElementById("english").remove();
                        Element title_french = document.getElementById("title_french");
                        title_french.text(sdf.format(orderLogistics.getTravelTime()) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande i-go1 le ");
                        Element xcf_french = document.getElementById("xcf_french");
                        xcf_french.text("GHS " + orderLogistics.getOrderMoney());
                        Element xj_french = document.getElementById("xj_french");
                        xj_french.text("GHS " + orderLogistics.getOrderMoney());
                        Element pay_type_french = document.getElementById("pay_type_french");
                        pay_type_french.text("Mobile");
                        Element pay_money_french = document.getElementById("pay_money_french");
                        pay_money_french.text("GHS " + orderLogistics.getPayMoney());
                        Element pdf_french = document.getElementById("pdf_french");
                        pdf_french.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                        Element lost_item_french = document.getElementById("lost_item_french");
                        lost_item_french.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_french = document.getElementById("track_french");
//                    track_french.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                        Element pay_time_french = document.getElementById("pay_time_french");
                        pay_time_french.text(sdf1.format(orderLogistics.getTravelTime()));
                        Elements driver_french = document.getElementsByClass("driver_french");
                        for (int i = 0; i < driver_french.size(); i++) {
                            Element element = driver_french.get(i);
                            element.text(driver.getFirstName() + "." + driver.getLastName());
                        }
                        Element start_address_french = document.getElementById("start_address_french");
                        start_address_french.text(orderLogistics.getStartAddress());
                        Element end_address_french = document.getElementById("end_address_french");
                        end_address_french.text(orderLogistics.getEndAddress());
                    }
                    EmailUtil.send(userInfo.getEmail(), language == 1 ? "包裹收据" : language == 2 ? "Parcel receipt" : "Réception de colis",  document.html());
                    //开始生成pdf收据和html收据
                    File file = new File("/usr/local/nginx/html/files/html/");
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    file = new File("/usr/local/nginx/html/files/html/parcel_receipt_" + orderId + ".html");
                    if(!file.exists()){
                        file.createNewFile();
                    }
                    FileWriter fileWriter = new FileWriter(file);
                    fileWriter.write(document.html());
                    fileWriter.flush();
                    fileWriter.close();
                    FileInputStream fileInputStream = new FileInputStream(file);
                    File file1 = new File("/usr/local/nginx/html/files/pdf/");
                    if(!file1.exists()){
                        file1.mkdirs();
                    }
                    file1 = new File("/usr/local/nginx/html/files/pdf/parcel_receipt_" + orderId + ".pdf");
                    if(!file1.exists()){
                        file1.createNewFile();
                    }
                    FileOutputStream fileOutputStream = new FileOutputStream(file1);
                    HtmlToPdfUtils.convertToPdf(fileInputStream, "IGO", fileOutputStream);
                }
            }
            if(orderLogistics.getPayType() == 2){
                if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                    String path = templatePath + "user/receiptLogistics.html";
                    Document document = Jsoup.parse(new File(path), "UTF-8");
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
                    Driver driver = driverService.selectById(orderLogistics.getDriverId());
                    if(1 == language){
                        document.getElementById("english").remove();
                        document.getElementById("french").remove();
                        Element title_chinese = document.getElementById("title_chinese");
                        title_chinese.text(sdf.format(orderLogistics.getTravelTime()) + ",您在I-GO1个订单消费GHS " + orderLogistics.getPayMoney());
                        Element xcf_chinese = document.getElementById("xcf_chinese");
                        xcf_chinese.text("GHS " + orderLogistics.getOrderMoney());
                        Element xj_chinese = document.getElementById("xj_chinese");
                        xj_chinese.text("GHS " + orderLogistics.getOrderMoney());
                        Element pay_type_chinese = document.getElementById("pay_type_chinese");
                        pay_type_chinese.text("银行卡");
                        Element pay_money_chinese = document.getElementById("pay_money_chinese");
                        pay_money_chinese.text("GHS " + orderLogistics.getPayMoney());
                        Element pdf_chinese = document.getElementById("pdf_chinese");
                        pdf_chinese.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                        Element lost_item_chinese = document.getElementById("lost_item_chinese");
                        lost_item_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_chinese = document.getElementById("track_chinese");
//                    track_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                        Element pay_time_chinese = document.getElementById("pay_time_chinese");
                        pay_time_chinese.text(sdf1.format(orderLogistics.getTravelTime()));
                        Elements driver_chinese = document.getElementsByClass("driver_chinese");
                        for (int i = 0; i < driver_chinese.size(); i++) {
                            Element element = driver_chinese.get(i);
                            element.text(driver.getFirstName() + "." + driver.getLastName());
                        }
                        Element start_address_chinese = document.getElementById("start_address_chinese");
                        start_address_chinese.text(orderLogistics.getStartAddress());
                        Element end_address_chinese = document.getElementById("end_address_chinese");
                        end_address_chinese.text(orderLogistics.getEndAddress());
                    }
                    if(2 == language){
                        document.getElementById("chinese").remove();
                        document.getElementById("french").remove();
                        Element title_english = document.getElementById("title_english");
                        title_english.text(sdf.format(orderLogistics.getTravelTime()) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
                        Element xcf_english = document.getElementById("xcf_english");
                        xcf_english.text("GHS " + orderLogistics.getOrderMoney());
                        Element xj_english = document.getElementById("xj_english");
                        xj_english.text("GHS " + orderLogistics.getOrderMoney());
                        Element pay_type_english = document.getElementById("pay_type_english");
                        pay_type_english.text("Bank card");
                        Element pay_money_english = document.getElementById("pay_money_english");
                        pay_money_english.text("GHS " + orderLogistics.getPayMoney());
                        Element pdf_english = document.getElementById("pdf_english");
                        pdf_english.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                        Element lost_item_english = document.getElementById("lost_item_english");
                        lost_item_english.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_english = document.getElementById("track_english");
//                    track_english.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                        Element pay_time_english = document.getElementById("pay_time_english");
                        pay_time_english.text(sdf1.format(orderLogistics.getTravelTime()));
                        Elements driver_english = document.getElementsByClass("driver_english");
                        for (int i = 0; i < driver_english.size(); i++) {
                            Element element = driver_english.get(i);
                            element.text(driver.getFirstName() + "." + driver.getLastName());
                        }
                        Element start_address_english = document.getElementById("start_address_english");
                        start_address_english.text(orderLogistics.getStartAddress());
                        Element end_address_english = document.getElementById("end_address_english");
                        end_address_english.text(orderLogistics.getEndAddress());
                    }
                    if(3 == language){
                        document.getElementById("chinese").remove();
                        document.getElementById("english").remove();
                        Element title_french = document.getElementById("title_french");
                        title_french.text(sdf.format(orderLogistics.getTravelTime()) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande i-go1 le ");
                        Element xcf_french = document.getElementById("xcf_french");
                        xcf_french.text("GHS " + orderLogistics.getOrderMoney());
                        Element xj_french = document.getElementById("xj_french");
                        xj_french.text("GHS " + orderLogistics.getOrderMoney());
                        Element pay_type_french = document.getElementById("pay_type_french");
                        pay_type_french.text("Carte bancaire");
                        Element pay_money_french = document.getElementById("pay_money_french");
                        pay_money_french.text("GHS " + orderLogistics.getPayMoney());
                        Element pdf_french = document.getElementById("pdf_french");
                        pdf_french.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                        Element lost_item_french = document.getElementById("lost_item_french");
                        lost_item_french.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_french = document.getElementById("track_french");
//                    track_french.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                        Element pay_time_french = document.getElementById("pay_time_french");
                        pay_time_french.text(sdf1.format(orderLogistics.getTravelTime()));
                        Elements driver_french = document.getElementsByClass("driver_french");
                        for (int i = 0; i < driver_french.size(); i++) {
                            Element element = driver_french.get(i);
                            element.text(driver.getFirstName() + "." + driver.getLastName());
                        }
                        Element start_address_french = document.getElementById("start_address_french");
                        start_address_french.text(orderLogistics.getStartAddress());
                        Element end_address_french = document.getElementById("end_address_french");
                        end_address_french.text(orderLogistics.getEndAddress());
                    }
                    EmailUtil.send(userInfo.getEmail(), language == 1 ? "包裹收据" : language == 2 ? "Parcel receipt" : "Réception de colis",  document.html());
                    //开始生成pdf收据和html收据
                    File file = new File("/usr/local/nginx/html/files/html/");
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    file = new File("/usr/local/nginx/html/files/html/parcel_receipt_" + orderId + ".html");
                    if(!file.exists()){
                        file.createNewFile();
                    }
                    FileWriter fileWriter = new FileWriter(file);
                    fileWriter.write(document.html());
                    fileWriter.flush();
                    fileWriter.close();
                    FileInputStream fileInputStream = new FileInputStream(file);
                    File file1 = new File("/usr/local/nginx/html/files/pdf/");
                    if(!file1.exists()){
                        file1.mkdirs();
                    }
                    file1 = new File("/usr/local/nginx/html/files/pdf/parcel_receipt_" + orderId + ".pdf");
                    if(!file1.exists()){
                        file1.createNewFile();
                    }
                    FileOutputStream fileOutputStream = new FileOutputStream(file1);
                    HtmlToPdfUtils.convertToPdf(fileInputStream, "IGO", fileOutputStream);
                }
            }
            if(orderLogistics.getPayType() == 3){
                if(ToolUtil.isNotEmpty(userInfo.getEmail())){
                    String path = templatePath + "user/receiptLogistics.html";
                    Document document = Jsoup.parse(new File(path), "UTF-8");
                    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm");
                    Driver driver = driverService.selectById(orderLogistics.getDriverId());
                    if(1 == language){
                        document.getElementById("english").remove();
                        document.getElementById("french").remove();
                        Element title_chinese = document.getElementById("title_chinese");
                        title_chinese.text(sdf2.format(orderLogistics.getTravelTime()) + ",您在I-GO1个订单消费GHS " + orderLogistics.getPayMoney());
                        Element xcf_chinese = document.getElementById("xcf_chinese");
                        xcf_chinese.text("GHS " + orderLogistics.getOrderMoney());
                        Element xj_chinese = document.getElementById("xj_chinese");
                        xj_chinese.text("GHS " + orderLogistics.getOrderMoney());
                        Element pay_type_chinese = document.getElementById("pay_type_chinese");
                        pay_type_chinese.text("余额");
                        Element pay_money_chinese = document.getElementById("pay_money_chinese");
                        pay_money_chinese.text("GHS " + orderLogistics.getPayMoney());
                        Element pdf_chinese = document.getElementById("pdf_chinese");
                        pdf_chinese.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                        Element lost_item_chinese = document.getElementById("lost_item_chinese");
                        lost_item_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_chinese = document.getElementById("track_chinese");
//                    track_chinese.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                        Element pay_time_chinese = document.getElementById("pay_time_chinese");
                        pay_time_chinese.text(sdf1.format(orderLogistics.getTravelTime()));
                        Elements driver_chinese = document.getElementsByClass("driver_chinese");
                        for (int i = 0; i < driver_chinese.size(); i++) {
                            Element element = driver_chinese.get(i);
                            element.text(driver.getFirstName() + "." + driver.getLastName());
                        }
                        Element start_address_chinese = document.getElementById("start_address_chinese");
                        start_address_chinese.text(orderLogistics.getStartAddress());
                        Element end_address_chinese = document.getElementById("end_address_chinese");
                        end_address_chinese.text(orderLogistics.getEndAddress());
                    }
                    if(2 == language){
                        document.getElementById("chinese").remove();
                        document.getElementById("french").remove();
                        Element title_english = document.getElementById("title_english");
                        title_english.text(sdf2.format(orderLogistics.getTravelTime()) + ",You spent GHS " + orderLogistics.getPayMoney() + " on the trip ");
                        Element xcf_english = document.getElementById("xcf_english");
                        xcf_english.text("GHS " + orderLogistics.getOrderMoney());
                        Element xj_english = document.getElementById("xj_english");
                        xj_english.text("GHS " + orderLogistics.getOrderMoney());
                        Element pay_type_english = document.getElementById("pay_type_english");
                        pay_type_english.text("balance");
                        Element pay_money_english = document.getElementById("pay_money_english");
                        pay_money_english.text("GHS " + orderLogistics.getPayMoney());
                        Element pdf_english = document.getElementById("pdf_english");
                        pdf_english.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                        Element lost_item_english = document.getElementById("lost_item_english");
                        lost_item_english.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_english = document.getElementById("track_english");
//                    track_english.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                        Element pay_time_english = document.getElementById("pay_time_english");
                        pay_time_english.text(sdf1.format(orderLogistics.getTravelTime()));
                        Elements driver_english = document.getElementsByClass("driver_english");
                        for (int i = 0; i < driver_english.size(); i++) {
                            Element element = driver_english.get(i);
                            element.text(driver.getFirstName() + "." + driver.getLastName());
                        }
                        Element start_address_english = document.getElementById("start_address_english");
                        start_address_english.text(orderLogistics.getStartAddress());
                        Element end_address_english = document.getElementById("end_address_english");
                        end_address_english.text(orderLogistics.getEndAddress());
                    }
                    if(3 == language){
                        document.getElementById("chinese").remove();
                        document.getElementById("english").remove();
                        Element title_french = document.getElementById("title_french");
                        title_french.text(sdf2.format(orderLogistics.getTravelTime()) + ",Vous consommez GHS " + orderLogistics.getPayMoney() + " sur votre commande i-go1 le ");
                        Element xcf_french = document.getElementById("xcf_french");
                        xcf_french.text("GHS " + orderLogistics.getOrderMoney());
                        Element xj_french = document.getElementById("xj_french");
                        xj_french.text("GHS " + orderLogistics.getOrderMoney());
                        Element pay_type_french = document.getElementById("pay_type_french");
                        pay_type_french.text("Le solde");
                        Element pay_money_french = document.getElementById("pay_money_french");
                        pay_money_french.text("GHS " + orderLogistics.getPayMoney());
                        Element pdf_french = document.getElementById("pdf_french");
                        pdf_french.attr("href", "http://182.160.16.251:80/user/base/order/uploadReceiptPdf?orderId=" + orderId + "&orderType=4");
                        Element lost_item_french = document.getElementById("lost_item_french");
                        lost_item_french.attr("href", "http://182.160.16.251:81/mailbox/user/lossGoods.html?language=" + language + "&orderId=" + orderId + "&orderType=4");
//                    Element track_french = document.getElementById("track_french");
//                    track_french.attr("href", "http://182.160.16.251:81/mailbox/user/location.html");
                        Element pay_time_french = document.getElementById("pay_time_french");
                        pay_time_french.text(sdf1.format(orderLogistics.getTravelTime()));
                        Elements driver_french = document.getElementsByClass("driver_french");
                        for (int i = 0; i < driver_french.size(); i++) {
                            Element element = driver_french.get(i);
                            element.text(driver.getFirstName() + "." + driver.getLastName());
                        }
                        Element start_address_french = document.getElementById("start_address_french");
                        start_address_french.text(orderLogistics.getStartAddress());
                        Element end_address_french = document.getElementById("end_address_french");
                        end_address_french.text(orderLogistics.getEndAddress());
                    }
                    EmailUtil.send(userInfo.getEmail(), language == 1 ? "包裹收据" : language == 2 ? "Parcel receipt" : "Réception de colis",  document.html());
                    //开始生成pdf收据和html收据
                    File file = new File("/usr/local/nginx/html/files/html/");
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    file = new File("/usr/local/nginx/html/files/html/parcel_receipt_" + orderId + ".html");
                    if(!file.exists()){
                        file.createNewFile();
                    }
                    FileWriter fileWriter = new FileWriter(file);
                    fileWriter.write(document.html());
                    fileWriter.flush();
                    fileWriter.close();
                    FileInputStream fileInputStream = new FileInputStream(file);
                    File file1 = new File("/usr/local/nginx/html/files/pdf/");
                    if(!file1.exists()){
                        file1.mkdirs();
                    }
                    file1 = new File("/usr/local/nginx/html/files/pdf/parcel_receipt_" + orderId + ".pdf");
                    if(!file1.exists()){
                        file1.createNewFile();
                    }
                    FileOutputStream fileOutputStream = new FileOutputStream(file1);
                    HtmlToPdfUtils.convertToPdf(fileInputStream, "IGO", fileOutputStream);
                }
            }
        }
        return ResultUtil.success();
    }
@@ -420,7 +819,7 @@
        UserInfo userInfo = userInfoMapper.selectById(orderLogistics.getUserId());
        if(ToolUtil.isNotEmpty(userInfo.getEmail())){
            String path = templatePath + "index.html";
            String path = templatePath + "driver/index.html";
            Document document = Jsoup.parse(new File(path), "UTF-8");
            if(1 == language){
                document.getElementById("english").remove();
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SettlementAllocationMapper.java
New file
@@ -0,0 +1,11 @@
package com.stylefeng.guns.modular.system.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.stylefeng.guns.modular.system.model.SettlementAllocation;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:27
 */
public interface SettlementAllocationMapper extends BaseMapper<SettlementAllocation> {
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SettlementDetailMapper.java
New file
@@ -0,0 +1,21 @@
package com.stylefeng.guns.modular.system.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.stylefeng.guns.modular.system.model.SettlementDetail;
import java.util.List;
import java.util.Map;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:28
 */
public interface SettlementDetailMapper extends BaseMapper<SettlementDetail> {
    /**
     * 获取汇总分组数据
     * @return
     */
    List<Map<String, Object>> queryGroupDriver();
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SettlementRecordMapper.java
New file
@@ -0,0 +1,24 @@
package com.stylefeng.guns.modular.system.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.stylefeng.guns.modular.system.model.SettlementRecord;
import com.stylefeng.guns.modular.system.warpper.QueryHistoricalSettlement;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:34
 */
public interface SettlementRecordMapper extends BaseMapper<SettlementRecord> {
    /**
     * 获取结算历史
     * @param driverId
     * @return
     */
    List<QueryHistoricalSettlement> queryHistoricalSettlement(@Param("driverId") Integer driverId, @Param("pageNum") Integer pageNum,
                                                              @Param("size") Integer size);
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SettlementAllocationMapper.xml
New file
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.stylefeng.guns.modular.system.dao.SettlementAllocationMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SettlementAllocation">
        <id column="id" property="id"/>
        <result column="content" property="content"/>
    </resultMap>
</mapper>
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SettlementDetailMapper.xml
New file
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.stylefeng.guns.modular.system.dao.SettlementDetailMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SettlementDetail">
        <id column="id" property="id"/>
        <result column="orderId" property="orderId"/>
        <result column="orderType" property="orderType"/>
        <result column="driverId" property="driverId"/>
        <result column="price" property="price"/>
        <result column="createTime" property="createTime"/>
    </resultMap>
    <select id="queryGroupDriver" resultType="map">
        select
        driverId,
        sum(price) as price
        from t_settlement_detail where settlementRecordId is null group by driverId
    </select>
</mapper>
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SettlementRecordMapper.xml
New file
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.stylefeng.guns.modular.system.dao.SettlementRecordMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.system.model.SettlementRecord">
        <id column="id" property="id"/>
        <result column="day" property="day"/>
        <result column="driverId" property="driverId"/>
        <result column="type" property="type"/>
        <result column="paymentStatus" property="paymentStatus"/>
        <result column="payMoney" property="payMoney"/>
        <result column="payType" property="payType"/>
        <result column="code" property="code"/>
        <result column="insertTime" property="insertTime"/>
    </resultMap>
    <select id="queryHistoricalSettlement" resultType="com.stylefeng.guns.modular.system.warpper.QueryHistoricalSettlement">
        select
        DATE_FORMAT(`day`, '%Y/%m/%d') as createTime,
        payMoney as price,
        `type`
        from t_settlement_record where driverId = #{driverId} and paymentStatus = 2 order by insertTime desc limit #{pageNum}, #{size}
    </select>
</mapper>
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SettlementAllocation.java
New file
@@ -0,0 +1,26 @@
package com.stylefeng.guns.modular.system.model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:26
 */
@Data
@TableName("t_settlement_allocation")
public class SettlementAllocation {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 配置json
     */
    @TableField("content")
    private String content;
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SettlementDetail.java
New file
@@ -0,0 +1,58 @@
package com.stylefeng.guns.modular.system.model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import java.util.Date;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:23
 */
@Data
@TableName("t_settlement_detail")
public class SettlementDetail {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 结算主表id
     */
    @TableField("settlementRecordId")
    private Integer settlementRecordId;
    /**
     * 订单id
     */
    @TableField("orderId")
    private Integer orderId;
    /**
     * 订单类型(1=专车,4=同城小件)
     */
    @TableField("orderType")
    private Integer orderType;
    /**
     * 司机id
     */
    @TableField("driverId")
    private Integer driverId;
    /**
     * 订单金额
     */
    @TableField("orderMoney")
    private Double orderMoney;
    /**
     * 结算金额
     */
    @TableField("price")
    private Double price;
    /**
     * 添加日期
     */
    @TableField("createTime")
    private Date createTime;
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SettlementRecord.java
New file
@@ -0,0 +1,70 @@
package com.stylefeng.guns.modular.system.model;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import java.util.Date;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:13
 */
@Data
@TableName("t_settlement_record")
public class SettlementRecord {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 结算日期
     */
    @TableField("day")
    private Date day;
    /**
     * 司机id
     */
    @TableField("driverId")
    private Integer driverId;
    /**
     * 结算周期(1=日结算,2=周结算,3=月结算)
     */
    @TableField("type")
    private Integer type;
    /**
     * 支付状态(1=待支付,2=已支付)
     */
    @TableField("paymentStatus")
    private Integer paymentStatus;
    /**
     * 支付金额
     */
    @TableField("payMoney")
    private Double payMoney;
    /**
     * 支付方式(1=手机支付,2=银行卡支付,3=余额支付)
     */
    @TableField("payType")
    private Integer payType;
    /**
     * 支付时间
     */
    @TableField("payTime")
    private Date payTime;
    /**
     * 支付单号
     */
    @TableField("code")
    private String code;
    /**
     * 添加时间
     */
    @TableField("insertTime")
    private Date insertTime;
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISettlementAllocationService.java
New file
@@ -0,0 +1,11 @@
package com.stylefeng.guns.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.stylefeng.guns.modular.system.model.SettlementAllocation;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:37
 */
public interface ISettlementAllocationService extends IService<SettlementAllocation> {
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISettlementDetailService.java
New file
@@ -0,0 +1,20 @@
package com.stylefeng.guns.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.stylefeng.guns.modular.system.model.SettlementDetail;
import java.util.List;
import java.util.Map;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:36
 */
public interface ISettlementDetailService extends IService<SettlementDetail>{
    /**
     * 获取汇总分组数据
     * @return
     */
    List<Map<String, Object>> queryGroupDriver();
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISettlementRecordService.java
New file
@@ -0,0 +1,56 @@
package com.stylefeng.guns.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.stylefeng.guns.modular.system.model.SettlementRecord;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.warpper.QueryHistoricalSettlement;
import com.stylefeng.guns.modular.system.warpper.QuerySettlementAmount;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:36
 */
public interface ISettlementRecordService extends IService<SettlementRecord> {
    /**
     * 获取待结算金额和明细
     * @param driverId
     * @return
     */
    QuerySettlementAmount querySettlementAmount(Integer driverId);
    /**
     * 支付待结算
     * @param driverId
     * @param payType
     * @return
     */
    ResultUtil paymentSettlementAmount(Integer driverId, Integer payType, Integer bankCardId, Integer language) throws Exception;
    /**
     * 获取司机历史结算记录
     * @param driverId
     * @return
     */
    List<QueryHistoricalSettlement> queryHistoricalSettlement(Integer driverId, Integer pageNum, Integer size);
    /**
     * 是否需要结算
     * @param driverId
     * @return
     * @throws Exception
     */
    boolean needToSettle(Integer driverId) throws Exception;
    /**
     * 定时任务生成结算数据
     */
    void taskSettlement();
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -201,7 +201,7 @@
        //发送验证码短信
        redisUtil.setStrValue(email, authCode, 5 * 60);//设置五分钟过期
        String path = templatePath + "index.html";
        String path = templatePath + "driver/index.html";
        Document document = Jsoup.parse(new File(path), "UTF-8");
        if(1 == language){
            document.getElementById("english").remove();
@@ -307,7 +307,7 @@
                driverMapper.updateById(driver);
                if(ToolUtil.isNotEmpty(driver.getEmail())){
                    String path = templatePath + "index.html";
                    String path = templatePath + "driver/index.html";
                    Document document = Jsoup.parse(new File(path), "UTF-8");
                    if(1 == language){
                        document.getElementById("english").remove();
@@ -424,12 +424,9 @@
            return ResultUtil.success(loginWarpper);
        }
        driver1 = driverMapper.queryByPhone(phone);
        if(null != driver1){
            LoginWarpper loginWarpper = new LoginWarpper();
            loginWarpper.setId(driver1.getId());
            return ResultUtil.success(loginWarpper);
            return ResultUtil.error(language == 1 ? "账号已存在" : language == 2 ? "Account already exists" : "Le compte existe déjà");
        }
        Driver driver = new Driver();
        driver.setAccount(phone);
@@ -479,7 +476,7 @@
        Driver driver = this.selectById(uid);
        driver.setLastName(registeredWarpper.getLastName());
        driver.setFirstName(registeredWarpper.getFirstName());
        driver.setSex(registeredWarpper.getSex());
//        driver.setSex(registeredWarpper.getSex());
        driver.setIdCard(registeredWarpper.getIdCard());
        driver.setBirthday(registeredWarpper.getBirthday());
@@ -513,11 +510,11 @@
        driver.setPlaceOfPractice(language == 1 ? city1.getChineseName() : language == 2 ? city1.getEnglishName() : city1.getFrenchName());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(registeredWarpper.getGetDriverLicenseDate());
//        calendar.setTime(registeredWarpper.getGetDriverLicenseDate());
        Calendar now = Calendar.getInstance();
        now.setTime(new Date());
        driver.setDriverAge(now.get(Calendar.YEAR) - calendar.get(Calendar.YEAR));
        driver.setGetDriverLicenseDate(registeredWarpper.getGetDriverLicenseDate());
//        driver.setGetDriverLicenseDate(registeredWarpper.getGetDriverLicenseDate());
        driver.setDriveCardImgUrl1(registeredWarpper.getDriveCardImgUrl());
        driver.setDriveCardImgUrl2(registeredWarpper.getDriveCardImgUrl2());
        driver.setEmail(registeredWarpper.getEmail());
@@ -545,7 +542,7 @@
        }
        if(ToolUtil.isNotEmpty(driver.getEmail())){
            String path1 = templatePath + "index.html";
            String path1 = templatePath + "driver/index.html";
            Document document1 = Jsoup.parse(new File(path1), "UTF-8");
            if(1 == language){
                document1.getElementById("english").remove();
@@ -624,7 +621,7 @@
        driverMapper.updateById(driver);
        if(ToolUtil.isNotEmpty(driver.getEmail())){
            String path1 = templatePath + "index.html";
            String path1 = templatePath + "driver/index.html";
            Document document1 = Jsoup.parse(new File(path1), "UTF-8");
            if(1 == language){
                document1.getElementById("english").remove();
@@ -770,24 +767,24 @@
        int size = this.queryMyActivity(uid, new Date(), language).size();
        map.put("activity", size);
        //获取司机待支付的现金支付订单推送司机支付
        new Thread(new Runnable() {
            @Override
            public void run() {
                List<OrderPrivateCar> orderPrivateCars = orderPrivateCarService.selectList(new EntityWrapper<OrderPrivateCar>().eq("driverId", uid).eq("payType", 4)
                        .eq("driverPay", 1).eq("isDelete", 1));
                if(orderPrivateCars.size() > 0){
                    OrderPrivateCar orderPrivateCar = orderPrivateCars.get(0);
                    pushUtil.pushOfflinePayment(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1);
                    return;
                }
                List<OrderLogistics> orderLogistics = orderLogisticsService.selectList(new EntityWrapper<OrderLogistics>().eq("driverId", uid).eq("payType", 4)
                        .eq("isDelete", 1).eq("driverPay", 1));
                if(orderLogistics.size() > 0){
                    OrderLogistics orderLogistics1 = orderLogistics.get(0);
                    pushUtil.pushOfflinePayment(2, orderLogistics1.getDriverId(), orderLogistics1.getId(), orderLogistics1.getType());
                }
            }
        }).start();
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                List<OrderPrivateCar> orderPrivateCars = orderPrivateCarService.selectList(new EntityWrapper<OrderPrivateCar>().eq("driverId", uid).eq("payType", 4)
//                        .eq("driverPay", 1).eq("isDelete", 1));
//                if(orderPrivateCars.size() > 0){
//                    OrderPrivateCar orderPrivateCar = orderPrivateCars.get(0);
//                    pushUtil.pushOfflinePayment(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1);
//                    return;
//                }
//                List<OrderLogistics> orderLogistics = orderLogisticsService.selectList(new EntityWrapper<OrderLogistics>().eq("driverId", uid).eq("payType", 4)
//                        .eq("isDelete", 1).eq("driverPay", 1));
//                if(orderLogistics.size() > 0){
//                    OrderLogistics orderLogistics1 = orderLogistics.get(0);
//                    pushUtil.pushOfflinePayment(2, orderLogistics1.getDriverId(), orderLogistics1.getId(), orderLogistics1.getType());
//                }
//            }
//        }).start();
        return map;
    }
@@ -1091,7 +1088,7 @@
        driver.setPassword(ShiroKit.md5(password, salt));
        this.updateById(driver);
        if(ToolUtil.isNotEmpty(driver.getEmail())){
            String path1 = templatePath + "index.html";
            String path1 = templatePath + "driver/index.html";
            Document document1 = Jsoup.parse(new File(path1), "UTF-8");
            if(1 == language){
                document1.getElementById("english").remove();
@@ -1388,7 +1385,7 @@
                    driverActivityHistoryMapper.insert(driverActivityHistory);
                    if(ToolUtil.isNotEmpty(driver.getEmail())) {
                        String path1 = templatePath + "index.html";
                        String path1 = templatePath + "driver/index.html";
                        Document document1 = Jsoup.parse(new File(path1), "UTF-8");
                        if (1 == language) {
                            document1.getElementById("english").remove();
@@ -1469,7 +1466,7 @@
                    driverActivityHistoryMapper.insert(driverActivityHistory);
                    if(ToolUtil.isNotEmpty(driver.getEmail())) {
                        String path1 = templatePath + "index.html";
                        String path1 = templatePath + "driver/index.html";
                        Document document1 = Jsoup.parse(new File(path1), "UTF-8");
                        if (1 == language) {
                            document1.getElementById("english").remove();
@@ -1551,7 +1548,7 @@
                    driverActivityHistoryMapper.insert(driverActivityHistory);
                    if(ToolUtil.isNotEmpty(driver.getEmail())) {
                        String path1 = templatePath + "index.html";
                        String path1 = templatePath + "driver/index.html";
                        Document document1 = Jsoup.parse(new File(path1), "UTF-8");
                        if (1 == language) {
                            document1.getElementById("english").remove();
@@ -1633,7 +1630,7 @@
                    driverActivityHistoryMapper.insert(driverActivityHistory);
                    if(ToolUtil.isNotEmpty(driver.getEmail())) {
                        String path1 = templatePath + "index.html";
                        String path1 = templatePath + "driver/index.html";
                        Document document1 = Jsoup.parse(new File(path1), "UTF-8");
                        if (1 == language) {
                            document1.getElementById("english").remove();
@@ -1737,7 +1734,7 @@
                    if(ToolUtil.isNotEmpty(driver.getEmail())) {
                        String path1 = templatePath + "index.html";
                        String path1 = templatePath + "driver/index.html";
                        Document document1 = Jsoup.parse(new File(path1), "UTF-8");
                        if (1 == language) {
                            document1.getElementById("english").remove();
@@ -1821,7 +1818,7 @@
                incomeService.saveData(2, dah.getDriverId(), 1, dao.getId(), null, dah.getMoney());
                if(ToolUtil.isNotEmpty(driver.getEmail())) {
                    String path1 = templatePath + "index.html";
                    String path1 = templatePath + "driver/index.html";
                    Document document1 = Jsoup.parse(new File(path1), "UTF-8");
                    if (1 == language) {
                        document1.getElementById("english").remove();
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SettlementAllocationServiceImpl.java
New file
@@ -0,0 +1,15 @@
package com.stylefeng.guns.modular.system.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.modular.system.dao.SettlementAllocationMapper;
import com.stylefeng.guns.modular.system.model.SettlementAllocation;
import com.stylefeng.guns.modular.system.service.ISettlementAllocationService;
import org.springframework.stereotype.Service;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:38
 */
@Service
public class SettlementAllocationServiceImpl extends ServiceImpl<SettlementAllocationMapper, SettlementAllocation> implements ISettlementAllocationService {
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SettlementDetailServiceImpl.java
New file
@@ -0,0 +1,28 @@
package com.stylefeng.guns.modular.system.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.modular.system.dao.SettlementDetailMapper;
import com.stylefeng.guns.modular.system.model.SettlementDetail;
import com.stylefeng.guns.modular.system.service.ISettlementDetailService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:37
 */
@Service
public class SettlementDetailServiceImpl extends ServiceImpl<SettlementDetailMapper, SettlementDetail> implements ISettlementDetailService {
    /**
     * 获取汇总分组数据
     * @return
     */
    @Override
    public List<Map<String, Object>> queryGroupDriver() {
        return this.baseMapper.queryGroupDriver();
    }
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SettlementRecordServiceImpl.java
New file
@@ -0,0 +1,263 @@
package com.stylefeng.guns.modular.system.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.modular.system.dao.SettlementRecordMapper;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
import com.stylefeng.guns.modular.system.util.ResultUtil;
import com.stylefeng.guns.modular.system.util.Tingg.TinggPayUtil;
import com.stylefeng.guns.modular.system.util.Tingg.model.CheckoutRequest;
import com.stylefeng.guns.modular.system.warpper.QueryHistoricalSettlement;
import com.stylefeng.guns.modular.system.warpper.QuerySettlementAmount;
import com.stylefeng.guns.modular.system.warpper.QuerySettlementAmountDetails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:36
 */
@Service
public class SettlementRecordServiceImpl extends ServiceImpl<SettlementRecordMapper, SettlementRecord> implements ISettlementRecordService {
    @Autowired
    private ISettlementDetailService settlementDetailService;
    @Autowired
    private IDriverService driverService;
    @Autowired
    private IBankCardService bankCardService;
    @Autowired
    private ITransactionDetailsService transactionDetailsService;
    @Autowired
    private ISettlementAllocationService settlementAllocationService;
    @Value("${callbackPath}")
    private String callbackPath;//支付回调网关地址
    /**
     * 获取待结算金额和明细
     * @param driverId
     * @return
     */
    @Override
    public QuerySettlementAmount querySettlementAmount(Integer driverId) {
        QuerySettlementAmount querySettlementAmount = new QuerySettlementAmount();
        SettlementRecord settlementRecord = this.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
        if(null != settlementRecord){
            querySettlementAmount.setType(settlementRecord.getType());
            querySettlementAmount.setAmount(settlementRecord.getPayMoney());
            List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("settlementRecordId", settlementRecord.getId()).orderBy("createTime desc"));
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            List<QuerySettlementAmountDetails> list = new ArrayList<>();
            settlementDetailList.forEach(s -> {
                QuerySettlementAmountDetails querySettlementAmountDetails = new QuerySettlementAmountDetails();
                querySettlementAmountDetails.setOrderMoney(s.getOrderMoney());
                querySettlementAmountDetails.setPayMoney(s.getPrice());
                querySettlementAmountDetails.setOrderTime(sdf.format(s.getCreateTime()));
                list.add(querySettlementAmountDetails);
            });
            querySettlementAmount.setList(list);
        }else{
            querySettlementAmount.setType(2);
            querySettlementAmount.setAmount(0D);
            querySettlementAmount.setList(new ArrayList<>());
        }
        return querySettlementAmount;
    }
    /**
     * 支付待结算
     * @param driverId
     * @param payType
     * @return
     */
    @Override
    public ResultUtil paymentSettlementAmount(Integer driverId, Integer payType, Integer bankCardId, Integer language) throws Exception {
        Driver driver1 = driverService.selectById(driverId);
        SettlementRecord settlementRecord = this.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
        if(null == settlementRecord){
            return ResultUtil.error(language == 1 ? "暂无需支付" : language == 2 ? "No need to pay" : "Pas besoin de payer");
        }
        Double payMoney = settlementRecord.getPayMoney();
        ResultUtil resultUtil = ResultUtil.success("");
        if(payType == 1){//手机支付
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + language + settlementRecord.getId();
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(driver1.getPhone()));
            checkoutRequest.setCustomerEmail(driver1.getEmail());
            checkoutRequest.setAccountNumber(driver1.getPhone());
            checkoutRequest.setCustomerFirstName(driver1.getFirstName());
            checkoutRequest.setCustomerLastName(driver1.getLastName());
            checkoutRequest.setRequestAmount(payMoney);
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Settlement cost");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/settlementRecord/querySettlementAmount");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()!=200){
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
            return resultUtil;
        }
        if(payType == 2){//银行卡支付
            BankCard bankCard = bankCardService.selectById(bankCardId);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            String merchantTransactionId = sdf.format(new Date()) + language + settlementRecord.getId();
            CheckoutRequest checkoutRequest = new CheckoutRequest();
            checkoutRequest.setMsisdn(Long.valueOf(bankCard.getCode()));
            checkoutRequest.setCustomerEmail(driver1.getEmail());
            checkoutRequest.setAccountNumber(bankCard.getCode());
            checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
            checkoutRequest.setCustomerLastName(bankCard.getLastName());
            checkoutRequest.setRequestAmount(payMoney);
            checkoutRequest.setMerchantTransactionId(merchantTransactionId);
            checkoutRequest.setRequestDescription("Settlement cost");
            checkoutRequest.setCallbackUrl(callbackPath + "/base/settlementRecord/querySettlementAmount");
            checkoutRequest.setPendingRedirectUrl("");
            checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
            checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
            resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
            if(resultUtil.getCode()!=200){
                resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Paiement échoué", "");
            }
            return resultUtil;
        }
        if(payType == 3){//余额支付
            if(driver1.getBalance() == null || driver1.getBalance() < payMoney){
                return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient account balance" : "Solde de compte insuffisant", "");
            }
            Double laveActivityMoney = driver1.getLaveActivityMoney();
            Double laveBusinessMoney = driver1.getLaveBusinessMoney();
            if(laveBusinessMoney.compareTo(payMoney) < 0){
                driver1.setLaveBusinessMoney(0D);
                BigDecimal m = new BigDecimal(payMoney).subtract(new BigDecimal(laveBusinessMoney));
                driver1.setLaveActivityMoney(new BigDecimal(laveActivityMoney).subtract(m).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            }else{
                driver1.setLaveBusinessMoney(new BigDecimal(laveBusinessMoney).subtract(new BigDecimal(payMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            }
            driver1.setBalance(new BigDecimal(driver1.getBalance()).subtract(new BigDecimal(payMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
            //添加交易明细
            transactionDetailsService.saveData(driverId, "线下结算", payMoney, 2, 1, 2, null, null);
            driverService.updateById(driver1);
            settlementRecord.setPaymentStatus(2);
            settlementRecord.setPayType(payType);
            settlementRecord.setPayTime(new Date());
            this.updateById(settlementRecord);
            return ResultUtil.success("");
        }
        return resultUtil;
    }
    /**
     * 获取司机结算历史记录
     * @param driverId
     * @return
     */
    @Override
    public List<QueryHistoricalSettlement> queryHistoricalSettlement(Integer driverId, Integer pageNum, Integer size) {
        pageNum = (pageNum - 1) * size;
        return this.baseMapper.queryHistoricalSettlement(driverId, pageNum, size);
    }
    /**
     * 是否需要结算
     * @param driverId
     * @return
     * @throws Exception
     */
    @Override
    public boolean needToSettle(Integer driverId) throws Exception {
        SettlementRecord settlementRecord = this.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
        return null == settlementRecord ? false : true;
    }
    /**
     * 定时任务生成结算数据
     */
    @Override
    public void taskSettlement() {
        SettlementAllocation settlementAllocation = settlementAllocationService.selectOne(null);
        Calendar today = Calendar.getInstance();
        int w = today.get(Calendar.DAY_OF_WEEK);
        w = w == 1 ? 7 : w - 1;
        int d = today.get(Calendar.DAY_OF_MONTH);
        if(null != settlementAllocation){
            List<Map<String, Object>> list = settlementDetailService.queryGroupDriver();
            JSONObject jsonObject = JSON.parseObject(settlementAllocation.getContent());
            Integer type = jsonObject.getInteger("type");
            Integer day = jsonObject.getInteger("day");
            if(type == 2 && w == day){//周结算
                for (Map<String, Object> map : list) {
                    Integer driverId = Integer.valueOf(map.get("driverId").toString());
                    Double price = Double.valueOf(map.get("price").toString());
                    SettlementRecord settlementRecord = new SettlementRecord();
                    settlementRecord.setDay(new Date());
                    settlementRecord.setDriverId(driverId);
                    settlementRecord.setType(2);
                    settlementRecord.setPaymentStatus(1);
                    settlementRecord.setPayMoney(price);
                    settlementRecord.setInsertTime(new Date());
                    this.insert(settlementRecord);
                    List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("driverId", driverId).isNull("settlementRecordId"));
                    settlementDetailList.forEach(s -> {
                        s.setSettlementRecordId(settlementRecord.getId());
                    });
                    if(settlementDetailList.size() > 0){
                        settlementDetailService.updateBatchById(settlementDetailList);
                    }
                }
            }
            if(type == 3 && d == day){//月结算
                for (Map<String, Object> map : list) {
                    Integer driverId = Integer.valueOf(map.get("driverId").toString());
                    Double price = Double.valueOf(map.get("price").toString());
                    SettlementRecord settlementRecord = new SettlementRecord();
                    settlementRecord.setDay(new Date());
                    settlementRecord.setDriverId(driverId);
                    settlementRecord.setType(3);
                    settlementRecord.setPaymentStatus(1);
                    settlementRecord.setPayMoney(price);
                    settlementRecord.setInsertTime(new Date());
                    this.insert(settlementRecord);
                    List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("driverId", driverId).isNull("settlementRecordId"));
                    settlementDetailList.forEach(s -> {
                        s.setSettlementRecordId(settlementRecord.getId());
                    });
                    if(settlementDetailList.size() > 0){
                        settlementDetailService.updateBatchById(settlementDetailList);
                    }
                }
            }
        }
    }
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/EmailUtil.java
@@ -54,8 +54,8 @@
        //选择ssl方式
        gmailssl(props);
        final String username = "southwindservice@gmail.com";// gmail 邮箱
        final String password = "ogsntijmguisoiuk";// Google应用专用密码
        final String username = "i-gotech@i-go.group";// gmail 邮箱
        final String password = "mhizkqkhuknbitps";// Google应用专用密码
        // 当做多商户的时候需要使用getInstance, 如果只是一个邮箱发送的话就用getDefaultInstance
        // Session.getDefaultInstance 会将username,password保存在session会话中
        // Session.getInstance 不进行保存
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java
@@ -2,6 +2,7 @@
import com.stylefeng.guns.modular.system.service.IDriverService;
import com.stylefeng.guns.modular.system.service.IOrderService;
import com.stylefeng.guns.modular.system.service.ISettlementRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -24,6 +25,9 @@
    @Autowired
    private JGPushUtil jgPushUtil;
    @Autowired
    private ISettlementRecordService settlementRecordService;
    public Set<Integer> driverIds = new HashSet<>();//存储需要提醒司机预约单的司机id
@@ -78,6 +82,8 @@
        try {
            //生成当天的司机活动
            driverService.addTodayActivity();
            //处理所有司机待结算数据
            settlementRecordService.taskSettlement();
        }catch (Exception e){
            e.printStackTrace();
        }
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/itextpdf/HtmlToPdfUtils.java
New file
@@ -0,0 +1,53 @@
package com.stylefeng.guns.modular.system.util.itextpdf;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
 * @author zhibing.pu
 * @Date 2023/8/14 11:13
 */
public class HtmlToPdfUtils {
    public static void convertToPdf(InputStream inputStream, String waterMark, OutputStream outputStream) throws IOException {
        PdfWriter pdfWriter = new PdfWriter(outputStream);
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        //设置为A4大小
        pdfDocument.setDefaultPageSize(PageSize.A4);
        //添加水印
        pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new WaterMarkEventHandler(waterMark));
        //添加页码
        //pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE,new PageEventHandler());
        //添加中文字体支持
        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = new FontProvider();
        PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
        fontProvider.addFont(sysFont.getFontProgram(), "UniGB-UCS2-H");
        //添加自定义字体,例如微软雅黑
        /*if (StringUtils.isNotBlank(fontPath)){
            PdfFont microsoft = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, false);
            fontProvider.addFont(microsoft.getFontProgram(), PdfEncodings.IDENTITY_H);
        }*/
        properties.setFontProvider(fontProvider);
        HtmlConverter.convertToPdf(inputStream, pdfDocument, properties);
        pdfWriter.close();
        pdfDocument.close();
    }
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/itextpdf/WaterMarkEventHandler.java
New file
@@ -0,0 +1,80 @@
package com.stylefeng.guns.modular.system.util.itextpdf;
import com.itextpdf.kernel.colors.WebColors;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import java.io.IOException;
/**
 * @author zhibing.pu
 * @Date 2023/8/14 11:15
 */
public class WaterMarkEventHandler implements IEventHandler {
    /**
     * 水印内容
     */
    private String waterMarkContent;
    /**
     * 一页中有几列水印
     */
    private int waterMarkX;
    /**
     * 一页中每列有多少水印
     */
    private int waterMarkY;
    public WaterMarkEventHandler(String waterMarkContent) {
        this(waterMarkContent, 5, 5);
    }
    public WaterMarkEventHandler(String waterMarkContent, int waterMarkX, int waterMarkY) {
        this.waterMarkContent = waterMarkContent;
        this.waterMarkX = waterMarkX;
        this.waterMarkY = waterMarkY;
    }
    @Override
    public void handleEvent(Event event) {
        PdfDocumentEvent documentEvent = (PdfDocumentEvent) event;
        PdfDocument document = documentEvent.getDocument();
        PdfPage page = documentEvent.getPage();
        Rectangle pageSize = page.getPageSize();
        PdfFont pdfFont = null;
        try {
            pdfFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);
        } catch (IOException e) {
            e.printStackTrace();
        }
        PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamAfter(), page.getResources(), document);
        Paragraph waterMark = new Paragraph(waterMarkContent).setOpacity(0.5f);
        Canvas canvas = new Canvas(pdfCanvas, pageSize)
                .setFontColor(WebColors.getRGBColor("lightgray"))
                .setFontSize(16)
                .setFont(pdfFont);
        for (int i = 0; i < waterMarkX; i++) {
            for (int j = 0; j < waterMarkY; j++) {
                canvas.showTextAligned(waterMark, (150 + i * 300), (160 + j * 150), document.getNumberOfPages(), TextAlignment.CENTER, VerticalAlignment.BOTTOM, 120);
            }
        }
        canvas.close();
    }
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/QueryHistoricalSettlement.java
New file
@@ -0,0 +1,20 @@
package com.stylefeng.guns.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 12:39
 */
@Data
@ApiModel
public class QueryHistoricalSettlement {
    @ApiModelProperty("结算日期")
    private String createTime;
    @ApiModelProperty("结算金额")
    private Double price;
    @ApiModelProperty("结算周期(1=日结算,2=周结算,3=月结算)")
    private Integer type;
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/QuerySettlementAmount.java
New file
@@ -0,0 +1,22 @@
package com.stylefeng.guns.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:41
 */
@Data
@ApiModel
public class QuerySettlementAmount {
    @ApiModelProperty("标题类型(1=日结算,2=周结算,3=月结算)")
    private Integer type;
    @ApiModelProperty("总待支付金额")
    private Double amount;
    @ApiModelProperty("明细列表")
    private List<QuerySettlementAmountDetails> list;
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/QuerySettlementAmountDetails.java
New file
@@ -0,0 +1,20 @@
package com.stylefeng.guns.modular.system.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2023/8/17 9:42
 */
@Data
@ApiModel
public class QuerySettlementAmountDetails {
    @ApiModelProperty("订单日期")
    private String orderTime;
    @ApiModelProperty("订单金额")
    private Double orderMoney;
    @ApiModelProperty("应付金额")
    private Double payMoney;
}
DriverIGOTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/warpper/RegisteredWarpper.java
@@ -15,8 +15,6 @@
    private String lastName;
    @ApiModelProperty("名")
    private String firstName;
    @ApiModelProperty("性别(1=男,2=女)")
    private Integer sex;
    @ApiModelProperty("生日")
    private Date birthday;
    @ApiModelProperty("居住地")
@@ -29,8 +27,6 @@
    private String idCardImgUrl1;
    @ApiModelProperty("身份证背面照")
    private String idCardImgUrl2;
    @ApiModelProperty("初次领取驾驶证日期")
    private Date getDriverLicenseDate;
    @ApiModelProperty("服务模式(1=专车,2=出租车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=包车)多个以逗号分隔")
    private String type;
    @ApiModelProperty("邮件")
@@ -77,14 +73,6 @@
        this.firstName = firstName;
    }
    public Integer getSex() {
        return sex;
    }
    public void setSex(Integer sex) {
        this.sex = sex;
    }
    public String getDriverContactAddress() {
        return driverContactAddress;
    }
@@ -123,14 +111,6 @@
    public void setIdCardImgUrl2(String idCardImgUrl2) {
        this.idCardImgUrl2 = idCardImgUrl2;
    }
    public Date getGetDriverLicenseDate() {
        return getDriverLicenseDate;
    }
    public void setGetDriverLicenseDate(Date getDriverLicenseDate) {
        this.getDriverLicenseDate = getDriverLicenseDate;
    }
    public String getType() {
@@ -194,13 +174,11 @@
        return "RegisteredWarpper{" +
                "phone='" + phone + '\'' +
                ", password='" + password + '\'' +
                ", sex=" + sex +
                ", driverContactAddress='" + driverContactAddress + '\'' +
                ", driverContactAddress_='" + driverContactAddress_ + '\'' +
                ", idCard='" + idCard + '\'' +
                ", idCardImgUrl1='" + idCardImgUrl1 + '\'' +
                ", idCardImgUrl2='" + idCardImgUrl2 + '\'' +
                ", getDriverLicenseDate=" + getDriverLicenseDate +
                ", type='" + type + '\'' +
                ", email='" + email + '\'' +
                ", placeOfPracticeId=" + placeOfPracticeId +
DriverIGOTravel/guns-admin/src/main/resources/application.yml
@@ -127,16 +127,16 @@
  mail:
    host: smtp.gmail.com # 配置 smtp 服务器地址
    port: 465 # smtp 服务器的端口
    username: southwindservice@gmail.com # 配置邮箱用户名(你的邮箱地址)
    password: ogsntijmguisoiuk # 配置申请到的授权码(刚让复制的授权码)
    username: i-gotech@i-go.group # 配置邮箱用户名(你的邮箱地址)
    password: mhizkqkhuknbitps # 配置申请到的授权码(刚让复制的授权码)
    default-encoding: UTF-8 # 配置邮件编码
    properties:
      mail:
        smtp:
          socketFactoryClass: javax.net.ssl.SSLSocketFactory # 配饰 SSL 加密工厂
        debug: true
    from: southwindservice@gmail.com # 发送方邮件,配在yml中可方便更改
    template-path: /usr/local/nginx/html/mailbox/driver/
    from: i-gotech@i-go.group # 发送方邮件,配在yml中可方便更改
    template-path: /usr/local/nginx/html/mailbox/
---