api配件新增、excel导入检查修改

This commit is contained in:
lym
2024-11-12 17:26:48 +08:00
parent d502dcdd55
commit e29ee20088
15 changed files with 558 additions and 320 deletions
@@ -0,0 +1,23 @@
package com.cf.imes.module.executor.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 配件主类的枚举值
*/
@Getter
@AllArgsConstructor
public enum CategoryEnum {
ASSEMBLY("组件"),
HARDWARE("五金"),
EDGING("封边条");
/**
* 类别名称
*/
private final String value;
}
@@ -0,0 +1,32 @@
package com.cf.imes.module.executor.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum IsHavaeEnum {
HAVE_ITEM(0, ""),
BI_ITEM(1, "");
private final Integer status;
private final String value;
public Integer getStatus() {
return status;
}
public String getValue() {
return value;
}
public boolean equals(Integer status) {
return this.status .equals(status) ;
}
public boolean equals(IsHavaeEnum quarrelEnum) {
return quarrelEnum != null && quarrelEnum.status .equals(this.getStatus()) ;
}
}
@@ -0,0 +1,22 @@
package com.cf.imes.module.executor.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum QuarrelEnum {
PLATE_ITEM(0, ""),
OTHER_ITEM(1, "");
private final Integer status;
private String value;
public boolean equals(Integer status) {
return this.status .equals(status) ;
}
public boolean equals(QuarrelEnum quarrelEnum) {
return quarrelEnum != null && quarrelEnum.status .equals(this.getStatus()) ;
}
}
@@ -8,6 +8,7 @@ import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.mybatis.core.generator.SnowFlakeGenerator;
import com.cf.imes.framework.operatelog.core.annotations.OperateLog;
import com.cf.imes.framework.redis.util.RedisLockUtil;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.executor.controller.admin.order.vo.order.*;
import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderBodyRespVO;
@@ -94,6 +95,10 @@ public class OrderController {
@Resource
private XmlTypeRealize xmlTypeRealize;
@Resource
private RedisLockUtil redisLockUtil;
@PutMapping("/update")
@Operation(summary = "更新生产单")
@PreAuthorize("@ss.hasPermission('production:manager-list:edit')")
@@ -195,6 +200,7 @@ public class OrderController {
@PreAuthorize("@ss.hasPermission('production:manager-list:create')")
public CommonResult<String> getApiData(@RequestParam(value = "orderNo") String orderNo){
redisLockUtil.lock(orderNo);
try {
Long orderId = (Long) identifierGenerator.nextId(null);
Long organId = getUserOrganId();
@@ -232,6 +238,8 @@ public class OrderController {
} catch (Exception e) {
log.error("api数据导入异常", e);
return success(e.getMessage());
} finally {
redisLockUtil.unlock(orderNo);
}
}
@@ -260,6 +268,7 @@ public class OrderController {
Boolean flag = true;
String customOrderNoKey = "自定义单号";
redisLockUtil.lock(file.getOriginalFilename());
try {
if (type == 0) { //excel
excelReadUtil.setErr(0);
@@ -365,6 +374,8 @@ public class OrderController {
String xmlStr = XmlBuilder.objectToXmlStr(orderXmlVO);
XMLUtil.writeErr(response, xmlStr, " order_add_xml_err.xml");
}
} finally {
redisLockUtil.unlock(file.getOriginalFilename());
}
}
@@ -38,6 +38,10 @@ public class OrderPartsDO extends BaseDO {
* 配件名称
*/
private String name;
/**
* 颜色
*/
private String color;
/**
* 材质
*/
@@ -45,7 +49,23 @@ public class OrderPartsDO extends BaseDO {
/**
* 配件类型
*/
private String category;
/**
* 配件子类
*/
private String type;
/**
* 宽度
*/
private Double width;
/**
* 长度
*/
private Double length;
/**
* 厚度
*/
private Double thickness;
/**
* 型号
*/
@@ -74,6 +94,10 @@ public class OrderPartsDO extends BaseDO {
* 是否复合部件:0 否 1 是
*/
private Boolean isComposite;
/**
* 子配件ID列表,复合部件时记录子配件ID,半角逗号分隔
*/
private String subparts;
/**
* 备注
*/
@@ -0,0 +1,101 @@
package com.cf.imes.module.executor.dal.dataobject.orderParts;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import com.cf.imes.framework.mybatis.core.dataobject.BaseDO;
/**
* 配件表 parts_{N} DO
*
* @author 晨丰科技
*/
@TableName("parts")
@KeySequence("parts_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PartsDO extends BaseDO {
/**
* 配件 ID
*/
@TableId
private Long id;
/**
* 组织id
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long organId;
/**
* 设计端商品ID
*/
private String goodsId;
/**
* 配件名称
*/
private String name;
/**
* 材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板
*/
private String material;
/**
* 颜色
*/
private String color;
/**
* 配件类型
*/
private String type;
/**
* 配件主类
*/
private String category;
/**
* 型号
*/
private String model;
/**
* 宽度
*/
private Double width;
/**
* 长度
*/
private Double length;
/**
* 厚度
*/
private Double thickness;
/**
* 规格
*/
private String spec;
/**
* 品牌
*/
private String brand;
/**
* 厂家
*/
private String factory;
/**
* 单位
*/
private String unit;
/**
* 是否复合部件:0 否 1 是
*/
private Boolean isComposite;
/**
* 子配件ID列表,复合部件时记录子配件ID,半角逗号分隔
*/
private String subparts;
/**
* 备注
*/
private String remark;
}
@@ -0,0 +1,19 @@
package com.cf.imes.module.executor.dal.mysql.orderParts;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.module.executor.dal.dataobject.orderParts.PartsDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 配件表 parts_{N} Mapper
*
* @author 晨丰科技
*/
@Mapper
public interface PartsMapper extends BaseMapperX<PartsDO> {
default PartsDO selectByGoodID(String goodId , Long organId) {
return selectOne(PartsDO::getGoodsId, goodId, PartsDO::getOrganId, organId);
}
}
@@ -16,6 +16,7 @@ import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.executor.dal.dataobject.orderModuleExtra.OrderModuleExtraDO;
import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO;
import com.cf.imes.module.executor.dal.dataobject.orderParts.PartsDO;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO;
import com.cf.imes.module.executor.dal.dataobject.plate.PlateGoodDO;
@@ -27,6 +28,7 @@ import com.cf.imes.module.executor.dal.mysql.orderGroup.OrderGroupMapper;
import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper;
import com.cf.imes.module.executor.dal.mysql.orderModuleExtra.OrderModuleExtraMapper;
import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper;
import com.cf.imes.module.executor.dal.mysql.orderParts.PartsMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateGoodMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.dal.mysql.rawgoods.RawGoodsMapper;
@@ -85,6 +87,9 @@ public class OrderInputProcessor {
@Resource
private ESDocumentService esDocumentService;
@Resource
private PartsMapper partsMapper;
@Resource
private ElasticsearchClient elasticsearchClient;
@@ -112,7 +117,8 @@ public class OrderInputProcessor {
Collection<PlateDO> plateDOS,
Collection<OrderItemDO> itemDOS,
Collection<GoodsDO> goodsDOS,
Collection<PlateGoodDO> plateGoodDOS) {
Collection<PlateGoodDO> plateGoodDOS,
Collection<PartsDO> partsDOS) {
// if (rawGoodsDOS != null)
@@ -159,6 +165,7 @@ public class OrderInputProcessor {
insertInBatches(itemDOS, 1000, (batch, index) -> orderItemMapper.insertBatch((Collection<OrderItemDO>) batch));
insertInBatches(goodsDOS, 1000, (batch, index) -> goodsMapper.insertBatch((Collection<GoodsDO>) batch));
insertInBatches(plateGoodDOS, 1000, (batch, index) -> plateGoodMapper.insertBatch((Collection<PlateGoodDO>) batch));
insertInBatches(partsDOS, 1000, (batch, index) -> partsMapper.insertBatch((Collection<PartsDO>) batch));
}
private void insertInBatches(Collection<?> entities, int batchSize, BiConsumer<Collection<?>, Integer> insertFunction) {
@@ -28,6 +28,7 @@ import com.cf.imes.module.executor.dal.dataobject.orderBody.OrderBodyDO;
import com.cf.imes.module.executor.dal.dataobject.orderGroup.OrderGroupDO;
import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.executor.dal.dataobject.orderParts.OrderPartsDO;
import com.cf.imes.module.executor.dal.dataobject.orderParts.PartsDO;
import com.cf.imes.module.executor.dal.dataobject.ordermodel.OrderModelDO;
import com.cf.imes.module.executor.dal.dataobject.pack.OrderPackageDO;
import com.cf.imes.module.executor.dal.dataobject.plan.PlanDO;
@@ -40,6 +41,7 @@ import com.cf.imes.module.executor.dal.mysql.orderBody.OrderBodyMapper;
import com.cf.imes.module.executor.dal.mysql.orderGroup.OrderGroupMapper;
import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper;
import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper;
import com.cf.imes.module.executor.dal.mysql.orderParts.PartsMapper;
import com.cf.imes.module.executor.dal.mysql.pack.OrderPackageMapper;
import com.cf.imes.module.executor.dal.mysql.pack.OrderPrepackagedMapper;
import com.cf.imes.module.executor.dal.mysql.plan.PlanMapper;
@@ -130,6 +132,9 @@ public class OrderServiceImpl implements OrderService {
@Resource
private SnowflakeIdWorker3rd idWorker;
@Resource
private PartsMapper partsMapper;
private static final String SUBMIT_STATE = "1"; // 空订单 原生产系统
@@ -391,9 +396,11 @@ public class OrderServiceImpl implements OrderService {
Map<String, List<?>> map = getPlateGoods(goodsDO);// 检验商品板材信息是否存在
goodsDO = (List<GoodsDO>) map.get(GOODSDO_KEY);
List<PlateGoodDO> plateGoodDOS = (List<PlateGoodDO>) map.get(PLATE_GOODS_LIST_KEY);
// 配件信息
List<PartsDO> partsDOS = getPartsGoods(partsDO);
orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, itemDO, goodsDO, plateGoodDOS);
orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, itemDO, goodsDO, plateGoodDOS, partsDOS);
List<OrderModelDO> orderModelDOs = BeanUtils.toBean(plateDetail, OrderModelDO.class);
if (!orderModelDOs.isEmpty()) {
@@ -446,7 +453,8 @@ public class OrderServiceImpl implements OrderService {
Map<String, List<?>> map = getPlateGoods(goodsDO);// 检验商品板材信息是否存在 excel
goodsDO = (List<GoodsDO>) map.get(GOODSDO_KEY);
List<PlateGoodDO> plateGoodDOS = (List<PlateGoodDO>) map.get(PLATE_GOODS_LIST_KEY);
// 配件库匹配
List<PartsDO> partsDOList = getPartsGoods(partsDO);
if (index != 0) {
roomCabinetProcessGroupMatch(orderDO.getId(), bodyDO, itemDO);
@@ -463,7 +471,7 @@ public class OrderServiceImpl implements OrderService {
updateOrder(BeanUtils.toBean(orderDO, OrderSaveReqVO.class));
}
}
orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, itemDO, goodsDO, plateGoodDOS);
orderInputProcessor.batchInsert(rawGoodsDO, bodyDO, groupDO, partsDO, plateDO, itemDO, goodsDO, plateGoodDOS, partsDOList);
if (orderModelDOS != null && !orderModelDOS.isEmpty()) {
orderInputProcessor.batchSaveModel(orderModelDOS);
}
@@ -693,12 +701,28 @@ public class OrderServiceImpl implements OrderService {
private PlateGoodDO getPlateGood(String goodsId, Long organId) {
List<PlateGoodDO> plateGoodDOs = plateGoodMapper.selectGoodOne(goodsId, organId);
if (plateGoodDOs.size() > 0) {
if (!plateGoodDOs.isEmpty()) {
return plateGoodDOs.get(0);
}
return null;
}
// 配件匹配
private List<PartsDO> getPartsGoods(List<OrderPartsDO> partsLists) {
List<PartsDO> partsDOS = new ArrayList<>();
for (OrderPartsDO partsDO : partsLists) {
if (partsDO.getGoodsId() != null) { // 有goodsId
PartsDO part = partsMapper.selectByGoodID(partsDO.getGoodsId(), OrganContextHolder.getOrganId());
if (part == null) { // 不存在记录,存入数据库
partsDOS.add(BeanUtils.toBean(partsDO, PartsDO.class).setOrganId(OrganContextHolder.getOrganId()));
}
}
}
return partsDOS;
}
private Map<String, List<?>> getPlateGoods(List<GoodsDO> goodsLists) {
Map<String, List<?>> map = new HashMap<>();
List<PlateGoodDO> plateGoodLists = new ArrayList<>();
@@ -717,7 +741,7 @@ public class OrderServiceImpl implements OrderService {
goodsDO.setGoodsId((obtainingTime) + Long.toString(plateNo).substring(2));
}
if (plateGoodDOS != null && plateGoodDOS.size() > 0) {//存在板材
if (plateGoodDOS != null && !plateGoodDOS.isEmpty()) {//存在板材
goodsDO.setGoodsId(plateGoodDOS.get(0).getGoodsId());
} else if (plateGoodDO != null) { // 存在板材
goodsDO.setGoodsId(plateGoodDO.getGoodsId());
@@ -6,12 +6,10 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.nacos.common.utils.StringUtils;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.executor.dal.dataobject.order.OrderDO;
import com.cf.imes.module.executor.enums.DataTypeEnum;
import com.cf.imes.module.executor.enums.OrderTypeEnum;
import com.cf.imes.module.executor.enums.*;
import com.cf.imes.module.executor.util.fileConversion.admin.ToolUtil;
import com.cf.imes.module.system.api.dict.DictDataApi;
import com.cf.imes.module.system.api.dict.dto.DictDataRespDTO;
import com.cf.imes.module.executor.enums.DictTypeConstants;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.springframework.stereotype.Component;
@@ -19,6 +17,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.*;
import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -27,8 +26,6 @@ import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import static com.mysql.cj.util.TimeUtil.DATE_FORMATTER;
@Slf4j
@Component
public class ExcelReadUtil { // 文件读取
@@ -40,6 +37,11 @@ public class ExcelReadUtil { // 文件读取
private static final String ERR = "error";
private static final String DEALER_PHONE = "dealerPhoneNumber";
private static final String NUMBER_TYPE_ERR = "数量类型错误";
private static final String NOT_EMPTY= "不可为空";
private static final String NUMBER_ERR = "数量错误";
private static final String ACCORD_ENUM = "请按照提示词语选择填入";
private static final String POSITIVE_ERR = "数据需为正数";
private static final String NUMBER_LENGTH_ERR = "数据长度过长";
// 读excel
public Map<String, Object> read(MultipartFile file) throws IOException {
Map<String, Object> map = new HashMap<>();
@@ -64,34 +66,38 @@ public class ExcelReadUtil { // 文件读取
if (index.get()) {
orderMap.put(item.get(0), item.get(1));
orderMap.put(item.get(16), item.get(17));
orderMap.put(item.get(19), item.get(20));
i.getAndIncrement();
} else {
if (i.getAndIncrement() > 6){
list.add(changeValue(item));
}
// if (item.get(1).equals("配件") || item.get(1).equals("板材")) {
// list.add(changeValue(item));
// }
}
}
);
index.set(true);
// if (MapUtil.isEmpty(orderMap) || CollectionUtil.isEmpty(list)) {
// isErr.set(-1);
// }
map.put("orderPri", orderMap);
map.put("plate", list);
return map;
}
private void setIfInvalid(String key, String errValue, Map<String, Object> orderMap, AtomicBoolean error) {
if (orderMap.get(key) == null) {
orderMap.put(key, errValue);
error.set(false);
}
//
private void setIfInvalid(String key, String errValue, Map<String, Object> orderMap,int length, AtomicBoolean error) {
orderMap.compute(key, (k, v) -> {
if (v == null) {
error.set(false);
return errValue;
} else {
int size = ((String) v).length();
if (size > length) {
error.set(false);
return NUMBER_LENGTH_ERR;
}
}
return v;
});
}
private void setPhone(String key, String errValue, Map<String, Object> orderMap, AtomicBoolean error) {
@@ -111,10 +117,10 @@ public class ExcelReadUtil { // 文件读取
AtomicBoolean error = new AtomicBoolean(true);
setIfInvalid("客户", "---< 客户不能为空 >---", orderMap, error);
setIfInvalid("经销商", "---< 经销商不能为空 >---", orderMap, error);
setIfInvalid("客户地址", "---< 客户地址不能为空 >---", orderMap, error);
setIfInvalid("客户地址", "---< 客户地址不能为空 >---", orderMap, error);
setIfInvalid("客户", "---< 客户不能为空 >---", orderMap, 255, error);
setIfInvalid("经销商", "---< 经销商不能为空 >---", orderMap, 255, error);
setIfInvalid("客户地址", "---< 客户地址不能为空 >---", orderMap, 255, error);
setIfInvalid("客户地址", "---< 客户地址不能为空 >---", orderMap, 255, error);
if (orderMap.get("客户电话") == null) {
orderMap.put("客户电话", "---< 客户电话不能为空 >---");
@@ -198,115 +204,124 @@ public class ExcelReadUtil { // 文件读取
case 6:// 颜色
vo.setColor(value);
break;
case 7:// 厂家
case 7:// 复合部件
vo.setIsComposite(value);
break;
case 8:// 配件类型
vo.setCategory(value);
break;
case 9:// 子类
vo.setType(value);
break;
case 10:// 厂家
vo.setFactory(value);
break;
case 8:// 品牌
case 11:// 品牌
vo.setBrand(value);
break;
case 9:// 型号
case 12:// 型号
vo.setModel(value);
break;
case 10:// 板材长
case 13:// 板材/配件
vo.setGoodsHeight(value);
break;
case 11:// 板材宽
case 14:// 板材/配件
vo.setGoodsWidth(value);
break;
case 12:// 板材厚
case 15:// 板材/配件
vo.setGoodsThickness(value);
break;
case 13:// 规格
case 16:// 规格
vo.setSpec(value);
break;
case 14:// 单位
case 17:// 单位
vo.setUnit(value);
break;
case 15:// 数量
case 18:// 数量
vo.setGoodsNumber(value);
break;
case 16:// 房间
case 19:// 房间
vo.setRoomsName(value);
break;
case 17:// 柜体
case 20:// 柜体
vo.setCabinetsName(value);
break;
case 18:// 加工组类型
case 21:// 加工组类型
vo.setSynthesisTypeName(value);
break;
case 19:// 加工组名称
case 22:// 加工组名称
vo.setCombinationName(value);
break;
case 20://板名称
case 23://板名称
vo.setName(value);
break;
case 21:// 自定义板编号
case 24:// 自定义板编号
vo.setPlateNo(value);
break;
case 22:// 成品长
case 25:// 成品长
vo.setHeight(value);
break;
case 23:// 成品宽
case 26:// 成品宽
vo.setWidth(value);
break;
case 24:// 拆单长
case 27:// 拆单长
vo.setSplitHeight(value);
break;
case 25:// 拆单宽
case 28:// 拆单宽
vo.setSplitWidth(value);
break;
case 26:// 厚
case 29:// 厚
vo.setThickness(value);
break;
case 27:// 左封边
case 30:// 左封边
vo.setSealLeft(value);
break;
case 28:// 右封边
case 31:// 右封边
vo.setSealRight(value);
break;
case 29:// 上封边
case 32:// 上封边
vo.setSealUp(value);
break;
case 30:// 下封边
case 33:// 下封边
vo.setSealDown(value);
break;
case 31:// 排版面
case 34:// 排版面
vo.setTypographicFace(value);
break;
case 32:// 纹路
case 35:// 纹路
vo.setTexture(value);
break;
case 33:// 开门方向
case 36:// 开门方向
vo.setOpenDoorType(value);
break;
case 34://备注1
case 37://备注1
vo.setRemark1(value);
break;
case 35://备注2
case 38://备注2
vo.setRemark2(value);
break;
case 36://备注3
case 39://备注3
vo.setRemark3(value);
break;
case 37://备注4
case 40://备注4
vo.setRemark4(value);
break;
case 38://备注5
case 41://备注5
vo.setRemark5(value);
break;
case 39://备注6
case 42://备注6
vo.setRemark6(value);
break;
case 40://备注7
case 43://备注7
vo.setRemark7(value);
break;
case 41://备注8
case 44://备注8
vo.setRemark8(value);
break;
case 42://备注9
case 45://备注9
vo.setRemark9(value);
break;
case 43://备注10
case 46://备注10
vo.setRemark10(value);
break;
default:
@@ -318,272 +333,215 @@ public class ExcelReadUtil { // 文件读取
return vo;
}
// OrderPlateImportExcelVO 数据验证
private Boolean checkVO(OrderPlateImportExcelVO vo) {
List<String> errList = new ArrayList<>();
Boolean flag = true;
// 检查非空 类型、数量
if (StringUtils.isEmpty(vo.getGoodType())) {
errList.add("类型不能为空");
flag = false;
// 错误判断通用方法
// 判断非零,错误返回;不为空时,判断是否符合枚举类
private void isNotEmptyAndBack(String value, Class<? extends Enum<?>> enumClass, List<String> errList, String errValue, int length , AtomicBoolean flag) {
if (StringUtils.isEmpty(value)) {
errList.add(errValue + NOT_EMPTY);
flag.set(false);
} else {
isEmptyAndSize(value, length, errList, errValue, flag);
try {
// 获取枚举类的所有值
Enum<?>[] enums = enumClass.getEnumConstants();
boolean isValid = false;
for (Enum<?> enumValue : enums) {
Field valueField = enumValue.getClass().getDeclaredField("value");
valueField.setAccessible(true);
String enumValueStr = (String) valueField.get(enumValue);
if (enumValueStr.equals(value)) {
isValid = true;
break;
}
}
if (!isValid) {
errList.add(errValue + ACCORD_ENUM);
flag.set(false);
}
} catch (IllegalArgumentException e) {
errList.add(errValue + ACCORD_ENUM);
flag.set(false);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
if (StringUtils.isEmpty(vo.getGoodsNumber())) {
errList.add("数量不能为空");
flag = false;
}else {
if (!convertToDouble(vo.getGoodsNumber())) {
flag = false;
errList.add(NUMBER_TYPE_ERR);
}
// 非零判断,有值判断---判断数值类型,数值长度
private void isEmptyAndPositiveNumberSize(String value, Class<?> targetType, Integer length, Integer decimalLength, List<String> errList, String errValue, AtomicBoolean flag) {
if (StringUtils.isNotEmpty(value)) {
if (Boolean.TRUE.equals(ToolUtil.convertToType(value, targetType))) {
if (Boolean.TRUE.equals(ToolUtil.checkNumber(value))) {
if (!ToolUtil.checkPrecision(value, length, decimalLength)) {
errList.add(errValue + NUMBER_LENGTH_ERR);
flag.set(false);
}
} else {
errList.add(errValue + POSITIVE_ERR);
flag.set(false);
}
} else {
errList.add(errValue + NUMBER_TYPE_ERR);
flag.set(false);
}
}
}
// 判断非零,错误返回
private void isNotEmptyAndBack(String value, List<String> errList, String errValue, AtomicBoolean flag) {
if (StringUtils.isEmpty(value)) {
errList.add(errValue + NOT_EMPTY);
flag.set(false);
}
}
// 判断非空,有值判断字符串的长度
private void isEmptyAndSize(String value, Integer length, List<String> errList, String errValue, AtomicBoolean flag) {
if (StringUtils.isNotEmpty(value)) {
int size = value.length();
if (size > length) {
errList.add(errValue + NUMBER_LENGTH_ERR);
flag.set(false);
}
}
}
// 非空判断,错误填入
private void isEmpty(String value, List<String> errList, String errValue, int length, AtomicBoolean flag) {
if (StringUtils.isEmpty(value)) {
errList.add(errValue + NOT_EMPTY);
flag.set(false);
} else {
// 字符串长度检查
int size = value.length();
if (size > length) {
errList.add(errValue + NUMBER_LENGTH_ERR);
flag.set(false);
}
}
}
// 判断非空,大于零判断
public void isEmptyAndPositiveNumber(String value, Class<?> targetType, List<String> errList, String errValue, AtomicBoolean flag) {
if (StringUtils.isNotEmpty(value)) {
if (Boolean.FALSE.equals(ToolUtil.convertToType(value, targetType))) {
errList.add(errValue + NUMBER_TYPE_ERR);
flag.set(false);
}else {
if (!checkNumber(vo.getGoodsNumber())) {
flag = false;
errList.add("数量不能为0");
if (Boolean.FALSE.equals(checkNumber(value))) {
errList.add(errValue + "数量不能为0");
flag.set(false);
}
}
}
}
// 判断非空,字典值判断
public void isNotEmptyAndDict(String value, String dictType, List<String> errList, String errValue, AtomicBoolean flag) {
if (StringUtils.isEmpty(value)) {
errList.add(errValue + NOT_EMPTY);
flag.set(false);
} else {
DictDataRespDTO dictDataRespDTO = dictDataApi.parseDictData(dictType, value).getData();
if (dictDataRespDTO == null) {
errList.add(errValue + ACCORD_ENUM);
flag.set(false);
}
}
}
// 板材的数据以及长度的检验
public void checkPlate(OrderPlateImportExcelVO vo, List<String> errList , AtomicBoolean flag) {
// 数量类型判断
isEmptyAndPositiveNumber(vo.getGoodsNumber(), Integer.class, errList, "板材数量", flag);
// 板材纹理
isNotEmptyAndBack(vo.getWave(), IsHavaeEnum.class, errList, "板材纹理", 4, flag);
// 大板的长宽厚存在以及是否符合数个
isNotEmptyAndBack(vo.getGoodsWidth(), errList, "板材长度", flag);
isEmptyAndPositiveNumberSize(vo.getGoodsWidth(), Double.class, 5, 3, errList, "板材长度", flag);
isNotEmptyAndBack(vo.getGoodsHeight(), errList, "板材宽度", flag);
isEmptyAndPositiveNumberSize(vo.getGoodsHeight(), Double.class, 5, 3, errList, "板材宽度", flag);
isNotEmptyAndBack(vo.getGoodsThickness(), errList, "板材厚度", flag);
isEmptyAndPositiveNumberSize(vo.getGoodsThickness(), Double.class, 5, 3, errList, "板材厚度", flag);
// 房间、柜体、板名称 不可以为空
isEmpty(vo.getRoomsName(), errList, "房间名称", 64, flag);
isEmpty(vo.getCabinetsName(), errList, "柜体名称", 64, flag);
isEmpty(vo.getName(), errList, "板材名称", 64, flag);
//成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边 不能为空
isNotEmptyAndBack(vo.getHeight(), errList, "成品长度", flag);
isEmptyAndPositiveNumberSize(vo.getHeight(), Double.class, 5, 3, errList, "成品长度", flag);
isNotEmptyAndBack(vo.getWidth(), errList, "成品宽度", flag);
isEmptyAndPositiveNumberSize(vo.getWidth(), Double.class, 5, 3, errList, "成品宽度", flag);
isNotEmptyAndBack(vo.getSplitHeight(), errList, "拆单长度", flag);
isEmptyAndPositiveNumberSize(vo.getSplitHeight(), Double.class, 5, 3, errList, "拆单长度", flag);
isNotEmptyAndBack(vo.getSplitWidth(), errList, "拆单宽度", flag);
isEmptyAndPositiveNumberSize(vo.getSplitWidth(), Double.class, 5, 3, errList, "拆单宽度", flag);
isNotEmptyAndBack(vo.getThickness(), errList, "厚度", flag);
isEmptyAndPositiveNumberSize(vo.getThickness(), Double.class, 5, 3, errList, "厚度", flag);
isNotEmptyAndBack(vo.getSealLeft(), errList, "左封边", flag);
isEmptyAndPositiveNumberSize(vo.getSealLeft(), Double.class, 5, 3, errList, "左封边", flag);
isNotEmptyAndBack(vo.getSealRight(), errList, "右封边", flag);
isEmptyAndPositiveNumberSize(vo.getSealRight(), Double.class, 5, 3, errList, "右封边", flag);
isNotEmptyAndBack(vo.getSealUp(), errList, "上封边", flag);
isEmptyAndPositiveNumberSize(vo.getSealUp(), Double.class, 5, 3, errList, "上封边", flag);
isNotEmptyAndBack(vo.getSealDown(), errList, "下封边", flag);
isEmptyAndPositiveNumberSize(vo.getSealDown(), Double.class, 5, 3, errList, "下封边", flag);
// 排版面、纹路、开门方向
isNotEmptyAndDict(vo.getTypographicFace(), DictTypeConstants.TYPOGRAPHY_TYPE, errList, "排版面", flag);
isNotEmptyAndDict(vo.getTexture(), DictTypeConstants.GRAIN_TYPE, errList, "纹路", flag);
isNotEmptyAndDict(vo.getOpenDoorType(), DictTypeConstants.DOOR_OPENING_DIRECTIONS, errList, "开门方向", flag);
}
// OrderPlateImportExcelVO 数据验证
private Boolean checkVO(OrderPlateImportExcelVO vo) {
List<String> errList = new ArrayList<>();
AtomicBoolean flag = new AtomicBoolean(true);
// 全部需要值的字段
// 检查非空 类型、数量
isEmpty(vo.getGoodType(), errList, "类型",32, flag);
isEmpty(vo.getGoodsNumber(), errList, "数量", 10000000 ,flag);
// 检查商品物料编码或是商品名称、规格、材质、颜色不可全为空
if (StringUtils.isEmpty(vo.getGoodsName()) || StringUtils.isEmpty(vo.getSpec())
|| StringUtils.isEmpty(vo.getMaterial()) || StringUtils.isEmpty(vo.getColor()) || StringUtils.isEmpty(vo.getUnit())) {
errList.add("商品商品名称、规格、材质、颜色、单位不可为空");
flag = false;
flag.set(false);
}
if (StringUtils.equals(vo.getGoodType(), "配件")) {
// 复合部件必填
isNotEmptyAndBack(vo.getIsComposite(), QuarrelEnum.class, errList, "是否复合部件", 1, flag); // 判断传入的值,是否符合字典中的枚举类
// 配件类型必填
isNotEmptyAndBack(vo.getCategory(), CategoryEnum.class, errList, "配件类型", 32, flag);
// 配件长宽厚,存在判断是否可以转义
isEmptyAndPositiveNumberSize(vo.getGoodsWidth(), Double.class, 5, 3, errList, "配件宽", flag);
isEmptyAndPositiveNumberSize(vo.getGoodsHeight(), Double.class, 5, 3, errList, "配件高", flag);
isEmptyAndPositiveNumberSize(vo.getGoodsThickness(), Double.class, 5, 3, errList, "配件厚", flag);
// 配件类型为封边条的时候,需要填写配件宽厚
if (StringUtils.equals(vo.getCategory(), CategoryEnum.EDGING.getValue())) { // 封边条必须有宽高
isNotEmptyAndBack(vo.getGoodsWidth(), errList, "封边条宽", flag);
isNotEmptyAndBack(vo.getGoodsThickness(), errList, "封边条厚", flag);
}
// 配件数量判断
isEmptyAndPositiveNumber(vo.getGoodsNumber(), Double.class, errList, "配件数量", flag);
}
// 若商品类型为板材,需检查房间、柜体、板名称、成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边、排版面、纹路、开门方向不能为空
if (StringUtils.equals(vo.getGoodType(), "板材")) {
// 数量类型判断
if (!convertToInteger(vo.getGoodsNumber())) {
flag = false;
if (errList.contains(NUMBER_TYPE_ERR)){
Iterator<String> iterator = errList.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
if (NUMBER_TYPE_ERR.equals(element)) {
iterator.remove();
}
}
errList.add("板材数量类型需为整数");
}else {
errList.add(NUMBER_TYPE_ERR);
}
}
// 纹理有效性判断
if (StringUtils.isEmpty(vo.getWave())) {
errList.add("板材纹理不可为空");
flag = false;
} else {
if (!StringUtils.equals(vo.getWave().trim(), "") && !StringUtils.equals(vo.getWave().trim(), "")) {
flag = false;
errList.add("纹理无效");
}
}
// 大板长宽厚数据不可为空
if (StringUtils.isEmpty(vo.getGoodsHeight()) && StringUtils.isEmpty(vo.getGoodsWidth()) && StringUtils.isEmpty(vo.getGoodsThickness())) {
flag = false;
errList.add("板材长宽厚数据不能为空");
} else {
// 大板长宽厚数据不为空,检查数据格式
if (!convertToDouble(vo.getGoodsHeight())) {
flag = false;
errList.add("板材长数据类型错误");
} else {
if (!checkPrecision(vo.getGoodsHeight())) {
flag = false;
errList.add("板材长数据长度错误");
}
}
if (!convertToDouble(vo.getGoodsWidth())) {
flag = false;
errList.add("板材宽数据类型错误");
} else {
if (!checkPrecision(vo.getGoodsWidth())) {
flag = false;
errList.add("板材宽数据长度错误");
}
}
if (!convertToDouble(vo.getGoodsThickness())) {
flag = false;
errList.add("板材厚数据类型错误");
} else {
if (!checkPrecision(vo.getGoodsThickness())) {
flag = false;
errList.add("板材厚数据长度错误");
}
}
}
if (StringUtils.isEmpty(vo.getRoomsName()) && StringUtils.isEmpty(vo.getCabinetsName()) && StringUtils.isEmpty(vo.getName())) {
flag = false;
errList.add("房间、柜体、板名称不能为空");
}
//成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边 不能为空
if (StringUtils.isEmpty(vo.getHeight()) || StringUtils.isEmpty(vo.getWidth()) || StringUtils.isEmpty(vo.getSplitHeight())
|| StringUtils.isEmpty(vo.getSplitWidth()) || StringUtils.isEmpty(vo.getThickness()) || StringUtils.isEmpty(vo.getSealLeft())
|| StringUtils.isEmpty(vo.getSealRight()) || StringUtils.isEmpty(vo.getSealUp()) || StringUtils.isEmpty(vo.getSealDown())) {
flag = false;
errList.add("小板轮廓数据不能为空");
} else { // 成品长、成品宽、拆单长、拆单宽、厚、左封边、右封边、上封边、下封边 数据类型以及长度验证
if (!convertToDouble(vo.getHeight())) {
flag = false;
errList.add("成品长数据类型错误");
} else {
if (!checkPrecision(vo.getHeight())) {
flag = false;
errList.add("成品长数据长度错误");
}
}
if (!convertToDouble(vo.getWidth())) {
flag = false;
errList.add("成品宽数据类型错误");
} else {
if (!checkPrecision(vo.getWidth())) {
flag = false;
errList.add("成品宽数据长度错误");
}
}
if (flag) {
Double plateHeight = Double.parseDouble(vo.getHeight());
Double plateWidth = Double.parseDouble(vo.getWidth());
vo.setArea(plateHeight * plateWidth * 0.000001);
}
if (!convertToDouble(vo.getSplitHeight())) {
flag = false;
errList.add("拆单长数据类型错误");
} else {
if (!checkPrecision(vo.getSplitHeight())) {
flag = false;
errList.add("拆单长数据长度错误");
}
}
if (!convertToDouble(vo.getSplitWidth())) {
flag = false;
errList.add("拆单宽数据类型错误");
} else {
if (!checkPrecision(vo.getSplitWidth())) {
flag = false;
errList.add("拆单宽数据长度错误");
}
}
if (!convertToDouble(vo.getThickness())) {
flag = false;
errList.add("厚数据类型错误");
} else {
if (!checkPrecision(vo.getThickness())) {
flag = false;
errList.add("厚数据长度错误");
}
}
if (!convertToDouble(vo.getSealLeft())) {
flag = false;
errList.add("左封边数据类型错误");
} else {
if (!checkPrecision(vo.getSealLeft())) {
flag = false;
errList.add("左封边数据长度错误");
}
}
if (!convertToDouble(vo.getSealRight())) {
flag = false;
errList.add("右封边数据类型错误");
} else {
if (!checkPrecision(vo.getSealRight())) {
flag = false;
errList.add("右封边数据长度错误");
}
}
if (!convertToDouble(vo.getSealUp())) {
flag = false;
errList.add("上封边数据类型错误");
} else {
if (!checkPrecision(vo.getSealUp())) {
flag = false;
errList.add("上封边数据长度错误");
}
}
if (!convertToDouble(vo.getSealDown())) {
flag = false;
errList.add("下封边数据类型错误");
} else {
if (!checkPrecision(vo.getSealDown())) {
flag = false;
errList.add("下封边数据长度错误");
}
}
}
// 排版面、纹路、开门方向
if (StringUtils.isEmpty(vo.getTypographicFace()) && StringUtils.isEmpty(vo.getTexture()) && StringUtils.isEmpty(vo.getOpenDoorType())) {
flag = false;
errList.add("排版面、纹路、开门方向不能为空");
} else {
DictDataRespDTO typographyDTO = dictDataApi.parseDictData(DictTypeConstants.TYPOGRAPHY_TYPE, vo.getTypographicFace()).getData();// 排版面
if (typographyDTO == null) {
flag = false;
errList.add("排版面数据不存在");
}
DictDataRespDTO grainDTO = dictDataApi.parseDictData(DictTypeConstants.GRAIN_TYPE, vo.getTexture()).getData();// 纹路
if (grainDTO == null) {
flag = false;
errList.add("纹路数据不存在");
}
DictDataRespDTO doorDTO = dictDataApi.parseDictData(DictTypeConstants.DOOR_OPENING_DIRECTIONS, vo.getOpenDoorType()).getData();
if (doorDTO == null) {
flag = false;
errList.add("开门方向数据不存在");
}
}
checkPlate(vo, errList, flag);
}
if (!flag) {
if (!flag.get()) {
isErr.getAndIncrement();
}
JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(errList));// 错误列表
vo.setResult(String.valueOf(jsonArray));
return flag;
return flag.get();
}
// 数据类型可否转换判断
public Boolean convertToDouble(String str) {
try {
Double.parseDouble(str);
} catch (NumberFormatException e) {
return false;
}
return true;
}
// 数据类型可否转换判断
public Boolean convertToInteger(String str) {
try {
Integer.parseInt(str);
} catch (NumberFormatException e) {
return false;
}
return true;
}
// 数据长度判断
public boolean checkPrecision(String numberStr) {
if (numberStr == null) {
return false;
}
// 分割整数部分和小数部分
String[] parts = numberStr.split("\\.");
String integerPart = parts[0];
String decimalPart = parts.length > 1 ? parts[1] : "";
// 检查整数部分位数
if (integerPart.length() > 5) {
return false;
}
// 检查小数部分位数
if (decimalPart.length() > 3) {
return false;
}
return true;
}
public int isErr() {
return isErr.get();
@@ -238,8 +238,14 @@ public class ExcelTypeRealize {
} else {
//配件
Long partsId = (Long) snowFlakeGenerator.nextId(null);
OrderPartsDO orderPartsDO = OrderPartsDO.builder().id(partsId).orderId(orderId).goodsId(combination.getGoodsId())
.color(combination.getColor()).category(combination.getCategory()).type(combination.getType())
.length(Double.valueOf(StringUtils.isEmpty(combination.getGoodsHeight()) ? "0" : combination.getGoodsHeight()))
.width(Double.valueOf(StringUtils.isEmpty(combination.getGoodsWidth()) ? "0" : combination.getGoodsWidth()))
.thickness(Double.valueOf(StringUtils.isEmpty(combination.getGoodsThickness()) ? "0" : combination.getGoodsThickness()))
.isComposite(Boolean.valueOf(combination.getIsComposite()))
.name(combination.getGoodsName()).material(combination.getMaterial()).type(combination.getGoodType())
.model(combination.getModel()).spec(combination.getSpec()).brand(combination.getBrand()).factory(combination.getFactory())
.unit(combination.getUnit()).price(0.0).isComposite(false).remark(remarkExtract(combination.remarkJSON())).isComposite(false).build();
@@ -60,6 +60,18 @@ public class OrderPlateImportExcelVO {
@JsonIgnore
private String color;
@ExcelProperty(value = "复合部件")
@JsonIgnore
private String isComposite;
@ExcelProperty(value = "配件类型")
@JsonIgnore
private String category;
@ExcelProperty(value = "配件子类")
@JsonIgnore
private String type;
@ExcelProperty(value = "厂家")
@JsonIgnore
private String factory;
@@ -72,15 +84,15 @@ public class OrderPlateImportExcelVO {
@JsonIgnore
private String model;
@ExcelProperty(value = "板材长")
@ExcelProperty(value = "板材/配件")
@JsonIgnore
private String goodsHeight;
@ExcelProperty(value = "板材宽")
@ExcelProperty(value = "板材/配件")
@JsonIgnore
private String goodsWidth;
@ExcelProperty(value = "板材厚")
@ExcelProperty(value = "板材/配件")
@JsonIgnore
private String goodsThickness;
@@ -225,12 +225,9 @@
g.thickness,
g.remark,
g.spec,
sub.order_id,
sub.totalPlates AS number,
sub.totalArea AS area,
sub.room_id,
sub.body_id,
sub.group_id
SUM(sub.totalPlates) AS number,
SUM(sub.totalArea) AS area
FROM (
SELECT
i.room_id,
@@ -243,7 +240,7 @@
SUM(p.area) AS totalArea
FROM
order_item i
RIGHT JOIN
RIGHT JOIN
order_plate p ON i.organ_id = p.organ_id AND i.order_id = p.order_id AND i.plate_id = p.id
WHERE
i.organ_id = #{organId} AND i.order_id = #{orderId} AND p.deleted = #{deleted}
@@ -277,6 +274,8 @@
) sub
LEFT JOIN
order_goods g ON sub.organ_id = g.organ_id AND sub.order_id = g.order_id AND sub.goods_id = g.id
GROUP BY
g.id, g.order_id, g.brand, g.goods_id, g.goods_name, g.material, g.texture, g.color, g.color_black, g.width, g.height, g.thickness, g.remark, g.spec;
</select>
</mapper>