diff --git a/cpte-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java b/cpte-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java index ac22025..ccd4743 100644 --- a/cpte-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java +++ b/cpte-boot-base-core/src/main/java/org/jeecg/config/mybatis/MybatisPlusSaasConfig.java @@ -5,16 +5,18 @@ import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.parser.JsqlParserGlobal; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; -import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.*; import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.log.Log; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; import org.jeecg.common.config.TenantContext; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.TenantConstant; @@ -27,34 +29,37 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; +import java.lang.reflect.Field; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * 单数据源配置(jeecg.datasource.open = false时生效) - * @Author zhoujf * + * @Author zhoujf */ @Slf4j @Configuration -@MapperScan(value={"org.jeecg.modules.**.mapper*", "org.jeecg.**.mapper*","org.cpte.modules.**.mapper*", "org.cpte.**.mapper*"}) +@MapperScan(value = {"org.jeecg.modules.**.mapper*", "org.jeecg.**.mapper*", "org.cpte.modules.**.mapper*", "org.cpte.**.mapper*"}) public class MybatisPlusSaasConfig { @Autowired private DataSource dataSource; - + /** * 是否开启系统模块的租户隔离 - * 控制范围:用户、角色、部门、我的部门、字典、分类字典、多数据源、职务、通知公告 - * - * 实现功能 - * 1.用户表通过硬编码实现租户ID隔离 - * 2.角色、部门、我的部门、字典、分类字典、多数据源、职务、通知公告除了硬编码还加入的 TENANT_TABLE 配置中,实现租户隔离更安全 - * 3.菜单表、租户表不做租户隔离 - * 4.通过拦截器MybatisInterceptor实现,增删改查数据 自动注入租户ID + * 控制范围:用户、角色、部门、我的部门、字典、分类字典、多数据源、职务、通知公告 + *

+ * 实现功能 + * 1.用户表通过硬编码实现租户ID隔离 + * 2.角色、部门、我的部门、字典、分类字典、多数据源、职务、通知公告除了硬编码还加入的 TENANT_TABLE 配置中,实现租户隔离更安全 + * 3.菜单表、租户表不做租户隔离 + * 4.通过拦截器MybatisInterceptor实现,增删改查数据 自动注入租户ID */ public static final Boolean OPEN_SYSTEM_TENANT_CONTROL = false; - + /** * 哪些表需要做多租户 表需要添加一个字段 tenant_id */ @@ -82,6 +87,22 @@ public class MybatisPlusSaasConfig { TENANT_TABLE.add("airag_knowledge"); TENANT_TABLE.add("airag_knowledge_doc"); TENANT_TABLE.add("airag_model"); + + TENANT_TABLE.add("base_area"); + TENANT_TABLE.add("base_item"); + TENANT_TABLE.add("base_point"); + TENANT_TABLE.add("base_stock"); + + TENANT_TABLE.add("data_asn"); + TENANT_TABLE.add("data_asn_detail"); + TENANT_TABLE.add("data_receive_record"); + TENANT_TABLE.add("data_pick"); + TENANT_TABLE.add("data_pick_detail"); + TENANT_TABLE.add("data_task"); + TENANT_TABLE.add("data_agv_task"); + TENANT_TABLE.add("data_inventory"); + TENANT_TABLE.add("data_inventory_log"); + } //2.示例测试 @@ -94,35 +115,36 @@ public class MybatisPlusSaasConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() { @Override public Expression getTenantId() { String tenantId = TenantContext.getTenant(); //如果通过线程获取租户ID为空,则通过当前请求的request获取租户(shiro排除拦截器的请求会获取不到租户ID) - if(oConvertUtils.isEmpty(tenantId)){ + if (oConvertUtils.isEmpty(tenantId)) { try { tenantId = TokenUtils.getTenantIdByRequest(SpringContextUtils.getHttpServletRequest()); } catch (Exception e) { //e.printStackTrace(); } } - if(oConvertUtils.isEmpty(tenantId)){ + if (oConvertUtils.isEmpty(tenantId)) { tenantId = "0"; } return new LongValue(tenantId); } @Override - public String getTenantIdColumn(){ + public String getTenantIdColumn() { return TenantConstant.TENANT_ID_TABLE; } // 返回 true 表示不走租户逻辑 @Override public boolean ignoreTable(String tableName) { - for(String temp: TENANT_TABLE){ - if(temp.equalsIgnoreCase(tableName)){ + for (String temp : TENANT_TABLE) { + if (temp.equalsIgnoreCase(tableName)) { return false; } } @@ -132,38 +154,38 @@ public class MybatisPlusSaasConfig { //update-begin-author:zyf date:20220425 for:【VUEN-606】注入动态表名适配拦截器解决多表名问题 interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor()); //update-end-author:zyf date:20220425 for:【VUEN-606】注入动态表名适配拦截器解决多表名问题 - + //update-begin---author:scott ---date:2025-08-02 for:【issues/8666】升级mybatisPlus后SqlServer分页使用OFFSET ? ROWS FETCH NEXT ? ROWS ONLY,导致online报表报错--- DbType dbType = null; try { - dbType = JdbcUtils.getDbType(dataSource.getConnection().getMetaData().getURL()); - log.info("当前数据库类型: {}", dbType); + dbType = JdbcUtils.getDbType(dataSource.getConnection().getMetaData().getURL()); + log.info("当前数据库类型: {}", dbType); } catch (SQLException e) { Log.error(e.getMessage(), e); } - if (dbType!=null && (dbType == DbType.SQL_SERVER || dbType == DbType.SQL_SERVER2005)) { + if (dbType != null && (dbType == DbType.SQL_SERVER || dbType == DbType.SQL_SERVER2005)) { // 如果是SQL Server则覆盖为2005分页方式 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQL_SERVER2005)); } else { interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); } //update-end---author:scott ---date::2025-08-02 for:【issues/8666】升级mybatisPlus后SqlServer分页使用OFFSET ? ROWS FETCH NEXT ? ROWS ONLY,导致online报表报错--- - + //【jeecg-boot/issues/3847】增加@Version乐观锁支持 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + + interceptor.addInnerInterceptor(fixForUpdateOrderInterceptor()); return interceptor; } /** * 动态表名切换拦截器,用于适配vue2和vue3同一个表有多个的情况,如sys_role_index在vue3情况下表名为sys_role_index_v3 + * * @return */ private DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() { DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor(); dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> { - /* if (sql.contains("FOR UPDATE")) { - return tableName; - }*/ //获取需要动态解析的表名 String dynamicTableName = ThreadLocalDataHelper.get(CommonConstant.DYNAMIC_TABLE_NAME); //当dynamicTableName不为空时才走动态表名处理逻辑,否则返回原始表名 @@ -180,6 +202,66 @@ public class MybatisPlusSaasConfig { return dynamicTableNameInnerInterceptor; } + private InnerInterceptor fixForUpdateOrderInterceptor() { + return new InnerInterceptor() { + @Override + public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, + ResultHandler resultHandler, BoundSql boundSql) throws SQLException { + String originalSql = boundSql.getSql(); + String upperSql = originalSql.toUpperCase(); + if (upperSql.contains("FOR UPDATE") && upperSql.contains("ORDER BY")) { + // 检查FOR UPDATE是否在ORDER BY之后 + String fixedSql = moveForUpdateToEnd(upperSql); + try { + Field sqlField = BoundSql.class.getDeclaredField("sql"); + sqlField.setAccessible(true); + sqlField.set(boundSql, fixedSql); + } catch (Exception e) { + log.warn("Failed to fix FOR UPDATE order in SQL: {}", e.getMessage()); + } + } + } + + public static String moveForUpdateToEnd(String originalSql) { + if (originalSql == null || originalSql.trim().isEmpty()) { + return originalSql; + } + + // 1. 将 SQL 转换为大写,以简化匹配过程,但保留原始大小写用于最终输出(通过捕获组实现)。 + // 同时在处理前和处理后去除多余的首尾空格。 + String sql = originalSql.trim(); + + // 2. 正则表达式模式解释: + // - (.*?):捕获语句开头到 FOR UPDATE 之前的任何内容 (第1组:SELECT/FROM/WHERE 部分)。 + // - (\sFOR\sUPDATE\s*):捕获 'FOR UPDATE' (第2组:FOR UPDATE)。 + // - (\sORDER\sBY\s.*):捕获 'ORDER BY' 及其之后的所有内容 (第3组:ORDER BY 部分)。 + // - $:确保匹配到字符串末尾。 + // - 关键字之间使用 \s 匹配空白字符,防止误匹配。 + // - 使用 (?i) 开启不区分大小写匹配。 + // + // 完整的原始结构: (SELECT/FROM/WHERE...) (FOR UPDATE) (ORDER BY...) + // 期望的替换结构: (SELECT/FROM/WHERE...) (ORDER BY...) (FOR UPDATE) + + // 模式: 捕获 (SELECT/FROM/WHERE) + (FOR UPDATE) + (ORDER BY ...) + String regex = "(?is)(.*?)(\\sFOR\\sUPDATE\\s*)(\\sORDER\\sBY.*)"; + + // 替换表达式: $1 是 SELECT/FROM/WHERE 部分, $3 是 ORDER BY 部分, $2 是 FOR UPDATE 部分 + String replacement = "$1$3$2"; + + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(sql); + + if (matcher.find()) { + // 如果找到匹配,则进行替换 + return matcher.replaceAll(replacement); + } else { + // 如果没有匹配到包含 FOR UPDATE 和 ORDER BY 的特定顺序,则返回原始语句 + return originalSql; + } + } + }; + } + // /** // * 下个版本会删除,现在为了避免缓存出现问题不得不配置 // * @return diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AsnStatusEnum.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AsnStatusEnum.java index d504a0a..8e41c76 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AsnStatusEnum.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AsnStatusEnum.java @@ -16,7 +16,9 @@ public enum AsnStatusEnum { RECEIVED(3, "收货完成"), - CANCELED(4, "已取消"), + CLOSED(4, "已关闭"), + + CANCELED(5, "已取消"), ; diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/controller/ConveyorLineController.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/controller/ConveyorLineController.java index c0fd00e..e5091bf 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/controller/ConveyorLineController.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/controller/ConveyorLineController.java @@ -32,10 +32,18 @@ public class ConveyorLineController { @AutoLog(value = "输送线扫描") @Operation(summary = "输送线-扫描托盘") @PostMapping(value = "/scanTray") - @IgnoreAuth public Result scanTray(@RequestBody @Valid ScanTrayRequest scanTrayRequest) { iConveyorLineService.scanTray(scanTrayRequest); return Result.OK("扫描成功"); } + @AutoLog(value = "输送线大屏") + @Operation(summary = "输送线-大屏显示") + @PostMapping(value = "/") + public Result showConveyorLineBigScreen() { + iConveyorLineService.showConveyorLineBigScreen(); + + return Result.OK(); + } + } diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/service/IConveyorLineService.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/service/IConveyorLineService.java index 67c9af0..c742f95 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/service/IConveyorLineService.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/service/IConveyorLineService.java @@ -10,4 +10,6 @@ public interface IConveyorLineService { * @param scanTrayRequest 扫描托盘请求参数 */ void scanTray(ScanTrayRequest scanTrayRequest); + + void showConveyorLineBigScreen(); } diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/vo/ConveyorLineBigScreenVo.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/vo/ConveyorLineBigScreenVo.java new file mode 100644 index 0000000..9e8efcb --- /dev/null +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/conveyorLine/vo/ConveyorLineBigScreenVo.java @@ -0,0 +1,5 @@ +package org.cpte.modules.conveyorLine.vo; + +public class ConveyorLineBigScreenVo { + private String stockCode; +} diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/inventory/mapper/xml/InventoryMapper.xml b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/inventory/mapper/xml/InventoryMapper.xml index 6358ea0..de1429a 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/inventory/mapper/xml/InventoryMapper.xml +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/inventory/mapper/xml/InventoryMapper.xml @@ -27,6 +27,7 @@ #{whCode} + ORDER BY create_time FOR UPDATE \ No newline at end of file diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/receive/entity/Asn.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/receive/entity/Asn.java index 6d86358..ab0797c 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/receive/entity/Asn.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/receive/entity/Asn.java @@ -85,7 +85,7 @@ public class Asn implements Serializable { private java.lang.Integer orderType; /** * 订单状态 - * 1.已创建;2.部分收货;3.收货完成;4.已取消 + * 1.已创建;2.部分收货;3.收货完成;4.已关闭、5.已取消 */ @Excel(name = "订单状态", width = 15) @Schema(description = "订单状态") diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/receive/service/impl/AsnServiceImpl.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/receive/service/impl/AsnServiceImpl.java index 61c666a..b8d3a2e 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/receive/service/impl/AsnServiceImpl.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/receive/service/impl/AsnServiceImpl.java @@ -279,16 +279,18 @@ public class AsnServiceImpl extends ServiceImpl implements IAsnS @Override public void receiveCallback(Asn asn, AsnDetail asnDetail, Stock stock) { - String url = openApiMapper.getRequestUrl(GeneralConstant.INBOUND_CALLBACK); - String json = receiveCallbackJson(asn, asnDetail, stock); - log.info("入库回传请求报文:{}", json); // 检查接口开关, 未开启则返回 if (sysDictMapper.queryByDictCode(GeneralConstant.OPEN_FLAG) == null) { updateAsnDetailResponse(asn, "接口未开启"); return; } + if(AsnStatusEnum.){ + } + String json = receiveCallbackJson(asn, asnDetail, stock); + String url = openApiMapper.getRequestUrl(GeneralConstant.INBOUND_CALLBACK); + log.info("入库回传请求报文:{}", json); Boolean Success = null; String Message = null; try { diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/saiWms/service/ISaiWmsService.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/saiWms/service/ISaiWmsService.java index 6f97bdf..af44f6a 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/saiWms/service/ISaiWmsService.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/saiWms/service/ISaiWmsService.java @@ -1,8 +1,5 @@ package org.cpte.modules.saiWms.service; -import org.cpte.modules.base.entity.Stock; -import org.cpte.modules.receive.entity.Asn; -import org.cpte.modules.receive.entity.AsnDetail; import org.cpte.modules.saiWms.request.InboundRequest; import org.cpte.modules.saiWms.request.OutboundRequest; diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/controller/PickController.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/controller/PickController.java index de5a23a..faafbd0 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/controller/PickController.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/controller/PickController.java @@ -58,17 +58,11 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; @RequestMapping("/shipping/pick") @Slf4j public class PickController { - @Autowired - private PickMapper pickMapper; - @Autowired - private TaskMapper taskMapper; @Autowired private IPickService pickService; @Autowired private IPickDetailService pickDetailService; @Autowired - private ITaskService taskService; - @Autowired private PickSerialNumberRule pickSerialNumberRule; /** @@ -277,19 +271,4 @@ public class PickController { } return Result.OK("文件导入失败!"); } - - /** - * 出库分配 - */ - @AutoLog(value = "出库分配") - @Operation(summary = "出库分配") - @PostMapping(value = "/allocatedPick") - @IgnoreAuth - public Result allocatedPick() { - List pickList = pickMapper.queryUnallocatedPick(); - pickService.allocatePick2(pickList); - taskService.generateAgvTask(); - return Result.OK("操作成功!"); - } - } diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/mapper/TaskMapper.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/mapper/TaskMapper.java index 12b4014..398fce5 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/mapper/TaskMapper.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/mapper/TaskMapper.java @@ -21,6 +21,6 @@ public interface TaskMapper extends BaseMapper { * * @return List */ - @Select("SELECT t.* FROM data_task t WHERE t.agv_task_id IS NULL ORDER BY t.create_time ASC FOR UPDATE ") + @Select("SELECT * FROM data_task WHERE agv_task_id is null order by create_time for update ") List queryUnallocatedTask(); } diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/mapper/xml/TaskMapper.xml b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/mapper/xml/TaskMapper.xml index 386f213..d97e630 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/mapper/xml/TaskMapper.xml +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/mapper/xml/TaskMapper.xml @@ -1,4 +1,5 @@ + \ No newline at end of file diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/IPickService.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/IPickService.java index e638970..896581c 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/IPickService.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/IPickService.java @@ -3,6 +3,7 @@ package org.cpte.modules.shipping.service; import org.cpte.modules.shipping.entity.PickDetail; import org.cpte.modules.shipping.entity.Pick; import com.baomidou.mybatisplus.extension.service.IService; +import org.cpte.modules.shipping.entity.Task; import java.io.Serializable; import java.util.Collection; @@ -60,4 +61,12 @@ public interface IPickService extends IService { */ List allocatePick2(List pickIds); + /** + * 出库任务回传 + * + * @param task 任务 + */ + void pickTaskCallback(Task task); + + } diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/PickServiceImpl.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/PickServiceImpl.java index 2ce049e..2354dd6 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/PickServiceImpl.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/PickServiceImpl.java @@ -542,4 +542,9 @@ public class PickServiceImpl extends ServiceImpl implements IP return new ArrayList<>(errorMsgSet); } + @Override + public void pickTaskCallback(Task task) { + Pick pick = pickMapper.selectById(task.getPickId()); + } + } diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/TaskServiceImpl.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/TaskServiceImpl.java index 211261a..70009fb 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/TaskServiceImpl.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/TaskServiceImpl.java @@ -117,6 +117,7 @@ public class TaskServiceImpl extends ServiceImpl implements IT @Override @Transactional(rollbackFor = Exception.class) public void generateAgvTask() { + List taskList = taskMapper.queryUnallocatedTask(); if (CollectionUtils.isEmpty(taskList)) { return; diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/utils/CodeGeneratorUtil.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/utils/CodeGeneratorUtil.java index 3a90fc5..d18baf1 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/utils/CodeGeneratorUtil.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/utils/CodeGeneratorUtil.java @@ -32,9 +32,9 @@ public class CodeGeneratorUtil { try { String dateStr = LocalDate.now().format(DATE_FORMATTER); - // 使用 SELECT FOR UPDATE 加锁查询并更新 + // 使用 SELECT for update 加锁查询并更新 String lockAndUpdateSql = - "SELECT current_seq FROM generator_sequence WHERE type = ? AND date_str = ? FOR UPDATE"; + "SELECT current_seq FROM generator_sequence WHERE type = ? AND date_str = ? for update"; List result = jdbcTemplate.queryForList(lockAndUpdateSql, Integer.class, type, dateStr); diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/utils/test.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/utils/test.java new file mode 100644 index 0000000..57a1539 --- /dev/null +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/utils/test.java @@ -0,0 +1,52 @@ +package org.cpte.modules.utils; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.HashMap; +import java.util.Map; + +public class test { + public static void main(String[] args) { + Map saiMap = new HashMap<>(); + saiMap.put("ak", "ak-h98TNj1bO5258uuS"); + saiMap.put("sk", "E20j9w4vkTkLkv6tjALrzYqcybrvDaCx"); + + Map tesMap = new HashMap<>(); + tesMap.put("ak", "ak-EMCNIpxwfMXzJ8rj"); + tesMap.put("sk", "HtT14KlSwCfLfLyGe3FeJVPc3zmjZwXR"); + + + long timestamp = System.currentTimeMillis(); + System.out.println("sai-timestamp:" + timestamp); + System.out.println("sai-signature:" + md5(saiMap.get("ak")+ saiMap.get("sk") + timestamp)); + System.out.println("======================================================================================="); + System.out.println("tes-timestamp:" + timestamp); + System.out.println("tes-signature:" + md5(tesMap.get("ak")+ tesMap.get("sk") + timestamp)); + + } + + public static String md5(String sourceStr) { + String result = ""; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(sourceStr.getBytes(StandardCharsets.UTF_8)); + byte[] hash = md.digest(); + int i; + StringBuffer buf = new StringBuffer(32); + for (int offset = 0; offset < hash.length; offset++) { + i = hash[offset]; + if (i < 0) { + i += 256; + } + if (i < 16) { + buf.append("0"); + } + buf.append(Integer.toHexString(i)); + } + result = buf.toString(); + } catch (Exception e) { + System.out.println("sign签名错误" + e); + } + return result; + } +}