From 6771fff413935485b5dce61769f133a44533d15c Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期六, 30 五月 2026 14:35:14 +0800
Subject: [PATCH] fix

---
 ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java |  178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 175 insertions(+), 3 deletions(-)

diff --git a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java b/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java
index daafcbf..655af48 100644
--- a/ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCompanyController.java
+++ b/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(查询直属司机时使用)

--
Gitblit v1.7.1