fix
longz
2026-05-30 6771fff413935485b5dce61769f133a44533d15c
fix
20个文件已修改
1007 ■■■■■ 已修改文件
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineShiftDriverServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysReformistMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysReformistMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysReformistController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TLineController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee_info.js 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany_info.js 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_info.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tLine/tLine_info.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/GunsApplication.java
@@ -14,6 +14,7 @@
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.client.RestTemplate;
@@ -38,6 +39,14 @@
        logger.info("GunsApplication is success!");
    }
    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(5);
        taskScheduler.setThreadNamePrefix("scheduled-task-");
        return taskScheduler;
    }
    @Bean //SpringCloud内部服务质检使用服务名调用
    @LoadBalanced
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml
@@ -173,17 +173,27 @@
            LEFT JOIN (
                SELECT lineShiftDriverId, MIN(id) AS orderId
                FROM t_order_cross_city
                WHERE state != 10
                WHERE isDelete = 1
                  AND state NOT IN (10, 12)
                GROUP BY lineShiftDriverId
            ) occ ON occ.lineShiftDriverId = lsd.id
            WHERE lsd.driverId = #{driverId}
              AND lsd.lineShiftId != -1
              AND NOT EXISTS (
              AND NOT (
                  EXISTS (
                      SELECT 1
                      FROM t_order_cross_city occ_has
                      WHERE occ_has.lineShiftDriverId = lsd.id
                        AND occ_has.isDelete = 1
                        AND occ_has.state NOT IN (10, 12)
                  )
                  AND NOT EXISTS (
                  SELECT 1
                  FROM t_order_cross_city occ_end
                  WHERE occ_end.lineShiftDriverId = lsd.id
                    AND occ_end.isDelete = 1
                    AND occ_end.state = 9
                        AND occ_end.state NOT IN (8, 9, 10, 12)
                  )
              )
              <if test="startDate != null and startDate != ''">
                  AND lsd.day = #{startDate}
@@ -214,12 +224,21 @@
               AND st.state = 1
            WHERE lsd.driverId = #{driverId}
              AND lsd.lineShiftId = -1
              AND NOT EXISTS (
              AND NOT (
                  EXISTS (
                      SELECT 1
                      FROM t_order_cross_city occ_has
                      WHERE occ_has.lineShiftDriverId = lsd.id
                        AND occ_has.isDelete = 1
                        AND occ_has.state NOT IN (10, 12)
                  )
                  AND NOT EXISTS (
                  SELECT 1
                  FROM t_order_cross_city occ_end
                  WHERE occ_end.lineShiftDriverId = lsd.id
                    AND occ_end.isDelete = 1
                    AND occ_end.state = 9
                        AND occ_end.state NOT IN (8, 9, 10, 12)
                  )
              )
              <if test="startDate != null and startDate != ''">
                  AND lsd.day = #{startDate}
@@ -282,15 +301,15 @@
            FROM t_order_cross_city occ
            WHERE occ.lineShiftDriverId = lsd.id
              AND occ.isDelete = 1
              AND occ.state != 10
              AND occ.state NOT IN (10, 12)
        )
          AND (
            (lsd.lineShiftId != -1
            (lsd.lineShiftId > 0
                AND ls.id IS NOT NULL
                AND ls.state = 1
                AND STR_TO_DATE(CONCAT(DATE_FORMAT(lsd.day, '%Y-%m-%d'), ' ', ls.endTime), '%Y-%m-%d %H:%i') &lt; NOW())
                OR
            (lsd.lineShiftId = -1
            (lsd.lineShiftId &lt;= -1
                AND st.id IS NOT NULL
                AND st.state = 1
                AND STR_TO_DATE(CONCAT(DATE_FORMAT(lsd.day, '%Y-%m-%d'), ' ', st.startTime), '%Y-%m-%d %H:%i') &lt; NOW())
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/OrderCrossCityMapper.xml
@@ -232,7 +232,7 @@
        left join t_user b on (a.userId = b.id)
        left join t_line_shift_driver c on (a.lineShiftDriverId = c.id)
        left join t_line_shift d on (c.lineShiftId = d.id)
        where a.orderNum = #{orderNum} and a.state in (2, 3, 4, 5, 6, 8, 9, 11) order by a.sort
        where a.orderNum = #{orderNum} and a.state in (2, 3, 4, 5, 6, 8, 9, 11) order by a.sort desc
    </select>
@@ -810,4 +810,4 @@
    <select id="taskMidAxbUnBindSend" resultType="OrderCrossCity">
        select * from t_order_cross_city where (state in (8, 9) and telX != '' and telX is not null and (UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(endServiceTime)) > 1800) or (state = 10 and telX != '' and telX is not null)
    </select>
</mapper>
</mapper>
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/LineShiftDriverServiceImpl.java
@@ -809,6 +809,7 @@
    @Transactional(rollbackFor = Exception.class)
    public Integer autoCancelExpiredNoOrderShifts() throws Exception {
        List<Integer> shiftIds = lineShiftDriverMapper.queryExpiredNoOrderShiftIds();
        System.out.println("自动清除无效车程数量 " + 0);
        if (shiftIds == null || shiftIds.isEmpty()) {
            return 0;
        }
@@ -822,7 +823,7 @@
                continue;
            }
            if (lineShiftDriver.getLineShiftId() != null
                    && lineShiftDriver.getLineShiftId() == -1
                    && lineShiftDriver.getLineShiftId() <= -1
                    && lineShiftDriver.getCustomerId() != null) {
                DriverSelfTrip trip = driverSelfTripMapper.selectById(lineShiftDriver.getCustomerId());
                if (trip != null && trip.getState() != null && trip.getState() == 1) {
@@ -834,6 +835,7 @@
            lineShiftDriverMapper.deleteById(shiftId);
            cancelCount++;
        }
        System.out.println("自动清除无效车程数量 " + cancelCount);
        return cancelCount;
    }
}
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -1459,7 +1459,7 @@
     * @throws Exception
     */
    public synchronized String getOrderNum(Integer driverId, Integer lineShiftDriverId) throws Exception{
        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryOrders(driverId, lineShiftDriverId, Arrays.asList(2, 3, 4, 7));
        List<OrderCrossCity> orderCrossCities = orderCrossCityMapper.queryOrders(driverId, lineShiftDriverId, Arrays.asList(2, 3, 4, 5, 6, 7));
        if(orderCrossCities.size() > 0){
            return orderCrossCities.get(0).getOrderNum();
        }
@@ -1859,7 +1859,7 @@
            return ResultUtil.success(response);
        } else if (type == 3) {
            order.setState(2);
            order.setPayMoney(0.00);
            order.setPayMoney(order.getOrderMoney());
            orderCrossCityMapper.updateById(order);
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysReformistMapper.java
@@ -9,9 +9,8 @@
    /**
     * 获取改派金额
     * @param openCityId
     * @return
     * @throws Exception
     */
    Double queryMoney(@Param("openCityId") Integer openCityId) throws Exception;
    Double queryMoney(@Param("openCityId") Integer openCityId, @Param("companyId") Integer companyId) throws Exception;
}
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysReformistMapper.xml
@@ -14,7 +14,18 @@
    <select id="queryMoney" resultType="double">
        select money from t_sys_reformist where openCityId = #{openCityId}
    <select id="queryMoney" resultType="java.lang.Double">
        select money
        from t_sys_reformist
        where (openCityId = #{openCityId}
            or companyId = #{companyId}
            or openCityId = #{companyId})
        order by
            case
                when openCityId = #{openCityId} then 1
                when companyId = #{companyId} then 2
                else 3
            end
        limit 1
    </select>
</mapper>
</mapper>
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/DriverServiceImpl.java
@@ -796,10 +796,25 @@
     */
    @Override
    public List<BaseWarpper> queryMyBusiness(Integer uid) throws Exception {
        Driver driver = this.selectById(uid);
        if (driver == null) {
            return new ArrayList<>();
        }
        Company company = null;
        if (driver.getFranchiseeId() != null && driver.getFranchiseeId() > 0) {
            company = companyMapper.selectById(driver.getFranchiseeId());
        }
        if (company == null && driver.getCompanyId() != null && driver.getCompanyId() > 0) {
            company = companyMapper.selectById(driver.getCompanyId());
        }
        List<DriverService> list = driverServiceMapper.queryMyBusiness(uid);
        List<BaseWarpper> maps = new ArrayList<>();
        for (DriverService d : list){
            if(d.getType() == 6){
                continue;
            }
            if (!isBusinessOpen(company, d.getType())) {
                continue;
            }
            BaseWarpper baseWarpper = new BaseWarpper();
@@ -829,6 +844,28 @@
        return maps;
    }
    private boolean isBusinessOpen(Company company, Integer type) {
        if (company == null || type == null) {
            return true;
        }
        switch (type) {
            case 1:
                return company.getIsSpe() != null && company.getIsSpe() == 1;
            case 2:
                return company.getIsTaxi() != null && company.getIsTaxi() == 1;
            case 3:
                return company.getIsCross() != null && company.getIsCross() == 1;
            case 4:
                return company.getIsSameLogistics() != null && company.getIsSameLogistics() == 1;
            case 5:
                return company.getIsCrossLogistics() != null && company.getIsCrossLogistics() == 1;
            case 6:
                return company.getIsCharter() != null && company.getIsCharter() == 1;
            default:
                return false;
        }
    }
    /**
     * 获取个人中心详情
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java
@@ -636,32 +636,38 @@
    @Override
    public Double queryReassignMoney(Integer orderId, Integer orderType) throws Exception {
        Integer openCityId = null;
        Integer companyId = null;
        switch (orderType){
            case 1://专车
                OrderPrivateCar orderPrivateCar = orderPrivateCarService.selectById(orderId);
                companyId = orderPrivateCar.getCompanyId();
                openCityId = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString()).getId();
                break;
            case 2://出租
                OrderTaxi orderTaxi = orderTaxiService.selectById(orderId);
                companyId = orderTaxi.getCompanyId();
                openCityId = openCityService.openCity1(orderTaxi.getStartLon().toString(), orderTaxi.getStartLat().toString()).getId();
                break;
            case 3://城际
                OrderCrossCity orderCrossCity = orderCrossCityService.selectById(orderId);
                companyId = orderCrossCity.getCompanyId();
                openCityId = openCityService.openCity1(orderCrossCity.getStartLon().toString(), orderCrossCity.getStartLat().toString()).getId();
                break;
            case 4://同城小件
                OrderLogistics orderLogistics = orderLogisticsService.selectById(orderId);
                companyId = orderLogistics.getCompanyId();
                openCityId = openCityService.openCity1(orderLogistics.getStartLon().toString(), orderLogistics.getStartLat().toString()).getId();
                break;
            case 5://跨城小件
                OrderLogistics orderLogistics1 = orderLogisticsService.selectById(orderId);
                companyId = orderLogistics1.getCompanyId();
                openCityId = openCityService.openCity1(orderLogistics1.getStartLon().toString(), orderLogistics1.getStartLat().toString()).getId();
                
                break;
            case 6:
                break;
        }
        return sysReformistMapper.queryMoney(openCityId);
        return sysReformistMapper.queryMoney(openCityId, companyId);
    }
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/TaskUtil.java
@@ -55,7 +55,7 @@
     */
    @Scheduled(fixedRate = 1000 * 60)
    public void taskMinute(){
        if(null != ip && "10.31.182.11".equals(ip)){
        if(null != ip){
            try {
                //修改满足活动条件的数据(在线时长,订单量)
                driverService.taskMinute();
@@ -67,7 +67,21 @@
                orderService.taskMidAxbUnBindSend();
                //修改过期的商家券
                userMerchantCouponService.updateExpired();
                //自动取消已超时且无订单的司机排班
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 每隔一分钟自动取消已超时且无有效订单的跨城司机排班
     */
    @Scheduled(fixedRate = 1000 * 60)
    public void autoCancelExpiredNoOrderShifts(){
        if(null != ip){
            try {
                lineShiftDriverService.autoCancelExpiredNoOrderShifts();
            } catch (Exception e) {
                e.printStackTrace();
@@ -84,7 +98,7 @@
     */
    @Scheduled(fixedRate = 1000 * 60 * 5)
    public void taskFiveMinute(){
        if(null != ip && "10.31.182.11".equals(ip)){
        if(null != ip){
            try {
                for (Integer id: driverIds){
                    jgPushUtil.push(1, "您的预约订单出行时间就要到了,请尽快前往预约地点接乘客", "DRIVER" + id);
@@ -103,7 +117,7 @@
     */
    @Scheduled(cron = "0 0 0 * * *")
    public void taskDay() {
        if(null != ip && "10.31.182.11".equals(ip)){
        if(null != ip){
            try {
                //生成当天的司机活动
                driverService.addTodayActivity();
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java
@@ -71,11 +71,20 @@
    @Autowired
    private ITDriverServiceService tDriverServiceService;
    @Autowired
    private ITCarService tCarService;
    @Autowired
    private ITCarService tCarService;
    @Autowired
    private ITCarServiceService tCarServiceService;
    @Autowired
    private ITCarServiceService tCarServiceService;
    private ITOrderPrivateCarService orderPrivateCarService;
    @Autowired
    private ITOrderTaxiService orderTaxiService;
    @Autowired
    private ITOrderCrossCityService orderCrossCityService;
    
    @Value("${pushMinistryOfTransport}")
    private boolean pushMinistryOfTransport;
@@ -363,6 +372,10 @@
        if(ToolUtil.isEmpty(tCompany.getIdentifier())){
            return "统一社会信用代码不能为空";
        }
        String commissionError = validateBusinessCommission(tCompany);
        if (commissionError != null) {
            return commissionError;
        }
        tCompany.setType(2);  //2:分公司
        tCompany.setState(0); //0:正常
        tCompany.setFlag("1");
@@ -455,6 +468,10 @@
        name = name.replaceAll("& #40;", "(");
        name = name.replaceAll("& #41;", ")");
        tCompany.setName(name);
        String commissionError = validateBusinessCommission(tCompany);
        if (commissionError != null) {
            return commissionError;
        }
        User user = userService.selectById(userId);
        if(null != user && ToolUtil.isNotEmpty(password)){
            user.setPassword(ShiroKit.md5(password, user.getSalt()));
@@ -464,6 +481,10 @@
        // ========== 级联更新逻辑 ==========
        TCompany oldCompany = tCompanyService.selectById(tCompany.getId());
        if (oldCompany != null && oldCompany.getType() == 2) {
            String unfinishedOrderError = validateCancelledServiceUnfinishedOrders(oldCompany, tCompany, true);
            if (unfinishedOrderError != null) {
                return unfinishedOrderError;
            }
            // 1. 检测并级联更新经营业务
            cascadeUpdateBusinessScope(oldCompany, tCompany);
@@ -507,6 +528,15 @@
        name = name.replaceAll("& #40;", "(");
        name = name.replaceAll("& #41;", ")");
        tCompany.setName(name);
        String commissionError = validateBusinessCommission(tCompany);
        if (commissionError != null) {
            return commissionError;
        }
        TCompany oldCompany = tCompanyService.selectById(tCompany.getId());
        String unfinishedOrderError = validateCancelledServiceUnfinishedOrders(oldCompany, tCompany, false);
        if (unfinishedOrderError != null) {
            return unfinishedOrderError;
        }
        tCompany.setUpdateTime(new Date());
//        tCompany.setVersion(tCompany.getVersion() + 1);
        tCompanyService.updateById(tCompany);
@@ -538,6 +568,10 @@
        if(ToolUtil.isEmpty(tCompany.getIdentifier())){
            return "统一社会信用代码不能为空";
        }
        String commissionError = validateBusinessCommission(tCompany);
        if (commissionError != null) {
            return commissionError;
        }
        tCompany.setType(3);  //2:分公司
        if (ShiroKit.getUser().getRoleType() == 2) {
            tCompany.setSuperiorId(ShiroKit.getUser().getObjectId());
@@ -692,6 +726,144 @@
        }
    }
    private String validateBusinessCommission(TCompany company) {
        if (Integer.valueOf(1).equals(company.getIsSpe()) && !hasCommissionSetting(company.getSpe())) {
            return "请先设置快车司机抽成";
        }
        if (Integer.valueOf(1).equals(company.getIsTaxi()) && !hasCommissionSetting(company.getTaxi())) {
            return "请先设置出租车司机抽成";
        }
        if (Integer.valueOf(1).equals(company.getIsCross()) && !hasCommissionSetting(company.getCross())) {
            return "请先设置跨城出行司机抽成";
        }
        return null;
    }
    private boolean hasCommissionSetting(String configText) {
        if (SinataUtil.isEmpty(configText)) {
            return false;
        }
        try {
            JSONObject config = JSON.parseObject(configText);
            JSONArray rules = config.getJSONArray("rules");
            if (hasCommissionRule(rules)) {
                return true;
            }
            JSONArray timeRules = config.getJSONArray("time_rules");
            if (timeRules != null) {
                for (int i = 0; i < timeRules.size(); i++) {
                    if (hasCommissionRule(timeRules.getJSONArray(i))) {
                        return true;
                    }
                }
            }
        } catch (Exception e) {
            return false;
        }
        return false;
    }
    private boolean hasCommissionRule(JSONArray rules) {
        if (rules == null || rules.size() <= 0) {
            return false;
        }
        for (int i = 0; i < rules.size(); i++) {
            JSONObject rule = rules.getJSONObject(i);
            if (rule != null && rule.containsKey("percent") && SinataUtil.isNotEmpty(rule.getString("percent"))) {
                return true;
            }
        }
        return false;
    }
    private String validateCancelledServiceUnfinishedOrders(TCompany oldCompany, TCompany newCompany, boolean includeFranchisee) {
        if (oldCompany == null || newCompany == null) {
            return null;
        }
        List<Integer> cancelledTypes = getCancelledCoreServiceTypes(oldCompany, newCompany);
        if (cancelledTypes.isEmpty()) {
            return null;
        }
        List<Integer> driverIds = getCompanyDriverIds(oldCompany.getId(), includeFranchisee);
        if (driverIds.isEmpty()) {
            return null;
        }
        if (cancelledTypes.contains(1) && hasUnfinishedPrivateCarOrder(driverIds)) {
            return "当前公司内司机存在快车未完成订单,无法变动";
        }
        if (cancelledTypes.contains(2) && hasUnfinishedTaxiOrder(driverIds)) {
            return "当前公司内司机存在出租车未完成订单,无法变动";
        }
        if (cancelledTypes.contains(3) && hasUnfinishedCrossCityOrder(driverIds)) {
            return "当前公司内司机存在跨城出行未完成订单,无法变动";
        }
        return null;
    }
    private List<Integer> getCancelledCoreServiceTypes(TCompany oldCompany, TCompany newCompany) {
        List<Integer> cancelledTypes = new ArrayList<>();
        if (isServiceCancelled(oldCompany.getIsSpe(), newCompany.getIsSpe())) {
            cancelledTypes.add(1);
        }
        if (isServiceCancelled(oldCompany.getIsTaxi(), newCompany.getIsTaxi())) {
            cancelledTypes.add(2);
        }
        if (isServiceCancelled(oldCompany.getIsCross(), newCompany.getIsCross())) {
            cancelledTypes.add(3);
        }
        return cancelledTypes;
    }
    private List<Integer> getCompanyDriverIds(Integer companyId, boolean includeFranchisee) {
        List<Integer> driverIds = new ArrayList<>();
        List<TDriver> companyDrivers = tDriverService.selectList(new EntityWrapper<TDriver>().ne("flag", "3").eq("companyId", companyId));
        addDriverIds(driverIds, companyDrivers);
        if (!includeFranchisee) {
            List<TDriver> franchiseeDrivers = tDriverService.selectList(new EntityWrapper<TDriver>().ne("flag", "3").eq("franchiseeId", companyId));
            addDriverIds(driverIds, franchiseeDrivers);
        }
        if (includeFranchisee) {
            List<TCompany> franchiseeList = tCompanyService.selectList(new EntityWrapper<TCompany>().eq("superiorId", companyId).eq("type", 3).ne("flag", "3"));
            for (TCompany franchisee : franchiseeList) {
                List<TDriver> franchiseeDrivers = tDriverService.selectList(new EntityWrapper<TDriver>().ne("flag", "3").eq("franchiseeId", franchisee.getId()));
                addDriverIds(driverIds, franchiseeDrivers);
            }
        }
        return driverIds;
    }
    private void addDriverIds(List<Integer> driverIds, List<TDriver> drivers) {
        if (drivers == null) {
            return;
        }
        for (TDriver driver : drivers) {
            if (driver != null && driver.getId() != null && !driverIds.contains(driver.getId())) {
                driverIds.add(driver.getId());
            }
        }
    }
    private boolean hasUnfinishedPrivateCarOrder(List<Integer> driverIds) {
        return orderPrivateCarService.selectCount(new EntityWrapper<TOrderPrivateCar>()
            .eq("isDelete", 1)
            .in("driverId", driverIds)
            .notIn("state", 8, 9, 10, 12)) > 0;
    }
    private boolean hasUnfinishedTaxiOrder(List<Integer> driverIds) {
        return orderTaxiService.selectCount(new EntityWrapper<TOrderTaxi>()
            .eq("isDelete", 1)
            .in("driverId", driverIds)
            .notIn("state", 8, 9, 10, 12)) > 0;
    }
    private boolean hasUnfinishedCrossCityOrder(List<Integer> driverIds) {
        return orderCrossCityService.selectCount(new EntityWrapper<TOrderCrossCity>()
            .eq("isDelete", 1)
            .in("driverId", driverIds)
            .notIn("state", 8, 9, 10, 12)) > 0;
    }
    /**
     * 删除司机的经营业务记录
     * @param companyId 分公司ID(查询直属司机时使用)
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java
@@ -98,6 +98,15 @@
    private ITComplaintService tComplaintService;
    @Autowired
    private ITOrderPrivateCarService orderPrivateCarService;
    @Autowired
    private ITOrderTaxiService orderTaxiService;
    @Autowired
    private ITOrderCrossCityService orderCrossCityService;
    @Autowired
    private IUserService userService;
    @Autowired
@@ -1155,6 +1164,11 @@
        obj.setUpdateTime(new Date());
        obj.setUpdateUser(ShiroKit.getUser().getId());
        obj.setPlaceOfEmployment(tDriver.getPlaceOfEmployment());
        List<Integer> newServiceTypes = parseDriverServiceTypes(serverBox);
        String unfinishedOrderError = validateDriverCancelledServiceUnfinishedOrders(tDriver.getId(), newServiceTypes);
        if (unfinishedOrderError != null) {
            return unfinishedOrderError;
        }
        tDriverService.updateAllColumnById(obj);
        //删除业务
@@ -1191,6 +1205,69 @@
        return SUCCESS_TIP;
    }
    private List<Integer> parseDriverServiceTypes(String serverBox) {
        List<Integer> serviceTypes = new ArrayList<>();
        if (SinataUtil.isEmpty(serverBox)) {
            return serviceTypes;
        }
        String[] serverArray = serverBox.split(",");
        for (String serviceType : serverArray) {
            if (SinataUtil.isNotEmpty(serviceType)) {
                serviceTypes.add(Integer.valueOf(serviceType));
            }
        }
        return serviceTypes;
    }
    private String validateDriverCancelledServiceUnfinishedOrders(Integer driverId, List<Integer> newServiceTypes) {
        List<Integer> oldServiceTypes = getDriverServiceTypes(driverId);
        if (oldServiceTypes.isEmpty()) {
            return null;
        }
        if (oldServiceTypes.contains(1) && !newServiceTypes.contains(1) && hasUnfinishedPrivateCarOrder(driverId)) {
            return "当前司机存在快车未完成订单,无法变动";
        }
        if (oldServiceTypes.contains(2) && !newServiceTypes.contains(2) && hasUnfinishedTaxiOrder(driverId)) {
            return "当前司机存在出租车未完成订单,无法变动";
        }
        if (oldServiceTypes.contains(3) && !newServiceTypes.contains(3) && hasUnfinishedCrossCityOrder(driverId)) {
            return "当前司机存在跨城出行未完成订单,无法变动";
        }
        return null;
    }
    private List<Integer> getDriverServiceTypes(Integer driverId) {
        List<Integer> serviceTypes = new ArrayList<>();
        List<TDriverService> serviceList = tDriverServiceService.selectList(new EntityWrapper<TDriverService>().eq("driverId", driverId));
        for (TDriverService service : serviceList) {
            if (service != null && service.getType() != null && !serviceTypes.contains(service.getType())) {
                serviceTypes.add(service.getType());
            }
        }
        return serviceTypes;
    }
    private boolean hasUnfinishedPrivateCarOrder(Integer driverId) {
        return orderPrivateCarService.selectCount(new EntityWrapper<TOrderPrivateCar>()
                .eq("isDelete", 1)
                .eq("driverId", driverId)
                .notIn("state", 8, 9, 10, 12)) > 0;
    }
    private boolean hasUnfinishedTaxiOrder(Integer driverId) {
        return orderTaxiService.selectCount(new EntityWrapper<TOrderTaxi>()
                .eq("isDelete", 1)
                .eq("driverId", driverId)
                .notIn("state", 8, 9, 10, 12)) > 0;
    }
    private boolean hasUnfinishedCrossCityOrder(Integer driverId) {
        return orderCrossCityService.selectCount(new EntityWrapper<TOrderCrossCity>()
                .eq("isDelete", 1)
                .eq("driverId", driverId)
                .notIn("state", 8, 9, 10, 12)) > 0;
    }
    /**
     * 下载模板
     * @param request
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TSysReformistController.java
@@ -322,27 +322,43 @@
                        Integer sjzp1, Integer sjzp2, Integer zuc1, Integer zuc2, Integer mc1, Integer mc2,
                        Integer czgrcl1, Integer czgrcl2, Integer mac1, Integer mac2, Integer sjzx1, Integer sjzx2,
                        Integer dck1, Integer dck2,Integer driverDays,Integer pushType) {
        if (openCityId == null){
            openCityId = ShiroKit.getUser().getObjectId();
        }
        Integer companyId = ShiroKit.getUser().getObjectId();
        boolean companySystemSet = openCityId == null;
        //改派设置
        if("reassigningSet".equals(type)){
            TSysReformist reformist = tSysReformistService.selectOne(new EntityWrapper<TSysReformist>().eq("openCityId", openCityId));
            EntityWrapper<TSysReformist> wrapper = new EntityWrapper<>();
            if (companySystemSet) {
                wrapper.eq("companyId", companyId);
            } else {
                wrapper.eq("openCityId", openCityId);
            }
            TSysReformist reformist = tSysReformistService.selectOne(wrapper);
            if (SinataUtil.isNotEmpty(reformist)){
                reformist.setOpenCityId(openCityId);
                if (companySystemSet) {
                    reformist.setCompanyId(companyId);
                } else {
                    reformist.setOpenCityId(openCityId);
                }
                reformist.setMoney(one);
                reformist.setIsSpecialCar(isSpecialCar);
                reformist.setIsTaxiCar(isTaxiCar);
                tSysReformistService.updateById(reformist);
            }else {
                reformist = new TSysReformist();
                reformist.setOpenCityId(openCityId);
                if (companySystemSet) {
                    reformist.setCompanyId(companyId);
                } else {
                    reformist.setOpenCityId(openCityId);
                }
                reformist.setMoney(one);
                reformist.setIsSpecialCar(isSpecialCar);
                reformist.setIsTaxiCar(isTaxiCar);
                tSysReformistService.insert(reformist);
            }
        }
        if (companySystemSet) {
            openCityId = companyId;
        }
        if("driverPayDays".equals(type)){
            TDriverPayDays tDriverPayDays = driverPayDaysService.selectOne(new EntityWrapper<TDriverPayDays>().eq("openCityId", openCityId));
            if (SinataUtil.isNotEmpty(tDriverPayDays)){
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TLineController.java
@@ -244,6 +244,9 @@
    @ResponseBody
    public ResultUtil add(TLine tLine,Integer startSiteId,Integer endSiteId,@RequestParam String subArr,
                          @RequestParam String shuArr, @RequestParam(required = false) String destArr) {
        if (!hasCommissionSetting(tLine.getOutSetting())) {
            return ResultUtil.error("请设置司机抽成");
        }
        JSONArray jsonArray1 = JSON.parseArray(shuArr);
        int size1 = jsonArray1.size();
        for (int i = 0; i < size1; i++) {
@@ -251,9 +254,9 @@
            String shiftTime = jsonObject.getString("shiftTime");
            if (SinataUtil.isNotEmpty(shiftTime)){
                String[] timeArray = shiftTime.split(" - ");
                String startTime = timeArray[0].split(":")[0];
                String endTime = timeArray[1].split(":")[0];
                if(Integer.valueOf(startTime) >= Integer.valueOf(endTime)){
                String startTime = timeArray[0];
                String endTime = timeArray[1];
                if(startTime.compareTo(endTime) >= 0){
                    return ResultUtil.error("班次结束时间不能小于开始时间");
                }
            }
@@ -766,6 +769,9 @@
    @ResponseBody
    public ResultUtil update(TLine tLine,Integer startSiteId,Integer endSiteId,@RequestParam String subArr,
                             @RequestParam String shuArr, @RequestParam(required = false) String destArr) {
        if (!hasCommissionSetting(tLine.getOutSetting())) {
            return ResultUtil.error("请设置司机抽成");
        }
        JSONArray jsonArray1 = JSON.parseArray(shuArr);
        int size1 = jsonArray1.size();
        for (int i = 0; i < size1; i++) {
@@ -773,9 +779,9 @@
            String shiftTime = jsonObject.getString("shiftTime");
            if (SinataUtil.isNotEmpty(shiftTime)){
                String[] timeArray = shiftTime.split(" - ");
                String startTime = timeArray[0].split(":")[0];
                String endTime = timeArray[1].split(":")[0];
                if(Integer.valueOf(startTime) >= Integer.valueOf(endTime)){
                String startTime = timeArray[0];
                String endTime = timeArray[1];
                if(startTime.compareTo(endTime) >= 0){
                    return ResultUtil.error("班次结束时间不能小于开始时间");
                }
            }
@@ -841,6 +847,44 @@
    /**
     * 添加线路目的地配置
     */
    private boolean hasCommissionSetting(String outSetting) {
        if (SinataUtil.isEmpty(outSetting)) {
            return false;
        }
        try {
            JSONObject config = JSON.parseObject(outSetting);
            JSONArray rules = config.getJSONArray("rules");
            if (hasCommissionRule(rules)) {
                return true;
            }
            JSONArray timeRules = config.getJSONArray("time_rules");
            if (timeRules != null) {
                for (int i = 0; i < timeRules.size(); i++) {
                    JSONArray oneTimeRules = timeRules.getJSONArray(i);
                    if (hasCommissionRule(oneTimeRules)) {
                        return true;
                    }
                }
            }
        } catch (Exception e) {
            return false;
        }
        return false;
    }
    private boolean hasCommissionRule(JSONArray rules) {
        if (rules == null || rules.size() <= 0) {
            return false;
        }
        for (int i = 0; i < rules.size(); i++) {
            JSONObject rule = rules.getJSONObject(i);
            if (rule != null && rule.containsKey("percent") && SinataUtil.isNotEmpty(rule.getString("percent"))) {
                return true;
            }
        }
        return false;
    }
    private ResultUtil addDestination(Integer lineId, String destArr) {
        if (SinataUtil.isEmpty(destArr)) {
            return ResultUtil.error("请至少设置一个目的地");
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tCompany/franchisee_info.js
@@ -139,6 +139,18 @@
    return false;
}
FranchiseeInfoDlg.hasSubmitError = function(data) {
    if (typeof data === "string") {
        if ("error" == data) {
            Feng.error("登录账户已存在,请重新输入");
        } else {
            Feng.error(data);
        }
        return true;
    }
    return false;
}
/**
 * 关闭此对话框
 */
@@ -233,52 +245,32 @@
        return;
    }
    var checkbox1 = $('#checkbox1').prop('checked');
    var speConfig = $("#Spe").val();
    var speMoney = "";
    if (checkbox1) {
        // var zc = $("input[name='zc']:checked").val();
        // if (1 == zc){
        //     var zcPercent = $("#zcPercent").val();
        //     if ("" == zcPercent){
        //         Feng.info("快车比例抽成不能为空!");
        //         return;
        //     }else if (!regDouble.test(zcPercent)) {
        //         Feng.info("快车比例抽成格式不正确!");
        //         return;
        //     }
        // }else if (2 == zc){
        //     var zcMoney = $("#zcMoney").val();
        //     if ("" == zcMoney){
        //         Feng.info("快车固定金额抽成不能为空!");
        //         return;
        //     }else if (!regDouble.test(zcMoney)) {
        //         Feng.info("快车固定金额抽成格式不正确!");
        //         return;
        //     }
        // }
        speMoney = FranchiseeInfoDlg.getCommissionFromConfig(speConfig, "快车");
        if (speMoney === false) {
            return;
        }
    }
    var checkbox2 = $('#checkbox2').prop('checked');
    var taxiConfig = $("#Taxi").val();
    var taxiMoney = "";
    if (checkbox2) {
        var cz = $("input[name='cz']:checked").val();
        if (1 == cz){
            var czPercent = $("#czPercent").val();
            if ("" == czPercent){
                Feng.info("出租车比例抽成不能为空!");
                return;
            }else if (!regDouble.test(czPercent)) {
                Feng.info("出租车比例抽成格式不正确!");
                return;
            }
        }else if (2 == cz){
            var czMoney = $("#czMoney").val();
            if ("" == czMoney){
                Feng.info("出租车固定金额抽成不能为空!");
                return;
            }else if (!regDouble.test(czMoney)) {
                Feng.info("出租车固定金额抽成格式不正确!");
                return;
            }
        taxiMoney = FranchiseeInfoDlg.getCommissionFromConfig(taxiConfig, "出租车");
        if (taxiMoney === false) {
            return;
        }
    }
    var checkbox3 = $('#checkbox3').prop('checked');
    var crossConfig = $("#Cross").val();
    var crossMoney = "";
    if (checkbox3) {
        crossMoney = FranchiseeInfoDlg.getCommissionFromConfig(crossConfig, "跨城出行");
        if (crossMoney === false) {
            return;
        }
    }
    var checkbox4 = $('#checkbox4').prop('checked');
    if (checkbox4) {
        // var tcx = $("input[name='tcx']:checked").val();
@@ -359,8 +351,7 @@
    var isOpenDriverSelfTrip = $("input[name='isOpenDriverSelfTrip']:checked").val();
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tCompany/addFranchisee", function(data){
        if ("error" == data){
            Feng.error("登录账户已存在,请重新输入");
        if (FranchiseeInfoDlg.hasSubmitError(data)){
            return;
        }
        if(200 == data.code){
@@ -375,35 +366,24 @@
    });
    ajax.set(FranchiseeInfoDlg.franchiseeInfoData);
    if (checkbox1){
        var zc = $("input[name='zc']:checked").val();
        ajax.set("isSpeFixedOrProportional",zc);
        if (1 == zc){
            ajax.set("speMoney",$("#zcPercent").val());
        }else if (2 == zc) {
            ajax.set("speMoney",$("#zcMoney").val());
        }
        ajax.set("isSpe",1);
        ajax.set("Spe",speConfig);
        ajax.set("speMoney",speMoney);
    }else{
        ajax.set("isSpe",2);
        ajax.set("Spe","");
        ajax.set("speMoney","");
    }
    if (checkbox2){
        var cz = $("input[name='cz']:checked").val()
        ajax.set("isTaxiFixedOrProportional",cz);
        if (1 == cz){
            ajax.set("taxiMoney",$("#czPercent").val());
        }else if (2 == cz) {
            ajax.set("taxiMoney",$("#czMoney").val());
        }
        ajax.set("isTaxi",1);
        ajax.set("Taxi",taxiConfig);
        ajax.set("taxiMoney",taxiMoney);
    }else{
        ajax.set("isTaxi",2);
        ajax.set("Taxi","");
        ajax.set("taxiMoney","");
    }
    if (checkbox3){
        var crossConfig = $("#Cross").val();
        var crossMoney = FranchiseeInfoDlg.getCommissionFromConfig(crossConfig, "跨城出行");
        if (crossMoney === false) {
            return;
        }
        ajax.set("isCross",1);
        ajax.set("Cross",crossConfig);
        ajax.set("crossMoney",crossMoney);
@@ -492,52 +472,32 @@
        return;
    }
    var checkbox1 = $('#checkbox1').prop('checked');
    var speConfig = $("#Spe").val();
    var speMoney = "";
    if (checkbox1) {
        // var zc = $("input[name='zc']:checked").val();
        // if (1 == zc){
        //     var zcPercent = $("#zcPercent").val();
        //     if ("" == zcPercent){
        //         Feng.info("快车比例抽成不能为空!");
        //         return;
        //     }else if (!regDouble.test(zcPercent)) {
        //         Feng.info("快车比例抽成格式不正确!");
        //         return;
        //     }
        // }else if (2 == zc){
        //     var zcMoney = $("#zcMoney").val();
        //     if ("" == zcMoney){
        //         Feng.info("快车固定金额抽成不能为空!");
        //         return;
        //     }else if (!regDouble.test(zcMoney)) {
        //         Feng.info("快车固定金额抽成格式不正确!");
        //         return;
        //     }
        // }
        speMoney = FranchiseeInfoDlg.getCommissionFromConfig(speConfig, "快车");
        if (speMoney === false) {
            return;
        }
    }
    var checkbox2 = $('#checkbox2').prop('checked');
    var taxiConfig = $("#Taxi").val();
    var taxiMoney = "";
    if (checkbox2) {
        var cz = $("input[name='cz']:checked").val();
        if (1 == cz){
            var czPercent = $("#czPercent").val();
            if ("" == czPercent){
                Feng.info("出租车比例抽成不能为空!");
                return;
            }else if (!regDouble.test(czPercent)) {
                Feng.info("出租车比例抽成格式不正确!");
                return;
            }
        }else if (2 == cz){
            var czMoney = $("#czMoney").val();
            if ("" == czMoney){
                Feng.info("出租车固定金额抽成不能为空!");
                return;
            }else if (!regDouble.test(czMoney)) {
                Feng.info("出租车固定金额抽成格式不正确!");
                return;
            }
        taxiMoney = FranchiseeInfoDlg.getCommissionFromConfig(taxiConfig, "出租车");
        if (taxiMoney === false) {
            return;
        }
    }
    var checkbox3 = $('#checkbox3').prop('checked');
    var crossConfig = $("#Cross").val();
    var crossMoney = "";
    if (checkbox3) {
        crossMoney = FranchiseeInfoDlg.getCommissionFromConfig(crossConfig, "跨城出行");
        if (crossMoney === false) {
            return;
        }
    }
    var checkbox4 = $('#checkbox4').prop('checked');
    if (checkbox4) {
        // var tcx = $("input[name='tcx']:checked").val();
@@ -618,8 +578,7 @@
    var isOpenDriverSelfTrip = $("input[name='isOpenDriverSelfTrip']:checked").val();
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tCompany/updateFranchisee", function(data){
        if ("error" == data){
            Feng.error("登录账户已存在,请重新输入");
        if (FranchiseeInfoDlg.hasSubmitError(data)){
            return;
        }
        Feng.success("修改成功!");
@@ -630,35 +589,24 @@
    });
    ajax.set(FranchiseeInfoDlg.franchiseeInfoData);
    if (checkbox1){
        var zc = $("input[name='zc']:checked").val();
        ajax.set("isSpeFixedOrProportional",zc);
        if (1 == zc){
            ajax.set("speMoney",$("#zcPercent").val());
        }else if (2 == zc) {
            ajax.set("speMoney",$("#zcMoney").val());
        }
        ajax.set("isSpe",1);
        ajax.set("Spe",speConfig);
        ajax.set("speMoney",speMoney);
    }else{
        ajax.set("isSpe",2);
        ajax.set("Spe","");
        ajax.set("speMoney","");
    }
    if (checkbox2){
        var cz = $("input[name='cz']:checked").val()
        ajax.set("isTaxiFixedOrProportional",cz);
        if (1 == cz){
            ajax.set("taxiMoney",$("#czPercent").val());
        }else if (2 == cz) {
            ajax.set("taxiMoney",$("#czMoney").val());
        }
        ajax.set("isTaxi",1);
        ajax.set("Taxi",taxiConfig);
        ajax.set("taxiMoney",taxiMoney);
    }else{
        ajax.set("isTaxi",2);
        ajax.set("Taxi","");
        ajax.set("taxiMoney","");
    }
    if (checkbox3){
        var crossConfig = $("#Cross").val();
        var crossMoney = FranchiseeInfoDlg.getCommissionFromConfig(crossConfig, "跨城出行");
        if (crossMoney === false) {
            return;
        }
        ajax.set("isCross",1);
        ajax.set("Cross",crossConfig);
        ajax.set("crossMoney",crossMoney);
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tCompany/tCompany_info.js
@@ -132,6 +132,18 @@
    return false;
}
TCompanyInfoDlg.hasSubmitError = function(data) {
    if (typeof data === "string") {
        if ("error" == data) {
            Feng.error("登录账户已存在,请重新输入");
        } else {
            Feng.error(data);
        }
        return true;
    }
    return false;
}
/**
 * 关闭此对话框
 */
@@ -228,52 +240,32 @@
        return;
    }
    var checkbox1 = $('#checkbox1').prop('checked');
    var speConfig = $("#Spe").val();
    var speMoney = "";
    if (checkbox1) {
        // var zc = $("input[name='zc']:checked").val();
        // if (1 == zc){
        //     var zcPercent = $("#zcPercent").val();
        //     if ("" == zcPercent){
        //         Feng.info("快车比例抽成不能为空!");
        //         return;
        //     }else if (!regDouble.test(zcPercent)) {
        //         Feng.info("快车比例抽成格式不正确!");
        //         return;
        //     }
        // }else if (2 == zc){
        //     var zcMoney = $("#zcMoney").val();
        //     if ("" == zcMoney){
        //         Feng.info("快车固定金额抽成不能为空!");
        //         return;
        //     }else if (!regDouble.test(zcMoney)) {
        //         Feng.info("快车固定金额抽成格式不正确!");
        //         return;
        //     }
        // }
        speMoney = TCompanyInfoDlg.getCommissionFromConfig(speConfig, "快车");
        if (speMoney === false) {
            return;
        }
    }
    var checkbox2 = $('#checkbox2').prop('checked');
    var taxiConfig = $("#Taxi").val();
    var taxiMoney = "";
    if (checkbox2) {
        var cz = $("input[name='cz']:checked").val();
        if (1 == cz){
            var czPercent = $("#czPercent").val();
            if ("" == czPercent){
                Feng.info("出租车比例抽成不能为空!");
                return;
            }else if (!regDouble.test(czPercent)) {
                Feng.info("出租车比例抽成格式不正确!");
                return;
            }
        }else if (2 == cz){
            var czMoney = $("#czMoney").val();
            if ("" == czMoney){
                Feng.info("出租车固定金额抽成不能为空!");
                return;
            }else if (!regDouble.test(czMoney)) {
                Feng.info("出租车固定金额抽成格式不正确!");
                return;
            }
        taxiMoney = TCompanyInfoDlg.getCommissionFromConfig(taxiConfig, "出租车");
        if (taxiMoney === false) {
            return;
        }
    }
    var checkbox3 = $('#checkbox3').prop('checked');
    var crossConfig = $("#Cross").val();
    var crossMoney = "";
    if (checkbox3) {
        crossMoney = TCompanyInfoDlg.getCommissionFromConfig(crossConfig, "跨城出行");
        if (crossMoney === false) {
            return;
        }
    }
    var checkbox4 = $('#checkbox4').prop('checked');
    if (checkbox4) {
        // var tcx = $("input[name='tcx']:checked").val();
@@ -366,8 +358,7 @@
    var isOpenDriverSelfTrip = $("input[name='isOpenDriverSelfTrip']:checked").val();
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tCompany/add", function(data){
        if ("error" == data){
            Feng.error("登录账户已存在,请重新输入");
        if (TCompanyInfoDlg.hasSubmitError(data)){
            return;
        }
        if(200 == data.code){
@@ -382,35 +373,24 @@
    });
    ajax.set(TCompanyInfoDlg.tCompanyInfoData);
    if (checkbox1){
        var zc = $("input[name='zc']:checked").val();
        ajax.set("isSpeFixedOrProportional",zc);
        if (1 == zc){
            ajax.set("speMoney",$("#zcPercent").val());
        }else if (2 == zc) {
            ajax.set("speMoney",$("#zcMoney").val());
        }
        ajax.set("isSpe",1);
        ajax.set("Spe",speConfig);
        ajax.set("speMoney",speMoney);
    }else{
        ajax.set("isSpe",2);
        ajax.set("Spe","");
        ajax.set("speMoney","");
    }
    if (checkbox2){
        var cz = $("input[name='cz']:checked").val()
        ajax.set("isTaxiFixedOrProportional",cz);
        if (1 == cz){
            ajax.set("taxiMoney",$("#czPercent").val());
        }else if (2 == cz) {
            ajax.set("taxiMoney",$("#czMoney").val());
        }
        ajax.set("isTaxi",1);
        ajax.set("Taxi",taxiConfig);
        ajax.set("taxiMoney",taxiMoney);
    }else{
        ajax.set("isTaxi",2);
        ajax.set("Taxi","");
        ajax.set("taxiMoney","");
    }
    if (checkbox3){
        var crossConfig = $("#Cross").val();
        var crossMoney = TCompanyInfoDlg.getCommissionFromConfig(crossConfig, "跨城出行");
        if (crossMoney === false) {
            return;
        }
        ajax.set("isCross",1);
        ajax.set("Cross",crossConfig);
        ajax.set("crossMoney",crossMoney);
@@ -501,52 +481,32 @@
        return;
    }
    var checkbox1 = $('#checkbox1').prop('checked');
    var speConfig = $("#Spe").val();
    var speMoney = "";
    if (checkbox1) {
        // var zc = $("input[name='zc']:checked").val();
        // if (1 == zc){
        //     var zcPercent = $("#zcPercent").val();
        //     if ("" == zcPercent){
        //         Feng.info("快车比例抽成不能为空!");
        //         return;
        //     }else if (!regDouble.test(zcPercent)) {
        //         Feng.info("快车比例抽成格式不正确!");
        //         return;
        //     }
        // }else if (2 == zc){
        //     var zcMoney = $("#zcMoney").val();
        //     if ("" == zcMoney){
        //         Feng.info("快车固定金额抽成不能为空!");
        //         return;
        //     }else if (!regDouble.test(zcMoney)) {
        //         Feng.info("快车固定金额抽成格式不正确!");
        //         return;
        //     }
        // }
        speMoney = TCompanyInfoDlg.getCommissionFromConfig(speConfig, "快车");
        if (speMoney === false) {
            return;
        }
    }
    var checkbox2 = $('#checkbox2').prop('checked');
    var taxiConfig = $("#Taxi").val();
    var taxiMoney = "";
    if (checkbox2) {
        var cz = $("input[name='cz']:checked").val();
        if (1 == cz){
            var czPercent = $("#czPercent").val();
            if ("" == czPercent){
                Feng.info("出租车比例抽成不能为空!");
                return;
            }else if (!regDouble.test(czPercent)) {
                Feng.info("出租车比例抽成格式不正确!");
                return;
            }
        }else if (2 == cz){
            var czMoney = $("#czMoney").val();
            if ("" == czMoney){
                Feng.info("出租车固定金额抽成不能为空!");
                return;
            }else if (!regDouble.test(czMoney)) {
                Feng.info("出租车固定金额抽成格式不正确!");
                return;
            }
        taxiMoney = TCompanyInfoDlg.getCommissionFromConfig(taxiConfig, "出租车");
        if (taxiMoney === false) {
            return;
        }
    }
    var checkbox3 = $('#checkbox3').prop('checked');
    var crossConfig = $("#Cross").val();
    var crossMoney = "";
    if (checkbox3) {
        crossMoney = TCompanyInfoDlg.getCommissionFromConfig(crossConfig, "跨城出行");
        if (crossMoney === false) {
            return;
        }
    }
    var checkbox4 = $('#checkbox4').prop('checked');
    if (checkbox4) {
        // var tcx = $("input[name='tcx']:checked").val();
@@ -639,8 +599,7 @@
    var isOpenDriverSelfTrip = $("input[name='isOpenDriverSelfTrip']:checked").val();
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tCompany/update", function(data){
        if ("error" == data){
            Feng.error("登录账户已存在,请重新输入");
        if (TCompanyInfoDlg.hasSubmitError(data)){
            return;
        }
        Feng.success("修改成功!");
@@ -651,35 +610,24 @@
    });
    ajax.set(TCompanyInfoDlg.tCompanyInfoData);
    if (checkbox1){
        var zc = $("input[name='zc']:checked").val();
        ajax.set("isSpeFixedOrProportional",zc);
        if (1 == zc){
            ajax.set("speMoney",$("#zcPercent").val());
        }else if (2 == zc) {
            ajax.set("speMoney",$("#zcMoney").val());
        }
        ajax.set("isSpe",1);
        ajax.set("Spe",speConfig);
        ajax.set("speMoney",speMoney);
    }else{
        ajax.set("isSpe",2);
        ajax.set("Spe","");
        ajax.set("speMoney","");
    }
    if (checkbox2){
        var cz = $("input[name='cz']:checked").val()
        ajax.set("isTaxiFixedOrProportional",cz);
        if (1 == cz){
            ajax.set("taxiMoney",$("#czPercent").val());
        }else if (2 == cz) {
            ajax.set("taxiMoney",$("#czMoney").val());
        }
        ajax.set("isTaxi",1);
        ajax.set("Taxi",taxiConfig);
        ajax.set("taxiMoney",taxiMoney);
    }else{
        ajax.set("isTaxi",2);
        ajax.set("Taxi","");
        ajax.set("taxiMoney","");
    }
    if (checkbox3){
        var crossConfig = $("#Cross").val();
        var crossMoney = TCompanyInfoDlg.getCommissionFromConfig(crossConfig, "跨城出行");
        if (crossMoney === false) {
            return;
        }
        ajax.set("isCross",1);
        ajax.set("Cross",crossConfig);
        ajax.set("crossMoney",crossMoney);
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tDriver/yesDriver_info.js
@@ -303,6 +303,18 @@
    return $("#" + key).val();
}
YesDriverInfoDlg.hasSubmitError = function(data) {
    if (typeof data === "string") {
        if ("error" == data) {
            Feng.error("登录账户已存在,请重新输入");
        } else {
            Feng.error(data);
        }
        return true;
    }
    return false;
}
/**
 * 关闭此对话框
 */
@@ -462,8 +474,7 @@
    }
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tDriver/add", function(data){
        if ("error" == data) {
            Feng.error("登录账户已存在,请重新输入");
        if (YesDriverInfoDlg.hasSubmitError(data)) {
            return;
        }
        if(200 == data.code){
@@ -583,8 +594,7 @@
    }
    //提交信息
    var ajax = new $ax(Feng.ctxPath + "/tDriver/update", function(data){
        if ("error" == data) {
            Feng.error("登录账户已存在,请重新输入");
        if (YesDriverInfoDlg.hasSubmitError(data)) {
            return;
        }
        if(200 == data.code){
ManagementYKDTravel/guns-admin/src/main/webapp/static/modular/system/tLine/tLine_info.js
@@ -144,6 +144,42 @@
    .set('outSetting');
}
TLineInfoDlg.validateOutSetting = function () {
    var outSetting = $("#outSetting").val();
    if (!outSetting) {
        Feng.error("请设置司机抽成");
        return false;
    }
    try {
        var config = JSON.parse(outSetting);
        if (config.rules && config.rules.length > 0) {
            for (var i = 0; i < config.rules.length; i++) {
                if (config.rules[i].percent !== undefined && config.rules[i].percent !== "") {
                    return true;
                }
            }
        }
        if (config.time_rules && config.time_rules.length > 0) {
            for (var j = 0; j < config.time_rules.length; j++) {
                var rules = config.time_rules[j];
                if (!rules || rules.length <= 0) {
                    continue;
                }
                for (var k = 0; k < rules.length; k++) {
                    if (rules[k].percent !== undefined && rules[k].percent !== "") {
                        return true;
                    }
                }
            }
        }
    } catch (e) {
        Feng.error("司机抽成配置格式不正确");
        return false;
    }
    Feng.error("请设置司机抽成");
    return false;
}
/**
 * 提交添加
 */
@@ -152,6 +188,9 @@
    this.clearData();
    this.collectData();
    if(!this.validate()){
        return ;
    }
    if(!TLineInfoDlg.validateOutSetting()){
        return ;
    }
    var startSiteId = $("#startSiteId").val();
@@ -223,6 +262,9 @@
    if(!this.validate()){
        return ;
    }
    if(!TLineInfoDlg.validateOutSetting()){
        return ;
    }
    var startSiteId = $("#startSiteId").val();
    var endSiteId = $("#endSiteId").val();
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -1,6 +1,5 @@
package com.stylefeng.guns.modular.specialTrain.server.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -1965,6 +1964,7 @@
    
    @Override
    public ResultUtil payPrivateCarOrder(Integer payType, Integer orderId, Integer couponId, Integer type) throws Exception {
        System.out.println("!!!" + payType + "!!!!" + orderId + "!!!" + couponId);
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        if (orderPrivateCar.getState() == 8 || orderPrivateCar.getState() == 9) {
            return ResultUtil.error("订单已完成支付,不允许重复支付", "");
@@ -1975,6 +1975,8 @@
        if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", "");
        }
        normalizePrivateCarPrepayFirstStageBeforePay(orderPrivateCar);
        System.out.println("!!!" + orderPrivateCar + "!!!!");
        Integer uid = orderPrivateCar.getUserId();
        Double orderMoney = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus() ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney());
        UserInfo userInfo = userInfoService.selectById(uid);
@@ -2028,11 +2030,19 @@
            }
        }
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
        if (prepaySettleResult != null) {
            return prepaySettleResult;
        orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
        boolean isPrepayFirstPayBeforeCreate = isPrivateCarPrepayFirstStage(orderPrivateCar);
        if (!isPrepayFirstPayBeforeCreate) {
            ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
            if (prepaySettleResult != null) {
                return prepaySettleResult;
            }
            if (orderPrivateCar.getPrepayStage() == 3){
                orderMoney = orderMoney - orderPrivateCar.getEstimateAmount();
            }
        }
        orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney);
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
        if (payType == 1) {//微信支付
            String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5);
            JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney);
@@ -2057,9 +2067,13 @@
            
            boolean isPrepayFirstStage = isPrivateCarPrepayFirstStage(orderPrivateCar);
            boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar);
            System.out.println("!!!" + isPrepayFirstStage + "!!!!" + isPrepaySpreadStage + "!!!" + orderPrivateCar);
            if (isPrepayFirstStage) {
                handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, orderMoney, 3);
                return resultUtil;
            }
            if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && !isPrepaySpreadStage) {
                return ResultUtil.error("预付阶段异常,请刷新后重试", "");
            }
            OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
@@ -2128,6 +2142,7 @@
        if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", new ArrayList<>());
        }
        normalizePrivateCarPrepayFirstStageBeforePay(orderPrivateCar);
        Integer uid = orderPrivateCar.getUserId();
        Double orderMoney = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus() ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney());
@@ -2290,15 +2305,21 @@
                orderMoney = v;
            }
        }
        if (orderPrivateCar.getPrepayStage() == 3){
            orderMoney = orderMoney - orderPrivateCar.getEstimateAmount();
        }
        orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
        System.out.println("!!!" + orderMoney + "!!!!");
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
        if (prepaySettleResult != null) {
            return prepaySettleResult;
        boolean isPrepayFirstPayBeforeCreate = isPrivateCarPrepayFirstStage(orderPrivateCar);
        if (!isPrepayFirstPayBeforeCreate) {
            ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney);
            if (prepaySettleResult != null) {
                return prepaySettleResult;
            }
            orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney);
        }
        orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney);
        if (!isPrivateCarPrepaySpreadStage(orderPrivateCar)) {
        if (!isPrepayFirstPayBeforeCreate && !isPrivateCarPrepaySpreadStage(orderPrivateCar)) {
            orderPrivateCar.setPayMoney(orderMoney);
        }
        if (payType == 1) {//微信支付
@@ -2356,9 +2377,13 @@
            boolean isPrepayFirstStage = isPrivateCarPrepayFirstStage(orderPrivateCar);
            boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar);
            System.out.println("!!!" + isPrepayFirstStage + "!!!!" + isPrepaySpreadStage + "!!!" + orderPrivateCar);
            if (isPrepayFirstStage) {
                handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, orderMoney, 3);
                return resultUtil;
            }
            if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && !isPrepaySpreadStage) {
                return ResultUtil.error("预付阶段异常,请刷新后重试");
            }
            OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString());
@@ -2579,6 +2604,28 @@
                && Integer.valueOf(1).equals(orderPrivateCar.getPrepayStage());
    }
    private void normalizePrivateCarPrepayFirstStageBeforePay(OrderPrivateCar orderPrivateCar) throws Exception {
        if (orderPrivateCar == null || !Integer.valueOf(7).equals(orderPrivateCar.getState())) {
            return;
        }
        if (Integer.valueOf(1).equals(orderPrivateCar.getPrepayStage())
                || Integer.valueOf(3).equals(orderPrivateCar.getPrepayStage())
                || Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())
                || Integer.valueOf(5).equals(orderPrivateCar.getPrepayStage())) {
            return;
        }
        if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode())) {
            orderPrivateCar.setPrepayStage(1);
            return;
        }
        PaymentRecord unpaidRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1,
                orderPrivateCar.getId(), 1, null, 1);
        if (unpaidRecord != null && orderPrivateCar.getEstimateAmount() != null && orderPrivateCar.getEstimateAmount() > 0) {
            orderPrivateCar.setPaymentMode(1);
            orderPrivateCar.setPrepayStage(1);
        }
    }
    private boolean isPrivateCarPrepaySpreadStage(OrderPrivateCar orderPrivateCar) {
        return orderPrivateCar != null
                && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode())
@@ -2672,6 +2719,11 @@
        Double displayAmount = getPrivateCarPrepayDisplayPayAmount(orderPrivateCar, finalAmount);
        map.put("orderMoney", finalAmount);
        map.put("payMoney", displayAmount);
        if (orderPrivateCar.getPrepayStage() == 3) {
            map.put("payMoney", new BigDecimal(finalAmount)
                    .subtract(new BigDecimal(orderPrivateCar.getEstimateAmount() != null ? orderPrivateCar.getEstimateAmount() : 0))
                    .setScale(2, RoundingMode.HALF_UP));
        }
    }
    private ResultUtil settlePrivateCarPrepayIfNoSecondPay(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double finalAmount) throws Exception {
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -1352,7 +1352,12 @@
        if (prepaySettleResult != null) {
            return prepaySettleResult;
        }
        orderMoney = getTaxiPrepayFinalPayAmount(orderTaxi, orderMoney);
//        orderMoney = getTaxiPrepayFinalPayAmount(orderTaxi, orderMoney);
        if (orderTaxi.getPrepayStage() == 3){
            orderMoney = orderMoney - orderTaxi.getEstimateAmount();
        }
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
        if (payType == 1) {//微信支付
            String outTradeNo = orderId + "_2_" + UUIDUtil.getRandomCode(5);
            JSONObject response = cbyzxOrderPayHelper.createOrder(orderTaxi.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney);
@@ -1603,6 +1608,9 @@
                orderTaxi.setActivityId(query2.getId());
                orderMoney = v;
            }
        }
        if (orderTaxi.getPrepayStage() == 3){
            orderMoney = orderMoney - orderTaxi.getEstimateAmount();
        }
        orderMoney = orderMoney < 0 ? 0 : orderMoney;
        orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue();
@@ -2232,8 +2240,13 @@
        }
        Double finalAmount = null != map.get("orderMoney") ? Double.valueOf(String.valueOf(map.get("orderMoney"))) : orderTaxi.getOrderMoney();
        Double displayAmount = getTaxiPrepayDisplayPayAmount(orderTaxi, finalAmount);
        map.put("orderMoney", displayAmount);
        map.put("orderMoney", finalAmount);
        map.put("payMoney", displayAmount);
        if (orderTaxi.getPrepayStage() == 3) {
            map.put("payMoney", new BigDecimal(finalAmount)
                    .subtract(new BigDecimal(orderTaxi.getEstimateAmount() != null ? orderTaxi.getEstimateAmount() : 0))
                    .setScale(2, RoundingMode.HALF_UP));
        }
    }
    private ResultUtil settleTaxiPrepayIfNoSecondPay(OrderTaxi orderTaxi, UserInfo userInfo, Double finalAmount) throws Exception {