add 添加自增主键,批量新增数据,接口定义

master
yinq 2 months ago
parent 62af5a8f17
commit f1d181592f

@ -1 +0,0 @@
custom: http://doc.ruoyi.vip/tagApi-vue/other/donate.html

@ -0,0 +1,123 @@
package hw.tagApi.common.utils.uuid;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Enumeration;
/**
* ID
* 仿MyBatis-Plus
*
* @author Yinq
* @date 2025-04-15
*/
public class IdGenerator {
/**
* 2025-01-01 00:00:00
*/
private static final long START_TIMESTAMP = LocalDateTime.of(2025, 1, 1, 0, 0, 0)
.toInstant(ZoneOffset.of("+8")).toEpochMilli();
/**
* ID
*/
private static final long WORKER_ID_BITS = 10L;
/**
*
*/
private static final long SEQUENCE_BITS = 12L;
/**
* ID
*/
private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);
/**
*
*/
private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS);
/**
* ID
*/
private static final long WORKER_ID_SHIFT = SEQUENCE_BITS;
/**
*
*/
private static final long TIMESTAMP_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;
/**
*
*/
private static long sequence = 0L;
/**
* ID
*/
private static long lastTimestamp = -1L;
/**
* ID
*/
private static long workerId;
static {
try {
workerId = getWorkerId();
} catch (Exception e) {
workerId = 1L;
}
}
/**
* ID
*/
private static long getWorkerId() throws SocketException {
long macPiece;
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
byte[] mac = networkInterface.getHardwareAddress();
if (mac != null) {
macPiece = ((0x000000FFL & (mac[mac.length - 1])) | (0x0000FF00L & (((mac[mac.length - 2]) << 8)))) >> 6;
return macPiece;
}
}
return 1L;
}
/**
* ID
*/
public static synchronized Long nextId() {
long timestamp = System.currentTimeMillis();
if (timestamp < lastTimestamp) {
throw new RuntimeException("时钟回拨拒绝生成ID");
}
if (timestamp == lastTimestamp) {
sequence = (sequence + 1) & SEQUENCE_MASK;
if (sequence == 0) {
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = timestamp;
return ((timestamp - START_TIMESTAMP) << TIMESTAMP_SHIFT) | (workerId << WORKER_ID_SHIFT) | sequence;
}
/**
*
*/
private static long tilNextMillis(long lastTimestamp) {
long timestamp = System.currentTimeMillis();
while (timestamp <= lastTimestamp) {
timestamp = System.currentTimeMillis();
}
return timestamp;
}
}

@ -114,6 +114,7 @@ public class SecurityConfig
requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers(HttpMethod.POST, "/docs/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();

@ -0,0 +1,70 @@
package hw.tagApi.service.constant;
/**
* API
*
* @author Yinq
* @date 2025-04-15
*/
public class ApiConstants {
/**
*
*/
public static final String DATA_STATUS = "00";
/**
*
*/
public static final String DATA_IMPORT = "10";
/**
*
*/
public static final String DATA_QUERY = "20";
/**
*
*/
public static final String DATA_EXPORT = "30";
/**
*
*/
public static final String IMPORTING = "导入中";
/**
*
*/
public static final String SYSTEM_ERROR = "系统错误";
/**
*
*/
public static final String SEARCHING = "搜索中";
/**
*
*/
public static final String SEARCH_TIMEOUT = "搜索超时";
/**
*
*/
public static final String EXPORTING = "导出中";
public static final String SUCCESS = "SUCCESS";
public static final String FAILED = "FAILED";
public static class ImportStatus {
public static final String IMPORT_SUCCESS = "IMPORT_SUCCESS";
public static final String IMPORT_FAILED = "IMPORT_FAILED";
}
public static class ExportStatus {
public static final String EXPORT_SUCCESS = "EXPORT_SUCCESS";
public static final String EXPORT_FAILED = "EXPORT_FAILED";
}
public static class SearchStatus {
public static final String SEARCH_SUCCESS = "SEARCH_SUCCESS";
public static final String NO_RECORD = "NO_RECORD";
}
}

@ -1,14 +1,23 @@
package hw.tagApi.service.controller;
import hw.tagApi.common.core.controller.BaseController;
import hw.tagApi.service.service.IHwTagRecordService;
import hw.tagApi.common.core.domain.AjaxResult;
import hw.tagApi.service.constant.ApiConstants;
import hw.tagApi.service.domain.ApiContent;
import hw.tagApi.service.domain.ApiRequest;
import hw.tagApi.service.service.IKDocsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Controller
* Controller
*
* @author Yinq
* @date 2025-04-15
@ -16,9 +25,112 @@ import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/docs")
public class KDocsApiController extends BaseController {
private static final Logger log = LoggerFactory.getLogger(KDocsApiController.class);
@Autowired
private IHwTagRecordService hwTagRecordService;
private IKDocsService ikDocsService;
/**
*
*
* @param request CASECONTENT
* @return
*/
@PostMapping("/api")
public AjaxResult handleRequest(@RequestHeader("API-Key") String apiKey, @RequestBody ApiRequest request) {
// 验证API-Key
if (!validateApiKey(apiKey)) {
log.warn("无效的API-Key: {}", apiKey);
return AjaxResult.error("无效的API-Key");
}
try {
String caseCode = request.getCASE();
List<ApiContent> content = request.getCONTENT();
// 打印接收到的请求参数
log.info("接收到请求 - CASE: {}, CONTENT: {}", caseCode, content);
switch (caseCode) {
case ApiConstants.DATA_STATUS:
log.info("查询数据库状态");
return AjaxResult.success("数据库状态正常");
case ApiConstants.DATA_IMPORT:
// 数据导入
if (content == null || content.isEmpty()) {
log.warn("导入数据为空");
return AjaxResult.error(ApiConstants.ImportStatus.IMPORT_FAILED, "导入数据不能为空");
}
log.info("开始导入数据: {}", content);
// TODO: 调用导入服务
return AjaxResult.success(ApiConstants.ImportStatus.IMPORT_SUCCESS);
case ApiConstants.DATA_QUERY:
// 数据查询
if (content == null || content.isEmpty()) {
log.warn("查询条件为空");
return AjaxResult.error(ApiConstants.SearchStatus.NO_RECORD, "查询条件不能为空");
}
log.info("开始查询数据: {}", content);
// TODO: 调用查询服务
return AjaxResult.success(ApiConstants.SearchStatus.SEARCH_SUCCESS);
case ApiConstants.DATA_EXPORT:
// 数据导出
log.info("开始导出数据");
Map<String, Object> response = new HashMap<>();
response.put("CASE", ApiConstants.DATA_EXPORT);
List<Map<String, Object>> result = new ArrayList<>();
Map<String, Object> item1 = new HashMap<>();
Map<String, String> fields1 = new HashMap<>();
fields1.put("导出状态", "导出中");
fields1.put("情况说明", "预计需要3分钟");
item1.put("fields", fields1);
item1.put("id", "ci");
result.add(item1);
Map<String, Object> item2 = new HashMap<>();
Map<String, String> fields2 = new HashMap<>();
fields2.put("导出状态", "导出失败");
fields2.put("情况说明", "");
item2.put("fields", fields2);
item2.put("id", "56");
result.add(item2);
Map<String, Object> item3 = new HashMap<>();
Map<String, String> fields3 = new HashMap<>();
fields3.put("导出状态", "导出中");
fields3.put("情况说明", "预计需要10分钟");
item3.put("fields", fields3);
item3.put("id", "9a");
result.add(item3);
response.put("RESULT", result);
log.info("导出数据完成: {}", response);
return AjaxResult.success(response);
default:
log.warn("未知的功能代码: {}", caseCode);
return AjaxResult.error("未知的功能代码");
}
} catch (Exception e) {
log.error("处理请求时发生错误", e);
return AjaxResult.error("系统错误:" + e.getMessage());
}
}
/**
* API-Key
*
* @param apiKey API
* @return
*/
private boolean validateApiKey(String apiKey) {
// TODO: 实现API-Key的验证逻辑
return true;
}
}

@ -0,0 +1,45 @@
package hw.tagApi.service.domain;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Map;
/**
* API
*
* @author Yinq
* @date 2025-04-15
*/
public class ApiContent {
/** 字段集合 */
@JsonProperty("fields")
private Map<String, String> fields;
/** 记录ID */
@JsonProperty("id")
private String id;
public Map<String, String> getFields() {
return fields;
}
public void setFields(Map<String, String> fields) {
this.fields = fields;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "ApiContent{" +
"fields=" + fields +
", id='" + id + '\'' +
'}';
}
}

@ -0,0 +1,45 @@
package hw.tagApi.service.domain;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
/**
* API
*
* @author Yinq
* @date 2025-04-15
*/
public class ApiRequest {
/** 功能代码 */
@JsonProperty("CASE")
private String CASE;
/** 请求内容 */
@JsonProperty("CONTENT")
private List<ApiContent> CONTENT;
public String getCASE() {
return CASE;
}
public void setCASE(String CASE) {
this.CASE = CASE;
}
public List<ApiContent> getCONTENT() {
return CONTENT;
}
public void setCONTENT(List<ApiContent> CONTENT) {
this.CONTENT = CONTENT;
}
@Override
public String toString() {
return "ApiRequest{" +
"CASE='" + CASE + '\'' +
", CONTENT=" + CONTENT +
'}';
}
}

@ -35,6 +35,14 @@ public interface HwTagRecordMapper
*/
public int insertHwTagRecord(HwTagRecord hwTagRecord);
/**
*
*
* @param hwTagRecordList
* @return
*/
public int batchInsertHwTagRecord(List<HwTagRecord> hwTagRecordList);
/**
*
*

@ -0,0 +1,49 @@
package hw.tagApi.service.service;
/**
*
*
* @author Yinq
* @date 2025-04-15
*/
public interface IKDocsService {
/**
*
*
* @return
*/
String getSystemStatus();
/**
*
*
* @param data
* @return
*/
String importData(String data);
/**
*
*
* @param id ID
* @return
*/
String deleteData(String id);
/**
*
*
* @param query
* @return
*/
String queryData(String query);
/**
*
*
* @param query
* @return
*/
String exportData(String query);
}

@ -1,7 +1,9 @@
package hw.tagApi.service.service.impl;
import java.util.ArrayList;
import java.util.List;
import hw.tagApi.common.utils.DateUtils;
import hw.tagApi.common.utils.uuid.IdGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import hw.tagApi.service.mapper.HwTagRecordMapper;
@ -66,7 +68,7 @@ public class HwTagRecordServiceImpl implements IHwTagRecordService
@Override
public int updateHwTagRecord(HwTagRecord hwTagRecord)
{
hwTagRecord.setUpdateTime(DateUtils.getNowDate());
initTagRecord(hwTagRecord);
return hwTagRecordMapper.updateHwTagRecord(hwTagRecord);
}
@ -93,4 +95,13 @@ public class HwTagRecordServiceImpl implements IHwTagRecordService
{
return hwTagRecordMapper.deleteHwTagRecordByRId(rId);
}
/**
* hwTagRecord
* @param hwTagRecord hwTagRecord
*/
public void initTagRecord(HwTagRecord hwTagRecord){
hwTagRecord.setrId(IdGenerator.nextId());
hwTagRecord.setCreateTime(DateUtils.getNowDate());
}
}

@ -0,0 +1,81 @@
package hw.tagApi.service.service.impl;
import hw.tagApi.service.service.IKDocsService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import hw.tagApi.service.constant.ApiConstants;
import hw.tagApi.service.mapper.HwTagRecordMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
*
* @author Yinq
* @date 2025-04-15
*/
@Service
public class KDocsServiceImpl implements IKDocsService
{
private static final Logger log = LoggerFactory.getLogger(KDocsServiceImpl.class);
private HwTagRecordMapper hwTagRecordMapper;
@Override
public String getSystemStatus() {
Map<String, Object> response = new HashMap<>();
response.put("CASE", ApiConstants.DATA_IMPORT);
List<Map<String, Object>> result = new ArrayList<>();
Map<String, Object> statusItem = new HashMap<>();
Map<String, String> statusFields = new HashMap<>();
statusFields.put("导入状态", ApiConstants.IMPORTING);
statusItem.put("fields", statusFields);
statusItem.put("id", "16");
result.add(statusItem);
Map<String, Object> errorItem = new HashMap<>();
Map<String, String> errorFields = new HashMap<>();
errorFields.put("导入模式", ApiConstants.SYSTEM_ERROR);
errorFields.put("情况说明", "");
errorItem.put("fields", errorFields);
errorItem.put("id", "s5");
result.add(errorItem);
response.put("RESULT", result);
return null;
}
@Override
public String importData(String data) {
// TODO: 实现数据导入逻辑
return getSystemStatus();
}
@Override
public String deleteData(String id) {
// TODO: 实现数据删除逻辑
return getSystemStatus();
}
@Override
public String queryData(String query) {
// TODO: 实现数据查询逻辑
return getSystemStatus();
}
@Override
public String exportData(String query) {
// TODO: 实现数据导出逻辑
return getSystemStatus();
}
}

@ -144,4 +144,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{rId}
</foreach>
</delete>
<!-- 批量新增标签记录 -->
<insert id="batchInsertHwTagRecord" parameterType="java.util.List">
insert into hw_tag_record (
r_id, t_id, epc, password, order_code, batch_number,
tag_sequence, total_quantity, tag_batch, model_code,
processing_time, operator_id, fields_1, fields_2, fields_3,
create_by, create_time, update_by, update_time, remark
) values
<foreach collection="list" item="item" separator=",">
(
#{item.rId}, #{item.tId}, #{item.epc}, #{item.password}, #{item.orderCode}, #{item.batchNumber},
#{item.tagSequence}, #{item.totalQuantity}, #{item.tagBatch}, #{item.modelCode},
#{item.processingTime}, #{item.operatorId}, #{item.fields1}, #{item.fields2}, #{item.fields3},
#{item.createBy}, sysdate(), #{item.updateBy}, sysdate(), #{item.remark}
)
</foreach>
</insert>
</mapper>
Loading…
Cancel
Save