refactor(controller): 移除冗余的service注入,使用BeanContext统一管理

feat(sales-order): 补充SalesOrderVo缺失字段并完善相关功能
feat(sales-order): 添加客户、税率等字段到销售订单界面
refactor(tab-skin): 重构TabSkin基类,统一bean获取方式
fix(fxml): 修正controller包路径和字段绑定
feat(repository): 添加findAllByOrder方法优化查询
This commit is contained in:
2025-10-15 00:40:02 +08:00
parent 1c1ff678a5
commit d2e0dc4555
25 changed files with 485 additions and 137 deletions

View File

@@ -160,9 +160,7 @@ public class SalesBillVoucherCtx extends AbstractYongYouU8Ctx {
public void syncBySalesOrder(SalesOrder order, MessageHolder holder) {
var voucherService = getSalesBillVoucherService();
var voucherItemService = getSalesBillVoucherItemService();
List<SalesBillVoucher> vouchers = voucherService.findAll((root, q, cb) -> {
return cb.equal(root.get("order"), order);
}, Sort.unsorted());
List<SalesBillVoucher> vouchers = voucherService.findAllByOrder(order);
holder.debug("查找到 " + vouchers.size() + " 条专用发票记录在数据库中");
Map<Integer, SalesBillVoucher> voucherMap = vouchers.stream()
.collect(Collectors.toMap(SalesBillVoucher::getRefId, item -> item));

View File

@@ -11,11 +11,16 @@ import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import com.ecep.contract.ds.company.model.Company;
import com.ecep.contract.ds.company.service.CompanyService;
import com.ecep.contract.ds.contract.service.ContractItemService;
import com.ecep.contract.ds.contract.service.ContractService;
import com.ecep.contract.vo.ContractVo;
import org.springframework.data.domain.Sort;
import org.springframework.util.StringUtils;
import com.ecep.contract.MessageHolder;
import com.ecep.contract.constant.CloudServiceConstant;
@@ -24,6 +29,8 @@ import com.ecep.contract.ds.contract.service.SalesOrderItemService;
import com.ecep.contract.ds.contract.model.Contract;
import com.ecep.contract.ds.customer.model.SalesOrder;
import com.ecep.contract.ds.customer.model.SalesOrderItem;
import com.ecep.contract.ds.customer.service.CompanyCustomerEntityService;
import com.ecep.contract.ds.customer.service.CustomerService;
import com.ecep.contract.util.NumberUtils;
import lombok.Setter;
@@ -42,6 +49,69 @@ public class SalesOrderCtx extends AbstractYongYouU8Ctx {
return saleOrdersService;
}
/**
* 更新客户信息
*
* @param getter 获取当前客户的函数
* @param setter 设置客户的函数
* @param code 客户代码
* @param name 客户名称
* @param holder 消息持有者
* @param fieldName 字段名称
* @return 是否发生了修改
*/
private boolean updateCustomer(Supplier<Company> getter,
java.util.function.Consumer<Company> setter,
String code,
String name,
MessageHolder holder,
String fieldName) {
Company current = getter.get();
CompanyService companyService = getBean(CompanyService.class);
if (StringUtils.hasText(code)) {
var customerEntity = getCachedBean(CompanyCustomerEntityService.class).findByCustomerCode(code);
if (customerEntity == null) {
holder.warn("未找到客户:" + name + " (代码: " + code + ")");
} else {
var customer = getCachedBean(CustomerService.class).findById(customerEntity.getCustomerId());
if (customer == null) {
holder.warn("未找到客户:" + name + " (代码: " + code + ")");
} else {
var companyId = customer.getCompanyId();
if (current == null) {
var updated = companyService.getById(companyId);
setter.accept(updated);
holder.info(fieldName + " 更新为 " + updated.getName());
return true;
}
if (!Objects.equals(current.getId(), companyId)) {
var updated = companyService.getById(companyId);
setter.accept(updated);
holder.info(fieldName + " 更新为 " + updated.getName());
return true;
}
}
}
}
// 尝试通过名称或简称查找公司
Company updated = companyService.findAndRemoveDuplicateCompanyByNameOrAbbName(name, null);
if (updated == null) {
holder.warn("未找到客户:" + name + " (代码: " + code + ")");
return false;
}
if (!Objects.equals(current, updated)) {
setter.accept(updated);
holder.info(fieldName + " 更新为 " + updated.getName());
return true;
}
return false;
}
SalesOrderItemService getOrderItemService() {
if (orderItemService == null) {
orderItemService = getBean(SalesOrderItemService.class);
@@ -49,22 +119,20 @@ public class SalesOrderCtx extends AbstractYongYouU8Ctx {
return orderItemService;
}
public List<SalesOrder> syncByContract(ContractVo contract, MessageHolder holder) {
SaleOrdersService saleOrdersService = getSaleOrdersService();
SalesOrderItemService orderItemService = getOrderItemService();
List<SalesOrder> orders = saleOrdersService.findAllByContract(contract);
holder.debug("查找到 " + orders.size() + " 条销售订单记录在数据库中");
Map<String, SalesOrder> ordersMap = orders.stream().collect(Collectors.toMap(SalesOrder::getCode, item -> item));
Map<String, SalesOrder> ordersMap = orders.stream()
.collect(Collectors.toMap(SalesOrder::getCode, item -> item));
// 按 order 分组
Map<SalesOrder, Map<String, SalesOrderItem>> itemMap = orders.stream()
.collect(
Collectors.toMap(Function.identity(), order -> orderItemService.findAllBySaleOrder(order).stream().collect(
Collectors.toMap(SalesOrderItem::getCode, item -> item)
))
);
Collectors.toMap(Function.identity(),
order -> orderItemService.findAllBySaleOrder(order).stream().collect(
Collectors.toMap(SalesOrderItem::getCode, item -> item))));
// 查询 U8 数据库
List<Map<String, Object>> ds = repository.findAllSalesOrderItemByContractCode(contract.getCode());
@@ -161,8 +229,23 @@ public class SalesOrderCtx extends AbstractYongYouU8Ctx {
private boolean applySalesOrderDetail(SalesOrder order, Map<String, Object> map, MessageHolder holder) {
String code = (String) map.get("cSOCode");
String employeeCode = (String) map.get("cPersonCode");
String cCloser = (String) map.get("cCloser");
String customerCode = (String) map.get("cCusCode");
String customerName = (String) map.get("cCusName");
String customerAddress = (String) map.get("cCusOAddress");
String makerName = (String) map.get("cMaker");
Timestamp makerDate = (Timestamp) map.get("dcreatesystime");
String verifierName = (String) map.get("cVerifier");
Timestamp verifierDate = (Timestamp) map.get("dverifysystime");
String modifierName = (String) map.get("cmodifier");
Timestamp modifierDate = (Timestamp) map.get("dmodifysystime");
String closerName = (String) map.get("cCloser");
Timestamp closerDate = (Timestamp) map.get("dclosesystime");
float taxRate = Optional.ofNullable(map.get("iTaxRate"))
.map(obj -> obj instanceof Number ? ((Number) obj).floatValue() : null).orElse(0f);
String memo = (String) map.get("cMemo");
@@ -174,20 +257,48 @@ public class SalesOrderCtx extends AbstractYongYouU8Ctx {
modified = true;
}
if (updateEmployeeByCode(order::getEmployee, order::setEmployee, (String) map.get("cPersonCode"), holder, "业务员")) {
if (updateEmployeeByCode(order::getEmployee, order::setEmployee, employeeCode, holder, "业务员")) {
modified = true;
}
if (updateEmployeeByName(order::getMaker, order::setMaker, (String) map.get("cMaker"), holder, "制单人")) {
if (updateEmployeeByName(order::getMaker, order::setMaker, makerName, holder, "制单人")) {
modified = true;
}
if (updateEmployeeByName(order::getVerifier, order::setVerifier, (String) map.get("cVerifier"), holder, "审核人")) {
if (updateEmployeeByName(order::getVerifier, order::setVerifier, verifierName, holder, "审核人")) {
modified = true;
}
if (updateEmployeeByName(order::getModifier, order::setModifier, modifierName, holder, "修改人")) {
modified = true;
}
if (updateEmployeeByName(order::getCloser, order::setCloser, closerName, holder, "关闭人")) {
modified = true;
}
if (updateLocalDate(order::getMakerDate, order::setMakerDate, (Timestamp) map.get("dcreatesystime"), holder, "制单日期")) {
if (updateLocalDate(order::getMakerDate, order::setMakerDate, makerDate, holder, "制单日期")) {
modified = true;
}
if (updateLocalDate(order::getVerifierDate, order::setVerifierDate, (Timestamp) map.get("dverifysystime"), holder, "审核日期")) {
if (updateLocalDate(order::getVerifierDate, order::setVerifierDate, verifierDate, holder, "审核日期")) {
modified = true;
}
if (updateLocalDate(order::getModifierDate, order::setModifierDate, modifierDate, holder, "修改日期")) {
modified = true;
}
if (updateLocalDate(order::getCloserDate, order::setCloserDate, closerDate, holder, "关闭日期")) {
modified = true;
}
if (!NumberUtils.equals(order.getTaxRate(), taxRate)) {
order.setTaxRate(taxRate);
holder.info("税率修改为: " + taxRate);
modified = true;
}
if (updateCustomer(order::getCustomer, order::setCustomer, customerCode, customerName, holder, "客户")) {
modified = true;
}
if (!Objects.equals(order.getCustomerAddress(), customerAddress)) {
order.setCustomerAddress(customerAddress);
holder.info("客户地址修改为: " + customerAddress);
modified = true;
}
@@ -200,11 +311,11 @@ public class SalesOrderCtx extends AbstractYongYouU8Ctx {
return modified;
}
private boolean applySaleOrderItemDetail(SalesOrderItem item, Map<String, Object> map, MessageHolder holder) {
String code = String.valueOf(map.get("iSOsID"));
String spec = (String) map.get("cInvName");
String title = (String) map.get("cInvName");
String contractItemRowId = (String) map.get("cContractRowGuid");
double quantity = (double) map.get("iQuantity");
double taxRate = (double) map.get("iTaxRate");
double taxPrice = (double) map.get("iTaxUnitPrice");
@@ -217,7 +328,6 @@ public class SalesOrderCtx extends AbstractYongYouU8Ctx {
holder.debug("条目:" + title + " x " + amount);
if (!Objects.equals(item.getCode(), code)) {
item.setCode(code);
holder.info("代码修改为: " + code);
@@ -255,6 +365,13 @@ public class SalesOrderCtx extends AbstractYongYouU8Ctx {
modified = true;
}
var contractItem = getCachedBean(ContractItemService.class).findByRowId(contractItemRowId);
if (!Objects.equals(item.getContractItem(), contractItem)) {
item.setContractItem(contractItem);
holder.info("合同条目修改为: #" + contractItem.getId());
modified = true;
}
if (!Objects.equals(item.getDescription(), memo)) {
item.setDescription(memo);
modified = true;