|
@@ -1,14 +1,23 @@
|
|
|
package com.gree.mall.manager.logic.common;
|
|
package com.gree.mall.manager.logic.common;
|
|
|
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.gree.mall.manager.bean.admin.AdminUserCom;
|
|
import com.gree.mall.manager.bean.admin.AdminUserCom;
|
|
|
|
|
+import com.gree.mall.manager.bean.material.vender.WebsitVenderVO;
|
|
|
|
|
+import com.gree.mall.manager.bean.order.OrderPickTimeConfigVO;
|
|
|
|
|
+import com.gree.mall.manager.commonmapper.CommonMapper;
|
|
|
|
|
+import com.gree.mall.manager.exception.RemoteServiceException;
|
|
|
import com.gree.mall.manager.plus.entity.OrderPickTimeConfig;
|
|
import com.gree.mall.manager.plus.entity.OrderPickTimeConfig;
|
|
|
import com.gree.mall.manager.plus.service.OrderPickTimeConfigService;
|
|
import com.gree.mall.manager.plus.service.OrderPickTimeConfigService;
|
|
|
|
|
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
|
|
|
|
|
+import com.gree.mall.manager.zfire.util.FieldUtils;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
|
|
|
@RequiredArgsConstructor
|
|
@RequiredArgsConstructor
|
|
@@ -18,14 +27,142 @@ public class OrderPickTimeConfigLogic {
|
|
|
|
|
|
|
|
private final CommonLogic commonLogic;
|
|
private final CommonLogic commonLogic;
|
|
|
private final OrderPickTimeConfigService orderPickTimeConfigService;
|
|
private final OrderPickTimeConfigService orderPickTimeConfigService;
|
|
|
|
|
+ private final CommonMapper commonMapper;
|
|
|
|
|
|
|
|
|
|
|
|
|
- public List<OrderPickTimeConfig> list() {
|
|
|
|
|
|
|
+ public List<OrderPickTimeConfig> list(String storageId) {
|
|
|
AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
return orderPickTimeConfigService.lambdaQuery()
|
|
return orderPickTimeConfigService.lambdaQuery()
|
|
|
.eq(StringUtils.isNotBlank(adminUser.getCompanyWechatId()), OrderPickTimeConfig::getCompanyWechatId, adminUser.getCompanyWechatId())
|
|
.eq(StringUtils.isNotBlank(adminUser.getCompanyWechatId()), OrderPickTimeConfig::getCompanyWechatId, adminUser.getCompanyWechatId())
|
|
|
.in(StringUtils.isBlank(adminUser.getCompanyWechatId())
|
|
.in(StringUtils.isBlank(adminUser.getCompanyWechatId())
|
|
|
&& CollectionUtil.isNotEmpty(adminUser.getCompanyWechatIds()), OrderPickTimeConfig::getCompanyWechatId, adminUser.getCompanyWechatIds())
|
|
&& CollectionUtil.isNotEmpty(adminUser.getCompanyWechatIds()), OrderPickTimeConfig::getCompanyWechatId, adminUser.getCompanyWechatIds())
|
|
|
|
|
+ .eq(OrderPickTimeConfig::getStorageId, storageId)
|
|
|
|
|
+ .orderByDesc(OrderPickTimeConfig::getId)
|
|
|
.list();
|
|
.list();
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ public IPage<OrderPickTimeConfigVO> list2(ZfireParamBean zfireParamBean) {
|
|
|
|
|
+ AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
|
|
+ if (CollectionUtil.isEmpty(zfireParamBean.getParams())) {
|
|
|
|
|
+ zfireParamBean.setParams(new ArrayList<>());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ FieldUtils.supplyParam(zfireParamBean, OrderPickTimeConfigVO.class, adminUser);
|
|
|
|
|
+ return commonMapper.orderPickTimeConfigList2(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 验证时间格式是否为HH:mm,并确保时间在00:00至23:59的区间内
|
|
|
|
|
+ */
|
|
|
|
|
+ private void validateTimeFormat(String time, String fieldName, OrderPickTimeConfig config) {
|
|
|
|
|
+ if (StringUtils.isBlank(time)) {
|
|
|
|
|
+ throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "提货时间配置的" + fieldName + "不能为空");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证时间格式是否为HH:mm,且时间在00:00至23:59的区间内
|
|
|
|
|
+ if (!time.matches("^([01]?[0-9]|2[0-3]):[0-5][0-9]$") ) {
|
|
|
|
|
+ throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "提货时间配置的" + fieldName + "格式不正确,请使用HH:mm格式,且时间范围必须在00:00至23:59之间");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 验证小时和分钟的范围(额外的安全检查)
|
|
|
|
|
+ String[] parts = time.split(":");
|
|
|
|
|
+ int hour = Integer.parseInt(parts[0]);
|
|
|
|
|
+ int minute = Integer.parseInt(parts[1]);
|
|
|
|
|
+
|
|
|
|
|
+ if (hour < 0 || hour > 23) {
|
|
|
|
|
+ throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "提货时间配置的" + fieldName + "小时部分必须在0-23之间");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (minute < 0 || minute > 59) {
|
|
|
|
|
+ throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "提货时间配置的" + fieldName + "分钟部分必须在0-59之间");
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
|
|
+ throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "提货时间配置的" + fieldName + "格式不正确,请使用HH:mm格式");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 将HH:mm格式的时间转换为分钟数
|
|
|
|
|
+ */
|
|
|
|
|
+ private int convertTimeToMinutes(String time) {
|
|
|
|
|
+ String[] parts = time.split(":");
|
|
|
|
|
+ return Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[1]);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public void save(List<OrderPickTimeConfig> configList) {
|
|
|
|
|
+ // 1. 检查configList不能为空,必须至少有一个对象
|
|
|
|
|
+ if (CollectionUtil.isEmpty(configList)) {
|
|
|
|
|
+ throw new RemoteServiceException("提货时间配置列表不能为空");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 按照startTime进行倒序排序
|
|
|
|
|
+ configList.sort((o1, o2) -> {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 转换为分钟数进行比较,取反实现倒序
|
|
|
|
|
+ return Integer.compare(convertTimeToMinutes(o2.getStartTime()), convertTimeToMinutes(o1.getStartTime()));
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ throw new RemoteServiceException(e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 检查时间范围是否有重叠和格式验证
|
|
|
|
|
+ String lastEndTime = null;
|
|
|
|
|
+ for (int i = 0; i < configList.size(); i++) {
|
|
|
|
|
+ OrderPickTimeConfig config = configList.get(i);
|
|
|
|
|
+
|
|
|
|
|
+ // 验证时间格式
|
|
|
|
|
+ validateTimeFormat(config.getStartTime(), "开始时间", config);
|
|
|
|
|
+ validateTimeFormat(config.getEndTime(), "结束时间", config);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 验证开始时间必须小于结束时间
|
|
|
|
|
+ int startTimeMinutes = convertTimeToMinutes(config.getStartTime());
|
|
|
|
|
+ int endTimeMinutes = convertTimeToMinutes(config.getEndTime());
|
|
|
|
|
+
|
|
|
|
|
+ if (startTimeMinutes >= endTimeMinutes) {
|
|
|
|
|
+ throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "提货时间配置的开始时间必须小于结束时间");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 验证当前配置的开始时间必须大于等于上一个配置的结束时间+1分钟
|
|
|
|
|
+ if (i > 0 && lastEndTime != null) {
|
|
|
|
|
+ // 确保当前配置的开始时间至少比上一个配置的结束时间晚1分钟
|
|
|
|
|
+ int lastEndMinutes = convertTimeToMinutes(lastEndTime);
|
|
|
|
|
+ if (startTimeMinutes <= lastEndMinutes) {
|
|
|
|
|
+ throw new RemoteServiceException(config.getStartTime() + " 至 " + config.getEndTime() + "的提货时间配置的开始时间必须在上一个配置结束时间之后至少1分钟");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 保存当前配置的结束时间,用于下一个配置的比较
|
|
|
|
|
+ lastEndTime = config.getEndTime();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 获取当前登录用户信息
|
|
|
|
|
+ AdminUserCom adminUser = commonLogic.getAdminUser();
|
|
|
|
|
+
|
|
|
|
|
+ if (StringUtils.isBlank(adminUser.getCompanyWechatId())) {
|
|
|
|
|
+ throw new RemoteServiceException("管理员账号不可操作");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 保存配置(先删除旧配置,再保存新配置)
|
|
|
|
|
+ // 假设同一个storageId下的配置是唯一的,先删除旧的配置
|
|
|
|
|
+ OrderPickTimeConfig firstConfig = configList.get(0);
|
|
|
|
|
+ String storageId = firstConfig.getStorageId();
|
|
|
|
|
+
|
|
|
|
|
+ orderPickTimeConfigService.lambdaUpdate()
|
|
|
|
|
+ .eq(OrderPickTimeConfig::getCompanyWechatId, adminUser.getCompanyWechatId())
|
|
|
|
|
+ .eq(OrderPickTimeConfig::getStorageId, storageId)
|
|
|
|
|
+ .remove();
|
|
|
|
|
+
|
|
|
|
|
+ // 6. 保存新的配置
|
|
|
|
|
+ for (OrderPickTimeConfig config : configList) {
|
|
|
|
|
+ // 设置企业微信信息
|
|
|
|
|
+ if (StringUtils.isNotBlank(adminUser.getCompanyWechatId())) {
|
|
|
|
|
+ config.setCompanyWechatId(adminUser.getCompanyWechatId());
|
|
|
|
|
+ config.setCompanyWechatName(adminUser.getCompanyName());
|
|
|
|
|
+ }
|
|
|
|
|
+ // 保存配置
|
|
|
|
|
+ orderPickTimeConfigService.save(config);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|