refactor(util): 重构BeanContext接口及相关实现

将ContextUtils重命名为BeanContext,并统一客户端和服务端的实现
添加DefaultBeanContext作为默认实现
优化Inventory同步任务逻辑,支持WebSocket远程调用
更新tasker_mapper.json添加新的任务映射
移除未使用的syncInventory方法
This commit is contained in:
2025-10-12 22:39:32 +08:00
parent 59d78619da
commit 5b3ab3ed00
17 changed files with 360 additions and 129 deletions

View File

@@ -6,9 +6,7 @@ import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeParseException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -17,35 +15,38 @@ import org.springframework.beans.BeansException;
import org.springframework.util.StringUtils;
import com.ecep.contract.MessageHolder;
import com.ecep.contract.SpringApp;
import com.ecep.contract.ds.company.service.CompanyService;
import com.ecep.contract.ds.other.service.EmployeeService;
import com.ecep.contract.ds.other.service.SysConfService;
import com.ecep.contract.util.ContextUtils;
import com.ecep.contract.util.BeanContext;
import com.ecep.contract.util.DefaultBeanContext;
import com.ecep.contract.util.MyStringUtils;
import com.ecep.contract.util.NumberUtils;
import lombok.Getter;
import lombok.Setter;
public class AbstractCtx implements ContextUtils {
public class AbstractCtx implements BeanContext {
@Setter
@Getter
Locale locale = Locale.getDefault();
private Map<Class<?>, Object> cachedBeans = new HashMap<>();
private BeanContext beanContext;
public <T> T getBean(Class<T> requiredType) throws BeansException {
return getCachedBean(requiredType);
public AbstractCtx() {
this(new DefaultBeanContext());
}
public AbstractCtx(BeanContext ctx) {
beanContext = ctx;
}
public <T> T getBean(Class<T> requiredType) throws BeansException {
return beanContext.getBean(requiredType);
}
@SuppressWarnings("unchecked")
public <T> T getCachedBean(Class<T> requiredType) throws BeansException {
Object object = cachedBeans.get(requiredType);
if (object == null) {
object = SpringApp.getBean(requiredType);
cachedBeans.put(requiredType, object);
}
return (T) object;
return beanContext.getCachedBean(requiredType);
}
public SysConfService getConfService() {

View File

@@ -5,6 +5,9 @@ import java.util.function.Consumer;
import java.util.function.Supplier;
import com.ecep.contract.vo.*;
import ch.qos.logback.core.util.ContextUtil;
import org.hibernate.Hibernate;
import org.springframework.beans.BeansException;
import org.springframework.util.StringUtils;
@@ -19,6 +22,7 @@ import com.ecep.contract.ds.vendor.service.VendorEntityService;
import com.ecep.contract.ds.vendor.service.VendorService;
import com.ecep.contract.ds.company.model.Company;
import com.ecep.contract.model.Employee;
import com.ecep.contract.util.BeanContext;
import lombok.Getter;
import lombok.Setter;
@@ -28,6 +32,14 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
@Setter
YongYouU8Repository repository;
public AbstractYongYouU8Ctx() {
super();
}
public AbstractYongYouU8Ctx(BeanContext ctx) {
super(ctx);
}
public void from(AbstractYongYouU8Ctx parent) {
repository = parent.repository;
}
@@ -60,7 +72,7 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
}
boolean updateEmployeeByCode(Supplier<Employee> getter, Consumer<Employee> setter, String code,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
if (StringUtils.hasText(code)) {
var employee = getEmployeeService().findByCode(code);
if (employee != null) {
@@ -71,7 +83,7 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
}
boolean updateEmployeeId(Supplier<Integer> getter, Consumer<Integer> setter, EmployeeVo employee,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
if (employee == null) {
return false;
}
@@ -90,7 +102,7 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
}
boolean updateEmployeeIdByCode(Supplier<Integer> getter, Consumer<Integer> setter, String code,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
if (StringUtils.hasText(code)) {
var employee = getEmployeeService().findByCode(code);
if (employee != null) {
@@ -101,7 +113,7 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
}
boolean updateEmployee(Supplier<Employee> getter, Consumer<Employee> setter, EmployeeVo employee,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
if (employee == null) {
return false;
}
@@ -124,7 +136,7 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
}
boolean updateEmployeeByName(Supplier<Employee> getter, Consumer<Employee> setter, String name,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
if (StringUtils.hasText(name)) {
EmployeeVo employee = getEmployeeService().findByName(name);
if (employee != null) {
@@ -135,7 +147,7 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
}
boolean updateEmployeeIdByName(Supplier<Integer> getter, Consumer<Integer> setter, String name,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
if (StringUtils.hasText(name)) {
EmployeeVo employee = getEmployeeService().findByName(name);
if (employee != null) {
@@ -146,7 +158,7 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
}
boolean updateCompanyByCustomerCode(Supplier<Company> getter, Consumer<Company> setter, String customerCode,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
Company company = null;
if (StringUtils.hasText(customerCode)) {
CompanyCustomerEntityService customerEntityService = getCompanyCustomerEntityService();
@@ -181,7 +193,7 @@ public class AbstractYongYouU8Ctx extends AbstractCtx {
}
boolean updateCompanyByVendorCode(Supplier<Company> getter, Consumer<Company> setter, String vendorCode,
MessageHolder holder, String topic) {
MessageHolder holder, String topic) {
Company company = null;
if (StringUtils.hasText(vendorCode)) {
VendorEntityService vendorEntityService = getCompanyVendorEntityService();

View File

@@ -7,41 +7,34 @@ import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;
import com.ecep.contract.vo.InventoryCatalogVo;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.util.StringUtils;
import com.ecep.contract.MessageHolder;
import com.ecep.contract.constant.CloudServiceConstant;
import com.ecep.contract.ds.other.service.InventoryCatalogService;
import com.ecep.contract.ds.other.service.InventoryService;
import com.ecep.contract.model.Inventory;
import com.ecep.contract.model.InventoryCatalog;
import com.ecep.contract.model.Price;
import com.ecep.contract.util.BeanContext;
import com.ecep.contract.vo.InventoryCatalogVo;
import com.ecep.contract.vo.InventoryVo;
import lombok.Setter;
public class InventoryCtx extends AbstractYongYouU8Ctx {
@Setter
private InventoryService inventoryService;
@Setter
private InventoryCatalogService inventoryCatalogService;
public InventoryCtx() {
super();
}
public InventoryCtx(BeanContext ctx) {
super(ctx);
}
public InventoryService getInventoryService() {
if (inventoryService == null) {
inventoryService = getBean(InventoryService.class);
}
return inventoryService;
return getCachedBean(InventoryService.class);
}
public InventoryCatalogService getInventoryCatalogService() {
if (inventoryCatalogService == null) {
inventoryCatalogService = getBean(InventoryCatalogService.class);
}
return inventoryCatalogService;
return getCachedBean(InventoryCatalogService.class);
}
private boolean applyInventoryDetail(Inventory item, Map<String, Object> map, MessageHolder holder) {
@@ -127,6 +120,21 @@ public class InventoryCtx extends AbstractYongYouU8Ctx {
return modified;
}
public boolean syncInventory(Inventory inventory, MessageHolder holder) {
Map<String, Object> map = null;
try {
map = repository.queryInventoryDetail(inventory.getCode());
} catch (EmptyResultDataAccessException e) {
holder.error("无此存货:" + inventory.getCode());
return false;
}
if (applyInventoryDetail(inventory, map, holder)) {
inventory.setUpdateDate(LocalDateTime.now());
return true;
}
return false;
}
public boolean syncInventoryDetailByCode(Inventory inventory, String inventoryCode, MessageHolder holder) {
if (repository == null) {
return false;
@@ -134,9 +142,6 @@ public class InventoryCtx extends AbstractYongYouU8Ctx {
Map<String, Object> map = null;
try {
map = repository.queryInventoryDetail(inventoryCode);
} catch (NoSuchBeanDefinitionException e) {
holder.warn("未启用 " + CloudServiceConstant.U8_NAME + " 服务");
return false;
} catch (EmptyResultDataAccessException e) {
holder.error("无此存货:" + inventoryCode);
return false;
@@ -159,7 +164,7 @@ public class InventoryCtx extends AbstractYongYouU8Ctx {
* @return 是否更新
*/
private boolean updateInventoryCatalog(Supplier<InventoryCatalog> getter, Consumer<InventoryCatalog> setter,
String catalogCode, MessageHolder holder, String topic) {
String catalogCode, MessageHolder holder, String topic) {
InventoryCatalogVo catalog = null;
if (StringUtils.hasText(catalogCode)) {
catalog = getInventoryCatalogService().findByCode(catalogCode);
@@ -195,7 +200,7 @@ public class InventoryCtx extends AbstractYongYouU8Ctx {
* @return 是否更新
*/
public boolean syncInventoryDetailByCode(Supplier<Inventory> getter, Consumer<Inventory> setter,
String inventoryCode, MessageHolder holder, String topic) {
String inventoryCode, MessageHolder holder, String topic) {
if (!StringUtils.hasText(inventoryCode)) {
return false;
}