新增配件管理、板材详情

This commit is contained in:
lym
2024-11-08 09:24:34 +08:00
parent e16583e3a8
commit 7c24a7453c
53 changed files with 2648 additions and 532 deletions
@@ -409,7 +409,7 @@ public class OrderController {
} }
@PostMapping("/get-platesDetailsPage") @PostMapping("/get-platesDetailsPage")
@Operation(summary = "生产单详情-板详细信息(分页)") @Operation(summary = "生产单详情-板详细信息(分页)")
@PreAuthorize("@ss.hasPermission('production:manager-list:detail')") @PreAuthorize("@ss.hasPermission('production:manager-list:detail')")
public CommonResult<PageResult<OrderPlatesDetailReqVO>> platesDetails(@Valid @RequestBody OrderBodyPageRespVO orderBodyPageRespVO) { public CommonResult<PageResult<OrderPlatesDetailReqVO>> platesDetails(@Valid @RequestBody OrderBodyPageRespVO orderBodyPageRespVO) {
if (orderBodyPageRespVO.getDeleted() == null) { if (orderBodyPageRespVO.getDeleted() == null) {
@@ -434,6 +434,20 @@ public class OrderController {
orderBodyPageRespVO.getPageNo(), orderBodyPageRespVO.getPageSize(), !orderBodyPageRespVO.getDeleted() ? 0 : 1)); orderBodyPageRespVO.getPageNo(), orderBodyPageRespVO.getPageSize(), !orderBodyPageRespVO.getDeleted() ? 0 : 1));
} }
@PostMapping("/get-goodsDetailsPage")
@Operation(summary = "生产单详情-板材详细信息(分页)")
@PreAuthorize("@ss.hasPermission('production:manager-list:detail')")
public CommonResult<PageResult<OrderGoodsDetailRespVO>> goodsDetails(@Valid @RequestBody OrderBodyPageRespVO orderBodyPageRespVO) {
if (orderBodyPageRespVO.getDeleted() == null) {
orderBodyPageRespVO.setDeleted(false);
}
return success(orderService.getGoodsDetail(orderBodyPageRespVO.getOrderId(),
orderBodyPageRespVO.getRoomIds(), orderBodyPageRespVO.getBodyIds(),
orderBodyPageRespVO.getGroupIds(), orderBodyPageRespVO.getGoodsId(),
orderBodyPageRespVO.getPageNo(), orderBodyPageRespVO.getPageSize(), !orderBodyPageRespVO.getDeleted() ? 0 : 1));
}
@DeleteMapping("/delete-body") @DeleteMapping("/delete-body")
@Operation(summary = "删除柜体") @Operation(summary = "删除柜体")
@PreAuthorize("@ss.hasPermission('production:manager-list:deleteCabinet')") @PreAuthorize("@ss.hasPermission('production:manager-list:deleteCabinet')")
@@ -32,6 +32,9 @@ public class OrderBodyPageRespVO extends PageParam {
@Schema(description = "配件名称", example = "1024") @Schema(description = "配件名称", example = "1024")
private String partsName; private String partsName;
@Schema(description = "板材id", example = "1024")
private Set<Long> goodsId;
@Schema(description = "是否删除", example = "false") @Schema(description = "是否删除", example = "false")
private Boolean deleted; private Boolean deleted;
} }
@@ -0,0 +1,59 @@
package com.cf.imes.module.executor.controller.admin.order.vo.order;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 生产单板材表 order_parts_{N} Response VO")
@Data
@ExcelIgnoreUnannotated
public class OrderGoodsDetailRespVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED)
private Long orderId;
@Schema(description = "客户的商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private String goodsId;
@Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
private String goodsName;
@Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED)
private String material;
@Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED)
private String color;
@Schema(description = "纹理", example = "true")
private Boolean texture;
@Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED)
private Double width;
@Schema(description = "高度", requiredMode = Schema.RequiredMode.REQUIRED)
private Double height;
@Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED)
private Double thickness;
@Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED)
private String brand;
@Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED)
private String spec;
@Schema(description = "小板片数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer number;
@Schema(description = "小板总面积", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Double area;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "随便")
private String remark;
private Long organId;
}
@@ -0,0 +1,38 @@
package com.cf.imes.module.executor.controller.admin.order.vo.order;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 板材生产单关系表
*/
@Schema(description = "管理后台 - 板材生产单关系表 order Response VO")
@Data
@ExcelIgnoreUnannotated
public class OrderGoodsRespVO {
@Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20230414026120")
private Long orderId;
@Schema(description = "房间Id", requiredMode = Schema.RequiredMode.REQUIRED)
private Long roomId;
@Schema(description = "柜体Id", requiredMode = Schema.RequiredMode.REQUIRED)
private Long bodyId;
@Schema(description = "加工组Id", requiredMode = Schema.RequiredMode.REQUIRED)
private Long groupId;
@Schema(description = "板材名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String goodsName;
@Schema(description = "板材id", requiredMode = Schema.RequiredMode.REQUIRED)
private Long goodsId;
@Schema(description = "小板片数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer totalPlates;
@Schema(description = "小班面积", requiredMode = Schema.RequiredMode.REQUIRED)
private Double totalArea;
}
@@ -21,7 +21,7 @@ public class OrderPlatesDetailReqVO {
@Schema(description = "板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰") @Schema(description = "板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰")
private String name; private String name;
@Schema(description = "自定义板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰") @Schema(description = "板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰")
private String plateNo; private String plateNo;
@Schema(description = "材质", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰") @Schema(description = "材质", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰")
@@ -23,7 +23,7 @@ public class OrderPartsRemark extends ESDocument {
@Schema(description = "备注") @Schema(description = "备注")
private String remark; private String remark;
@Schema(description = "五金额外规格") @Schema(description = "额外规格")
private String specExtras; private String specExtras;
@Schema(description = "门板组件铰链备注") @Schema(description = "门板组件铰链备注")
@@ -38,7 +38,7 @@ public class PlateDO extends BaseDO {
*/ */
private String name; private String name;
/** /**
* 自定义板编号,设计有板编号,则保留设计板编号;设计没有且在机台设置中设置了自定义板编号规则,则按规则自动生成 * 组织中唯一板编号
*/ */
private String plateNo; private String plateNo;
/** /**
@@ -3,6 +3,8 @@ package com.cf.imes.module.executor.dal.mysql.orderItem;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsDetailRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsRespVO;
import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlatesDetailRespVO; import com.cf.imes.module.executor.controller.admin.order.vo.order.OrderPlatesDetailRespVO;
import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO; import com.cf.imes.module.executor.controller.admin.orderParts.vo.OrderPartsRespVO;
import com.cf.imes.module.executor.controller.admin.plate.vo.PlateDetailReqVO; import com.cf.imes.module.executor.controller.admin.plate.vo.PlateDetailReqVO;
@@ -117,4 +119,12 @@ public interface OrderItemMapper extends BaseMapperX<OrderItemDO> {
void deletePackList(@Param("orderId") Long orderId,@Param("packIds") List<Long> packIds,@Param("organId") Long organId); void deletePackList(@Param("orderId") Long orderId,@Param("packIds") List<Long> packIds,@Param("organId") Long organId);
List<OrderGoodsRespVO> selectGoodsByOrderId(@Param("orderId") Long orderId,
@Param("organId") Long organId,
@Param("deleted") Integer deleted);
IPage<OrderGoodsDetailRespVO> selectGoodsDetailByOrderId(@Param("page") IPage page, @Param("orderId") Long orderId, @Param("roomId") Set<Long> roomId,
@Param("bodyId") Set<Long> bodyId, @Param("groupId") Set<Long> groupId, @Param("goodsId") Set<Long> goodsId,
@Param("organId") Long organId, @Param("deleted") Integer deleted);
} }
@@ -105,10 +105,14 @@ public class OrderInputProcessor {
* @param itemDOS * @param itemDOS
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void batchInsert(Collection<RawGoodsDO> rawGoodsDOS, Collection<OrderBodyDO> orderBodyDOS, public void batchInsert(Collection<RawGoodsDO> rawGoodsDOS,
Collection<OrderGroupDO> orderGroupDOS, Collection<OrderPartsDO> orderPartsDOS, Collection<OrderBodyDO> orderBodyDOS,
Collection<PlateDO> plateDOS, Collection<OrderItemDO> itemDOS, Collection<OrderGroupDO> orderGroupDOS,
Collection<GoodsDO> goodsDOS, Collection<PlateGoodDO> plateGoodDOS) { Collection<OrderPartsDO> orderPartsDOS,
Collection<PlateDO> plateDOS,
Collection<OrderItemDO> itemDOS,
Collection<GoodsDO> goodsDOS,
Collection<PlateGoodDO> plateGoodDOS) {
// if (rawGoodsDOS != null) // if (rawGoodsDOS != null)
@@ -82,6 +82,15 @@ public interface OrderService {
*/ */
PageResult<OrderPartsRespVO> getPartsDetail(Long orderId, Set<Long> roomId , Set<Long> bodyId, Set<Long> groupId, String name, Integer pageNo, Integer pageSize, Integer deleted); PageResult<OrderPartsRespVO> getPartsDetail(Long orderId, Set<Long> roomId , Set<Long> bodyId, Set<Long> groupId, String name, Integer pageNo, Integer pageSize, Integer deleted);
/**
* @param orderId: 生产单id
* @param roomId: 房间id
* @param bodyId: 柜体id
* @return List<OrderGoodsDetailRespVO>
* 需要修改返回值
*/
PageResult<OrderGoodsDetailRespVO> getGoodsDetail(Long orderId, Set<Long> roomId , Set<Long> bodyId, Set<Long> groupId, Set<Long> goodsId, Integer pageNo, Integer pageSize, Integer deleted);
/** /**
* 删除柜体/柜体还原 * 删除柜体/柜体还原
* @param orderId: 生产单id * @param orderId: 生产单id
@@ -95,8 +104,6 @@ public interface OrderService {
/** /**
* @param listMap:生产单号 * @param listMap:生产单号
* @return Boolean * @return Boolean
* @author Administrator
* @date 2024/3/30
*/ */
Long importApiData(Map<String, Object> listMap); Long importApiData(Map<String, Object> listMap);
@@ -49,6 +49,7 @@ import com.cf.imes.module.executor.dal.mysql.rawgoods.RawGoodsMapper;
import com.cf.imes.module.executor.enums.OrderDeletedEnum; import com.cf.imes.module.executor.enums.OrderDeletedEnum;
import com.cf.imes.module.executor.enums.OrderStatusEnum; import com.cf.imes.module.executor.enums.OrderStatusEnum;
import com.cf.imes.module.executor.service.plan.PlanService; import com.cf.imes.module.executor.service.plan.PlanService;
import com.cf.imes.module.executor.util.deviseData.structure.FieldConstants;
import com.cf.imes.module.executor.util.deviseData.structure.PlateDetail; import com.cf.imes.module.executor.util.deviseData.structure.PlateDetail;
import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd; import com.cf.imes.module.executor.util.fileConversion.admin.SnowflakeIdWorker3rd;
import org.springframework.aop.framework.AopContext; import org.springframework.aop.framework.AopContext;
@@ -215,9 +216,13 @@ public class OrderServiceImpl implements OrderService {
// 配件 // 配件
List<OrderPlatesDetailRespVO> orderItemDOS = orderItemMapper.selectPartsByOrderId(orderId, getUserOrganId(), deleted); List<OrderPlatesDetailRespVO> orderItemDOS = orderItemMapper.selectPartsByOrderId(orderId, getUserOrganId(), deleted);
// 板材
List<OrderGoodsRespVO> orderGoodsRespVOS = orderItemMapper.selectGoodsByOrderId(orderId, getUserOrganId(), deleted);
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("module", orderModuleRespVOList); map.put("module", orderModuleRespVOList);
map.put("parts", orderItemDOS); map.put("parts", orderItemDOS);
map.put("goods", orderGoodsRespVOS);
return map; return map;
} }
@@ -241,6 +246,15 @@ public class OrderServiceImpl implements OrderService {
return new PageResult(orderDetail.getRecords(), orderDetail.getTotal()); return new PageResult(orderDetail.getRecords(), orderDetail.getTotal());
} }
@Override
public PageResult<OrderGoodsDetailRespVO> getGoodsDetail(Long orderId, Set<Long> roomId, Set<Long> bodyId, Set<Long> groupId, Set<Long> goodsId, Integer pageNo, Integer pageSize, Integer deleted) {
PageDTO<OrderGoodsDetailRespVO> page = new PageDTO<>(pageNo, pageSize);
IPage<OrderGoodsDetailRespVO> goodsDetail = orderItemMapper.selectGoodsDetailByOrderId(page, orderId, roomId, bodyId, groupId, goodsId, getUserOrganId(), deleted);
return new PageResult(goodsDetail.getRecords(), goodsDetail.getTotal());
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateDeleteBody(Long orderId, Set<Long> roomIds, Long bodyId, Integer status) { // 要删除传1,还原传0 public void updateDeleteBody(Long orderId, Set<Long> roomIds, Long bodyId, Integer status) { // 要删除传1,还原传0
@@ -369,7 +383,7 @@ public class OrderServiceImpl implements OrderService {
List<OrderBodyDO> bodyDO = (List<OrderBodyDO>) listMap.get("bodyDO"); List<OrderBodyDO> bodyDO = (List<OrderBodyDO>) listMap.get("bodyDO");
List<OrderGroupDO> groupDO = (List<OrderGroupDO>) listMap.get("groupDO"); List<OrderGroupDO> groupDO = (List<OrderGroupDO>) listMap.get("groupDO");
List<OrderPartsDO> partsDO = (List<OrderPartsDO>) listMap.get("partsDO"); List<OrderPartsDO> partsDO = (List<OrderPartsDO>) listMap.get("partsDO");
List<PlateDO> plateDO = (List<PlateDO>) listMap.get("platesDO"); List<PlateDO> plateDO = (List<PlateDO>) listMap.get(FieldConstants.PLATE);
List<PlateDetail> plateDetail = (List<PlateDetail>) listMap.get("plateDetail"); List<PlateDetail> plateDetail = (List<PlateDetail>) listMap.get("plateDetail");
List<OrderItemDO> itemDO = (List<OrderItemDO>) listMap.get("itemDO"); List<OrderItemDO> itemDO = (List<OrderItemDO>) listMap.get("itemDO");
List<OrderPartsRemark> partsRemark = (List<OrderPartsRemark>) listMap.get("partsRemark"); List<OrderPartsRemark> partsRemark = (List<OrderPartsRemark>) listMap.get("partsRemark");
@@ -0,0 +1,20 @@
package com.cf.imes.module.executor.util.deviseData.structure;
/**
* 数据格式转换对应的常量
*/
public class FieldConstants {
public static final String ORDER = "orderDO";
public static final String BODY = "bodyDO";
public static final String GROUP = "groupDO";
public static final String GOODS = "goodsDO";
public static final String RAW_GOODS = "rawGoodsDO";
public static final String PARTS = "partsDO";
public static final String PLATE = "plateDO";
public static final String ITEM = "itemDO";
public static final String PLATE_DETAIL = "plateDetail";
public static final String PARTS_REMARK = "partsRemark";
}
@@ -1,7 +1,6 @@
package com.cf.imes.module.executor.util.deviseData.structure; package com.cf.imes.module.executor.util.deviseData.structure;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -57,7 +56,7 @@ public class PlateDetail{
// 板材所属加工组 // 板材所属加工组
private String group;// 板件加工组Group的名称,可以有多个 private String group;// 板件加工组Group的名称,可以有多个
// 加工组具体信息 // 加工组具体信息
private List<Group> groupList; // private List<Group> groupList;
// 成品长宽、面积 // 成品长宽、面积
private BigDecimal plateWidth; private BigDecimal plateWidth;
@@ -83,11 +82,11 @@ public class PlateDetail{
private BigDecimal offsetY; private BigDecimal offsetY;
// 大板基本信息 // 大板基本信息
private BoardInfo boardInfo; // private BoardInfo boardInfo;
// 配件基本信息 // 配件基本信息
private List<PartsInfo> partsInfos; private List<PartsInfo> partsInfos; // xml中有,估计之后不需要
// 排钻类型 // 排钻类型
private List<DrillsInfo> drillsInfos; private List<DrillsInfo> drillsInfos; // api中有
private Double throughHoleCount; // 挖孔的孔数 private Double throughHoleCount; // 挖孔的孔数
private Double throughModelCount; // 挖穿的造型数 private Double throughModelCount; // 挖穿的造型数
@@ -103,11 +102,11 @@ public class PlateDetail{
private List<PointDetail> rawPointDetail ; //原始点明细(含封边) private List<PointDetail> rawPointDetail ; //原始点明细(含封边)
private List<PointDetail> basePointDetail ; //坯料点明细 private List<PointDetail> basePointDetail ; //坯料点明细
private Map<String,Integer> holeCount;//孔类型数量集合 private Map<String,Integer> holeCount;//孔类型数量集合 (xml中特有----孔类型,对应的数量)
private List<HoleDetail> holeDetail ; //孔明细,表示板上的孔 private List<HoleDetail> holeDetail ; //孔明细,表示板上的孔
private Map<String,Integer> contourCount;//凹槽数量集合 private Map<String,Integer> contourCount;//凹槽数量集合 (xml中特有----槽所在板面的对应数量)
private List<ModelDetail> contourDetail ; //造型明细(凹槽 private List<ModelDetail> contourDetail ; //造型明细(xml中为凹槽,将孤岛的信息放入槽中
private List<ModelDetail> isletsDetail ; //造型明细(孤岛) // private List<ModelDetail> isletsDetail ; //造型明细(孤岛)不需要
private List<HoleDetail> sideHoleDetail;//侧面孔明细 private List<HoleDetail> sideHoleDetail;//侧面孔明细
@@ -50,9 +50,10 @@ public class SnowflakeIdWorker3rd {
/** 测试 */ /** 测试 */
public static void main(String[] args) { public static void main(String[] args) {
SnowflakeIdWorker3rd idWorker = new SnowflakeIdWorker3rd(); SnowflakeIdWorker3rd idWorker = new SnowflakeIdWorker3rd();
for (int i = 0; i < 1000; i++) { long obtainingTime = idWorker.obtainingTime();
for (int i = 0; i < 10001; i++) {
long id = idWorker.nextId(); long id = idWorker.nextId();
System.out.println(i + ": " + id + " " + "2406" + Long.toString(id).substring(2)); System.out.println(i + ": " + id + " " + obtainingTime + Long.toString(id).substring(2));
} }
// long id = idWorker.nextId(); // long id = idWorker.nextId();
// System.out.println(id); // System.out.println(id);
@@ -0,0 +1,282 @@
package com.cf.imes.module.executor.util.fileConversion.admin.api.webcad;
/**
* 原系统生产接口返回字段对应参数常量
*/
public class ProduceApiConstants {
public static final String VALUE = "value";
public static final String LIST = "List";
public static final String DATA = "data";
public static final String CODE = "err_code";
public static final String ZERO = "0";
public static final String ONE = "1";
// ========== getApiOrderPartsMessage partsList 配件明细模块 ==========
public static final String PD_ROOM_ID = "RoomID"; // 房间标识
public static final String PD_BOX_ID = "BoxID"; // 柜体标识
public static final String PD_NAME = "Name"; // 配件名称
public static final String PD_BRAND = "Brand"; // 配件品牌
public static final String PD_FACTORY = "Factory"; // 配件厂商
public static final String PD_ITEM_NO = "ItemNo"; // 配件编号
public static final String PD_DATA_ID = "DataID"; // 配件标识
public static final String PD_GOODS_ID = "GoodsID"; // 商品对应标识
public static final String PD_MODEL = "Model"; // 配件型号
public static final String PD_NUM = "Num"; // 配件数量
public static final String PD_SPEC = "Spec"; // 配件规格
public static final String PD_UNITS = "Units"; // 配件单位
public static final String PD_REMARK = "Remark"; // 配件备注
public static final String PD_IS_COMPOSITE = "IsComposite"; // 是否组件
public static final String PD_GROUP_NAME = "GroupName"; // 五金分类
public static final String PD_OBJECT_TYPE = "ObjectType"; // 五金类型
public static final String PD_SPEC_EXTRAS = "SpecExtras"; // 五金额外规格
public static final String PD_PARTS_SPEC = "PartsSpec"; // 配件属性
public static final String PD_PARTS_SPEC_SPEC = "spec"; // 配件属性 -> 规格
public static final String PD_PARTS_SPEC_MATERIAL = "material"; // 配件属性 -> 材质
public static final String PD_PARTS_SPEC_COLOR = "color"; // 配件属性 -> 颜色
public static final String PD_SPECIAL_REMARK = "SpecialRemark"; // 特殊备注(Json字符串)
public static final String PD_PROCESS_GROUP = "ProcessGroup"; // 五金加工组
public static final String PD_DOOR_REMARK = "DoorRemark"; // 门板组件铰链备注
public static final String PD_HINGE_REMARK = "HingeRemark"; // 门板组件拉手备注
public static final String PD_ROOM_NAME = "RoomName"; // 房间名称
public static final String PD_BOX_NAME = "BoxName"; // 柜体名称
public static final String PD_ITEM_ID = "ItemID"; // 配件ID
public static final String PD_MODULE_TYPE_ID_LIST = "ModuleTypeIDList"; // 加工组类型ID
public static final String PD_MODULE_ID_LIST = "ModuleIDList"; // 加工组ID
public static final String PD_SIZE = "Size"; // 配件尺寸
public static final String PD_LENGTH = "Length"; // 配件长
public static final String PD_WIDTH = "Width"; // 配件宽
public static final String PD_THICKNESS = "Thickness"; // 配件厚
// ========== getApiOrderBodyMessage boxsList 柜体明细模块 ==========
public static final String B_BOX_ID = "BoxID"; // 柜体标识
public static final String B_ROOM_ID = "RoomID"; // 房间标识
public static final String B_ROOM_NAME = "Room"; // 房间名
public static final String B_NAME = "Name"; // 柜体名
public static final String B_WIDTH = "Width"; // 宽
public static final String B_HEIGHT = "Height"; // 高
public static final String B_DEPTH = "Depth"; // 深
// ========== getApiOrderGoodsMessage goodsList 商品数据信息模块 ==========
public static final String G_BRAND = "Brand"; // 商品品牌
public static final String G_COLOR = "Color"; // 商品颜色
public static final String G_DOOR_ID = "GoodsID"; // 商品标识
public static final String G_GOODS_SN = "GoodsSN"; // 商品编号
public static final String G_GOODS_NAME = "GoodsName"; // 商品名称
public static final String G_HEIGHT = "Height"; // 商品长度
public static final String G_MATERIAL = "Material"; // 商品材料
public static final String G_SPEC = "Spec"; // 商品规格
public static final String G_THICKNESS = "Thickness"; // 商品厚度
public static final String G_WIDTH = "Width"; // 商品宽度
public static final String G_EXTRA_PROP = "ExtraProp"; // 额外属性
public static final String G_HAS_WAVE = "HasWave"; // 有无纹路 1:有;0:无
// ========== getApiModuleTypeDataMessage getModuleTypeList 加工组关联板件、五金信息列表模块 ==========
public static final String M_MODULE_TYPE_ID = "ModuleTypeID"; // 加工组类型ID
public static final String M_MODULE_TYPE_NAME = "ModuleTypeName"; // 加工组名称
public static final String M_MODULE_ID = "ModuleID"; // 加工组ID
public static final String M_ROOM_ID = "RoomID"; // 房间ID
public static final String M_ROOM_NAME = "RoomName"; // 房间名称
public static final String M_BOX_ID = "BoxID"; // 柜体ID
public static final String M_BOX_NAME = "BoxName"; // 柜体名称
public static final String M_LENGTH = "Length"; // 加工组长
public static final String M_WIDTH = "Width"; // 加工组宽
public static final String M_THICKNESS = "Thickness"; // 加工组厚
public static final String M_ITEM_ID_LIST = "ItemIDList"; // 加工组关联的板ID
// ========== getApiBlocksDataMessage blocksList 板块明细模块 ==========
public static final String BD_BLOCK_NO = "BlockNo"; // 板材编号
public static final String BD_BOX_ID = "BoxID"; // 柜体标识
public static final String BD_GOODS_ID = "GoodsID"; // 商品标识
public static final String BD_OPEN_DOOR_TYPE = "OpenDoorType"; // 开门类型
public static final String BD_EXTRA_REMARK = "ExtraRemark"; // 扩展备注
public static final String BD_PROCESS_GROUP = "ProcessGroup"; // 加工组
public static final String BD_GROUP_TYPE = "GroupType"; // 类型(柜体,加工组)
public static final String BD_UN_REGULAR_POINT_COUNT = "UnRegularPointCount"; // 异形数
public static final String BD_BACK_HOLE_COUNT = "BackHoleCount"; // 反面孔数
public static final String BD_FRONT_MODEL_COUNT = "FrontModelCount"; // 正面造型数
public static final String BD_BACK_MODEL_COUNT = "BackModelCount"; // 反面造型数
public static final String BD_SIDE_HOLE_COUNT = "SideHoleCount"; // 侧面孔数
public static final String BD_FRONT_HOLE_COUNT = "FrontHoleCount"; // 正面孔数
public static final String BD_CUT_LENGTH = "CutLength"; // 开料长
public static final String BD_CUT_WIDTH = "CutWidth"; // 开料宽
public static final String BD_SPECIAL_REMARK = "SpecialRemark"; // 特殊备注(Json字符串)
public static final String BD_EXTRA_HANDLE_REMARK = "ExtraHandleRemark"; // 拉手备注
public static final String BD_DRILLS_REMARK = "DrillsRemark"; // 排钻备注(Json字符串)
public static final String BD_INFO_REMARK = "InfoRemark"; //板其他备注(Json字符串)
public static final String BD_BOARD_NAME = "BoardName"; // 板名称
public static final String BD_SEALED_LEFT = "SealedLeft"; // 左封边
public static final String BD_SEALED_RIGHT = "SealedRight"; // 右封边
public static final String BD_SEALED_UP = "SealedUp"; // 上封边
public static final String BD_SEALED_DOWN = "SealedDown"; // 下封边
public static final String BD_IS_MODEL = "IsModel"; // 是否有造型
public static final String BD_IS_UN_REGULAR = "UnRegular"; // 是否异形
public static final String BD_IS_FRONT_HOLE = "FrontHole"; // 是否有正面孔
public static final String BD_IS_BACK_HOLE = "BackHole"; // 是否有反面孔
public static final String BD_IS_SIDE_HOLE = "SideHole"; // 是否有侧面孔
public static final String BD_IS_FRONT_MODEL = "FrontModel"; // 是否有正面造型
public static final String BD_IS_BACK_MODEL = "BackModel"; // 是否有反面造型
public static final String BD_BOARD_TYPE = "BoardType"; // 板类型 层板,立板,背板
public static final String BD_SPLIT_THICKNESS = "SpliteThickness"; // 拆单厚
public static final String BD_SPLIT_WIDTH = "SpliteWidth"; // 拆单宽
public static final String BD_SPLIT_HEIGHT = "SpliteHeight"; // 拆单长
public static final String BD_CUSTOMIZE_BLOCK_NO = "CustBlockNo"; // 自定义板号
public static final String BD_REMARK_JSON = "RemarkJson"; // 板件备注(Json字符串)
public static final String BD_IS_COPY = "IsCopy"; // 是否成倍拆单(false为原柜,true为成倍复制的柜子)
public static final String BD_MUL_NUM = "MultNum"; // 成倍拆单数量
public static final String BD_GROUP_NO = "GroupNo"; // 按柜(房名)名分组的柜体序号
public static final String BD_BOX_NO = "BoxNo"; // 成倍拆单柜体序号
public static final String BD_BOX_MUL_NUM = "BoxMultNum"; // 成倍拆单数量(总数、原柜和复制柜一致)
public static final String BD_ROOM_NAME = "RoomName"; // 房间名
public static final String BD_BOX_NAME = "BoxName"; // 柜体名
public static final String BD_ITEM_ID = "ItemID"; // 板ID
public static final String BD_MODULE_TYPE_ID_LIST = "ModuleTypeIDList"; // 加工组类型ID
public static final String BD_MODULE_ID_LIST = "ModuleIDList"; // 加工组ID
// ========== getApiBlocksMessage getBlocks 板件数据(概括)模块 ==========
public static final String BG_ORDER_NO = "OrderNo"; // 订单号
public static final String BG_ROOM_NAME = "RoomName"; // 房间名
public static final String BG_BOX_NAME = "BoxName"; // 柜体名
public static final String BG_BOX_ID = "BoxID"; // 柜体标识
public static final String BG_BLOCK_NO = "BlockNo"; // 板编号
public static final String BG_BOARD_NAME = "BoardName"; // 板名称
public static final String BG_GOODS_ID = "GoodsID"; // 商品标识
public static final String BG_MATERIAL = "Material"; // 材料名称
public static final String BG_COLOR = "Color"; // 颜色
public static final String BG_BRAND = "Brand"; // 品牌
public static final String BG_HEIGHT = "Height"; // 长
public static final String BG_WIDTH = "Width"; // 宽
public static final String BG_THICKNESS = "Thickness"; // 厚
public static final String BG_AREA = "Area"; // 面积
public static final String BG_WAVE = "Wave"; // 纹路(正纹 = 0, 可翻转 = 1, 反纹 = 2 )
public static final String BG_SEAL = "Seal"; // 封边信息(格式:左封边,右封边,上封边,下封边)
public static final String BG_IS_UN_REGULAR = "IsUnRegular"; // 是否异形
public static final String BG_IS_MODEL = "IsModel"; // 是否造型
public static final String BG_IS_HOLE = "IsHole"; // 是否有孔
public static final String BG_REMARK_JSON = "RemarkJson"; // 备注(Json格式)
public static final String BG_SPECIAL_REMARK = "SpecialRemark"; // 特殊备注(Json字符串)
// ========== getApiOrderList orderList 生产单列表模块 ==========
public static final String OL_ORDER_NO = "order_no"; // 订单编号
public static final String OL_CUSTOM_ORDER_NO = "custom_order_no"; // 自定义单号
public static final String OL_STORE_NAME = "store_name"; // 门店名称
public static final String OL_STORE_PHONE = "store_phone"; // 门店电话
public static final String OL_CUSTOMER_NAME = "cosignee_name"; // 客户名称
public static final String OL_CUSTOMER_PHONE = "cosignee_phone"; // 客户电话
public static final String OL_CUSTOMER_ADDRESS = "cosignee_address"; // 客户地址
public static final String OL_START_DATE = "start_date"; // 订单开始时间
public static final String OL_END_DATE = "end_date"; // 订单结束时间
public static final String OL_ORDER_STATUS = "submit_state"; // 平台状态
public static final String OL_COMMENTS = "comments"; // 备注
public static final String OL_NICK_NAME = "nick_name"; // 业务员昵称
public static final String OL_CD_NICK_NAME = "cd_nick_name"; // 拆单员昵称
// ========== getApiOrderMessage orderPlanData 生产数据模块 ==========
public static final String OPD_ORDER = "Orders";
public static final String BPD_ORDER_NO = "OrderNo"; // 订单号
public static final String BPD_CUSTOM_ORDER_NO = "CustomOrderNo"; // 自定义单号
public static final String BPD_MATERIALS = "Materials";
public static final String BPD_MATERIALS_NAME = "Name"; // 材质名称
public static final String BPD_MATERIALS_GOODS_ID = "GoodsID";
public static final String BPD_MATERIALS_COLOR = "Color";
public static final String BPD_MATERIALS_SPECIFICATION = "Specification"; // 板材规格——长宽
public static final String BPD_MATERIALS_ONE = "Material";
public static final String BPD_MATERIALS_THICKNESS = "Thickness"; // 板材厚度
public static final String BPD_MATERIALS_WIDTH = "Width";
public static final String BPD_MATERIALS_LENGTH = "Length";
public static final String BPD_MATERIALS_WAVE = "WaveFlag"; // 有无纹路
public static final String BPD_BLOCKS = "Blocks"; // 板编号
public static final String BPD_BLOCK_NO = "BlockNo"; // 板编号
public static final String BPD_ROOM_NAME = "RoomName"; // 房间名
public static final String BPD_BOX_NO = "BoxNo"; // 柜体号
public static final String BPD_BOX_NAME = "BoxName"; // 柜体名
public static final String BPD_BLOCK_ID = "BlockID"; // 板ID
public static final String BPD_CUSTOM_BLOCK_NO = "CustomNo"; // (自定义)板号
public static final String BPD_BLOCK_NAME = "BlockName"; // 板名称
public static final String BPD_OPEN_DOOR_TYPE = "OpenDoorType"; // 开门类型 0=非门板 1=左开门板 2=右开门板 3=上开门板 4=下开门板
public static final String BPD_EXTRA_REMARK = "ExtraRemark"; // 额外补充
public static final String BPD_DRILLS = "drills";
public static final String BPD_DRILL_NAME = "name";
public static final String BPD_DRILL_TYPE = "type";
public static final String BPD_DRILL_FACE = "face";
public static final String BPD_DRILL_COUNT = "count";
public static final String BPD_EXTRA = "extra";
public static final String BPD_EXTRA_BOARD_TYPE = "boardType"; // 板类型
public static final String BPD_EXTRA_THROUGH_HOLE_COUNT = "throughHoleCount"; // 挖穿的孔数
public static final String BPD_EXTRA_THROUGH_MODEL_COUNT = "throughModelCount"; // 挖穿的造型数
public static final String BPD_EXTRA_HAS_2D_MODEL = "has2DModel"; // 是否有二维刀路
public static final String BPD_EXTRA_HAS_3D_MODEL = "has3DModel"; //
public static final String BPD_PROCESS_GROUP_NAME = "ProcessGroupName"; // 加工组(名称)
public static final String BPD_WIDTH = "Width"; // 成品宽
public static final String BPD_LENGTH = "Length"; // 成品长
public static final String BPD_SIZE = "Size"; // 成品面积
public static final String BPD_CUTTING_WIDTH = "CuttingWidth"; // 开料宽
public static final String BPD_CUTTING_LENGTH = "CuttingLength"; // 开料长
public static final String BPD_CUTTING_SIZE = "CuttingSize"; // 开料面积
public static final String BPD_BORDER_LEFT = "BorderLeft"; // 左封边 用于矩形,异形板对接封边分在原始轮廓里定义
public static final String BPD_BORDER_RIGHT = "BorderRight"; // 右封边
public static final String BPD_BORDER_UPPER = "BorderUpper"; // 上封边
public static final String BPD_BORDER_UNDER = "BorderUnder"; // 下封边
public static final String BPD_WAVE = "Wave"; // 纹路 正纹 = 0,可翻转 = 1, 反纹 = 2
public static final String BPD_PLACE_FACE = "PlaceFace"; // 排版面 正面 = 0, 反面 = 1, 随意面 = 2
public static final String BPD_IS_UN_REGULAR = "IsUnRegular"; // 是否异形
public static final String BPD_OFFSET_X = "OffsetX"; // 开料轮廓,成品轮廓 偏移量X
public static final String BPD_OFFSET_Y = "OffsetY"; // 开料轮廓,成品轮廓 偏移量y
public static final String BPD_POINTS = "Points"; // 异形板的开料轮廓 (不含封边)
public static final String BPD_ORG_POINTS = "OrgPoints"; // 异形板的成品轮廓 (含封边)
public static final String BPD_POINTS_X = "X";
public static final String BPD_POINTS_Y = "Y";
public static final String BPD_POINTS_CURVE = "Curve";
public static final String BPD_POINTS_EDGE = "Edge";
public static final String BPD_HOLES = "Holes"; // 孔
public static final String BPD_SIDE_HOLES = "SideHoles"; // 侧孔 (基于成品轮廓 含封边)
public static final String BPD_HOLE_X = "X";
public static final String BPD_HOLE_Y = "Y";
public static final String BPD_HOLE_DEPTH = "Depth";
public static final String BPD_HOLE_DIAMETER = "Diameter";
public static final String BPD_HOLE_FACE = "Face";
public static final String BPD_HOLE_DIRECTION = "Direction";
public static final String BPD_HOLE_END_POINT = "EndPoint";
public static final String BPD_HOLE_START_POINT = "StartPoint";
public static final String BPD_MODEL = "Models"; // 造型
public static final String BPD_MODEL_DEPTH = "Depth";
public static final String BPD_MODEL_DIAMETER = "Diameter";
public static final String BPD_MODEL_FACE = "Face";
public static final String BPD_MODEL_TOOL_NO = "ToolNo";
public static final String BPD_MODEL_ORIGIN_MODELING = "OriginModeling"; // 造型 原始轮廓
public static final String BPD_MODEL_ORIGIN_MODELING_ADD_DEPTH = "AddDepth";
public static final String BPD_MODEL_ORIGIN_MODELING_ADD_LEN = "AddLen";
public static final String BPD_MODEL_ORIGIN_MODELING_ADD_WIDTH = "AddWidth";
public static final String BPD_MODEL_ORIGIN_MODELING_DIR = "Dir";
public static final String BPD_MODEL_ORIGIN_MODELING_KNIFE_RADIUS = "KnifeRadius";
public static final String BPD_MODEL_ORIGIN_MODELING_THICKNESS = "Thickness";
public static final String BPD_MODEL_ORIGIN_MODELING_OUTLINE = "Outline"; // 造型 原始轮廓 outline
public static final String BPD_MODEL_ORIGIN_MODELING_OUTLINE_CURVE = "Curve";
public static final String BPD_MODEL_ORIGIN_MODELING_OUTLINE_POS = "Pos";
public static final String BPD_MODEL_ORIGIN_MODELING_HOLES = "Holes"; // 造型 原始轮廓 holes
public static final String BPD_MODEL_ORIGIN_MODELING_HOLES_CURVE = "Curve";
public static final String BPD_MODEL_ORIGIN_MODELING_HOLES_POS = "Pos";
public static final String BPD_MODEL_POINTS = "Points"; // 造型 刀路点阵
public static final String BPD_MODEL_POINTS_CURVE = "Curve";
public static final String BPD_MODEL_POINTS_POS = "Pos";
public static final String BPD_MODEL_OFFSET_LIST = "OffsetList"; // 造型 偏移刀路
public static final String BPD_MODEL_OFFSET_LIST_ANGLE = "Angle";
public static final String BPD_MODEL_OFFSET_LIST_DEPTH = "Depth";
public static final String BPD_MODEL_OFFSET_LIST_DIRECTION = "Diameter";
public static final String BPD_MODEL_OFFSET_LIST_NAME = "Name";
public static final String BPD_MODEL_OFFSET_LIST_VALUE = "Value";
}
@@ -6,7 +6,6 @@ import lombok.NoArgsConstructor;
import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.*;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@@ -56,6 +55,14 @@ public class GrooveXmlVO implements Serializable {
@XmlAttribute(name = "depthExtend") @XmlAttribute(name = "depthExtend")
private String depthExtend; private String depthExtend;
// 造型/凹槽(边缘)的刀路方向——内圈顺时针(最)外圈逆时针、内圈顺时针(最)外圈顺时针、内圈逆时针(最)外圈顺时针、内圈逆时针(最)外圈逆时针
@XmlAttribute(name = "direction")
private String direction;
// 加工模式/方式——由内向外、由外向内
@XmlAttribute(name = "mode")
private String mode;
// 圆角半径 // 圆角半径
@XmlAttribute(name = "round") @XmlAttribute(name = "round")
private String round; private String round;
@@ -92,6 +99,10 @@ public class GrooveXmlVO implements Serializable {
@XmlElement(name = "offsetLines") @XmlElement(name = "offsetLines")
private OffsetLineXmlVOS offsetLineXmlVOS; private OffsetLineXmlVOS offsetLineXmlVOS;
// 原始造型(外)轮廓信息
@XmlElement(name = "Outline")
private OutlineXmlVO outlineXmlVO;
@XmlAttribute(name = "result") @XmlAttribute(name = "result")
private String result; private String result;
} }
@@ -871,7 +871,7 @@ public class XMLUtil {
flag.set(false); flag.set(false);
} else { } else {
for (PointXmlVO pointXmlVO : pointXmlVOS.getPointXmlVOList()) { for (PointXmlVO pointXmlVO : pointXmlVOS.getPointXmlVOList()) {
checkPoint(pointXmlVO, flag); checkPointRemoveZ(pointXmlVO, flag, "孤岛");
} }
} }
} }
@@ -970,6 +970,8 @@ public class XMLUtil {
isEmptyAddAndPositiveNumber(grooveXmlVO::getWidthExtend, grooveXmlVO::setWidthExtend, "0", Double.class, "槽宽度延长", flag); isEmptyAddAndPositiveNumber(grooveXmlVO::getWidthExtend, grooveXmlVO::setWidthExtend, "0", Double.class, "槽宽度延长", flag);
isEmptyAddAndPositiveNumber(grooveXmlVO::getLengthExtend, grooveXmlVO::setLengthExtend, "0", Double.class, "槽长度延长", flag); isEmptyAddAndPositiveNumber(grooveXmlVO::getLengthExtend, grooveXmlVO::setLengthExtend, "0", Double.class, "槽长度延长", flag);
isEmptyAddAndPositiveNumber(grooveXmlVO::getDepthExtend, grooveXmlVO::setDepthExtend, "0", Double.class, "槽深度延长", flag); isEmptyAddAndPositiveNumber(grooveXmlVO::getDepthExtend, grooveXmlVO::setDepthExtend, "0", Double.class, "槽深度延长", flag);
isEmptyAddAndPositiveNumber(grooveXmlVO::getDirection, grooveXmlVO::setDirection, "0", Double.class, "造型/凹槽(边缘)的刀路方向", flag);
isEmptyAddAndPositiveNumber(grooveXmlVO::getMode, grooveXmlVO::setMode, "0", Double.class, "加工模式/方式", flag);
isEmptyAddAndPositiveNumber(grooveXmlVO::getRound, grooveXmlVO::setRound, "0", Double.class, "圆角半径", flag); isEmptyAddAndPositiveNumber(grooveXmlVO::getRound, grooveXmlVO::setRound, "0", Double.class, "圆角半径", flag);
if (grooveXmlVO.getType().trim().equals("路径槽") || grooveXmlVO.getType().trim().equals("折返路径槽")) { if (grooveXmlVO.getType().trim().equals("路径槽") || grooveXmlVO.getType().trim().equals("折返路径槽")) {
@@ -981,12 +983,21 @@ public class XMLUtil {
isEmptyAddAndPositiveNumber(grooveXmlVO::getTangentAngle, grooveXmlVO::setTangentAngle, "0", Double.class, "角度(二维刀路V型刀提角/清角用)", flag); isEmptyAddAndPositiveNumber(grooveXmlVO::getTangentAngle, grooveXmlVO::setTangentAngle, "0", Double.class, "角度(二维刀路V型刀提角/清角用)", flag);
isEmptyAddAndPositiveNumber(grooveXmlVO::getIsletCount, grooveXmlVO::setIsletCount, "0", Integer.class, "孤岛数量", flag); isEmptyAddAndPositiveNumber(grooveXmlVO::getIsletCount, grooveXmlVO::setIsletCount, "0", Integer.class, "孤岛数量", flag);
if (grooveXmlVO.getOutlineXmlVO() == null || grooveXmlVO.getOutlineXmlVO().getPointXmlVOList() == null || grooveXmlVO.getOutlineXmlVO().getPointXmlVOList().size() < 1) {
grooveXmlVO.setResult("---< 原始造型(外)轮廓点阵列表不可为空 >---");
flag.set(false);
} else {
for (PointXmlVO pointXmlVO : grooveXmlVO.getOutlineXmlVO().getPointXmlVOList()) {
checkPoint(pointXmlVO, flag, "原始造型(外)轮廓");
}
}
if (grooveXmlVO.getPointXmlVOS() == null || grooveXmlVO.getPointXmlVOS().getPointXmlVOList() == null || grooveXmlVO.getPointXmlVOS().getPointXmlVOList().size() < 1) { if (grooveXmlVO.getPointXmlVOS() == null || grooveXmlVO.getPointXmlVOS().getPointXmlVOList() == null || grooveXmlVO.getPointXmlVOS().getPointXmlVOList().size() < 1) {
grooveXmlVO.setResult("---< 槽点坐标列表不可为空 >---"); grooveXmlVO.setResult("---< 槽点坐标列表不可为空 >---");
flag.set(false); flag.set(false);
} else { } else {
for (PointXmlVO pointXmlVO : grooveXmlVO.getPointXmlVOS().getPointXmlVOList()) { for (PointXmlVO pointXmlVO : grooveXmlVO.getPointXmlVOS().getPointXmlVOList()) {
checkPoint(pointXmlVO, flag); checkPoint(pointXmlVO, flag, "刀路点阵");
} }
} }
@@ -1007,8 +1018,8 @@ public class XMLUtil {
private void checkRawOutline(RawOutlineXmlVO rawOutlineXmlVO, AtomicBoolean flag) { private void checkRawOutline(RawOutlineXmlVO rawOutlineXmlVO, AtomicBoolean flag) {
boolean index = isEmptyBackAndPositiveNumberAndBack(rawOutlineXmlVO::getCount, "小板坯料(精加工)轮廓点阵列表数量 "+ rawOutlineXmlVO.getCount(), rawOutlineXmlVO::setCount, Integer.class, flag); boolean index = isEmptyBackAndPositiveNumberAndBack(rawOutlineXmlVO::getCount, "小板坯料(精加工)轮廓点阵列表数量 "+ rawOutlineXmlVO.getCount(), rawOutlineXmlVO::setCount, Integer.class, flag);
isEmptyBackAndNumber(rawOutlineXmlVO::getReferenceOffsetX, rawOutlineXmlVO::setReferenceOffsetX, Double.class, "小板坯料(精加工)轮廓参考点X坐标不可为空 " +rawOutlineXmlVO.getReferenceOffsetX() , flag); isEmptyBackAndNumber(rawOutlineXmlVO::getReferenceOffsetX, rawOutlineXmlVO::setReferenceOffsetX, Double.class, "相对于成品轮廓,基准点的X坐标偏移量" +rawOutlineXmlVO.getReferenceOffsetX() , flag);
isEmptyBackAndNumber(rawOutlineXmlVO::getReferenceOffsetY, rawOutlineXmlVO::setReferenceOffsetY, Double.class, "小板坯料(精加工)轮廓参考点Y坐标不可为空 " +rawOutlineXmlVO.getReferenceOffsetY() , flag); isEmptyBackAndNumber(rawOutlineXmlVO::getReferenceOffsetY, rawOutlineXmlVO::setReferenceOffsetY, Double.class, "相对于成品轮廓,基准点的Y坐标偏移量" +rawOutlineXmlVO.getReferenceOffsetY() , flag);
if (rawOutlineXmlVO.getPointXmlVOList() != null && !rawOutlineXmlVO.getPointXmlVOList().isEmpty()) { if (rawOutlineXmlVO.getPointXmlVOList() != null && !rawOutlineXmlVO.getPointXmlVOList().isEmpty()) {
@@ -1018,7 +1029,7 @@ public class XMLUtil {
flag.set(false); flag.set(false);
} else { } else {
for (PointXmlVO pointXmlVO : rawOutlineXmlVO.getPointXmlVOList()) { for (PointXmlVO pointXmlVO : rawOutlineXmlVO.getPointXmlVOList()) {
checkPoint(pointXmlVO, flag); checkPointRemoveZ(pointXmlVO, flag, "坯料轮廓信息");
} }
} }
} }
@@ -1038,7 +1049,7 @@ public class XMLUtil {
flag.set(false); flag.set(false);
} else { } else {
for (PointXmlVO pointXmlVO : cuttingOutlineXmlVO.getPointXmlVOList()) { for (PointXmlVO pointXmlVO : cuttingOutlineXmlVO.getPointXmlVOList()) {
checkPoint(pointXmlVO, flag); checkPointRemoveZ(pointXmlVO, flag, "开料成型轮廓信息");
} }
} }
} }
@@ -1056,6 +1067,7 @@ public class XMLUtil {
if (Integer.parseInt(outlineXmlVO.getCount()) != outlineXmlVO.getPointXmlVOList().size()) { if (Integer.parseInt(outlineXmlVO.getCount()) != outlineXmlVO.getPointXmlVOList().size()) {
outlineXmlVO.setCount("---< 小板轮廓点阵数量与实际数量不一致 >---"); outlineXmlVO.setCount("---< 小板轮廓点阵数量与实际数量不一致 >---");
flag.set(false); flag.set(false);
return;
} }
@@ -1065,8 +1077,6 @@ public class XMLUtil {
isEmptyBackAndNumber(pointXmlVO::getCurvature, pointXmlVO::setCurvature, Double.class, "小板轮廓边圆弧凹凸度", flag); isEmptyBackAndNumber(pointXmlVO::getCurvature, pointXmlVO::setCurvature, Double.class, "小板轮廓边圆弧凹凸度", flag);
isEmptyBackAndNumber(pointXmlVO::getRadius, pointXmlVO::setRadius, Double.class, "小板轮廓边圆弧半径", flag); isEmptyBackAndNumber(pointXmlVO::getRadius, pointXmlVO::setRadius, Double.class, "小板轮廓边圆弧半径", flag);
checkPoint(pointXmlVO, flag);
checkEdging(pointXmlVO, flag); checkEdging(pointXmlVO, flag);
// if (!(StringUtils.isEmpty(pointXmlVO.getItemCode()) && StringUtils.isEmpty(pointXmlVO.getEdgingName()) && // if (!(StringUtils.isEmpty(pointXmlVO.getItemCode()) && StringUtils.isEmpty(pointXmlVO.getEdgingName()) &&
// StringUtils.isEmpty(pointXmlVO.getEdgingColor()) && StringUtils.isEmpty(pointXmlVO.getEdgingMaterial()) && // StringUtils.isEmpty(pointXmlVO.getEdgingColor()) && StringUtils.isEmpty(pointXmlVO.getEdgingMaterial()) &&
@@ -1128,11 +1138,17 @@ public class XMLUtil {
// point 验证 // point 验证
private void checkPoint(PointXmlVO pointXmlVO, AtomicBoolean flag) { private void checkPointRemoveZ(PointXmlVO pointXmlVO, AtomicBoolean flag, String name) {
isEmptyBackAndNumber(pointXmlVO::getPointX, pointXmlVO::setPointX, Double.class, pointXmlVO.getPointX(), flag); isEmptyBackAndNumber(pointXmlVO::getPointX, pointXmlVO::setPointX, Double.class, name + "起点X坐标", flag);
isEmptyBackAndNumber(pointXmlVO::getPointY, pointXmlVO::setPointY, Double.class, pointXmlVO.getPointY(), flag); isEmptyBackAndNumber(pointXmlVO::getPointY, pointXmlVO::setPointY, Double.class, name + "起点Y坐标", flag);
isEmptyBackAndNumber(pointXmlVO::getCurvature, pointXmlVO::setCurvature, Double.class, pointXmlVO.getCurvature(), flag); isEmptyBackAndNumber(pointXmlVO::getCurvature, pointXmlVO::setCurvature, Double.class, name + "起点圆弧凹凸度", flag);
isEmptyBackAndNumber(pointXmlVO::getRadius, pointXmlVO::setRadius, Double.class, pointXmlVO.getRadius(), flag); isEmptyBackAndNumber(pointXmlVO::getRadius, pointXmlVO::setRadius, Double.class, name + "起点圆弧半径", flag);
}
private void checkPoint(PointXmlVO pointXmlVO, AtomicBoolean flag, String name) {
checkPointRemoveZ(pointXmlVO, flag, name);
isEmptyBackAndNumber(pointXmlVO::getPointZ, pointXmlVO::setPointZ, Double.class, name + "起点Z坐标", flag);
} }
} }
@@ -26,6 +26,8 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -199,6 +201,22 @@ public class XmlTypeRealize {
return groupInfos; return groupInfos;
} }
private void isEmptyAndAdd(Supplier<String> getName, Consumer<String> setName, Supplier<String> getCode, Consumer<String> setCode) {
String name = getName.get();
String code = getCode.get();
if (StringUtils.isEmpty(name) && StringUtils.isEmpty(code)) {
setName.accept(NOT_ASSIGNED);
setCode.accept(NOT_ASSIGNED_CODE);
}
if (StringUtils.isEmpty(code) && !StringUtils.isEmpty(name)){
setCode.accept(NOT_ASSIGNED_CODE + " + " + name);
}
if (!StringUtils.isEmpty(code) && StringUtils.isEmpty(name)){
setName.accept(NOT_ASSIGNED + " + " + code);
}
}
// 板材信息转换 // 板材信息转换
public Map<String, Object> goodsInfoChange(OrderXmlVO orderXmlVO, Long orderId, Long organId) { public Map<String, Object> goodsInfoChange(OrderXmlVO orderXmlVO, Long orderId, Long organId) {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
@@ -219,166 +237,112 @@ public class XmlTypeRealize {
Map<String, OrderGroupDO> groupInfos = groupInfoChange(orderXmlVO.getGroupXmlVOS(), orderId, organId); // groupInfos 这个在跟着一起变 Map<String, OrderGroupDO> groupInfos = groupInfoChange(orderXmlVO.getGroupXmlVOS(), orderId, organId); // groupInfos 这个在跟着一起变
Map<String, Object> itemInfos = new HashMap<>(); Map<String, Object> itemInfos = new HashMap<>();
// Map<String, Object> partsInfos = new HashMap<>();
Map<String, Object> orderPartsRemarks = new HashMap<>(); Map<String, Object> orderPartsRemarks = new HashMap<>();
Map<String, Object> partsDOInfos = new HashMap<>(); Map<String, Object> partsDOInfos = new HashMap<>();
if (orderXmlVO.getMaterialXmlVO() != null) { if (orderXmlVO.getMaterialXmlVO() == null) {
MaterialXmlVO materialXmlVO = orderXmlVO.getMaterialXmlVO(); return map;
if (materialXmlVO.getAccessoryXmlVO() != null && materialXmlVO.getAssemblieXmlVOS() != null && materialXmlVO.getPlateXmlVOS() != null) { }
MaterialXmlVO materialXmlVO = orderXmlVO.getMaterialXmlVO();
Map<String, List<EdgingXmlVO>> edgingMap;
Map<String, List<HardwareXmlVO>> hardwareMap;
Map<String, List<AssemblyXmlVO>> assemblyMap;
// 配件
if (materialXmlVO.getAccessoryXmlVO() != null ) {
AccessoryXmlVO accessoryXmlVO = materialXmlVO.getAccessoryXmlVO();
if (accessoryXmlVO.getEdgingXmlVOS() != null && accessoryXmlVO.getEdgingXmlVOS().getEdgingXmlVOList() != null && !accessoryXmlVO.getEdgingXmlVOS().getEdgingXmlVOList().isEmpty()) {
List<EdgingXmlVO> edgingList = accessoryXmlVO.getEdgingXmlVOS().getEdgingXmlVOList();
edgingList.forEach(edgingXmlVO -> {
isEmptyAndAdd(edgingXmlVO::getRoomName, edgingXmlVO::setRoomName, edgingXmlVO::getRoomCode, edgingXmlVO::setRoomCode);
isEmptyAndAdd(edgingXmlVO::getBoxName, edgingXmlVO::setBoxName, edgingXmlVO::getBoxCode, edgingXmlVO::setBoxCode);
});
// 以itemCode为条件进行分组,成map
edgingMap = edgingList.stream().collect(Collectors.groupingBy(EdgingXmlVO::getItemCode));
// 遍历map
edgingMap.forEach((key, value) -> {
if (key == null) { // 没有itemCode
Map<String, List<EdgingXmlVO>> edgingMapWithNull = value.stream().collect(Collectors.groupingBy(edgingXmlVO ->
edgingXmlVO.getManufacturer() + edgingXmlVO.getBrand() + edgingXmlVO.getName() + edgingXmlVO.getMaterial() +
edgingXmlVO.getSpecs() + edgingXmlVO.getColor() + edgingXmlVO.getWidth() + edgingXmlVO.getThickness()));
edgingMap.putAll(edgingMapWithNull);
}
});
} else {
edgingMap = null;
}
if (accessoryXmlVO.getHardwareXmlVOS() != null && accessoryXmlVO.getHardwareXmlVOS().getHardwareXmlVOList() != null && !accessoryXmlVO.getHardwareXmlVOS().getHardwareXmlVOList().isEmpty()) {
List<HardwareXmlVO> hardwareXmlVOS = accessoryXmlVO.getHardwareXmlVOS().getHardwareXmlVOList();
hardwareXmlVOS.forEach(hardwareXmlVO -> {
isEmptyAndAdd(hardwareXmlVO::getRoomName, hardwareXmlVO::setRoomName, hardwareXmlVO::getRoomCode, hardwareXmlVO::setRoomCode);
isEmptyAndAdd(hardwareXmlVO::getBoxName, hardwareXmlVO::setBoxName, hardwareXmlVO::getBoxCode, hardwareXmlVO::setBoxCode);
});
// 以itemCode为条件进行分组,成map
hardwareMap = hardwareXmlVOS.stream().collect(Collectors.groupingBy(HardwareXmlVO::getItemCode));
// 遍历map
hardwareMap.forEach((key, value) -> {
if (key == null) { //没有itemCode
Map<String, List<HardwareXmlVO>> hardwareMapWithNull = value.stream().collect(Collectors.groupingBy(hardwareXmlVO ->
hardwareXmlVO.getManufacturer() + hardwareXmlVO.getBrand() + hardwareXmlVO.getName() + hardwareXmlVO.getMaterial() +
hardwareXmlVO.getSpecs() + hardwareXmlVO.getColor() + hardwareXmlVO.getType()));
hardwareMap.putAll(hardwareMapWithNull);
}
});
} else {
hardwareMap = null;
}
} else {
hardwareMap = null;
edgingMap = null;
}
if (materialXmlVO.getAssemblieXmlVOS() != null) {
AssemblieXmlVOS assemblieXmlVOS = materialXmlVO.getAssemblieXmlVOS();
if (assemblieXmlVOS.getAssemblyXmlVOList() != null && !assemblieXmlVOS.getAssemblyXmlVOList().isEmpty()) {
List<AssemblyXmlVO> assemblyList = assemblieXmlVOS.getAssemblyXmlVOList();
assemblyList.forEach(assemblyXmlVO -> {
isEmptyAndAdd(assemblyXmlVO::getRoomName, assemblyXmlVO::setRoomName, assemblyXmlVO::getRoomCode, assemblyXmlVO::setRoomCode);
isEmptyAndAdd(assemblyXmlVO::getBoxName, assemblyXmlVO::setBoxName, assemblyXmlVO::getBoxCode, assemblyXmlVO::setBoxCode);
});
assemblyMap = assemblieXmlVOS.getAssemblyXmlVOList().stream().collect(Collectors.groupingBy(AssemblyXmlVO::getItemCode));
assemblyMap.forEach((key, value) -> {
if (key == null) { // 没有itemCode
Map<String, List<AssemblyXmlVO>> assemblyMapWithNull = value.stream().collect(Collectors.groupingBy(assemblyXmlVO ->
assemblyXmlVO.getManufacturer() + assemblyXmlVO.getBrand() + assemblyXmlVO.getName() + assemblyXmlVO.getMaterial() +
assemblyXmlVO.getSpecs() + assemblyXmlVO.getColor() + assemblyXmlVO.getType()));
assemblyMap.putAll(assemblyMapWithNull);
}
});
} else {
assemblyMap = null;
}
} else {
assemblyMap = null;
}
Map<String, Map<String, Object>> partInfoAll = goodsInfoChange(organId, orderId, edgingMap, hardwareMap, assemblyMap, roomInfos, groupInfos);
itemInfos.putAll(partInfoAll.get("orderItemMap"));
orderPartsRemarks.putAll(partInfoAll.get("orderPartsRemarks"));
partsDOInfos.putAll(partInfoAll.get("orderPartsDOMap"));
if (materialXmlVO.getPlateXmlVOS() != null) {
PlateXmlVOS plateXmlVOS = materialXmlVO.getPlateXmlVOS(); PlateXmlVOS plateXmlVOS = materialXmlVO.getPlateXmlVOS();
AssemblieXmlVOS assemblieXmlVOS = materialXmlVO.getAssemblieXmlVOS();
AccessoryXmlVO accessoryXmlVO = materialXmlVO.getAccessoryXmlVO();
// 配件
Map<String, List<EdgingXmlVO>> edgingMap;
Map<String, List<HardwareXmlVO>> hardwareMap;
Map<String, List<AssemblyXmlVO>> assemblyMap;
if (accessoryXmlVO.getEdgingXmlVOS() != null && accessoryXmlVO.getEdgingXmlVOS().getEdgingXmlVOList() != null && accessoryXmlVO.getEdgingXmlVOS().getEdgingXmlVOList().size() > 0) {
List<EdgingXmlVO> edgingList = accessoryXmlVO.getEdgingXmlVOS().getEdgingXmlVOList();
edgingList.forEach(edgingXmlVO -> {
if (edgingXmlVO.getRoomName() == null && edgingXmlVO.getRoomCode() == null) {
edgingXmlVO.setRoomName(NOT_ASSIGNED);
edgingXmlVO.setRoomCode(NOT_ASSIGNED_CODE);
}
if (edgingXmlVO.getRoomCode() == null && edgingXmlVO.getRoomName() != null){
edgingXmlVO.setRoomCode(NOT_ASSIGNED_CODE + " + " + edgingXmlVO.getRoomName());
}
if (edgingXmlVO.getRoomCode() != null && edgingXmlVO.getRoomName() == null){
edgingXmlVO.setRoomName(NOT_ASSIGNED + " + " + edgingXmlVO.getRoomCode());
}
if (edgingXmlVO.getBoxName() == null && edgingXmlVO.getBoxCode() == null) {
edgingXmlVO.setBoxName(NOT_ASSIGNED);
edgingXmlVO.setBoxCode(NOT_ASSIGNED_CODE);
}
if (edgingXmlVO.getBoxCode() == null && edgingXmlVO.getBoxName() != null){
edgingXmlVO.setBoxCode(NOT_ASSIGNED_CODE + " + " + edgingXmlVO.getBoxName());
}
if (edgingXmlVO.getBoxCode() != null && edgingXmlVO.getBoxName() == null){
edgingXmlVO.setBoxName(NOT_ASSIGNED + " + " + edgingXmlVO.getBoxCode());
}
// if (edgingXmlVO.getGroupCode() == null && edgingXmlVO.getGroupName() != null){
// edgingXmlVO.setGroupCode(NOT_ASSIGNED_CODE + " + " + edgingXmlVO.getGroupName());
// }
// if (edgingXmlVO.getGroupCode() != null && edgingXmlVO.getGroupName() == null){
// edgingXmlVO.setGroupName(NOT_ASSIGNED + " + " + edgingXmlVO.getGroupCode());
// }
});
// 以itemCode为条件进行分组,成map
edgingMap = edgingList.stream().collect(Collectors.groupingBy(EdgingXmlVO::getItemCode));
// 遍历map
edgingMap.forEach((key, value) -> {
if (key == null) { // 没有itemCode
Map<String, List<EdgingXmlVO>> edgingMapWithNull = value.stream().collect(Collectors.groupingBy(edgingXmlVO ->
edgingXmlVO.getManufacturer() + edgingXmlVO.getBrand() + edgingXmlVO.getName() + edgingXmlVO.getMaterial() +
edgingXmlVO.getSpecs() + edgingXmlVO.getColor() + edgingXmlVO.getWidth() + edgingXmlVO.getThickness()));
edgingMap.putAll(edgingMapWithNull);
}
});
} else {
edgingMap = null;
}
if (accessoryXmlVO.getHardwareXmlVOS() != null && accessoryXmlVO.getHardwareXmlVOS().getHardwareXmlVOList() != null && accessoryXmlVO.getHardwareXmlVOS().getHardwareXmlVOList().size() > 0) {
List<HardwareXmlVO> hardwareXmlVOS = accessoryXmlVO.getHardwareXmlVOS().getHardwareXmlVOList();
hardwareXmlVOS.forEach(hardwareXmlVO -> {
if (hardwareXmlVO.getRoomName() == null && hardwareXmlVO.getRoomCode() == null) {
hardwareXmlVO.setRoomName(NOT_ASSIGNED);
hardwareXmlVO.setRoomCode(NOT_ASSIGNED_CODE);
}
if (hardwareXmlVO.getRoomCode() == null && hardwareXmlVO.getRoomName() != null){
hardwareXmlVO.setRoomCode(NOT_ASSIGNED_CODE + " + " + hardwareXmlVO.getRoomName());
}
if (hardwareXmlVO.getRoomCode() != null && hardwareXmlVO.getRoomName() == null){
hardwareXmlVO.setRoomName(NOT_ASSIGNED + " + " + hardwareXmlVO.getRoomCode());
}
if (hardwareXmlVO.getBoxName() == null && hardwareXmlVO.getBoxCode() == null) {
hardwareXmlVO.setBoxName(NOT_ASSIGNED);
hardwareXmlVO.setBoxCode(NOT_ASSIGNED_CODE);
}
if (hardwareXmlVO.getBoxCode() == null && hardwareXmlVO.getBoxName() != null){
hardwareXmlVO.setBoxCode(NOT_ASSIGNED_CODE + " + " + hardwareXmlVO.getBoxName());
}
if (hardwareXmlVO.getBoxCode() != null && hardwareXmlVO.getBoxName() == null){
hardwareXmlVO.setBoxName(NOT_ASSIGNED + " + " + hardwareXmlVO.getBoxCode());
}
// if (hardwareXmlVO.getGroupCode() == null && hardwareXmlVO.getGroupName() != null){
// hardwareXmlVO.setGroupCode(NOT_ASSIGNED_CODE + " + " + hardwareXmlVO.getGroupName());
// }
// if (hardwareXmlVO.getGroupCode() != null && hardwareXmlVO.getGroupName() == null){
// hardwareXmlVO.setGroupName(NOT_ASSIGNED + " + " + hardwareXmlVO.getGroupCode());
// }
});
// 以itemCode为条件进行分组,成map
hardwareMap = hardwareXmlVOS.stream().collect(Collectors.groupingBy(HardwareXmlVO::getItemCode));
// 遍历map
hardwareMap.forEach((key, value) -> {
if (key == null) { //没有itemCode
Map<String, List<HardwareXmlVO>> hardwareMapWithNull = value.stream().collect(Collectors.groupingBy(hardwareXmlVO ->
hardwareXmlVO.getManufacturer() + hardwareXmlVO.getBrand() + hardwareXmlVO.getName() + hardwareXmlVO.getMaterial() +
hardwareXmlVO.getSpecs() + hardwareXmlVO.getColor() + hardwareXmlVO.getType()));
hardwareMap.putAll(hardwareMapWithNull);
}
});
} else {
hardwareMap = null;
}
if (assemblieXmlVOS.getAssemblyXmlVOList() != null && assemblieXmlVOS.getAssemblyXmlVOList().size() > 0) {
List<AssemblyXmlVO> assemblyList = assemblieXmlVOS.getAssemblyXmlVOList();
assemblyList.forEach(assemblyXmlVO -> {
if (assemblyXmlVO.getRoomName() == null && assemblyXmlVO.getRoomCode() == null) {
assemblyXmlVO.setRoomName(NOT_ASSIGNED);
assemblyXmlVO.setRoomCode(NOT_ASSIGNED_CODE);
}
if (assemblyXmlVO.getRoomCode() == null && assemblyXmlVO.getRoomName() != null){
assemblyXmlVO.setRoomCode(NOT_ASSIGNED_CODE + " + " + assemblyXmlVO.getRoomName());
}
if (assemblyXmlVO.getRoomCode() != null && assemblyXmlVO.getRoomName() == null){
assemblyXmlVO.setRoomName(NOT_ASSIGNED + " + " + assemblyXmlVO.getRoomCode());
}
if (assemblyXmlVO.getBoxName() == null && assemblyXmlVO.getBoxCode() == null) {
assemblyXmlVO.setBoxName(NOT_ASSIGNED);
assemblyXmlVO.setBoxCode(NOT_ASSIGNED_CODE);
}
if (assemblyXmlVO.getBoxCode() == null && assemblyXmlVO.getBoxName() != null){
assemblyXmlVO.setBoxCode(NOT_ASSIGNED_CODE + " + " + assemblyXmlVO.getBoxName());
}
if (assemblyXmlVO.getBoxCode() != null && assemblyXmlVO.getBoxName() == null){
assemblyXmlVO.setBoxName(NOT_ASSIGNED + " + " + assemblyXmlVO.getBoxCode());
}
// if (assemblyXmlVO.getGroupCode() == null && assemblyXmlVO.getGroupName() != null){
// assemblyXmlVO.setGroupCode(NOT_ASSIGNED_CODE + " + " + assemblyXmlVO.getGroupName());
// }
// if (assemblyXmlVO.getGroupCode() != null && assemblyXmlVO.getGroupName() == null){
// assemblyXmlVO.setGroupName(NOT_ASSIGNED + " + " + assemblyXmlVO.getGroupCode());
// }
});
assemblyMap = assemblieXmlVOS.getAssemblyXmlVOList().stream().collect(Collectors.groupingBy(AssemblyXmlVO::getItemCode));
assemblyMap.forEach((key, value) -> {
if (key == null) { // 没有itemCode
Map<String, List<AssemblyXmlVO>> assemblyMapWithNull = value.stream().collect(Collectors.groupingBy(assemblyXmlVO ->
assemblyXmlVO.getManufacturer() + assemblyXmlVO.getBrand() + assemblyXmlVO.getName() + assemblyXmlVO.getMaterial() +
assemblyXmlVO.getSpecs() + assemblyXmlVO.getColor() + assemblyXmlVO.getType()));
assemblyMap.putAll(assemblyMapWithNull);
}
});
} else {
assemblyMap = null;
}
Map<String, Map<String, Object>> partInfoAll = goodsInfoChange(organId, orderId, edgingMap, hardwareMap, assemblyMap, roomInfos, groupInfos);
// Map<String, Map<String, Object>> partAllInfo = goodsInfoChange(accessoryXmlVO, assemblieXmlVOS, orderId, organId, roomInfos, groupInfos);
itemInfos.putAll(partInfoAll.get("orderItemMap"));
// partsInfos.putAll(partInfoAll.get("orderPartsMap"));
orderPartsRemarks.putAll(partInfoAll.get("orderPartsRemarks"));
partsDOInfos.putAll(partInfoAll.get("orderPartsDOMap"));
// 板材 // 板材
if (plateXmlVOS.getPlateXmlVOList() != null && plateXmlVOS.getPlateXmlVOList().size() > 0) { if (plateXmlVOS.getPlateXmlVOList() != null && !plateXmlVOS.getPlateXmlVOList().isEmpty()) {
for (PlateXmlVO plateXmlVO : plateXmlVOS.getPlateXmlVOList()) { for (PlateXmlVO plateXmlVO : plateXmlVOS.getPlateXmlVOList()) {
if (StringUtils.equals(plateXmlVO.getGrained().trim(), "")) { if (StringUtils.equals(plateXmlVO.getGrained().trim(), "")) {
plateXmlVO.setGrained("false"); plateXmlVO.setGrained("false");
@@ -424,14 +388,14 @@ public class XmlTypeRealize {
goodsDOs.add(goodsDO); goodsDOs.add(goodsDO);
// 小板信息 // 小板信息
// plateDetail = plateInfoChange(plateXmlVO.getBlockXmlVOS(), orderId, goodsDO.getId(), organId, roomInfos, groupInfos, partsInfos, itemInfos, plateDOs, boxBasePositions, roomBasePositions);
plateInfoChange(plateDetail, organId, orderId, goodsId, plateXmlVO.getBlockXmlVOS(), plateDOs, itemInfos, partsDOInfos, roomInfos, groupInfos, boxBasePositions, roomBasePositions); plateInfoChange(plateDetail, organId, orderId, goodsId, plateXmlVO.getBlockXmlVOS(), plateDOs, itemInfos, partsDOInfos, roomInfos, groupInfos, boxBasePositions, roomBasePositions);
// plateDetail.add(plateInfoChange(organId, orderId, goodsId, plateXmlVO.getBlockXmlVOS(), plateDOs, itemInfos, partsDOInfos, roomInfos, groupInfos, boxBasePositions, roomBasePositions));
} }
} }
} }
}
// 取map中的值 // 取map中的值
List<Object> orderBodyDOList = roomInfos.values().stream() List<Object> orderBodyDOList = roomInfos.values().stream()
@@ -453,8 +417,7 @@ public class XmlTypeRealize {
map.put("orderItemDOS", itemDOList); map.put("orderItemDOS", itemDOList);
map.put("plateDetail", plateDetail); map.put("plateDetail", plateDetail);
map.put("orderPartsRemarks", partRemarks); map.put("orderPartsRemarks", partRemarks);
// System.out.println(" orderBodyDOS " + orderBodyDOList);
// System.out.println(" orderPartsDOS " + partDOList);
return map; return map;
} }
@@ -584,7 +547,7 @@ public class XmlTypeRealize {
for (EdgingXmlVO edgingVO : value) { for (EdgingXmlVO edgingVO : value) {
partsNum = partsNum + Double.parseDouble(edgingVO.getCount()); partsNum = partsNum + Double.parseDouble(edgingVO.getCount());
if (edgingVO.getRemarkXmlVOS() != null && edgingVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && edgingVO.getRemarkXmlVOS().getRemarkXmlVOList().size() > 0) { if (edgingVO.getRemarkXmlVOS() != null && edgingVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && !edgingVO.getRemarkXmlVOS().getRemarkXmlVOList().isEmpty()) {
finalRemarkXmlVOS.addAll(edgingVO.getRemarkXmlVOS().getRemarkXmlVOList()); finalRemarkXmlVOS.addAll(edgingVO.getRemarkXmlVOS().getRemarkXmlVOList());
} }
} }
@@ -601,7 +564,7 @@ public class XmlTypeRealize {
.build()); .build());
}); });
if (finalRemarkXmlVOS.size() > 0) { if (!finalRemarkXmlVOS.isEmpty()) {
orderPartsRemarks.put(key, OrderPartsRemark.builder() orderPartsRemarks.put(key, OrderPartsRemark.builder()
.partsId(partsId) .partsId(partsId)
.orderId(orderId) .orderId(orderId)
@@ -653,7 +616,7 @@ public class XmlTypeRealize {
for (HardwareXmlVO hardwareVO : value) { for (HardwareXmlVO hardwareVO : value) {
partsNum = partsNum + Double.parseDouble(hardwareVO.getCount()); partsNum = partsNum + Double.parseDouble(hardwareVO.getCount());
if (hardwareVO.getRemarkXmlVOS() != null && hardwareVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && hardwareVO.getRemarkXmlVOS().getRemarkXmlVOList().size() > 0) { if (hardwareVO.getRemarkXmlVOS() != null && hardwareVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && !hardwareVO.getRemarkXmlVOS().getRemarkXmlVOList().isEmpty()) {
finalRemarkXmlVOS.addAll(hardwareVO.getRemarkXmlVOS().getRemarkXmlVOList()); finalRemarkXmlVOS.addAll(hardwareVO.getRemarkXmlVOS().getRemarkXmlVOList());
} }
} }
@@ -670,7 +633,7 @@ public class XmlTypeRealize {
.build()); .build());
}); });
if (finalRemarkXmlVOS.size() > 0) { if (!finalRemarkXmlVOS.isEmpty()) {
orderPartsRemarks.put(key, OrderPartsRemark.builder() orderPartsRemarks.put(key, OrderPartsRemark.builder()
.partsId(partsId) .partsId(partsId)
.orderId(orderId) .orderId(orderId)
@@ -722,7 +685,7 @@ public class XmlTypeRealize {
for (AssemblyXmlVO assemblyVO : value) { for (AssemblyXmlVO assemblyVO : value) {
partsNum = partsNum + Double.parseDouble(assemblyVO.getCount()); partsNum = partsNum + Double.parseDouble(assemblyVO.getCount());
if (assemblyVO.getRemarkXmlVOS() != null && assemblyVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && assemblyVO.getRemarkXmlVOS().getRemarkXmlVOList().size() > 0) { if (assemblyVO.getRemarkXmlVOS() != null && assemblyVO.getRemarkXmlVOS().getRemarkXmlVOList() != null && !assemblyVO.getRemarkXmlVOS().getRemarkXmlVOList().isEmpty()) {
finalRemarkXmlVOS.addAll(assemblyVO.getRemarkXmlVOS().getRemarkXmlVOList()); finalRemarkXmlVOS.addAll(assemblyVO.getRemarkXmlVOS().getRemarkXmlVOList());
} }
} }
@@ -739,7 +702,7 @@ public class XmlTypeRealize {
.build()); .build());
}); });
if (finalRemarkXmlVOS.size() > 0) { if (!finalRemarkXmlVOS.isEmpty()) {
orderPartsRemarks.put(key, OrderPartsRemark.builder() orderPartsRemarks.put(key, OrderPartsRemark.builder()
.partsId(partsId) .partsId(partsId)
.orderId(orderId) .orderId(orderId)
@@ -761,9 +724,12 @@ public class XmlTypeRealize {
List<Object> plateDOs, Map<String, Object> orderItemMap, Map<String, Object> partsDO, List<Object> plateDOs, Map<String, Object> orderItemMap, Map<String, Object> partsDO,
Map<String, Map<String, OrderBodyDO>> roomInfos, Map<String, OrderGroupDO> groupInfos, Map<String, Map<String, OrderBodyDO>> roomInfos, Map<String, OrderGroupDO> groupInfos,
Map<String, Map<String, BasePosition>> boxBasePositionMap, Map<String, BasePosition> roomBasePositions) { Map<String, Map<String, BasePosition>> boxBasePositionMap, Map<String, BasePosition> roomBasePositions) {
// List<Object> plateDetails = new ArrayList<>();
if (blockXmlVOS != null && blockXmlVOS.getBlockXmlVOList() != null && blockXmlVOS.getBlockXmlVOList().size() > 0) { if (blockXmlVOS != null && blockXmlVOS.getBlockXmlVOList() == null || blockXmlVOS.getBlockXmlVOList().isEmpty()) {
}
if (blockXmlVOS != null && blockXmlVOS.getBlockXmlVOList() != null && !blockXmlVOS.getBlockXmlVOList().isEmpty()) {
for (BlockXmlVO blockXmlVO : blockXmlVOS.getBlockXmlVOList()) { for (BlockXmlVO blockXmlVO : blockXmlVOS.getBlockXmlVOList()) {
long plateNo = idWorker.nextId(); long plateNo = idWorker.nextId();
@@ -800,9 +766,9 @@ public class XmlTypeRealize {
.moduleName(blockXmlVO.getModuleName()) .moduleName(blockXmlVO.getModuleName())
.moduleCode(blockXmlVO.getModuleCode()) .moduleCode(blockXmlVO.getModuleCode())
.build(); .build();
// Map<String, Long> idMap = getId(blockXmlVO.getRoomCode(), blockXmlVO.getBoxCode(), roomInfos, blockXmlVO.getGroupCode(), groupInfos, plateNum, unregularNum, orderId, organId);
Map<String, Long> idMap = getId(positionVO, roomInfos, groupInfos, plateNum, unregularNum, orderId, organId); Map<String, Long> idMap = getId(positionVO, roomInfos, groupInfos, plateNum, unregularNum, orderId, organId);
// 出错 null
// 柜体基点坐标 // 柜体基点坐标
BasePosition boxBasePoint = null; BasePosition boxBasePoint = null;
if (boxBasePositionMap.get(blockXmlVO.getRoomCode()) != null){ if (boxBasePositionMap.get(blockXmlVO.getRoomCode()) != null){
@@ -87,6 +87,9 @@ spring:
bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
elasticsearch: elasticsearch:
uris: 192.168.1.205:9200 uris: 192.168.1.205:9200
security-http-ssl-enable: false
username: elastic
password: admin.
--- #################### 定时任务相关配置 #################### --- #################### 定时任务相关配置 ####################
xxl: xxl:
@@ -186,6 +186,97 @@
</update> </update>
<select id="selectGoodsByOrderId"
resultType="com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsRespVO">
SELECT
i.order_id,
i.room_id,
i.body_id,
p.goods_id,
g.goods_name,
COUNT(DISTINCT p.id) AS totalPlates,
SUM(p.area) AS totalArea
FROM
order_item i
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
RIGHT JOIN
order_goods g ON i.organ_id = g.organ_id AND i.order_id = g.order_id AND p.goods_id = g.id
WHERE
i.order_id = #{orderId} AND i.organ_id = #{organId} AND p.deleted = #{deleted}
GROUP BY
i.room_id, i.body_id, p.goods_id, g.goods_name
</select>
<select id="selectGoodsDetailByOrderId" resultType="com.cf.imes.module.executor.controller.admin.order.vo.order.OrderGoodsDetailRespVO">
SELECT
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,
sub.order_id,
sub.totalPlates AS number,
sub.totalArea AS area,
sub.room_id,
sub.body_id,
sub.group_id
FROM (
SELECT
i.room_id,
i.body_id,
i.group_id,
i.organ_id,
i.order_id,
p.goods_id,
COUNT(p.id) AS totalPlates,
SUM(p.area) AS totalArea
FROM
order_item i
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}
<if test="roomId != null and roomId.size() > 0">
AND i.room_id IN
<foreach item="roomIdItem" collection="roomId" open="(" separator="," close=")">
#{roomIdItem}
</foreach>
</if>
<if test="bodyId != null and bodyId.size() > 0">
AND i.body_id IN
<foreach item="bodyIdItem" collection="bodyId" open="(" separator="," close=")">
#{bodyIdItem}
</foreach>
</if>
<if test="groupId != null and groupId.size() > 0">
AND i.group_id IN
<foreach item="groupIdItem" collection="groupId" open="(" separator="," close=")">
#{groupIdItem}
</foreach>
</if>
<if test="goodsId != null and goodsId.size() > 0">
AND p.goods_id IN
<foreach item="goodIdItem" collection="goodsId" open="(" separator="," close=")">
#{goodIdItem}
</foreach>
</if>
GROUP BY
i.room_id, i.body_id, i.group_id, p.goods_id, i.organ_id, i.order_id
) 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
</select>
</mapper> </mapper>
@@ -8,4 +8,6 @@ package com.cf.imes.module.manage.enums;
public class DictTypeConstants { public class DictTypeConstants {
public static final String PLATE_TEXTURE = "plate_texture_type";// 板件纹里 public static final String PLATE_TEXTURE = "plate_texture_type";// 板件纹里
public static final String PART_CATEGORY = "part_category";// 配件主类型
} }
@@ -1,8 +1,14 @@
package com.cf.imes.module.manage.enums; package com.cf.imes.module.manage.enums;
import com.cf.imes.framework.common.exception.ErrorCode;
/** /**
* @author there * @author there
* 生产管理服务错误码枚举 使用1-004-000-000 段 * 生产管理服务错误码枚举 使用1-004-000-000 段
*/ */
public interface ErrorCodeConstants { public interface ErrorCodeConstants {
public static final ErrorCode PARTS_NOT_EXISTS = new ErrorCode(1_004_000_000, "配件不存在");
public static final ErrorCode PARTS_GOOD_ID_EXISTS = new ErrorCode(1_004_000_000, "配件标识已存在");
} }
@@ -0,0 +1,22 @@
package com.cf.imes.module.manage.enums.parts;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 配件主类的枚举值
*/
@Getter
@AllArgsConstructor
public enum CategoryEnum implements ObjectEnum{
ASSEMBLY("组件"),
HARDWARE("五金"),
EDGING("封边条");
/**
* 类别名称
*/
private final String value;
}
@@ -0,0 +1,6 @@
package com.cf.imes.module.manage.enums.parts;
public interface ObjectEnum {
String getValue();
}
@@ -0,0 +1,17 @@
package com.cf.imes.module.manage.enums.parts;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum WhetherEnum implements ObjectEnum{
TRUE(""),
FALSE("");
/**
* 类别名称
*/
private final String value;
}
@@ -1,4 +1,4 @@
package com.cf.imes.module.manage.enums; package com.cf.imes.module.manage.enums.remainPlate;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -1,4 +1,4 @@
package com.cf.imes.module.manage.enums; package com.cf.imes.module.manage.enums.remainPlate;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -1,4 +1,4 @@
package com.cf.imes.module.manage.enums; package com.cf.imes.module.manage.enums.remainPlate;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -0,0 +1,148 @@
package com.cf.imes.module.manage.controller.admin.parts;
import com.cf.imes.module.manage.controller.admin.parts.vo.*;
import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlateImportExcelVO;
import com.cf.imes.module.manage.dal.dataobject.parts.PartsDO;
import com.cf.imes.module.manage.service.parts.PartsExcelListener;
import com.cf.imes.module.manage.service.parts.PartsService;
import com.cf.imes.module.manage.util.file.ExcelReadUtil;
import io.swagger.v3.oas.annotations.Parameters;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.*;
import javax.servlet.http.*;
import javax.validation.constraints.NotEmpty;
import java.util.*;
import java.io.IOException;
import com.cf.imes.framework.common.pojo.PageParam;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import static com.cf.imes.framework.common.pojo.CommonResult.success;
import com.cf.imes.framework.excel.core.util.ExcelUtils;
import com.cf.imes.framework.operatelog.core.annotations.OperateLog;
import org.springframework.web.multipart.MultipartFile;
import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.*;
@Tag(name = "管理后台 - 配件管理")
@RestController
@RequestMapping("/manage/parts/")
@Validated
public class PartsController {
@Resource
private PartsService partsService;
final String IMPORT_TEMPLATE = "配件导入模板.xlsx";
@PostMapping("/create")
@Operation(summary = "创建配件")
@PreAuthorize("@ss.hasAnyPermissions('system:accessory:create','base:accessory:create')")
public CommonResult<Long> create(@Valid @RequestBody PartsSaveReqVO createReqVO) {
return success(partsService.create(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新配件")
@PreAuthorize("@ss.hasAnyPermissions('system:accessory:update','base:accessory:update')")
public CommonResult<Boolean> update(@Valid @RequestBody PartsSaveReqVO updateReqVO) {
partsService.update(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除配件")
@Parameters({
@Parameter(name = "id", description = "编号", required = true, example = "1024"),
@Parameter(name = "organId", description = "板材所属组织ID", example = "1024")
})
@PreAuthorize("@ss.hasAnyPermissions('system:accessory:delete','base:accessory:delete')")
public CommonResult<Boolean> delete(@RequestParam("id") Long id,
@RequestParam(value = "organId",required = false, defaultValue = "0") Long organId) {
partsService.delete(id, organId);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得配件")
@Parameters({
@Parameter(name = "id", description = "编号", required = true, example = "1024"),
@Parameter(name = "organId", description = "板材所属组织ID", example = "1024")
})
@PreAuthorize("@ss.hasAnyPermissions('system:accessory:query','base:accessory:query')")
public CommonResult<PartsRespVO> get(@RequestParam("id") Long id,
@RequestParam(value = "organId", required = false, defaultValue = "0") Long organId) {
PartsDO partsDO = partsService.get(id, organId);
return success(BeanUtils.toBean(partsDO, PartsRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得配件分页")
@PreAuthorize("@ss.hasAnyPermissions('manage:parts:query','base:accessory:query')")
public CommonResult<PageResult<PartsRespVO>> getPage(@Valid PartsPageReqVO pageReqVO) {
PageResult<PartsDO> pageResult = partsService.getPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, PartsRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出配件文件")
@PreAuthorize("@ss.hasAnyPermissions('manage:parts:export','base:accessory:export')")
@OperateLog(type = EXPORT)
public void exportExcel(@Valid PartsPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<PartsDO> list = partsService.getPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "配件表 parts_{N}.xls", "数据", PartsRespVO.class,
BeanUtils.toBean(list, PartsRespVO.class));
}
@GetMapping("/get-import-template")
@Operation(summary = "获得导入配件模板")
@Parameter(name = "value", description = "文件类型", required = true, example = "0")
public void importTemplate(HttpServletResponse response, @RequestParam("value") @NotEmpty(message = "文件路径不能为空") String value) {
partsService.exportTemplate(response, value);
}
@PostMapping("/import")
@Operation(summary = "导入配件")
@Parameters({
@Parameter(name = "file", description = "Excel 文件", required = true),
@Parameter(name = "updateSupport", description = "是否支持更新", example = "true"),
@Parameter(name = "organId", description = "配件所属组织ID")
})
@PreAuthorize("@ss.hasAnyPermissions('system:accessory:import','base:accessory:import')")
public void importExcel(@RequestParam("file") MultipartFile file,
@RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport,
@RequestParam(value = "organId", required = false, defaultValue = "0") Long organId,
HttpServletResponse response) throws Exception {
ExcelReadUtil excelReadUtil = new ExcelReadUtil();
PartsExcelListener listener = new PartsExcelListener();
List<PartsImportExcelVO> list = excelReadUtil.read(file, PartsImportExcelVO.class, listener);
System.out.println(" list = " + list);
if (!excelReadUtil.getFlag())
ExcelUtils.write(response, IMPORT_TEMPLATE, "配件列表", PartsImportExcelVO.class, list);
else {
if (list.isEmpty()){
PartsImportExcelVO partsImportExcelVO = PartsImportExcelVO.builder().result("导入失败,请保证导入文件中包含配件数据").build();
list.add(partsImportExcelVO);
ExcelUtils.write(response, IMPORT_TEMPLATE, "板材列表", PartsImportExcelVO.class, list);
} else {
partsService.importPartsList(list, updateSupport, organId);// 成功,批量导入
}
}
}
}
@@ -0,0 +1,73 @@
package com.cf.imes.module.manage.controller.admin.parts.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 配件导入模板
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
public class PartsImportExcelVO {
@ExcelProperty("配件编号")
private String goodsId;
@ExcelProperty("复合部件")
private String isComposite;
@ExcelProperty("配件类型")
private String category;
@ExcelProperty("配件子类")
private String type;
@ExcelProperty("配件名称")
private String name;
@ExcelProperty("型号")
private String model;
@ExcelProperty("颜色")
private String color;
@ExcelProperty("材质")
private String material;
@ExcelProperty("单位")
private String unit;
@ExcelProperty("规格")
private String spec;
@ExcelProperty("品牌")
private String brand;
@ExcelProperty("厂家")
private String factor;
@ExcelProperty("长度")// float(8,3)
private String length;
@ExcelProperty("宽度")// float(8,3)
private String width;
@ExcelProperty("厚度")
private String thickness;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("上传结果")
@ExcelIgnore
private String result;
}
@@ -0,0 +1,104 @@
package com.cf.imes.module.manage.controller.admin.parts.vo;
import com.cf.imes.framework.common.pojo.PageParam;
import com.cf.imes.framework.common.validation.NumberValid;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.Size;
import java.time.LocalDateTime;
import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* 查询
*/
@Schema(description = "管理后台 - 配件分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PartsPageReqVO extends PageParam {
@Schema(description = "设计端商品ID", example = "26589")
@Size(max = 32, message = "配件编号长度不能超过32个字符")
private String goodsId;
@Schema(description = "配件名称", example = "张三")
@Size(max = 64, message = "配件名称长度不能超过64个字符")
private String name;
@Schema(description = "颜色")
@Size(max = 32, message = "颜色长度不能超过32个字符")
private String color;
@Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板")
@Size(max = 64, message = "材质长度不能超过64个字符")
private String material;
@Schema(description = "配件类型", example = "2")
@Size(max = 32, message = "配件类型长度不能超过323个字符")
private String category;
@Schema(description = "配件子类", example = "2")
@Size(max = 64, message = "配件子类长度不能超过64个字符")
private String type;
@Schema(description = "型号")
@Size(max = 64, message = "配件型号长度不能超过64个字符")
private String model;
@Schema(description = "规格")
@Size(max = 64, message = "配件规格不能超过64个字符")
private String spec;
@Schema(description = "宽度")
@NumberValid(name = "宽度")
private Double[] width;
@Schema(description = "长度")
@NumberValid(name = "长度")
private Double[] length;
@Schema(description = "厚度")
@NumberValid(name = "厚度")
private Double[] thickness;
@Schema(description = "品牌")
@Size(max = 64, message = "配件品牌不能超过64个字符")
private String brand;
@Schema(description = "厂家")
@Size(max = 128, message = "厂家长度不能超过64个字符")
private String factory;
@Schema(description = "单位")
@Size(max = 32, message = "单位长度不能超过64个字符")
private String unit;
@Schema(description = "是否复合部件:0 否 1 是")
private Boolean isComposite;
@Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", example = "你说的对")
@Size(max = 255, message = "子配件列表长度不能超过255个字符")
private String subparts;
@Schema(description = "备注", example = "你说的对")
@Size(max = 255, message = "备注长度不能超过255个字符")
private String remark;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
private Long organId;
@Schema(description = "排序", example = "ascend")
private String order;
@Schema(description = "排序字段", example = "id")
private String field;
}
@@ -0,0 +1,97 @@
package com.cf.imes.module.manage.controller.admin.parts.vo;
import com.cf.imes.framework.common.validation.NumberValid;
import com.cf.imes.framework.excel.core.annotations.DictFormat;
import com.cf.imes.module.manage.enums.DictTypeConstants;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
@Schema(description = "管理后台 - 配件 Response VO")
@Data
@ExcelIgnoreUnannotated
public class PartsRespVO {
@Schema(description = "配件 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11238")
@ExcelProperty("配件 ID")
private Long id;
@Schema(description = "设计端商品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26589")
@ExcelProperty("设计端商品ID")
private String goodsId;
@Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
@ExcelProperty("配件名称")
private String name;
@Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED)
@Size(max = 32, message = "颜色长度不能超过32个字符")
private String color;
@Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板")
private String material;
@Schema(description = "配件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@ExcelProperty("配件类型")
@DictFormat(DictTypeConstants.PART_CATEGORY)
private String category;
@Schema(description = "配件子类", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@ExcelProperty("配件子类")
private String type;
@Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("型号")
private String model;
@Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED)
@NumberValid(name = "宽度")
private Double width;
@Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED)
@NumberValid(name = "长度")
private Double length;
@Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED)
@NumberValid(name = "厚度")
private Double thickness;
@Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("规格")
private String spec;
@Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("品牌")
private String brand;
@Schema(description = "厂家", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("厂家")
private String factory;
@Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("单位")
private String unit;
@Schema(description = "是否复合部件:0 否 1 是", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("是否复合部件:0 否 1 是")
private Boolean isComposite;
@Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对")
@ExcelProperty("是否复合部件:0 否 1 是")
private String subparts;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
@@ -0,0 +1,95 @@
package com.cf.imes.module.manage.controller.admin.parts.vo;
import com.cf.imes.framework.common.validation.NumberValid;
import com.cf.imes.module.manage.validation.parts.PartsCategoryValid;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 配件 新增/修改 Request VO")
@Data
public class PartsSaveReqVO {
@Schema(description = "配件 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11238")
private Long id;
@Schema(description = "设计端商品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26589")
@NotEmpty(message = "设计端商品ID不能为空")
@Size(max = 32, message = "设计端商品ID长度不能超过32个字符")
private String goodsId;
@Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
@NotEmpty(message = "配件名称不能为空")
@Size(max = 64, message = "配件名称长度不能超过64个字符")
private String name;
@Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED)
@Size(max = 32, message = "颜色长度不能超过32个字符")
@NotEmpty(message = "颜色不能为空")
private String color;
@Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板不能为空")
@Size(max = 64, message = "材质长度不能超过64个字符")
private String material;
@Schema(description = "配件类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@NotEmpty(message = "配件类型不能为空")
@Size(max = 32, message = "配件类型长度不能超过32个字符")
@PartsCategoryValid
private String category;
@Schema(description = "配件子类", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@Size(max = 64, message = "配件子类长度不能超过64个字符")
private String type;
@Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "型号不能为空")
@Size(max = 64, message = "型号长度不能超过64个字符")
private String model;
@Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED)
@NumberValid(name = "宽度")
private Double width;
@Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED)
@NumberValid(name = "长度")
private Double length;
@Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED)
@NumberValid(name = "厚度")
private Double thickness;
@Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED)
@Size(max = 64, message = "规格长度不能超过64个字符")
private String spec;
@Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED)
@Size(max = 64, message = "品牌长度不能超过64个字符")
private String brand;
@Schema(description = "厂家", requiredMode = Schema.RequiredMode.REQUIRED)
@Size(max = 128, message = "厂家长度不能超过128个字符")
private String factory;
@Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "单位不能为空")
@Size(max = 32, message = "单位长度不能超过32个字符")
private String unit;
@Schema(description = "是否复合部件:0 否 1 是", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "是否复合部件不能为空")
private Boolean isComposite;
@Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对")
@Size(max = 255, message = "子配件列表长度不能超过255个字符")
private String subparts;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你说的对")
@Size(max = 255, message = "备注长度不能超过255个字符")
private String remark;
private Long organId;
}
@@ -42,6 +42,8 @@ public class PlateController {
@Resource @Resource
private PlateService plateService; private PlateService plateService;
final String IMPORT_TEMPLATE = "板材导入模板.xlsx";
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建板材信息") @Operation(summary = "创建板材信息")
// @PreAuthorize("@ss.hasPermission('manage:plate:create')") // @PreAuthorize("@ss.hasPermission('manage:plate:create')")
@@ -123,7 +125,7 @@ public class PlateController {
.thickness(String.valueOf(18)).brand("鸿达树").spec("2750*1220*18").remark("测试").color("白玉木兰").texture("").build() .thickness(String.valueOf(18)).brand("鸿达树").spec("2750*1220*18").remark("测试").color("白玉木兰").texture("").build()
); );
// 输出 // 输出
ExcelUtils.write(response, "板材导入模板.xlsx", "板材列表", PlateImportExcelVO.class, list); ExcelUtils.write(response, IMPORT_TEMPLATE, "板材列表", PlateImportExcelVO.class, list);
} }
@PostMapping("/import") @PostMapping("/import")
@@ -143,12 +145,12 @@ public class PlateController {
List<PlateImportExcelVO> list = plateExcelUtil.read(file, PlateImportExcelVO.class); List<PlateImportExcelVO> list = plateExcelUtil.read(file, PlateImportExcelVO.class);
// 判断文件是否导入成功 // 判断文件是否导入成功
if (!plateExcelUtil.getFlag()) if (!plateExcelUtil.getFlag())
ExcelUtils.write(response, "板材导入模板.xlsx", "板材列表", PlateImportExcelVO.class, list); ExcelUtils.write(response, IMPORT_TEMPLATE, "板材列表", PlateImportExcelVO.class, list);
else { else {
if (list.size() == 0){ if (list.size() == 0){
PlateImportExcelVO plateImportExcelVO = PlateImportExcelVO.builder().result("导入失败,请保证导入文件中包含板材数据").build(); PlateImportExcelVO plateImportExcelVO = PlateImportExcelVO.builder().result("导入失败,请保证导入文件中包含板材数据").build();
list.add(plateImportExcelVO); list.add(plateImportExcelVO);
ExcelUtils.write(response, "板材导入模板.xlsx", "板材列表", PlateImportExcelVO.class, list); ExcelUtils.write(response, IMPORT_TEMPLATE, "板材列表", PlateImportExcelVO.class, list);
}else { }else {
plateService.importPlateList(list, updateSupport, organId);// 成功,批量导入 plateService.importPlateList(list, updateSupport, organId);// 成功,批量导入
} }
@@ -0,0 +1,101 @@
package com.cf.imes.module.manage.dal.dataobject.parts;
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,106 @@
package com.cf.imes.module.manage.dal.mysql.parts;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX;
import com.cf.imes.module.manage.controller.admin.parts.vo.PartsPageReqVO;
import com.cf.imes.module.manage.dal.dataobject.parts.PartsDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 配件表 parts_{N} Mapper
*
* @author 晨丰科技
*/
@Mapper
public interface PartsMapper extends BaseMapperX<PartsDO> {
default PageResult<PartsDO> selectPage(PartsPageReqVO reqVO) {
LambdaQueryWrapperX<PartsDO> queryWrapper = new LambdaQueryWrapperX<PartsDO>()
.eqIfPresent(PartsDO::getOrganId, reqVO.getOrganId())
.eqIfPresent(PartsDO::getCategory, reqVO.getCategory())
.likeIfPresent(PartsDO::getGoodsId, reqVO.getGoodsId())
.likeIfPresent(PartsDO::getColor, reqVO.getColor())
.likeIfPresent(PartsDO::getType, reqVO.getType())
.likeIfPresent(PartsDO::getName, reqVO.getName())
.likeIfPresent(PartsDO::getMaterial, reqVO.getMaterial())
.likeIfPresent(PartsDO::getModel, reqVO.getModel())
.likeIfPresent(PartsDO::getSpec, reqVO.getSpec())
.likeIfPresent(PartsDO::getBrand, reqVO.getBrand())
.likeIfPresent(PartsDO::getFactory, reqVO.getFactory())
.likeIfPresent(PartsDO::getUnit, reqVO.getUnit())
.eqIfPresent(PartsDO::getIsComposite, reqVO.getIsComposite())
.betweenIfPresent(PartsDO::getWidth, reqVO.getWidth())
.betweenIfPresent(PartsDO::getLength, reqVO.getLength())
.betweenIfPresent(PartsDO::getThickness, reqVO.getThickness())
.likeIfPresent(PartsDO::getRemark, reqVO.getRemark())
.betweenIfPresent(PartsDO::getCreateTime, reqVO.getCreateTime());
if (reqVO.getOrder() == null) {
queryWrapper.orderByDesc(PartsDO::getGoodsId);
}else {
if (reqVO.getOrder().equals("ascend")) {
switch (reqVO.getField()) {
case "goodsId" -> queryWrapper.orderByAsc(PartsDO::getGoodsId);
case "isComposite" -> queryWrapper.orderByAsc(PartsDO::getIsComposite);
case "category" -> queryWrapper.orderByAsc(PartsDO::getCategory);
case "type" -> queryWrapper.orderByAsc(PartsDO::getType);
case "name" -> queryWrapper.orderByAsc(PartsDO::getName);
case "model" -> queryWrapper.orderByAsc(PartsDO::getModel);
case "material" -> queryWrapper.orderByAsc(PartsDO::getMaterial);
case "color" -> queryWrapper.orderByAsc(PartsDO::getColor);
case "unit" -> queryWrapper.orderByAsc(PartsDO::getUnit);
case "spec" -> queryWrapper.orderByAsc(PartsDO::getSpec);
case "brand" -> queryWrapper.orderByAsc(PartsDO::getBrand);
case "factory" -> queryWrapper.orderByAsc(PartsDO::getFactory);
case "width" -> queryWrapper.orderByAsc(PartsDO::getWidth);
case "length" -> queryWrapper.orderByAsc(PartsDO::getLength);
case "thickness" -> queryWrapper.orderByAsc(PartsDO::getThickness);
default -> {
// default不排序
}
}
}else if (reqVO.getOrder().equals("descend")) {
switch (reqVO.getField()) {
case "goodsId" -> queryWrapper.orderByDesc(PartsDO::getGoodsId);
case "isComposite" -> queryWrapper.orderByDesc(PartsDO::getIsComposite);
case "category" -> queryWrapper.orderByDesc(PartsDO::getCategory);
case "type" -> queryWrapper.orderByDesc(PartsDO::getType);
case "name" -> queryWrapper.orderByDesc(PartsDO::getName);
case "model" -> queryWrapper.orderByDesc(PartsDO::getModel);
case "material" -> queryWrapper.orderByDesc(PartsDO::getMaterial);
case "color" -> queryWrapper.orderByDesc(PartsDO::getColor);
case "unit" -> queryWrapper.orderByDesc(PartsDO::getUnit);
case "spec" -> queryWrapper.orderByDesc(PartsDO::getSpec);
case "brand" -> queryWrapper.orderByDesc(PartsDO::getBrand);
case "factory" -> queryWrapper.orderByDesc(PartsDO::getFactory);
case "width" -> queryWrapper.orderByDesc(PartsDO::getWidth);
case "length" -> queryWrapper.orderByDesc(PartsDO::getLength);
case "thickness" -> queryWrapper.orderByDesc(PartsDO::getThickness);
default -> {
// default不排序
}
}
}
}
return selectPage(reqVO, queryWrapper);
}
default PartsDO selectById(Long id , Long organId) {
return selectOne(PartsDO::getId, id, PartsDO::getOrganId, organId);
}
default PartsDO selectByGoodID(String goodId , Long organId) {
return selectOne(PartsDO::getGoodsId, goodId, PartsDO::getOrganId, organId);
}
default PartsDO selectExceptGoodID(Long id, String goodId , Long organId) {
return selectOne(new LambdaQueryWrapperX<PartsDO>()
.ne(PartsDO::getId, id)
.eq(PartsDO::getGoodsId, goodId)
.eq(PartsDO::getOrganId, organId));
}
}
@@ -0,0 +1,211 @@
package com.cf.imes.module.manage.service.parts;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.nacos.common.utils.StringUtils;
import com.cf.imes.module.manage.controller.admin.parts.vo.PartsImportExcelVO;
import com.cf.imes.module.manage.enums.parts.CategoryEnum;
import com.cf.imes.module.manage.enums.parts.ObjectEnum;
import com.cf.imes.module.manage.enums.parts.WhetherEnum;
import com.cf.imes.module.manage.util.file.ExcelListener;
import lombok.extern.slf4j.Slf4j;
import java.text.DecimalFormat;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* 配件 导入监听器
*/
@Slf4j
public final class PartsExcelListener extends ExcelListener<PartsImportExcelVO> {
private static final String ZERO = "0";
/**
* 自定义用于暂时存储data
* 可以通过实例获取该值
*/
private List<PartsImportExcelVO> datas = new ArrayList<>();
private boolean flag = true;
private Map<Integer, String> valueMap = new HashMap<>();
// 非空判断,错误写入;不为空则判断字符串长度是否超过
private void isEmptyAndAdd(Supplier<String> getter, Consumer<String> setter,String msg, int maxLength) {
String value = getter.get();
if (StringUtils.isEmpty(value)) {
setter.accept(msg + "不可为空");
this.flag = false;
} else { // 字符长度判断
isLong(value, setter, maxLength, msg);
}
}
private void isEmpty(Supplier<String> getter, Consumer<String> setter,String msg) {
String value = getter.get();
if (StringUtils.isEmpty(value)) {
setter.accept(msg + "不可为空");
this.flag = false;
}
}
//不为空时,判断长度
private void isNotEmptyAndAdd(Supplier<String> getter, Consumer<String> setter,String msg, int maxLength) {
String value = getter.get();
if (StringUtils.isNotEmpty(value)) {
isLong(value, setter, maxLength, msg);
}
}
// 非空判断,并判断枚举值是否正确
private <T extends Enum<T> & ObjectEnum> void isEmptyAndEnumAdd(Supplier<String> getter, Consumer<String> setter, String msg, Class<T> enumClass) {
String value = getter.get();
if (StringUtils.isEmpty(value)) {
setter.accept(msg + "不可为空");
this.flag = false;
} else {
boolean isValid = false;
for (T enumValue : enumClass.getEnumConstants()) {
if (Objects.equals(enumValue.getValue(), value)) {
isValid = true;
break;
}
}
if (!isValid) {
setter.accept(msg + "请使用规范标识填写表格");
this.flag = false;
}
}
}
// 非空时判断字符串是否可以转换为Double,并判断整数位与小数位是否符合长度要求
private void isEmptyAndDoubleAdd(Supplier<String> getter, Consumer<String> setter, String msg, int integerLength, int decimalLength) {
String value = getter.get();
if (StringUtils.isNotEmpty(value)) {
// 判断是否可以转换
try {
Double d = Double.parseDouble(value);
if (d < Double.parseDouble(ZERO)) {
setter.accept(msg + "必须大于0");
} else {
// 处理科学计数法,保留小数点后四位
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String valueString = decimalFormat.format(d);
String[] split = valueString.split("\\.");
// 获取小数点前的位数
int integerPartLength = split[0].length();
// 获取小数点后的位数
int fractionalPartLength = 0;
if (split.length > 2) {
fractionalPartLength = split[1].length();
}
if (integerPartLength > integerLength || fractionalPartLength > decimalLength) {
setter.accept(msg + "长度不合法,总长度不超过8位,小数点后不超过3位");
}
}
} catch (NumberFormatException e) {
setter.accept(msg + "必须为数字");
this.flag = false;
}
}
}
// 判断字符串长度是否过长
private void isLong(String value, Consumer<String> setter, int maxLength, String msg) {
if (value.length() > maxLength) {
setter.accept(msg + "长度不能超过" + maxLength + "个字符");
this.flag = false;
}
}
// 结果数据生成
private String setResult(String result, String value) {
if (StringUtils.isEmpty(result)) {
return value;
} else {
return result + "," + value;
}
}
/**
* 每解析一行都会回调invoke()方法
*
* @param data 读取后的数据对象
* @param context 内容
*/
@Override
public void invoke(PartsImportExcelVO data, AnalysisContext context) {
isEmptyAndAdd(data::getGoodsId, data::setResult, setResult(data.getResult(), "编号"), 32);
isEmptyAndEnumAdd(data::getIsComposite, data::setResult, setResult(data.getResult(), "是否复合部件"), WhetherEnum.class);
isEmptyAndEnumAdd(data::getCategory, data::setResult, setResult(data.getResult(), "类型"), CategoryEnum.class);
isNotEmptyAndAdd(data::getCategory, data::setResult, setResult(data.getResult(), "类型"),32);
isNotEmptyAndAdd(data::getType, data::setResult, setResult(data.getResult(), "子类型"), 64);
isEmptyAndAdd(data::getName, data::setResult, setResult(data.getResult(), "名称"), 64);
isEmptyAndAdd(data::getModel, data::setResult, setResult(data.getResult(), "型号"), 64);
isEmptyAndAdd(data::getColor, data::setResult, setResult(data.getResult(), "颜色"), 64);
isEmptyAndAdd(data::getMaterial, data::setResult, setResult(data.getResult(), "材质"), 64);
isEmptyAndAdd(data::getUnit, data::setResult, setResult(data.getResult(), "单位"), 32);
isNotEmptyAndAdd(data::getSpec, data::setResult, setResult(data.getResult(), "规格"), 64);
isNotEmptyAndAdd(data::getBrand, data::setResult, setResult(data.getResult(), "品牌"), 64);
isNotEmptyAndAdd(data::getFactor, data::setResult, setResult(data.getResult(), "厂家"), 128);
isEmptyAndDoubleAdd(data::getLength, data::setResult, setResult(data.getResult(), "长度"), 5 , 3);
isEmptyAndDoubleAdd(data::getWidth, data::setResult, setResult(data.getResult(), "宽度"), 5 , 3);
isEmptyAndDoubleAdd(data::getThickness, data::setResult, setResult(data.getResult(), "厚度"), 5 , 3);
isNotEmptyAndAdd(data::getRemark, data::setResult, setResult(data.getResult(), "备注"), 255);
// 当为封边的时候,一定需要
if (StringUtils.isNotEmpty(data.getCategory())) {
if (data.getCategory().equals(CategoryEnum.EDGING.getValue())) {
isEmpty(data::getThickness, data::setResult, setResult(data.getResult(), "厚度"));
isEmpty(data::getWidth, data::setResult, setResult(data.getResult(), "宽度"));
}
}
if (data.getResult() != null)
data.setResult(data.getResult().replace("null,", ""));
valueMap.put(context.getCurrentRowNum(), data.getResult());
datas.add(data);
}
/**
* 读取完后操作
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
if (this.flag)
log.info("PlateExcelListener 所有数据读取完成");
}
/**
* 返回数据
*
* @return 返回读取的数据集合
**/
public List<PartsImportExcelVO> getDates() {
return datas;
}
/**
* 返回读取结果
*
* @return 是否读取成功
**/
public boolean getFlag() {
return flag;
}
/**
* 返回错误信息
*
* @return String
**/
public Map<Integer, String> getValueMap() {
return valueMap;
}
}
@@ -0,0 +1,84 @@
package com.cf.imes.module.manage.service.parts;
import javax.servlet.http.HttpServletResponse;
import javax.validation.*;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.module.manage.controller.admin.parts.vo.PartsImportExcelVO;
import com.cf.imes.module.manage.controller.admin.parts.vo.PartsPageReqVO;
import com.cf.imes.module.manage.controller.admin.parts.vo.PartsSaveReqVO;
import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlateImportExcelVO;
import com.cf.imes.module.manage.controller.admin.plate.vo.plate.PlateImportRespVO;
import com.cf.imes.module.manage.dal.dataobject.parts.PartsDO;
import org.springframework.boot.system.ApplicationHome;
import java.io.File;
import java.util.List;
/**
* 配件表 parts_{N} Service 接口
*
* @author 晨丰科技
*/
public interface PartsService {
/**
* 创建配件表 parts_{N}
*
* @param createReqVO 创建信息
* @return 编号
*/
Long create(@Valid PartsSaveReqVO createReqVO);
/**
* 更新配件表 parts_{N}
*
* @param updateReqVO 更新信息
*/
void update(@Valid PartsSaveReqVO updateReqVO);
/**
* 删除配件表 parts_{N}
*
* @param id 编号
*/
void delete(Long id, Long organId);
/**
* 获得配件表 parts_{N}
*
* @param id 编号
* @return 配件表 parts_{N}
*/
PartsDO get(Long id, Long organId);
/**
* 获得配件表 parts_{N}分页
*
* @param pageReqVO 分页查询
* @return 配件表 parts_{N}分页
*/
PageResult<PartsDO> getPage(PartsPageReqVO pageReqVO);
/**
* 生产导入文件模板下载
*/
void exportTemplate(HttpServletResponse response, String value);
/**
* 批量导入配件
*
* @param importParts 导入配件列表
* @param isUpdateSupport 是否支持更新
*/
void importPartsList(List<PartsImportExcelVO> importParts, boolean isUpdateSupport , Long organId);
default String getSavePath() {
ApplicationHome applicationHome = new ApplicationHome(this.getClass());
// 保存目录位置根据项目需求可随意更改
return applicationHome.getDir().getAbsolutePath() + File.separator + "type";
}
}
@@ -0,0 +1,209 @@
package com.cf.imes.module.manage.service.parts;
import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.organ.core.aop.OrganIgnore;
import com.cf.imes.framework.organ.core.context.OrganContextHolder;
import com.cf.imes.module.manage.controller.admin.parts.vo.PartsImportExcelVO;
import com.cf.imes.module.manage.controller.admin.parts.vo.PartsPageReqVO;
import com.cf.imes.module.manage.controller.admin.parts.vo.PartsSaveReqVO;
import com.cf.imes.module.manage.util.file.FileHelperUtil;
import com.cf.imes.module.manage.dal.dataobject.parts.PartsDO;
import com.cf.imes.module.manage.dal.mysql.parts.PartsMapper;
import com.cf.imes.module.system.api.organ.OrganApi;
import com.cf.imes.module.system.api.permission.PermissionApi;
import com.cf.imes.module.system.enums.ErrorCodeConstants;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils;
import java.util.ArrayList;
import java.util.List;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
import static com.cf.imes.module.manage.enums.ErrorCodeConstants.PARTS_GOOD_ID_EXISTS;
import static com.cf.imes.module.manage.enums.ErrorCodeConstants.PARTS_NOT_EXISTS;
/**
* 配件表 parts_{N} Service 实现类
*
* @author 晨丰科技
*/
@Service
@Validated
public class PartsServiceImpl implements PartsService {
@Resource
private PartsMapper partsMapper;
@Resource
private OrganApi organApi;
@Resource
private PermissionApi permissionApi;
private final static String BASE_PARTS_IMPORT_PERMISSION = "base:accessory:import"; // 导入板材
private final static String BASE_PARTS_DELETE_PERMISSION = "base:accessory:delete"; // 删除板材信息
private final static String BASE_PARTS_CREATE_PERMISSION = "base:accessory:create"; // 创建板材信息
private final static String BASE_PARTS_UPDATE_PERMISSION = "base:accessory:update"; // 更新板材信息
private final static String BASE_PARTS_QUERY_PERMISSION = "base:accessory:query"; // 获得板材信息
@Override
@OrganIgnore
public Long create(PartsSaveReqVO createReqVO) {
PartsDO partsDO = BeanUtils.toBean(createReqVO, PartsDO.class);
Long organId = getOrganId(BASE_PARTS_CREATE_PERMISSION, getLoginUser().getId(), partsDO.getOrganId());
partsDO.setOrganId(organId).setIsComposite(false);
// 判断是否存在--- goodsId
if (validateExistsByGoodsId(partsDO.getGoodsId(), organId)) {
throw exception(PARTS_GOOD_ID_EXISTS);
}
partsMapper.insert(partsDO);
// 返回
return partsDO.getId();
}
@Override
@OrganIgnore
@Transactional(rollbackFor = Exception.class)
public void update(PartsSaveReqVO updateReqVO) {
Long organId = getOrganId(BASE_PARTS_UPDATE_PERMISSION, getLoginUser().getId(), updateReqVO.getOrganId());
// 校验id存在
boolean index = validateExistsById(updateReqVO.getId(),organId);
if (!index) {
throw exception(PARTS_NOT_EXISTS);
}
// 校验goodsId是否存在
if (!validateExistsExceptGoodsId(updateReqVO.getId(),updateReqVO.getGoodsId(),organId)) {
throw exception(PARTS_GOOD_ID_EXISTS);
}
// 更新
updateReqVO.setOrganId(organId);
PartsDO updateObj = BeanUtils.toBean(updateReqVO, PartsDO.class);
partsMapper.updateById(updateObj);
}
@Override
public void delete(Long id, Long organId) {
// 校验存在
if (!validateExistsById(id, getOrganId(BASE_PARTS_DELETE_PERMISSION, getLoginUser().getId(), organId))) {
throw exception(PARTS_NOT_EXISTS);
}
// 删除
partsMapper.deleteById(id);
}
private boolean validateExistsById(Long id, Long organId) {
if (partsMapper.selectById(id, organId) == null) {
return false;
}
return true;
}
private boolean validateExistsByGoodsId(String goodsId, Long organId) {
if (partsMapper.selectByGoodID(goodsId, organId) == null) {
return false;
}
return true;
}
private boolean validateExistsExceptGoodsId(Long id, String goodsId, Long organId) {
if (partsMapper.selectExceptGoodID(id, goodsId, organId) == null) { // 不存在相同的goods_id
return true;
}
return false;
}
@Override
public PartsDO get(Long id, Long organId) {
organId = getOrganId(BASE_PARTS_QUERY_PERMISSION, getLoginUser().getId(), organId);
return partsMapper.selectById(id, organId);
}
@Override
public PageResult<PartsDO> getPage(PartsPageReqVO pageReqVO) {
pageReqVO.setOrganId(getOrganId(BASE_PARTS_QUERY_PERMISSION, getLoginUser().getId(), pageReqVO.getOrganId()));
return partsMapper.selectPage(pageReqVO);
}
@Override
public void exportTemplate(HttpServletResponse response, String value) {
String rootPath = getSavePath();
FileHelperUtil.getFile(rootPath, response, value);
}
@Override
public void importPartsList(List<PartsImportExcelVO> importParts, boolean isUpdateSupport, Long organId) {
// 组织id
organId = getOrganId(BASE_PARTS_IMPORT_PERMISSION, getLoginUser().getId(), organId);
// 批量插入集合
List<PartsDO> insertList = new ArrayList<>();
// 批量更新集合
List<PartsDO> updateList = new ArrayList<>();
Long finalOrganId = organId;
importParts.forEach(importPart -> {
// 判断如果不存在,在进行插入
PartsDO existPlate = partsMapper.selectByGoodID(importPart.getGoodsId(), finalOrganId);
if (existPlate == null) { // 不存在
insertList.add(BeanUtils.toBean(importPart, PartsDO.class).setOrganId(finalOrganId));
return;
}
// 判断是否允许更新
if (!isUpdateSupport) {
PartsDO partsDO = BeanUtils.toBean(importPart, PartsDO.class).setOrganId(finalOrganId).setId(existPlate.getId());
updateList.add(partsDO);
}
});
// 批量插入,批量更新
if (insertList.size() > 0) {
partsMapper.insertBatch(insertList);
}
if (updateList.size() > 0) {
partsMapper.updateBatch(updateList);
}
}
private void validateOrganExists(Long organId) {
CommonResult<Boolean> index = organApi.validOrgan(organId);
if (!index.isSuccess()) {
throw exception(ErrorCodeConstants.ORGAN_NOT_EXISTS);
}
}
// 组织id返回
private Long getOrganId(String type, Long userId, Long organId) {
boolean hasPermission = permissionApi.hasRoles(userId, type).getData();
Long organIdDefault = OrganContextHolder.getOrganId();
if (hasPermission && organId != null && organId != 0) {
validateOrganExists(organId);
organIdDefault = organId;
}
return organIdDefault;
}
}
@@ -6,8 +6,8 @@ import com.cf.imes.module.manage.controller.admin.plate.vo.remain.RemainPlateSav
import com.cf.imes.module.manage.dal.dataobject.remainplaten.RemainPlateDO; import com.cf.imes.module.manage.dal.dataobject.remainplaten.RemainPlateDO;
import com.cf.imes.module.manage.dal.mysql.remainplaten.RemainPlateMapper; import com.cf.imes.module.manage.dal.mysql.remainplaten.RemainPlateMapper;
import com.cf.imes.framework.common.enums.DeletedCodeEnum; import com.cf.imes.framework.common.enums.DeletedCodeEnum;
import com.cf.imes.module.manage.enums.RemainPlateStatusEnum; import com.cf.imes.module.manage.enums.remainPlate.RemainPlateStatusEnum;
import com.cf.imes.module.manage.enums.RemainPlateUseTypeEnum; import com.cf.imes.module.manage.enums.remainPlate.RemainPlateUseTypeEnum;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -0,0 +1,68 @@
package com.cf.imes.module.manage.util.file;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 文件读取监听
*/
public class ExcelListener<T> extends AnalysisEventListener<T> {
/**
* 自定义用于暂时存储data
* 可以通过实例获取该值
*/
private List<T> dates = new ArrayList<>();
private boolean flag = true;
private Map<Integer, String> valueMap = new HashMap<>();
@Override
public void invoke(T t, AnalysisContext analysisContext) {
}
/**
* 读取完后操作
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
/**
* 返回数据
*
* @return 返回读取的数据集合
**/
public List<T> getDates() {
return dates;
}
/**
* 返回读取结果
*
* @return 是否读取成功
**/
public boolean getFlag() {
return flag;
}
/**
* 返回错误信息
*
* @return String
**/
public Map<Integer, String> getValueMap() {
return valueMap;
}
}
@@ -0,0 +1,61 @@
package com.cf.imes.module.manage.util.file;
import com.alibaba.excel.EasyExcelFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
/**
* 文件读取
*/
@Slf4j
public final class ExcelReadUtil{
private String value;
private boolean flag;
public <T> List<T> read(MultipartFile file, Class<T> head, ExcelListener<T> listener) throws IOException {
value = "";
flag = true;
if (file.isEmpty()) {
value = "文件为空";
flag = false;
throw new IOException("文件为空");
} else if (!(file.getOriginalFilename().endsWith(".xlsx") || file.getOriginalFilename().endsWith(".xls"))) {
value = "文件格式不正确";
flag = false;
throw new IOException("文件格式不正确");
} else if (file.getSize() > 1024 * 1024 * 10) {
value = "文件大小超过 10M";
flag = false;
throw new IOException("文件大小超过 10M");
} else if (file.getSize() == 0) {
value = "文件大小为 0";
flag = false;
throw new IOException("文件大小为 0");
} else {
EasyExcelFactory.read(file.getInputStream(), head, listener)
.autoCloseStream(true) // 不要自动关闭,交给 Servlet 自己处理
.headRowNumber(1).sheet(0).doRead();
//获取读取的数据
List<T> list = listener.getDates();
flag = listener.getFlag();
if (!flag) {
value = "导入数据有误";
}
return list;
}
}
public String getValue() {
return value;
}
public boolean getFlag() {
return flag;
}
}
@@ -0,0 +1,38 @@
package com.cf.imes.module.manage.util.file;
import org.springframework.boot.system.ApplicationHome;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
/**
* 文件上传下载相工具类
*/
public class FileHelperUtil {
// 文件下载
public static void getFile(String route, HttpServletResponse response, String value) {
// path是指想要下载的文件的路径
File file = new File(route + File.separator + value);
// 获取文件名
String filename = file.getName();
// 将文件写入输入流
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
response.reset();
response.setCharacterEncoding("UTF-8");
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
response.addHeader("Content-Length", "" + file.length());
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
outputStream.write(buffer);
outputStream.flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
@@ -2,7 +2,7 @@ package com.cf.imes.module.manage.validation.common;
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext; import javax.validation.ConstraintValidatorContext;
import com.cf.imes.module.manage.enums.RemainPlateStatusEnum; import com.cf.imes.module.manage.enums.remainPlate.RemainPlateStatusEnum;
/** /**
* 状态校验 * 状态校验
@@ -0,0 +1,26 @@
package com.cf.imes.module.manage.validation.parts;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 配件主类校验注解
*/
@Target({
ElementType.FIELD,
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
validatedBy = {PartsCategoryValidator.class}
)
public @interface PartsCategoryValid {
String message() default "配件主类不合法,1:封边条,2:五金,3:组件";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@@ -0,0 +1,28 @@
package com.cf.imes.module.manage.validation.parts;
import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.module.manage.enums.parts.CategoryEnum;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Objects;
/**
* 配件主类校验
*/
public class PartsCategoryValidator implements ConstraintValidator<PartsCategoryValid, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (ObjectUtil.isNull(value)) {
return true;
}
for (CategoryEnum categoryEnum : CategoryEnum.values()) {
if (Objects.equals(categoryEnum.getValue(), value)) {
return true;
}
}
return false;
}
}
@@ -1,6 +1,6 @@
package com.cf.imes.module.manage.validation.placeStyle; package com.cf.imes.module.manage.validation.placeStyle;
import com.cf.imes.module.manage.enums.RemainPlatePlaceStyleEnum; import com.cf.imes.module.manage.enums.remainPlate.RemainPlatePlaceStyleEnum;
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext; import javax.validation.ConstraintValidatorContext;
@@ -1,6 +1,6 @@
package com.cf.imes.module.manage.validation.type; package com.cf.imes.module.manage.validation.type;
import com.cf.imes.module.manage.enums.RemainPlateUseTypeEnum; import com.cf.imes.module.manage.enums.remainPlate.RemainPlateUseTypeEnum;
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext; import javax.validation.ConstraintValidatorContext;
@@ -243,6 +243,7 @@ public class ErrorCodeConstants {
public static final ErrorCode PROCESS_GROUP_NAME_EXISTS = new ErrorCode(1_002_032_003, "工序名称已存在"); public static final ErrorCode PROCESS_GROUP_NAME_EXISTS = new ErrorCode(1_002_032_003, "工序名称已存在");
public static final ErrorCode PROCESS_GROUP_CUTTING_ERROR = new ErrorCode(1_002_032_004, "开料工序类型已经存在,禁止重复"); public static final ErrorCode PROCESS_GROUP_CUTTING_ERROR = new ErrorCode(1_002_032_004, "开料工序类型已经存在,禁止重复");
public static final ErrorCode PROCESS_GROUP_PACKING_ERROR = new ErrorCode(1_002_032_005, "打包工序类型已经存在,禁止重复"); public static final ErrorCode PROCESS_GROUP_PACKING_ERROR = new ErrorCode(1_002_032_005, "打包工序类型已经存在,禁止重复");
public static final ErrorCode PROCESS_ITEM_NOT_EXISTS = new ErrorCode(1_002_032_006, "工序信息不存在");
@@ -65,9 +65,11 @@ public class ProcessGroupServiceImpl implements ProcessGroupService {
// 判断重复 // 判断重复
int isCutting = 0; int isCutting = 0;
int isPacking = 0; int isPacking = 0;
if (createReqVO.getItems() != null) { if (createReqVO.getItems() == null) {
throw exception(PROCESS_ITEM_NOT_EXISTS);
}
List<String> list = cuttingItems(createReqVO.getItems()); List<String> list = cuttingItems(createReqVO.getItems());
if (list.size() > 0) { if (!list.isEmpty()) {
for (String item : list) { for (String item : list) {
ProcessDO process = processMapper.selectOneById(Long.valueOf(item), OrganContextHolder.getOrganId()); ProcessDO process = processMapper.selectOneById(Long.valueOf(item), OrganContextHolder.getOrganId());
if (process.getType() == ProcessTypeEnum.TYPE_ONE.getStatus()){ if (process.getType() == ProcessTypeEnum.TYPE_ONE.getStatus()){
@@ -78,7 +80,7 @@ public class ProcessGroupServiceImpl implements ProcessGroupService {
} }
} }
} }
}
if (isCutting > 1){ if (isCutting > 1){
throw exception(PROCESS_GROUP_CUTTING_ERROR); throw exception(PROCESS_GROUP_CUTTING_ERROR);
} }
@@ -77,6 +77,9 @@ spring:
bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
elasticsearch: elasticsearch:
uris: 192.168.1.205:9200 uris: 192.168.1.205:9200
security-http-ssl-enable: false
username: elastic
password: admin.
--- #################### 定时任务相关配置 #################### --- #################### 定时任务相关配置 ####################
xxl: xxl: