Compare commits
3 Commits
15af775af4
...
d95f527938
| Author | SHA1 | Date | |
|---|---|---|---|
| d95f527938 | |||
| 97df87eb06 | |||
|
|
b98a0f06ba |
@@ -4,6 +4,8 @@ import top.continew.starter.data.mp.base.BaseMapper;
|
||||
import top.wms.admin.material.model.entity.MaterialInfoDO;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 物料信息 Mapper
|
||||
*
|
||||
@@ -12,5 +14,6 @@ import org.springframework.stereotype.Repository;
|
||||
*/
|
||||
@Repository
|
||||
public interface MaterialInfoMapper extends BaseMapper<MaterialInfoDO> {
|
||||
|
||||
public int updateByName(List<MaterialInfoDO> list);
|
||||
public int updateByCode(List<MaterialInfoDO> list);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package top.wms.admin.material.model.req;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@Data
|
||||
@Schema(description = "物料信息导入行数据")
|
||||
public class MaterialImportRowReq implements Serializable {
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 物料名称
|
||||
*/
|
||||
@Schema(description = "物料名称")
|
||||
@NotBlank(message = "物料名称不能为空")
|
||||
@Length(max = 255, message = "物料名称长度不能超过 {max} 个字符")
|
||||
private String materialName;
|
||||
|
||||
/**
|
||||
* 物料编码
|
||||
*/
|
||||
@Schema(description = "物料编码")
|
||||
@NotBlank(message = "物料编码不能为空")
|
||||
@Length(max = 255, message = "物料编码长度不能超过 {max} 个字符")
|
||||
private String encoding;
|
||||
|
||||
/**
|
||||
* 物料单位重量(g)
|
||||
*/
|
||||
@Schema(description = "物料单位重量(g)")
|
||||
private BigDecimal unitWeight;
|
||||
|
||||
/*
|
||||
* 物料规格
|
||||
* */
|
||||
@Schema(description = "物料规格")
|
||||
private String materialSpec;
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package top.wms.admin.material.model.req;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import top.wms.admin.common.enums.DisEnableStatusEnum;
|
||||
import top.wms.admin.system.enums.ImportPolicyEnum;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@Schema(description = "物料导入参数")
|
||||
public class MaterialInfoImportReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 导入会话KEY
|
||||
*/
|
||||
@Schema(description = "导入会话KEY", example = "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed")
|
||||
@NotBlank(message = "导入已过期,请重新上传")
|
||||
private String importKey;
|
||||
|
||||
/**
|
||||
* 物料名称重复策略
|
||||
*/
|
||||
@Schema(description = "物料名称重复策略", example = "1")
|
||||
@NotNull(message = "物料名称重复策略不能为空")
|
||||
private ImportPolicyEnum duplicateName;
|
||||
|
||||
/**
|
||||
* 重复编码策略
|
||||
*/
|
||||
@Schema(description = "重复编码策略", example = "1")
|
||||
@NotNull(message = "重复编码策略不能为空")
|
||||
private ImportPolicyEnum duplicateCode;
|
||||
|
||||
/**
|
||||
* 默认状态
|
||||
*/
|
||||
@Schema(description = "默认状态", example = "1")
|
||||
private DisEnableStatusEnum defaultStatus;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package top.wms.admin.material.model.resp;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 物料导入解析结果
|
||||
*
|
||||
* @author kils
|
||||
* @since 2024/6/18 14:37
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Schema(description = "用户导入解析结果")
|
||||
public class MaterialImportParseResp implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 导入会话 Key
|
||||
*/
|
||||
@Schema(description = "导入会话Key", example = "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed")
|
||||
private String importKey;
|
||||
|
||||
/**
|
||||
* 总计行数
|
||||
*/
|
||||
@Schema(description = "总计行数", example = "100")
|
||||
private Integer totalRows;
|
||||
|
||||
/**
|
||||
* 有效行数
|
||||
*/
|
||||
@Schema(description = "有效行数", example = "100")
|
||||
private Integer validRows;
|
||||
|
||||
/**
|
||||
* 重复物料名行数
|
||||
*/
|
||||
@Schema(description = "重复物料名行数", example = "100")
|
||||
private Integer duplicateNameRows;
|
||||
|
||||
/**
|
||||
* 重复物料编码行数
|
||||
*/
|
||||
@Schema(description = "重复物料编码行数", example = "100")
|
||||
private Integer duplicateCodeRows;
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package top.wms.admin.material.model.resp;
|
||||
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@Schema(description = "物料信息导入结果")
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class MaterialInfoImportResp implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 总计行数
|
||||
*/
|
||||
@Schema(description = "总计行数", example = "100")
|
||||
private Integer totalRows;
|
||||
|
||||
/**
|
||||
* 新增行数
|
||||
*/
|
||||
@Schema(description = "新增行数", example = "100")
|
||||
private Integer insertRows;
|
||||
|
||||
/**
|
||||
* 修改行数
|
||||
*/
|
||||
@Schema(description = "修改行数", example = "100")
|
||||
private Integer updateRows;
|
||||
}
|
||||
@@ -49,7 +49,7 @@ public class MaterialInfoResp extends BaseDetailResp {
|
||||
*/
|
||||
@Schema(description = "物料规格")
|
||||
@ExcelProperty(value = "物料规格")
|
||||
private Double materialSpec;
|
||||
private String materialSpec;
|
||||
|
||||
/**
|
||||
* 物料照片地址
|
||||
|
||||
@@ -1,10 +1,20 @@
|
||||
package top.wms.admin.material.service;
|
||||
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import top.continew.starter.extension.crud.service.BaseService;
|
||||
import top.wms.admin.material.model.entity.MaterialInfoDO;
|
||||
import top.wms.admin.material.model.query.MaterialInfoQuery;
|
||||
import top.wms.admin.material.model.req.MaterialInfoImportReq;
|
||||
import top.wms.admin.material.model.req.MaterialInfoReq;
|
||||
import top.wms.admin.material.model.resp.MaterialImportParseResp;
|
||||
import top.wms.admin.material.model.resp.MaterialInfoImportResp;
|
||||
import top.wms.admin.material.model.resp.MaterialInfoResp;
|
||||
import top.wms.admin.system.model.req.user.UserImportReq;
|
||||
import top.wms.admin.system.model.resp.user.UserImportParseResp;
|
||||
import top.wms.admin.system.model.resp.user.UserImportResp;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* 物料信息业务接口
|
||||
@@ -13,5 +23,34 @@ import top.wms.admin.material.model.resp.MaterialInfoResp;
|
||||
* @since 2026/02/27 14:19
|
||||
*/
|
||||
public interface MaterialInfoService extends BaseService<MaterialInfoResp, MaterialInfoResp, MaterialInfoQuery, MaterialInfoReq> {
|
||||
|
||||
/*
|
||||
*
|
||||
* 根据编码查询物料信息
|
||||
* */
|
||||
public MaterialInfoDO getMaterialInfoByCode(String code);
|
||||
|
||||
/**
|
||||
* 下载导入模板
|
||||
*
|
||||
* @param response 响应对象
|
||||
* @throws IOException /
|
||||
*/
|
||||
void downloadImportTemplate(HttpServletResponse response) throws IOException;
|
||||
|
||||
/**
|
||||
* 解析导入数据
|
||||
*
|
||||
* @param file 导入文件
|
||||
* @return 解析结果
|
||||
*/
|
||||
MaterialImportParseResp parseImport(MultipartFile file);
|
||||
|
||||
/**
|
||||
* 导入数据
|
||||
*
|
||||
* @param req 导入信息
|
||||
* @return 导入结果
|
||||
*/
|
||||
MaterialInfoImportResp importMaterial(MaterialInfoImportReq req);
|
||||
}
|
||||
|
||||
@@ -1,20 +1,71 @@
|
||||
package top.wms.admin.material.service.impl;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.DateUnit;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.io.resource.ResourceUtil;
|
||||
import cn.hutool.core.lang.UUID;
|
||||
import cn.hutool.core.math.MathUtil;
|
||||
import cn.hutool.core.util.*;
|
||||
import cn.hutool.extra.validation.ValidationUtil;
|
||||
import cn.hutool.http.ContentType;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import me.ahoo.cosid.IdGenerator;
|
||||
import me.ahoo.cosid.provider.DefaultIdGeneratorProvider;
|
||||
import net.dreamlu.mica.core.result.R;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import top.continew.starter.cache.redisson.util.RedisUtils;
|
||||
import top.continew.starter.core.exception.BusinessException;
|
||||
import top.continew.starter.core.util.SpringUtils;
|
||||
import top.continew.starter.core.validation.CheckUtils;
|
||||
import top.continew.starter.extension.crud.service.BaseServiceImpl;
|
||||
import top.continew.starter.web.util.FileUploadUtils;
|
||||
import top.wms.admin.common.constant.CacheConstants;
|
||||
import top.wms.admin.common.context.UserContextHolder;
|
||||
import top.wms.admin.common.enums.GenderEnum;
|
||||
import top.wms.admin.common.util.SecureUtils;
|
||||
import top.wms.admin.material.mapper.MaterialInfoMapper;
|
||||
import top.wms.admin.material.model.entity.MaterialInfoDO;
|
||||
import top.wms.admin.material.model.query.MaterialInfoQuery;
|
||||
import top.wms.admin.material.model.req.MaterialImportRowReq;
|
||||
import top.wms.admin.material.model.req.MaterialInfoImportReq;
|
||||
import top.wms.admin.material.model.req.MaterialInfoReq;
|
||||
import top.wms.admin.material.model.resp.MaterialImportParseResp;
|
||||
import top.wms.admin.material.model.resp.MaterialInfoImportResp;
|
||||
import top.wms.admin.material.model.resp.MaterialInfoResp;
|
||||
import top.wms.admin.material.service.MaterialInfoService;
|
||||
import top.wms.admin.system.model.entity.DeptDO;
|
||||
import top.wms.admin.system.model.entity.RoleDO;
|
||||
import top.wms.admin.system.model.entity.UserDO;
|
||||
import top.wms.admin.system.model.entity.UserRoleDO;
|
||||
import top.wms.admin.system.model.req.user.UserImportReq;
|
||||
import top.wms.admin.system.model.req.user.UserImportRowReq;
|
||||
import top.wms.admin.system.model.resp.user.UserImportParseResp;
|
||||
import top.wms.admin.system.model.resp.user.UserImportResp;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.math.BigDecimal;
|
||||
import java.sql.Time;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static top.wms.admin.system.enums.ImportPolicyEnum.*;
|
||||
import static top.wms.admin.system.enums.ImportPolicyEnum.SKIP;
|
||||
|
||||
/**
|
||||
* 物料信息业务实现
|
||||
@@ -34,4 +85,241 @@ public class MaterialInfoServiceImpl extends BaseServiceImpl<MaterialInfoMapper,
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void downloadImportTemplate(HttpServletResponse response) throws IOException {
|
||||
try {
|
||||
FileUploadUtils.download(response, ResourceUtil.getStream("templates/import/materialInfo.xlsx"), "物料信息导入模板.xlsx");
|
||||
} catch (Exception e) {
|
||||
log.error("下载用户导入模板失败:{}", e);
|
||||
response.setCharacterEncoding(CharsetUtil.UTF_8);
|
||||
response.setContentType(ContentType.JSON.toString());
|
||||
response.getWriter().write(JSONUtil.toJsonStr(R.fail("下载用户导入模板失败")));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public MaterialImportParseResp parseImport(MultipartFile file) {
|
||||
MaterialImportParseResp materialImportResp = new MaterialImportParseResp();
|
||||
List<MaterialImportRowReq> importRowList;
|
||||
// 读取表格数据
|
||||
try {
|
||||
importRowList = EasyExcel.read(file.getInputStream())
|
||||
.head(MaterialImportRowReq.class)
|
||||
.sheet()
|
||||
.headRowNumber(1)
|
||||
.doReadSync();
|
||||
} catch (Exception e) {
|
||||
log.error("物料信息导入数据文件解析异常:{}", e);
|
||||
throw new BusinessException("数据文件解析异常");
|
||||
}
|
||||
// 总计行数
|
||||
materialImportResp.setTotalRows(importRowList.size());
|
||||
CheckUtils.throwIfEmpty(importRowList, "数据文件格式错误");
|
||||
// 有效行数:过滤无效(同名物料)数据
|
||||
List<MaterialImportRowReq> validRowList = this.filterImportData(importRowList);
|
||||
materialImportResp.setValidRows(validRowList.size());
|
||||
CheckUtils.throwIfEmpty(validRowList, "数据文件格式错误");
|
||||
|
||||
// 检测表格内数据是否合法
|
||||
Set<String> seenCode = new HashSet<>();
|
||||
boolean hasDuplicateEncoding = validRowList.stream()
|
||||
.map(MaterialImportRowReq::getEncoding)
|
||||
.anyMatch(encoding -> encoding != null && !seenCode.add(encoding));
|
||||
CheckUtils.throwIf(hasDuplicateEncoding, "存在重复物料编码,请检测数据");
|
||||
|
||||
// 查询重复用户
|
||||
materialImportResp
|
||||
.setDuplicateNameRows(countExistByField(validRowList, MaterialImportRowReq::getMaterialName, MaterialInfoDO::getMaterialName, false));
|
||||
// 查询重复邮箱
|
||||
materialImportResp
|
||||
.setDuplicateCodeRows(countExistByField(validRowList, MaterialImportRowReq::getEncoding, MaterialInfoDO::getEncoding, false));
|
||||
// 设置导入会话并缓存数据,有效期10分钟
|
||||
String importKey = UUID.fastUUID().toString(true);
|
||||
RedisUtils.set(CacheConstants.DATA_IMPORT_KEY + importKey, JSONUtil.toJsonStr(validRowList), Duration
|
||||
.ofMinutes(10));
|
||||
materialImportResp.setImportKey(importKey);
|
||||
return materialImportResp;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public MaterialInfoImportResp importMaterial(MaterialInfoImportReq req) {
|
||||
// 校验导入会话是否过期
|
||||
List<MaterialImportRowReq> importMaterialList;
|
||||
try {
|
||||
String data = RedisUtils.get(CacheConstants.DATA_IMPORT_KEY + req.getImportKey());
|
||||
importMaterialList = JSONUtil.toList(data, MaterialImportRowReq.class);
|
||||
CheckUtils.throwIf(CollUtil.isEmpty(importMaterialList), "导入已过期,请重新上传");
|
||||
} catch (Exception e) {
|
||||
log.error("导入异常:", e);
|
||||
throw new BusinessException("导入已过期,请重新上传");
|
||||
}
|
||||
// 已存在数据查询
|
||||
List<String> existName = listExistByField(importMaterialList, MaterialImportRowReq::getMaterialName, MaterialInfoDO::getMaterialName);
|
||||
List<String> existCode = listExistByField(importMaterialList, MaterialImportRowReq::getEncoding, MaterialInfoDO::getEncoding);
|
||||
CheckUtils
|
||||
.throwIf(isExitImportMaterial(req, importMaterialList, existName, existCode), "数据不符合导入策略,已退出导入");
|
||||
// 批量操作数据库集合
|
||||
List<MaterialInfoDO> insertList = new ArrayList<>();
|
||||
List<MaterialInfoDO> updateByNameList = new ArrayList<>();
|
||||
List<MaterialInfoDO> updateByCodeList = new ArrayList<>();
|
||||
// ID生成器
|
||||
// IdGenerator idGenerator = DefaultIdGeneratorProvider.INSTANCE.getShare();
|
||||
for (MaterialImportRowReq row : importMaterialList) {
|
||||
if (isSkipMaterialImport(req, row, existName, existCode)) {
|
||||
// 按规则跳过该行
|
||||
continue;
|
||||
}
|
||||
MaterialInfoDO materialDO = BeanUtil.toBeanIgnoreError(row, MaterialInfoDO.class);
|
||||
materialDO.setUnitWeight(NumberUtil.isValidNumber(row.getUnitWeight())?row.getUnitWeight(): null);
|
||||
materialDO.setMaterialSpec(StrUtil.isNotBlank(row.getMaterialSpec())?row.getMaterialSpec():null);
|
||||
// 修改 or 新增
|
||||
if (UPDATE.validate(req.getDuplicateName(), row.getMaterialName(), existName)) {
|
||||
materialDO.setMaterialName(row.getMaterialName());
|
||||
materialDO.setUpdateTime(LocalDateTime.now());
|
||||
materialDO.setUpdateUser(UserContextHolder.getUserId());
|
||||
updateByNameList.add(materialDO);
|
||||
} else if (UPDATE.validate(req.getDuplicateCode(), row.getEncoding(), existCode)) {
|
||||
materialDO.setEncoding(row.getEncoding());
|
||||
materialDO.setUpdateTime(LocalDateTime.now());
|
||||
materialDO.setUpdateUser(UserContextHolder.getUserId());
|
||||
updateByCodeList.add(materialDO);
|
||||
} else {
|
||||
// materialDO.setId(idGenerator.generate());
|
||||
insertList.add(materialDO);
|
||||
}
|
||||
}
|
||||
doImportMaterial(insertList, updateByNameList, updateByCodeList);
|
||||
RedisUtils.delete(CacheConstants.DATA_IMPORT_KEY + req.getImportKey());
|
||||
int insertCount = insertList.size();
|
||||
int updateByNameCount = updateByNameList.size();
|
||||
int updateByCodeCount = updateByCodeList.size();
|
||||
int totalUpdateCount = updateByNameCount + updateByCodeCount;
|
||||
int totalHandleCount = insertCount + totalUpdateCount;
|
||||
return new MaterialInfoImportResp(
|
||||
totalHandleCount, // 总处理数
|
||||
insertCount, // 新增数
|
||||
totalUpdateCount // 更新总数
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 按指定数据集获取数据库已存在的数量
|
||||
*
|
||||
* @param materialRowList 导入的数据源
|
||||
* @param rowField 导入数据的字段
|
||||
* @param dbField 对比数据库的字段
|
||||
* @return 存在的数量
|
||||
*/
|
||||
private int countExistByField(List<MaterialImportRowReq> materialRowList,
|
||||
Function<MaterialImportRowReq, String> rowField,
|
||||
SFunction<MaterialInfoDO, ?> dbField,
|
||||
boolean fieldEncrypt) {
|
||||
List<String> fieldValues = materialRowList.stream().map(rowField).filter(Objects::nonNull).toList();
|
||||
if (fieldValues.isEmpty()) {
|
||||
return 0;
|
||||
}
|
||||
return (int)this.count(Wrappers.<MaterialInfoDO>lambdaQuery()
|
||||
.in(dbField, fieldEncrypt ? SecureUtils.encryptFieldByAes(fieldValues) : fieldValues));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 过滤无效的导入用户数据(批量导入不严格校验数据)
|
||||
*
|
||||
* @param importRowList 导入数据
|
||||
*/
|
||||
private List<MaterialImportRowReq> filterImportData(List<MaterialImportRowReq> importRowList) {
|
||||
// 校验过滤
|
||||
List<MaterialImportRowReq> list = importRowList.stream()
|
||||
.filter(row -> ValidationUtil.validate(row).isEmpty())
|
||||
.toList();
|
||||
// 物料名去重
|
||||
return list.stream()
|
||||
.collect(Collectors.toMap(MaterialImportRowReq::getMaterialName, row -> row, (existing, replacement) -> existing))
|
||||
.values()
|
||||
.stream()
|
||||
.toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 按指定数据集获取数据库已存在内容
|
||||
*
|
||||
* @param materialRowList 导入的数据源
|
||||
* @param rowField 导入数据的字段
|
||||
* @param dbField 对比数据库的字段
|
||||
* @return 存在的内容
|
||||
*/
|
||||
private List<String> listExistByField(List<MaterialImportRowReq> materialRowList,
|
||||
Function<MaterialImportRowReq, String> rowField,
|
||||
SFunction<MaterialInfoDO, String> dbField) {
|
||||
List<String> fieldValues = materialRowList.stream().map(rowField).filter(Objects::nonNull).toList();
|
||||
if (fieldValues.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<MaterialInfoDO> materialDOList = baseMapper.selectList(Wrappers.<MaterialInfoDO>lambdaQuery()
|
||||
.in(dbField, fieldValues)
|
||||
.select(dbField));
|
||||
return materialDOList.stream().map(dbField).filter(Objects::nonNull).toList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否退出导入
|
||||
*
|
||||
* @param req 导入参数
|
||||
* @param list 导入数据
|
||||
* @param existName 导入数据中已存在的物料名
|
||||
* @param existCode 导入数据中已存在的物料编号
|
||||
* @return 是否退出
|
||||
*/
|
||||
private boolean isExitImportMaterial(MaterialInfoImportReq req,
|
||||
List<MaterialImportRowReq> list,
|
||||
List<String> existName,
|
||||
List<String> existCode) {
|
||||
return list.stream()
|
||||
.anyMatch(row -> EXIT.validate(req.getDuplicateName(), row.getMaterialName(), existName) || EXIT.validate(req
|
||||
.getDuplicateCode(), row.getEncoding(), existCode));
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否跳过导入
|
||||
*
|
||||
* @param req 导入参数
|
||||
* @param row 导入数据
|
||||
* @param existName 导入数据中已存在的物料名称
|
||||
* @param existCode 导入数据中已存在的物料编号
|
||||
* @return 是否跳过
|
||||
*/
|
||||
private boolean isSkipMaterialImport(MaterialInfoImportReq req,
|
||||
MaterialImportRowReq row,
|
||||
List<String> existName,
|
||||
List<String> existCode) {
|
||||
return SKIP.validate(req.getDuplicateName(), row.getMaterialName(), existName) || SKIP.validate(req
|
||||
.getDuplicateCode(), row.getEncoding(), existCode);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入用户
|
||||
*
|
||||
* @param insertList 新增用户
|
||||
* @param updateByNameList 修改用户
|
||||
* @param updateByCodeList 用户角色关联
|
||||
*/
|
||||
private void doImportMaterial(List<MaterialInfoDO> insertList, List<MaterialInfoDO> updateByNameList, List<MaterialInfoDO> updateByCodeList) {
|
||||
if (CollUtil.isNotEmpty(insertList)) {
|
||||
baseMapper.insertBatch(insertList);
|
||||
}
|
||||
if (CollUtil.isNotEmpty(updateByNameList)) {
|
||||
baseMapper.updateByName(updateByNameList);
|
||||
}
|
||||
if (CollUtil.isNotEmpty(updateByCodeList)) {
|
||||
baseMapper.updateByCode(updateByCodeList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
package top.wms.admin.system.mapper;
|
||||
|
||||
import org.springframework.stereotype.Repository;
|
||||
import top.continew.starter.data.mp.base.BaseMapper;
|
||||
import top.wms.admin.system.model.entity.RuleRelationDO;
|
||||
|
||||
/**
|
||||
* 通行规则-设备关联 Mapper
|
||||
*
|
||||
* @author zc
|
||||
* @since 2025/12/22 17:16
|
||||
*/
|
||||
@Repository
|
||||
public interface RuleRelationMapper extends BaseMapper<RuleRelationDO> {
|
||||
|
||||
int deleteByRuleId(RuleRelationDO ruleRelation);
|
||||
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package top.wms.admin.system.model.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 通行规则-设备关联实体
|
||||
*
|
||||
* @author zc
|
||||
* @since 2025/12/22 17:16
|
||||
*/
|
||||
@Data
|
||||
@TableName("equipment_rule_relation")
|
||||
public class RuleRelationDO implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 平台侧规则ID(关联规则表主键)
|
||||
*/
|
||||
private Long ruleId;
|
||||
|
||||
/**
|
||||
* 设备ID(关联设备表主键)
|
||||
*/
|
||||
private Long equipmentId;
|
||||
|
||||
/**
|
||||
* 设备侧的规则ID(设备本地存储的规则标识)
|
||||
*/
|
||||
private String equipmentRuleId;
|
||||
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
package top.wms.admin.system.model.req;
|
||||
|
||||
import jakarta.validation.constraints.*;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 创建或修改通行规则-设备关联参数
|
||||
*
|
||||
* @author zc
|
||||
* @since 2025/12/22 17:16
|
||||
*/
|
||||
@Data
|
||||
@Schema(description = "创建或修改通行规则-设备关联参数")
|
||||
public class RuleRelationReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 平台侧规则ID(关联规则表主键)
|
||||
*/
|
||||
@Schema(description = "平台侧规则ID(关联规则表主键)")
|
||||
@NotNull(message = "平台侧规则ID(关联规则表主键)不能为空")
|
||||
private Long ruleId;
|
||||
|
||||
/**
|
||||
* 设备ID(关联设备表主键)
|
||||
*/
|
||||
@Schema(description = "设备ID(关联设备表主键)")
|
||||
@NotNull(message = "设备ID(关联设备表主键)不能为空")
|
||||
private Long equipmentId;
|
||||
|
||||
/**
|
||||
* 设备侧的规则ID(设备本地存储的规则标识)
|
||||
*/
|
||||
@Schema(description = "设备侧的规则ID(设备本地存储的规则标识)")
|
||||
@NotBlank(message = "设备侧的规则ID(设备本地存储的规则标识)不能为空")
|
||||
@Length(max = 64, message = "设备侧的规则ID(设备本地存储的规则标识)长度不能超过 {max} 个字符")
|
||||
private String equipmentRuleId;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
private LocalDateTime createTime;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package top.wms.admin.system.service.impl;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import top.continew.starter.extension.crud.service.BaseServiceImpl;
|
||||
import top.wms.admin.system.mapper.PeopleEquipmentMapper;
|
||||
import top.wms.admin.system.model.entity.PeopleEquipmentDO;
|
||||
import top.wms.admin.system.model.query.PeopleEquipmentQuery;
|
||||
import top.wms.admin.system.model.req.PeopleEquipmentReq;
|
||||
import top.wms.admin.system.model.resp.PeopleEquipmentResp;
|
||||
import top.wms.admin.system.service.PeopleEquipmentService;
|
||||
|
||||
/**
|
||||
* 人员设备下发信息业务实现
|
||||
*
|
||||
* @author zc
|
||||
* @since 2025/03/27 14:59
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class PeopleEquipmentServiceImpl extends BaseServiceImpl<PeopleEquipmentMapper, PeopleEquipmentDO, PeopleEquipmentResp, PeopleEquipmentResp, PeopleEquipmentQuery, PeopleEquipmentReq> implements PeopleEquipmentService {}
|
||||
@@ -36,6 +36,7 @@ import net.dreamlu.mica.core.result.R;
|
||||
import org.dromara.x.file.storage.core.FileInfo;
|
||||
import org.dromara.x.file.storage.core.FileStorageService;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -131,6 +132,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserRes
|
||||
CheckUtils.throwIf(StrUtil.isNotBlank(email) && this.isEmailExists(email, null), errorMsgTemplate, email);
|
||||
String phone = req.getPhone();
|
||||
CheckUtils.throwIf(StrUtil.isNotBlank(phone) && this.isPhoneExists(phone, null), errorMsgTemplate, phone);
|
||||
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
|
||||
req.setPassword("{bcrypt}"+encoder.encode(req.getPassword()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package top.wms.admin.weighManage.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Constants;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import top.continew.starter.data.mp.base.BaseMapper;
|
||||
import top.wms.admin.weighManage.model.entity.WorkOrderDO;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import top.wms.admin.weighManage.model.resp.WorkOrderResp;
|
||||
|
||||
/**
|
||||
* 任务工单信息 Mapper
|
||||
*
|
||||
* @author zc
|
||||
* @since 2026/03/03 17:09
|
||||
*/
|
||||
@Repository
|
||||
public interface WorkOrderMapper extends BaseMapper<WorkOrderDO> {
|
||||
|
||||
IPage<WorkOrderResp> selectWorkOrderPage(@Param("page") Page<Object> objectPage, @Param(Constants.WRAPPER) QueryWrapper<WorkOrderDO> queryWrapper);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package top.wms.admin.weighManage.model.entity;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
|
||||
import top.wms.admin.common.model.entity.BaseDO;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 任务工单信息实体
|
||||
*
|
||||
* @author zc
|
||||
* @since 2026/03/03 17:09
|
||||
*/
|
||||
@Data
|
||||
@TableName("sys_work_order")
|
||||
public class WorkOrderDO extends BaseDO {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 任务工单号
|
||||
*/
|
||||
private String orderNo;
|
||||
|
||||
/**
|
||||
* 物料主键id
|
||||
*/
|
||||
private Long materialId;
|
||||
|
||||
/**
|
||||
* 总重量
|
||||
*/
|
||||
private BigDecimal totalWeight;
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package top.wms.admin.weighManage.model.query;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
import top.continew.starter.data.core.annotation.Query;
|
||||
import top.continew.starter.data.core.enums.QueryType;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.time.*;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 任务工单信息查询条件
|
||||
*
|
||||
* @author zc
|
||||
* @since 2026/03/03 17:09
|
||||
*/
|
||||
@Data
|
||||
@Schema(description = "任务工单信息查询条件")
|
||||
public class WorkOrderQuery implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 总重量
|
||||
*/
|
||||
@Schema(description = "总重量")
|
||||
private BigDecimal totalWeight;
|
||||
|
||||
/**
|
||||
* 任务工单号
|
||||
*/
|
||||
@Schema(description = "任务工单号")
|
||||
private String orderNo;
|
||||
|
||||
/**
|
||||
* 物料名称
|
||||
*/
|
||||
@Schema(description = "物料名称")
|
||||
private String materialName;
|
||||
|
||||
/**
|
||||
* 创建人
|
||||
*/
|
||||
@Schema(description = "创建人")
|
||||
private Long createUser;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@Schema(description = "创建时间")
|
||||
private LocalDateTime createTime;
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package top.wms.admin.weighManage.model.req;
|
||||
|
||||
import jakarta.validation.constraints.*;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
import org.hibernate.validator.constraints.Length;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.time.*;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 创建或修改任务工单信息参数
|
||||
*
|
||||
* @author zc
|
||||
* @since 2026/03/03 17:09
|
||||
*/
|
||||
@Data
|
||||
@Schema(description = "创建或修改任务工单信息参数")
|
||||
public class WorkOrderReq implements Serializable {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 总重量
|
||||
*/
|
||||
@Schema(description = "总重量")
|
||||
@NotNull(message = "总重量不能为空")
|
||||
private BigDecimal totalWeight;
|
||||
|
||||
/**
|
||||
* 创建人
|
||||
*/
|
||||
@Schema(description = "创建人")
|
||||
@NotNull(message = "创建人不能为空")
|
||||
private Long createUser;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@Schema(description = "创建时间")
|
||||
@NotNull(message = "创建时间不能为空")
|
||||
private LocalDateTime createTime;
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
package top.wms.admin.weighManage.model.resp;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MaterialResp {
|
||||
private Long id;
|
||||
private String materialCode;
|
||||
private String materialName;
|
||||
private String materialSpec;
|
||||
private String weight;
|
||||
private String imageUrl;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package top.wms.admin.weighManage.model.resp;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
import top.wms.admin.common.model.resp.BaseDetailResp;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.time.*;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 任务工单信息信息
|
||||
*
|
||||
* @author zc
|
||||
* @since 2026/03/03 17:09
|
||||
*/
|
||||
@Data
|
||||
@Schema(description = "任务工单信息信息")
|
||||
public class WorkOrderResp extends BaseDetailResp {
|
||||
|
||||
@Serial
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 标题
|
||||
*/
|
||||
@Schema(description = "标题")
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 物料主键id
|
||||
*/
|
||||
@Schema(description = "物料主键id")
|
||||
private Long materialId;
|
||||
|
||||
/**
|
||||
* 物料名称
|
||||
*/
|
||||
@Schema(description = "物料名称")
|
||||
private String materialName;
|
||||
|
||||
/**
|
||||
* 物料编码
|
||||
*/
|
||||
@Schema(description = "物料编码")
|
||||
private String encoding;
|
||||
|
||||
/**
|
||||
* 物料单位重量
|
||||
*/
|
||||
@Schema(description = "物料单位重量")
|
||||
private BigDecimal unitWeight;
|
||||
|
||||
/**
|
||||
* 物料规格
|
||||
*/
|
||||
@Schema(description = "物料规格")
|
||||
private String materialSpec;
|
||||
|
||||
/**
|
||||
* 物料图片
|
||||
*/
|
||||
@Schema(description = "物料图片")
|
||||
private String photoUrl;
|
||||
|
||||
/**
|
||||
* 总重量
|
||||
*/
|
||||
@Schema(description = "总重量")
|
||||
private BigDecimal totalWeight;
|
||||
|
||||
/**
|
||||
* 修改人
|
||||
*/
|
||||
@Schema(description = "修改人")
|
||||
private Long updateUser;
|
||||
|
||||
/**
|
||||
* 修改时间
|
||||
*/
|
||||
@Schema(description = "修改时间")
|
||||
private LocalDateTime updateTime;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package top.wms.admin.weighManage.service;
|
||||
|
||||
import top.continew.starter.extension.crud.service.BaseService;
|
||||
import top.wms.admin.weighManage.model.query.WorkOrderQuery;
|
||||
import top.wms.admin.weighManage.model.req.WorkOrderReq;
|
||||
import top.wms.admin.weighManage.model.resp.WorkOrderResp;
|
||||
|
||||
/**
|
||||
* 任务工单信息业务接口
|
||||
*
|
||||
* @author zc
|
||||
* @since 2026/03/03 17:09
|
||||
*/
|
||||
public interface WorkOrderService extends BaseService<WorkOrderResp, WorkOrderResp, WorkOrderQuery, WorkOrderReq> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package top.wms.admin.weighManage.service.impl;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import top.continew.starter.extension.crud.model.query.PageQuery;
|
||||
import top.continew.starter.extension.crud.model.resp.PageResp;
|
||||
import top.continew.starter.extension.crud.service.BaseServiceImpl;
|
||||
import top.wms.admin.weighManage.mapper.WorkOrderMapper;
|
||||
import top.wms.admin.weighManage.model.entity.WorkOrderDO;
|
||||
import top.wms.admin.weighManage.model.query.WorkOrderQuery;
|
||||
import top.wms.admin.weighManage.model.req.WorkOrderReq;
|
||||
import top.wms.admin.weighManage.model.resp.WorkOrderResp;
|
||||
import top.wms.admin.weighManage.service.WorkOrderService;
|
||||
|
||||
/**
|
||||
* 任务工单信息业务实现
|
||||
*
|
||||
* @author zc
|
||||
* @since 2026/03/03 17:09
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkOrderDO, WorkOrderResp, WorkOrderResp, WorkOrderQuery, WorkOrderReq> implements WorkOrderService {
|
||||
|
||||
@Override
|
||||
public PageResp<WorkOrderResp> page(WorkOrderQuery query, PageQuery pageQuery) {
|
||||
QueryWrapper<WorkOrderDO> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.like(StrUtil.isNotBlank(query.getMaterialName()), "m.material_name", query.getMaterialName());
|
||||
queryWrapper.eq(null != query.getOrderNo(), "w.order_no", query.getOrderNo());
|
||||
this.sort(queryWrapper, pageQuery);
|
||||
|
||||
IPage<WorkOrderResp> page = baseMapper.selectWorkOrderPage(new Page<>(pageQuery.getPage(), pageQuery
|
||||
.getSize()), queryWrapper);
|
||||
|
||||
return PageResp.build(page);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="top.wms.admin.material.mapper.MaterialInfoMapper">
|
||||
|
||||
<!-- 按物料名称批量更新 -->
|
||||
<update id="updateByName">
|
||||
<foreach collection="list" item="item" separator=";">
|
||||
UPDATE sys_material_info
|
||||
SET
|
||||
<if test="item.encoding != null and item.encoding != ''" >
|
||||
encoding = #{item.encoding},
|
||||
</if>
|
||||
<if test="item.unitWeight != null">
|
||||
unit_weight = #{item.unitWeight},
|
||||
</if>
|
||||
<if test="item.materialSpec != null and item.materialSpec != ''">
|
||||
material_spec = #{item.materialSpec},
|
||||
</if>
|
||||
<if test="item.updateTime != null">
|
||||
update_time = NOW(),
|
||||
</if>
|
||||
<if test="item.updateUser != null and item.updateUser != ''">
|
||||
update_user = #{item.updateUser}
|
||||
</if>
|
||||
WHERE material_name = #{item.materialName}
|
||||
</foreach>
|
||||
</update>
|
||||
|
||||
<update id="updateByCode">
|
||||
<foreach collection="list" item="item" separator=";">
|
||||
UPDATE sys_material_info
|
||||
SET
|
||||
<if test="item.materialName != null and item.materialName != ''">
|
||||
material_name = #{item.materialName},
|
||||
</if>
|
||||
<if test="item.unitWeight != null">
|
||||
unit_weight = #{item.unitWeight},
|
||||
</if>
|
||||
<if test="item.materialSpec != null and item.materialSpec != ''">
|
||||
material_spec = #{item.materialSpec},
|
||||
</if>
|
||||
<if test="item.updateTime != null">
|
||||
update_time = NOW(),
|
||||
</if>
|
||||
<if test="item.updateUser != null and item.updateUser != ''">
|
||||
update_user = #{item.updateUser}
|
||||
</if>
|
||||
WHERE encoding = #{item.encoding}
|
||||
</foreach>
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="top.wms.admin.system.mapper.RuleRelationMapper">
|
||||
|
||||
|
||||
<delete id="deleteByRuleId" parameterType="top.wms.admin.system.model.entity.RuleRelationDO">
|
||||
DELETE FROM equipment_rule_relation
|
||||
WHERE 1=1
|
||||
<!-- 判空规则:字段不为 null 且 不为空字符串(兼容字符串/数字类型) -->
|
||||
<if test="ruleId != null and ruleId != ''">
|
||||
AND rule_id = #{ruleId}
|
||||
</if>
|
||||
<if test="equipmentId != null and equipmentId != ''">
|
||||
AND equipment_id = #{equipmentId}
|
||||
</if>
|
||||
<if test="equipmentRuleId != null and equipmentRuleId != ''">
|
||||
AND equipment_rule_id = #{equipmentRuleId}
|
||||
</if>
|
||||
</delete>
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
|
||||
<mapper namespace="top.wms.admin.weighManage.mapper.WorkOrderMapper">
|
||||
|
||||
<select id="selectWorkOrderPage" resultType="top.wms.admin.weighManage.model.resp.WorkOrderResp">
|
||||
select
|
||||
w.*,
|
||||
m.material_name
|
||||
from sys_work_order w
|
||||
left join sys_material_info m on w.material_id = m.id
|
||||
${ew.customSqlSegment}
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
@@ -1,37 +0,0 @@
|
||||
package top.wms.admin.controller.WeighManage;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import top.wms.admin.weighManage.model.resp.MaterialResp;
|
||||
|
||||
/**
|
||||
* 部门管理管理 API
|
||||
*
|
||||
* @author zc
|
||||
* @since 2025/03/19 17:46
|
||||
*/
|
||||
@Tag(name = "部门管理管理 API")
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/weighManage/material")
|
||||
public class WeighController {
|
||||
|
||||
/**
|
||||
* 获取材料详细信息
|
||||
*/
|
||||
@SaCheckPermission("Weigh:material:detail")
|
||||
@GetMapping(value = "/detail")
|
||||
public MaterialResp getInfo() {
|
||||
MaterialResp materialResp = new MaterialResp();
|
||||
materialResp.setId(1L);
|
||||
materialResp.setMaterialCode("123");
|
||||
materialResp.setMaterialName("测试材料");
|
||||
materialResp.setMaterialSpec("测试规格");
|
||||
materialResp.setWeight("100");
|
||||
materialResp.setImageUrl("http://example.com/image.jpg");
|
||||
return materialResp;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +1,13 @@
|
||||
package top.wms.admin.controller.meterial;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import top.continew.starter.core.validation.ValidationUtils;
|
||||
import top.continew.starter.extension.crud.enums.Api;
|
||||
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -11,9 +19,17 @@ import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
|
||||
import top.wms.admin.common.controller.BaseController;
|
||||
import top.wms.admin.material.model.entity.MaterialInfoDO;
|
||||
import top.wms.admin.material.model.query.MaterialInfoQuery;
|
||||
import top.wms.admin.material.model.req.MaterialInfoImportReq;
|
||||
import top.wms.admin.material.model.req.MaterialInfoReq;
|
||||
import top.wms.admin.material.model.resp.MaterialImportParseResp;
|
||||
import top.wms.admin.material.model.resp.MaterialInfoImportResp;
|
||||
import top.wms.admin.material.model.resp.MaterialInfoResp;
|
||||
import top.wms.admin.material.service.MaterialInfoService;
|
||||
import top.wms.admin.system.model.req.user.UserImportReq;
|
||||
import top.wms.admin.system.model.resp.user.UserImportParseResp;
|
||||
import top.wms.admin.system.model.resp.user.UserImportResp;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* 物料信息管理 API
|
||||
@@ -33,4 +49,26 @@ public class MaterialInfoController extends BaseController<MaterialInfoService,
|
||||
public MaterialInfoDO getMaterialInfoByCode(@PathVariable String code) {
|
||||
return baseService.getMaterialInfoByCode(code);
|
||||
}
|
||||
|
||||
@Operation(summary = "下载导入模板", description = "下载导入模板")
|
||||
@SaCheckPermission("admin:materialInfo:import")
|
||||
@GetMapping(value = "/import/template", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
|
||||
public void downloadImportTemplate(HttpServletResponse response) throws IOException {
|
||||
baseService.downloadImportTemplate(response);
|
||||
}
|
||||
|
||||
@Operation(summary = "解析导入数据", description = "解析导入数据")
|
||||
@SaCheckPermission("admin:materialInfo:import")
|
||||
@PostMapping("/import/parse")
|
||||
public MaterialImportParseResp parseImport(@NotNull(message = "文件不能为空") MultipartFile file) {
|
||||
ValidationUtils.throwIf(file::isEmpty, "文件不能为空");
|
||||
return baseService.parseImport(file);
|
||||
}
|
||||
|
||||
@Operation(summary = "导入数据", description = "导入数据")
|
||||
@SaCheckPermission("admin:materialInfo:import")
|
||||
@PostMapping(value = "/import")
|
||||
public MaterialInfoImportResp importUser(@Validated @RequestBody MaterialInfoImportReq req) {
|
||||
return baseService.importMaterial(req);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@@ -91,7 +92,8 @@ public class UserController extends BaseController<UserService, UserResp, UserDe
|
||||
ValidationUtils.throwIfNull(rawNewPassword, "新密码解密失败");
|
||||
ValidationUtils.throwIf(!ReUtil
|
||||
.isMatch(RegexConstants.PASSWORD, rawNewPassword), "密码长度为 8-32 个字符,支持大小写字母、数字、特殊字符,至少包含字母和数字");
|
||||
req.setNewPassword(rawNewPassword);
|
||||
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
|
||||
req.setNewPassword("{bcrypt}"+encoder.encode(rawNewPassword));
|
||||
baseService.resetPassword(req, id);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package top.wms.admin.controller.weighManage;
|
||||
|
||||
import top.continew.starter.extension.crud.enums.Api;
|
||||
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
|
||||
import top.wms.admin.common.controller.BaseController;
|
||||
import top.wms.admin.weighManage.model.query.WorkOrderQuery;
|
||||
import top.wms.admin.weighManage.model.req.WorkOrderReq;
|
||||
import top.wms.admin.weighManage.model.resp.WorkOrderResp;
|
||||
import top.wms.admin.weighManage.service.WorkOrderService;
|
||||
|
||||
/**
|
||||
* 任务工单信息管理 API
|
||||
*
|
||||
* @author zc
|
||||
* @since 2026/03/03 17:09
|
||||
*/
|
||||
@Tag(name = "任务工单信息管理 API")
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@CrudRequestMapping(value = "/weighManage/workOrder", api = {Api.PAGE, Api.DETAIL, Api.ADD, Api.DELETE, Api.EXPORT})
|
||||
public class WorkOrderController extends BaseController<WorkOrderService, WorkOrderResp, WorkOrderResp, WorkOrderQuery, WorkOrderReq> {
|
||||
|
||||
}
|
||||
Binary file not shown.
BIN
wms-webapi/src/main/resources/templates/import/materialInfo.xlsx
Normal file
BIN
wms-webapi/src/main/resources/templates/import/materialInfo.xlsx
Normal file
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user