diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml b/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml index a863d5805..5d482fdad 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/pom.xml @@ -151,6 +151,14 @@ uk.co.jemos.podam podam + + + + + com.alibaba + fastjson + + diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/GoodsController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/GoodsController.java index 774470cba..8ec9b4e7c 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/GoodsController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/GoodsController.java @@ -44,7 +44,7 @@ public class GoodsController { @PostMapping("/create") @Operation(summary = "对应生产单商品") @PreAuthorize("@ss.hasPermission('executor:goods:create')") - public CommonResult> createGoods(@Valid @RequestBody Set createReqVOS) { + public CommonResult createGoods(@Valid @RequestBody List createReqVOS) { return success(goodsService.createCorrespondsGoods(createReqVOS)); } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsSaveReqVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsSaveReqVO.java index 2ba0405cf..69c356cc3 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsSaveReqVO.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/goods/vo/GoodsSaveReqVO.java @@ -15,55 +15,42 @@ public class GoodsSaveReqVO { private Long id; @Schema(description = "生产单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12114") - @NotNull(message = "生产单号不能为空") private Long orderId; @Schema(description = "设计端商品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "832") - @NotEmpty(message = "设计端商品ID不能为空") private Long rawGoodsId; @Schema(description = "商品 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "243") - @NotEmpty(message = "商品 ID不能为空") private Long goodsId; @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晨丰") - @NotEmpty(message = "商品名称不能为空") private String goodsName; @Schema(description = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板不能为空") private String material; @Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "颜色不能为空") private String color; @Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "宽度不能为空") private BigDecimal width; @Schema(description = "高度", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "高度不能为空") private BigDecimal height; @Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "厚度不能为空") private BigDecimal thickness; @Schema(description = "价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "7305") - @NotNull(message = "价格不能为空") private BigDecimal price; @Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "品牌不能为空") private String brand; @Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "规格不能为空") private String spec; @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") - @NotEmpty(message = "备注不能为空") private String remark; } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java index fdbca0234..bd4cad18d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/controller/admin/order/OrderController.java @@ -3,6 +3,7 @@ package com.cf.imes.module.executor.controller.admin.order; import com.cf.imes.module.executor.controller.admin.order.vo.order.*; import com.cf.imes.module.executor.controller.admin.order.vo.product.OrderBodyRespVO; import com.cf.imes.module.executor.dal.dataobject.orderModuleExtra.OrderModuleExtraDO; +import com.cf.imes.module.executor.service.order.OrderInputProcessor; import com.cf.imes.module.executor.util.FileTypeChangeUtil; import com.cf.imes.module.executor.util.deviseData.Detail; import io.swagger.v3.oas.annotations.Parameters; @@ -62,6 +63,9 @@ public class OrderController { @Resource private FileTypeChangeUtil fileTypeChangeUtil; + @Resource + private OrderInputProcessor orderInputProcessor; + private static final Logger log = LoggerFactory.getLogger(OrderController.class); @PostMapping("/create") @@ -202,12 +206,15 @@ public class OrderController { } else if (createReqVO.getDataType() == 3) {//Excel // 文件数据读取 list = fileTypeChangeUtil.fileDataChange(file); - if (list == null || list.size() == 0) { - orderImportRespVO.getFailureOrder().put("生产单导入错误", String.valueOf(fileTypeChangeUtil.getValue())); - } } - OrderImportRespVO respVO = orderService.importOrderList(list , id , orderImportRespVO); - return success(respVO); + if (list == null || list.size() == 0) { + orderImportRespVO.getFailureOrder().put("生产单导入错误", String.valueOf(fileTypeChangeUtil.getValue())); + return success(orderImportRespVO); + } +// OrderImportRespVO respVO = orderService.importOrderList(list , id , orderImportRespVO); + orderInputProcessor.input(list , id); + return success(orderImportRespVO); + } } @@ -279,17 +286,41 @@ public class OrderController { return success(BeanUtils.toBean(orderService.getBody(orderId), OrderBodyRespVO.class)); } + /** + * api获取数据接口(用户从其他应用点击数据传输,首先进行用户数据验证【用户传入token,本生产系统获得token之后,调用erp接口,进行用户账号数据 + * 获取,获取的数据进行本系统的登陆,获取本系统的token】,然后进行数据推送【redis首先缓存数据,生成唯一数据标识符,返回给应用用户】,再用户进入 + * 本系统的生产单新增页面,进行新增生产单数据的传入(有问题) + * 调用本系统的接口,进行数据传输, + * 传输成功之后,返回数据给用户,用户进行数据查看, + */ + + @GetMapping("api-import") + @Operation(summary = "api调用传入设计数据") + @Parameters({ + @Parameter(name = "body", description = "api传输数据", required = true) +// , +// @Parameter(name = "isAddPlate", description = "是否为生产单新增板材", example = "false"), +// @Parameter(name = "upload", description = "是 更新、否 新建", example = "false"), +// @Parameter(name = "orderSaveReqVO", description = "生产单新增参数", required = true) + }) + @PreAuthorize("@ss.hasPermission('executor:order:import')") + public CommonResult apiImport(@RequestPart("data") String data +// , +// @RequestParam(value = "isAddPlate", required = false, defaultValue = "false") Boolean isAddPlate, +// @RequestParam(value = "upload", required = false, defaultValue = "false") Boolean upload, +// @RequestPart("orderSaveReqVO") OrderSaveReqVO createReqVO + ) { + OrderImportRespVO orderImportRespVO = OrderImportRespVO.builder().createOrder(new ArrayList<>()) + .updateOrder(new ArrayList<>()).failureOrder(new LinkedHashMap<>()).build(); + +// OrderImportRespVO respVO = orderService.importOrderList(list , id , orderImportRespVO); +// json转换 +// List list = fileDataChangeUtil.fileDataChange(data); +// orderInputProcessor.input(list , 1L); + System.out.println("webcad数据: " + data); + return success(orderImportRespVO); -// 测试 -// @PostMapping("importTest") -// public void readExcel(@RequestPart("file") MultipartFile file) { -// OrderExcelUtil.read(file, OrderPlateImportExcelVO.class, t -> { -// // 模拟service中业务异常 -// if (t.getOrdinal() < 0) { -// throw new LyException.Normal("学号必须以\"No.\"开头"); -// } -// },7); -// } + } } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/managePlate/ManagePlateDO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/managePlate/ManagePlateDO.java new file mode 100644 index 000000000..f3cdcc46e --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/dataobject/managePlate/ManagePlateDO.java @@ -0,0 +1,81 @@ +package com.cf.imes.module.executor.dal.dataobject.managePlate; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.math.BigDecimal; + +/** + * 板材信息表 plate_N DO + * + * @author 晨丰科技 + */ +@TableName("plate") +@KeySequence("plate_n_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ManagePlateDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 客户的商品编号 + */ + private String goodsId; + /** + * 商品名称 + */ + private String goodsName; + /** + * 材质:颗粒板、欧松板、多层板、生态板、禾香板、密度板、实木、铝蜂窝板、铝塑板 + */ + private String material; + /** + * 颜色 + */ + private String color; + /** + * 宽度 + */ + private BigDecimal width; + /** + * 高度 + */ + private BigDecimal height; + /** + * 厚度 + */ + private BigDecimal thickness; + /** + * 价格 + */ + private Double price; + /** + * 品牌 + */ + private String brand; + /** + * 规格 + */ + private String spec; + /** + * 备注 + */ + private String remark; + + /** + * 组织id + */ + private Long organId; + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/managePlate/ManagePlateMapper.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/managePlate/ManagePlateMapper.java new file mode 100644 index 000000000..c6e1b204f --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/dal/mysql/managePlate/ManagePlateMapper.java @@ -0,0 +1,15 @@ +package com.cf.imes.module.executor.dal.mysql.managePlate; + +import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.module.executor.dal.dataobject.managePlate.ManagePlateDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 板材信息表 plate_{N} Mapper + * + * @author 晨丰科技 + */ +@Mapper +public interface ManagePlateMapper extends BaseMapperX { + +} \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java index 97a658ffd..f5a2442d7 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/framework/rpc/config/RpcConfiguration.java @@ -13,6 +13,7 @@ import org.springframework.context.annotation.Configuration; * @author there */ @Configuration(proxyBeanMethods = false) -@EnableFeignClients(clients = {AdminUserApi.class, MachineApi.class, DictDataApi.class, FileApi.class, ProcessGroupApi.class, FileApi.class, DataSourceApi.class}) +@EnableFeignClients(clients = {AdminUserApi.class, MachineApi.class, DictDataApi.class, + FileApi.class, ProcessGroupApi.class, FileApi.class, DataSourceApi.class}) public class RpcConfiguration { } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsService.java index bd19f95d0..7fc951de7 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsService.java @@ -20,7 +20,7 @@ public interface GoodsService { * @param createReqVOS 创建信息 * @return 编号 */ - List createCorrespondsGoods(@Valid Set createReqVOS); + Boolean createCorrespondsGoods(@Valid List createReqVOS); /** * 更新生产单商品 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsServiceImpl.java index 608448d4a..44d93b599 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/goods/GoodsServiceImpl.java @@ -1,8 +1,12 @@ package com.cf.imes.module.executor.service.goods; -import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.executor.dal.dataobject.managePlate.ManagePlateDO; +import com.cf.imes.module.executor.dal.dataobject.order.OrderDO; +import com.cf.imes.module.executor.dal.mysql.managePlate.ManagePlateMapper; +import com.cf.imes.module.executor.dal.mysql.order.OrderMapper; import com.cf.imes.module.executor.service.plate.PlateService; import com.cf.imes.module.executor.service.rawgoods.RawGoodsService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import org.springframework.validation.annotation.Validated; @@ -36,26 +40,35 @@ public class GoodsServiceImpl implements GoodsService { @Resource private RawGoodsService rawGoodsService; + @Autowired + private ManagePlateMapper plateMapper; + + @Resource + private OrderMapper orderMapper; + @Override - public List createCorrespondsGoods(Set createReqVOS) { + public Boolean createCorrespondsGoods(List createReqVOS) { List longs = new ArrayList<>(); + // 校验生产单是否存在 + if (orderMapper.selectOne(OrderDO::getId, createReqVOS.get(0).getOrderId()) == null) { + throw exception(GOODS_NOT_EXISTS); + } createReqVOS.forEach(createReqVO -> { // 校验商品是否存在 - if (plateService.getPlate(createReqVO.getGoodsId()) == null) { + if (plateMapper.selectOne(ManagePlateDO::getId, createReqVO.getGoodsId()) == null) { throw exception(PLATE_NOT_EXISTS); } + // 校验 if (rawGoodsService.getRawGoods(createReqVO.getRawGoodsId()) == null) { throw exception(RAW_GOODS_NOT_EXISTS); } - // 插入 - GoodsDO goods = BeanUtils.toBean(createReqVO, GoodsDO.class); - goodsMapper.insert(goods); -// 修改order_plate中的对应关系 -// plateService.updatePlateByRawGoodsId(createReqVO.getRawGoodsId(), goods.getId(), createReqVO.getOrderId()); - longs.add(goods.getId()); }); + // 一次性插入数据库 + goodsMapper.insertBatch(BeanUtils.toBean(createReqVOS, GoodsDO.class)); + // 修改order_plate + plateService.updatePlateByRawGoodsId(createReqVOS); // 返回 - return longs; + return true; } @Override diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateService.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateService.java index 0e4aaca22..b926ab63d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateService.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateService.java @@ -3,6 +3,7 @@ package com.cf.imes.module.executor.service.plate; import java.util.*; import javax.validation.*; +import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO; import com.cf.imes.module.executor.controller.admin.plate.vo.*; import com.cf.imes.module.executor.dal.dataobject.plate.PlateDO; import com.cf.imes.framework.common.pojo.PageResult; @@ -82,10 +83,8 @@ public interface PlateService { PageResult getPlatePageByTerms(PlateTermsPageReqVO pageReqVO); /** - * @param rawGoodsIds: 未对应之前的板材id - * @param goodsId: 对应之后的板材id - * @param orderIds: 生产单id + * @param createReqVOS * @return void */ - void updatePlateByRawGoodsId(Set rawGoodsIds, Long goodsId , Set orderIds); + void updatePlateByRawGoodsId(List createReqVOS); } \ No newline at end of file diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java index 7fa153ac8..882bfb002 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/service/plate/PlateServiceImpl.java @@ -2,10 +2,12 @@ package com.cf.imes.module.executor.service.plate; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; +import com.cf.imes.module.executor.controller.admin.goods.vo.GoodsSaveReqVO; import com.cf.imes.module.system.enums.ErrorCodeConstants; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -117,10 +119,18 @@ public class PlateServiceImpl implements PlateService { } @Override - public void updatePlateByRawGoodsId(Set rawGoodsIds, Long goodsId, Set orderIds) { - // 校验存在 -// validatePlateExists(orderId); -// plateMapper.update(null, new LambdaQueryWrapper().eq(PlateDO::getRawGoodsId, rawGoodsId).set(PlateDO::getGoodsId, goodsId)); + public void updatePlateByRawGoodsId(List createReqVOS) { + // 根据生产单id和goods_id查到数据,再更新goods_id + createReqVOS.forEach(createReqVO -> { +// plateMapper.update(null, +// new LambdaQueryWrapper() +// .eq(PlateDO::getGoodsId, createReqVO.getRawGoodsId()) +// .eq(PlateDO::getOrderId, createReqVO.getOrderId()) +// .set(PlateDO::getGoodsId, createReqVO.getGoodsId() +// ); + + }); + } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/FileTypeChangeUtil.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/FileTypeChangeUtil.java index f05796423..5409e0b7b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/FileTypeChangeUtil.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/FileTypeChangeUtil.java @@ -16,7 +16,7 @@ public interface FileTypeChangeUtil { // 文件数据格式转换 List fileDataChange(MultipartFile file) throws IOException; // List转json,并且文件压缩存储 -void fileDataChangeToJson(List detailList , Long orderId) throws IOException; + void fileDataChangeToJson(List detailList , Long orderId) throws IOException; // Api数据格式转换 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ZLibUtils.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ZLibUtils.java index b4f1392c4..1468a2415 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ZLibUtils.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/ZLibUtils.java @@ -1,13 +1,12 @@ package com.cf.imes.module.executor.util; -import com.cf.imes.module.executor.util.deviseData.HoleDetail; -import com.cf.imes.module.executor.util.deviseData.ModelDetail; -import com.cf.imes.module.executor.util.deviseData.PointDetail; -import com.cf.imes.module.executor.util.deviseData.other.*; +import com.cf.imes.module.executor.util.deviseData.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.*; +import java.util.ArrayList; +import java.util.List; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.Inflater; @@ -114,42 +113,58 @@ public class ZLibUtils { } public static void main(String[] args) throws JsonProcessingException { - GoodDetail goodDetail = new GoodDetail(); +// GoodDetail goodDetail = new GoodDetail(); - ModelDetail[] modelDetail = {new ModelDetail()}; //造型明细 - PointDetail[] pointDetail = {new PointDetail()}; //点明细 - HoleDetail[] holeDetail = {new HoleDetail()}; //孔明细 - PointDetail[] orgPointDetail = {new PointDetail()}; //原始点明细 - ModelDetail[] sideModelDetail = {new ModelDetail()}; //侧面造型明细 - HoleDetail[] sideHoleDetail= {new HoleDetail()};//侧面孔明细 + List modelDetail = new ArrayList<>(); + modelDetail.add(new ModelDetail()); +// ModelDetail modelDetail = new ModelDetail(); //造型明细 +// modelDetail.setModelId(1); + List pointDetail = new ArrayList<>(); //点明细 + pointDetail.add(new PointDetail()); + List holeDetail = new ArrayList<>(); //孔明细 + holeDetail.add(new HoleDetail()); + List orgPointDetail = new ArrayList<>(); //原始点明细 + orgPointDetail.add(new PointDetail()); + List sideModelDetail = new ArrayList<>(); //侧面造型明细 + sideModelDetail.add(new ModelDetail()); + List sideHoleDetail= new ArrayList<>();//侧面孔明细 + sideHoleDetail.add(new HoleDetail()); - PlateDetail plateDetail = new PlateDetail(); - plateDetail.setGoodDetail(goodDetail); - plateDetail.setModelDetail(modelDetail); - plateDetail.setPointDetail(pointDetail); - plateDetail.setSideHoleDetail(sideHoleDetail); - plateDetail.setSideModelDetail(sideModelDetail); - plateDetail.setHoleDetail(holeDetail); - plateDetail.setOrgPointDetail(orgPointDetail); - - PartDetail partDetail = new PartDetail(); - PartDetail[] partDetailList = {partDetail,partDetail}; - PlateDetail[] plateDetailList = {plateDetail,plateDetail}; - CabinetsDetail cabinetsDetail = new CabinetsDetail(); - cabinetsDetail.setPlateDetail(plateDetailList); - cabinetsDetail.setPartsDetail(partDetailList); - RoomDetail roomDetail = new RoomDetail(); - CabinetsDetail[] cabinetsDetailList = {cabinetsDetail,cabinetsDetail}; - roomDetail.setCabinetsDetail(cabinetsDetailList); Detail detail = new Detail(); - RoomDetail[] roomDetailList = {roomDetail,roomDetail}; - detail.setRoomDetail(roomDetailList); - Detail[] detailList = {detail,detail}; +// PlateDetail plateDetail = new PlateDetail(); +// plateDetail.setGoodDetail(goodDetail); + IBoardProdInfo iBoardProdInfo = new IBoardProdInfo(); + detail.setIBoardProdInfo(iBoardProdInfo); + detail.setContourDetail(modelDetail); + detail.setPointDetail(pointDetail); +// detail.setHoleDetail(holeDetail); + detail.setRawPointDetail(orgPointDetail); + detail.setSideModelDetail(sideModelDetail); + detail.setSideHoleDetail(sideHoleDetail); + +// PartDetail partDetail = new PartDetail(); +// PartDetail[] partDetailList = {partDetail,partDetail}; +// PlateDetail[] plateDetailList = {plateDetail,plateDetail}; +// CabinetsDetail cabinetsDetail = new CabinetsDetail(); +// cabinetsDetail.setPlateDetail(plateDetailList); +// cabinetsDetail.setPartsDetail(partDetailList); +// RoomDetail roomDetail = new RoomDetail(); +// CabinetsDetail[] cabinetsDetailList = {cabinetsDetail,cabinetsDetail}; +// roomDetail.setCabinetsDetail(cabinetsDetailList); +// Detail detail = new Detail(); +// RoomDetail[] roomDetailList = {roomDetail,roomDetail}; +// detail.setRoomDetail(roomDetailList); +// Detail[] detailList = {detail,detail}; ObjectMapper objectMapper = new ObjectMapper(); - String detailListJson = objectMapper.writeValueAsString(detailList); + String detailListJson = objectMapper.writeValueAsString(detail); System.out.println( detailListJson ); + + + + + //测试字节数组 // System.err.println("字节压缩/解压缩测试"); // String inputStr = "snowolf@zlex.org;dongliang@zlex.org;zlex.dongliang@zlex.org"; diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/HoleDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/HoleDetail.java index 6cb7f27bf..421d7a942 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/HoleDetail.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/HoleDetail.java @@ -17,16 +17,16 @@ import lombok.experimental.Accessors; public class HoleDetail { private Integer holeId; //孔ID - private Integer holeType;// 孔类型(0大孔, 10小孔, 20木削, 21木削大孔, 30层板钉, 40通孔, 50连接杆, -10造型孔) - private Integer faceType; // 孔面类型(0正面, 1反面, 2侧面) - private Integer pointX; - private Integer pointY; - private Integer pointZ; - private Integer radius; //孔半径 - private Integer depth; //孔深度 - private Integer endPoint; //孔末端点 - private Integer pointX2; - private Integer pointY2; - private Integer angle; //角度 + private float holeType;// 孔类型(0大孔, 10小孔, 20木削, 21木削大孔, 30层板钉, 40通孔, 50连接杆, -10造型孔) + private float faceType; // 孔面类型(0正面, 1反面, 2侧面) + private float pointX; + private float pointY; + private float pointZ; + private float radius; //孔半径 + private float depth; //孔深度 + private float endPoint; //孔末端点 + private float pointX2; + private float pointY2; + private float angle; //角度 } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IBoardProdInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IBoardProdInfo.java index 0ff8d981c..c76240492 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IBoardProdInfo.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IBoardProdInfo.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.math.BigDecimal; +import java.util.Map; /** * 板件属性信息 @@ -50,26 +51,26 @@ public class IBoardProdInfo { private int openDoorType; //开门类型 0非门板,1左开,2右开,3上翻,4下翻 private Boolean isRect; //是否为矩形 - private Integer splitHeight; //开料长 - private Integer splitWidth; //开料宽 - private Integer splitThickness; //开料厚度 + private float splitHeight; //开料长 + private float splitWidth; //开料宽 + private float splitThickness; //开料厚度 - private Integer decomposeHeight; //拆单长 - private Integer decomposeWidth; //拆单宽 - private Integer decomposeThickness; //拆单厚度 + private float decomposeHeight; //拆单长 + private float decomposeWidth; //拆单宽 + private float decomposeThickness; //拆单厚度 - private BigDecimal height; //成品长 - private BigDecimal width; //成品宽 + private float height; //成品长 + private float width; //成品宽 // private BigDecimal thickness; //成品厚度和开料的厚度相同 - private Integer edgeHeight; //外封边长 - private Integer edgeWidth; //外封边宽 - private Integer edgeThickness; //外封边厚度 + private float edgeHeight; //外封边长 + private float edgeWidth; //外封边宽 + private float edgeThickness; //外封边厚度 - private BigDecimal sealLeft; //左封边 - private BigDecimal sealRight; //右封边 - private BigDecimal sealUp; //上封边 - private BigDecimal sealDown; //下封边 + private float sealLeft; //左封边 + private float sealRight; //右封边 + private float sealUp; //上封边 + private float sealDown; //下封边 private String remark; //备注 } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IContourData.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IContourData.java index 2fb67c801..81c7624c9 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IContourData.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IContourData.java @@ -20,5 +20,5 @@ import java.util.List; @Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 public class IContourData { private List pts; //点集(二维向量(x,y)) - private Integer[] buls; //凸度(0直线段 >0逆时针方向 <0顺时针方向) + private float[] buls; //凸度(0直线段 >0逆时针方向 <0顺时针方向) } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IOriginModelingData.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IOriginModelingData.java index 4e503e6d6..87be15f56 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IOriginModelingData.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/IOriginModelingData.java @@ -26,15 +26,15 @@ public class IOriginModelingData { @Schema(description = "孔轮廓") private List holes; @Schema(description ="厚度" ) - private Integer thickness; + private float thickness; @Schema(description = "0正面、1反面、2侧面") private Integer dir; @Schema(description = "刀半径") - private Integer knifeRadius; + private float knifeRadius; @Schema(description = "槽加长") - private Integer addLen; + private float addLen; @Schema(description = "槽加宽") - private Integer addWidth; + private float addWidth; @Schema(description = "槽加深") - private Integer addDepth; + private float addDepth; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/ModelDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/ModelDetail.java index 62bbce413..ab39694fd 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/ModelDetail.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/ModelDetail.java @@ -22,8 +22,8 @@ public class ModelDetail {//去除order_module_extra private Integer lineID; //纹路ID private Integer typographicFace; //排版面 0正面, 1反面, 2侧面 private String knifeName; //刀具名称 - private Integer knifeRadius; //刀半径 - private Integer depth; //深度 + private float knifeRadius; //刀半径 + private float depth; //深度 private IOriginModelingData originModeling; //造型数据 private List pointList; //点列表 private List offSetList; //偏移量列表 //模块偏移数据 diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/OffSetList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/OffSetList.java index 312b8be84..9d2525b16 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/OffSetList.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/OffSetList.java @@ -18,8 +18,8 @@ public class OffSetList { private String name; //名称 private Integer faceType;// 面向类型(0正面, 1反面, 2侧面) - private Integer value; //值 - private Integer radius;//半径 - private Integer deep;//深度 - private Integer angle;//角度 + private float value; //值 + private float radius;//半径 + private float deep;//深度 + private float angle;//角度 } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PlateModuleExtra.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PlateModuleExtra.java index 4628b70a8..b0285fdf9 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PlateModuleExtra.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PlateModuleExtra.java @@ -16,8 +16,8 @@ import java.math.BigDecimal; @AllArgsConstructor @NoArgsConstructor public class PlateModuleExtra { - private BigDecimal width; - private BigDecimal height; + private float width; + private float height; private Double thickness; private String groupType; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PointDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PointDetail.java index 0402bdf5e..8519b762b 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PointDetail.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PointDetail.java @@ -16,8 +16,8 @@ import lombok.experimental.Accessors; @Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 public class PointDetail { private Integer pointId; - private Integer pointX; - private Integer pointY; - private Integer curve;//曲线 - private Integer SealSize;//封边尺寸 + private float pointX; + private float pointY; + private float curve;//曲线 + private float SealSize;//封边尺寸 } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PointList.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PointList.java index 7c8bfc520..850a20a31 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PointList.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/PointList.java @@ -17,9 +17,9 @@ import lombok.experimental.Accessors; public class PointList { private Integer lineId;//纹路Id private Integer pointId;//点Id - private Integer pointX; - private Integer pointY; - private Integer radius; - private Integer depth; - private Integer curve; + private float pointX; + private float pointY; + private float radius; + private float depth; + private float curve; } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IBoardProdInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IBoardProdInfo.java new file mode 100644 index 000000000..d09c2b282 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/IBoardProdInfo.java @@ -0,0 +1,37 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 板件基本信息 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class IBoardProdInfo { + +// 商品信息 + private String goodsId; // 商品编码 + private String goodsName; //商品名称 + private int goodType; //商品类型,用于筛选是板材还是配件类,可传入文字(需做转换) + private String material; //材质 + private String color; //颜色 + private String factory; //商品生产厂商 + private String brand; //商品品牌 + private String model; //商品型号 + private String spec; //商品规格 + private Double thickness;//规格-板厚 板厚,成品和开料都是一样的 + private String unit; //商品单位 + +// 当有板件时就有板件信息 + private float goodsNumber; //产品数量为特殊处理,板件和配件都有数量 + + + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PlateDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PlateDetail.java new file mode 100644 index 000000000..73c8db7fc --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/dataTwo/PlateDetail.java @@ -0,0 +1,37 @@ +package com.cf.imes.module.executor.util.deviseData.dataTwo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * CAD板件信息详情 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PlateDetail { + +// 板件所属信息 + private String roomsName; //房间名称 + private String cabinetsName; //柜体名 + // 柜体 长 宽 深 + private Double width; + private Double height; + private Double depth; + +// 柜体成倍拆单的倍数 + private Integer multiNum; + +// 板材所属加工组 + private List synthesis;// 板件加工组Group的名称,可以有多个 + private String synthesisName;// 加工组中Group中每个小加工组的名称 + + + private Map remark; +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/HolesInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/HolesInfo.java deleted file mode 100644 index 30c78449e..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/HolesInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.jsonDetial; - -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 HolesInfo { - - private Long id; - private int holeType; - private int faceType; - private Double startPointX; - private Double startPointY; - private Double startPointZ; - private Double radius; - private Double depth; - private String endPoint; - private Double endPointX; - private Double endPointY; - private Double endPointZ; - private Double angle; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/IContourData.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/IContourData.java deleted file mode 100644 index 7ee4337c2..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/IContourData.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.jsonDetial; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.awt.*; -import java.util.ArrayList; - -/** - * 轮廓数据 - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 -public class IContourData { - private ArrayList pts; //点集(二维向量(x,y)) - private Integer[] buls; //凸度(0直线段 >0逆时针方向 <0顺时针方向) -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/IOriginModel.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/IOriginModel.java deleted file mode 100644 index de359de05..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/IOriginModel.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.jsonDetial; - -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 IOriginModel { - - private IContourData outLine; - private IContourData[] holes; - private Double depth; //数据厚度 - private Double modelType; //造型类型 - private Double knifeRadius; - private Double addLen; - private Double addWidth; - private Double addDepth; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/ModeInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/ModeInfo.java deleted file mode 100644 index 347393faa..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/ModeInfo.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.jsonDetial; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.util.ArrayList; - -/** - * 板件 造型 包含信息 - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 -public class ModeInfo { - - private Long id; - private int lineType; - private int faceType; - private String KnifeName; - private String KnifeRadius; - private Double depth; - private ArrayList pointList; - private ArrayList offSetList; - private IOriginModel originModel; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/ModelOffSet.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/ModelOffSet.java deleted file mode 100644 index b4863a20d..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/ModelOffSet.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.jsonDetial; - -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 ModelOffSet { - - private String name; - private int faceType; - private Double value; - private Double radius; - private Double depth; - private Double angle; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/ModelPoint.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/ModelPoint.java deleted file mode 100644 index f4e3414bc..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/ModelPoint.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.jsonDetial; - -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 ModelPoint { - - private Long LineId; - private int faceType; - private Double value; - private Double pointX; - private Double pointY; - private Double radius; - private Double Angle; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/PartInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/PartInfo.java deleted file mode 100644 index d4bb0e734..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/PartInfo.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.jsonDetial; - -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 PartInfo { - - private String goodsId; - private String goodsName; - private int goodType; - private String goodTypeName; - private String factory; - private String brand; - private String model; - private String spec; - private String unit; - private String color; - private String material; //材质 -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/PlateInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/PlateInfo.java deleted file mode 100644 index 0c6a8cee9..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/PlateInfo.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.jsonDetial; - -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 PlateInfo { -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/PointInfo.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/PointInfo.java deleted file mode 100644 index 3693c6ec2..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/jsonDetial/PointInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.jsonDetial; - -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 PointInfo { - - private Long id; //点标识 - private Double pointX; - private Double pointY; - private Double curve; - private Double sealSize; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/CabinetsDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/CabinetsDetail.java deleted file mode 100644 index 3d31a6f0b..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/CabinetsDetail.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.other; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * CAD组合板件信息详情 - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 -public class CabinetsDetail { - - private String name;//组合名称 - private Long id;// 组合id 组合类别 - private PlateDetail[] plateDetail; - private PartDetail[] partsDetail; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/Detail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/Detail.java deleted file mode 100644 index 7e3315fc6..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/Detail.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.other; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * CAD模块板件信息详情 - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 -public class Detail { - - private String name; - private Long id; - private RoomDetail[] roomDetail; - -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/GoodDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/GoodDetail.java deleted file mode 100644 index 9e31af9b5..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/GoodDetail.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.other; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * CAD板件材料信息详情 - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 -public class GoodDetail { - - private String goodsId; - private String goodsName; - private int goodType; - private String factory; - private String brand; - private String model; - private String spec; - private String unit; - private String color; - private String material; //材质 -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/PartDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/PartDetail.java deleted file mode 100644 index b4bbf9ee0..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/PartDetail.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.other; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * CAD板件配件信息详情 - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 -public class PartDetail { - - private String goodsId; - private String goodsName; - private int goodType; - private String goodTypeName; - private String factory; - private String brand; - private String model; - private String spec; - private String unit; - private String color; - private String material; //材质 -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/PlateDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/PlateDetail.java deleted file mode 100644 index fa3db705f..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/PlateDetail.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.other; - -import com.cf.imes.module.executor.util.deviseData.HoleDetail; -import com.cf.imes.module.executor.util.deviseData.ModelDetail; -import com.cf.imes.module.executor.util.deviseData.PointDetail; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.math.BigDecimal; - -/** - * CAD板件信息详情 - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 -public class PlateDetail { - - private GoodDetail goodDetail;//板材详情 - private Long plateId; //板件Id - private String plateNo;//板件自定义编号 - private String name; //板件名称 - private Double number; - - private ModelDetail[] modelDetail ; //造型明细 - private PointDetail[] pointDetail ; //点明细 - private HoleDetail[] holeDetail ; //孔明细 - private PointDetail[] orgPointDetail ; //原始点明细 - private ModelDetail[] sideModelDetail ; //侧面造型明细 - private HoleDetail[] sideHoleDetail;//侧面孔明细 - - - - private Integer texture; //纹路 纹路(0正纹1可翻转2反纹) - private int typographicFace; //排版面 排钻类型(0正面1反面2随意面) - private int openDoorType; //开门类型 0非门板,1左开,2右开,3上翻,4下翻 - private Boolean isRect; //是否为矩形 - - private Integer splitHeight; //开料长 - private Integer splitWidth; //开料宽 - private Integer splitThickness; //开料厚度 - - private Integer decomposeHeight; //拆单长 - private Integer decomposeWidth; //拆单宽 - private Integer decomposeThickness; //拆单厚度 - - private Integer finishedHeight; //成品长 - private Integer finishedWidth; //成品宽 - private Integer finishedThickness; //成品厚度 - - private Integer edgeHeight; //外封边长 - private Integer edgeWidth; //外封边宽 - private Integer edgeThickness; //外封边厚度 - - private BigDecimal sealLeft; //封边左 - private BigDecimal sealRight;//封边右 - private BigDecimal sealUp;//封边上 - private BigDecimal sealDown;//封边下 - -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/RoomDetail.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/RoomDetail.java deleted file mode 100644 index 1a380df60..000000000 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/deviseData/other/RoomDetail.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.cf.imes.module.executor.util.deviseData.other; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -/** - * CAD柜体板件信息详情 - */ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 -public class RoomDetail { - - private String name;//柜体名称 - private Long id;// 柜体id - private CabinetsDetail[] cabinetsDetail; -} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeChangeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeChangeRealize.java new file mode 100644 index 000000000..2fb0e9804 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/api/webcad/ApiTypeChangeRealize.java @@ -0,0 +1,15 @@ +package com.cf.imes.module.executor.util.fileConversion.admin.api.webcad; + +import com.cf.imes.module.executor.util.FileTypeChangeUtil; +import com.cf.imes.module.executor.util.deviseData.Detail; + +import java.util.List; + +/** + * 实现数据格式转换 + */ +public interface ApiTypeChangeRealize extends FileTypeChangeUtil { + default List apiDataChange(String data) { + return null; + } +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelDataContentException.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelDataContentException.java new file mode 100644 index 000000000..2a3133d0d --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelDataContentException.java @@ -0,0 +1,7 @@ +package com.cf.imes.module.executor.util.fileConversion.admin.files.excel; + +import com.alibaba.excel.exception.ExcelRuntimeException; + + +public class ExcelDataContentException extends ExcelRuntimeException { +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java index 8fcd8840e..781997d4d 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/ExcelListener.java @@ -66,7 +66,11 @@ public final class ExcelListener extends AnalysisEventListener { excelDataConvertException.getColumnIndex() + 1, excelDataConvertException.getCellData()); value = value + String.valueOf(new RuntimeException("第" + (excelDataConvertException.getRowIndex() + 1) + "行" + ",第" + (excelDataConvertException.getColumnIndex() + 1) + "列读取错误")) ; - System.out.println(datas.get(datas.size() - 1));; + } + if (exception instanceof RuntimeException) { + RuntimeException runtimeException = (RuntimeException) exception; + log.error("读取异常:{}", runtimeException.getMessage()); + value = value + runtimeException.getMessage(); } } diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/FileTypeChangeRealize.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/FileTypeChangeRealize.java index d3fa6a8a2..129f3015a 100644 --- a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/FileTypeChangeRealize.java +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/FileTypeChangeRealize.java @@ -44,34 +44,34 @@ public class FileTypeChangeRealize implements FileTypeChangeUtil { List orderPlateImportExcelVOS = OrderExcelUtil.read(file, OrderPlateImportExcelVO.class); System.out.println(orderPlateImportExcelVOS); - if (orderPlateImportExcelVOS == null || orderPlateImportExcelVOS.isEmpty()) { - return details; - } - - StringBuilder value = new StringBuilder(); - - - for (OrderPlateImportExcelVO orderPlateImportExcelVO : orderPlateImportExcelVOS) { - orderPlateImportExcelVO.setRemark(orderPlateImportExcelVO.remarkJSON()); - if(dictDataApi.getDictData(DictTypeConstants.SYNTHESIS_TYPE,String.valueOf(orderPlateImportExcelVO.getSynthesis())).getData() != null){ - String synthesisTypeName = dictDataApi.getDictData(DictTypeConstants.SYNTHESIS_TYPE,String.valueOf(orderPlateImportExcelVO.getSynthesis())).getData().getLabel(); - orderPlateImportExcelVO.setSynthesisTypeName(synthesisTypeName); - } - handleOrderPlateImportExcelVO(orderPlateImportExcelVO, value); - if(flag){ - Detail detail = Detail.builder() - .iBoardProdInfo(BeanUtils.toBean(orderPlateImportExcelVO, IBoardProdInfo.class)) - .build(); - details.add(detail); - }else { - details = null; - System.out.println(value.toString()); - break; - } - - } - return details; -// return null; +// if (orderPlateImportExcelVOS == null || orderPlateImportExcelVOS.isEmpty()) { +// return details; +// } +// +// StringBuilder value = new StringBuilder(); +// +// +// for (OrderPlateImportExcelVO orderPlateImportExcelVO : orderPlateImportExcelVOS) { +// orderPlateImportExcelVO.setRemark(orderPlateImportExcelVO.remarkJSON()); +// if(dictDataApi.getDictData(DictTypeConstants.SYNTHESIS_TYPE,String.valueOf(orderPlateImportExcelVO.getSynthesis())).getData() != null){ +// String synthesisTypeName = dictDataApi.getDictData(DictTypeConstants.SYNTHESIS_TYPE,String.valueOf(orderPlateImportExcelVO.getSynthesis())).getData().getLabel(); +// orderPlateImportExcelVO.setSynthesisTypeName(synthesisTypeName); +// } +// handleOrderPlateImportExcelVO(orderPlateImportExcelVO, value); +// if(flag){ +// Detail detail = Detail.builder() +// .iBoardProdInfo(BeanUtils.toBean(orderPlateImportExcelVO, IBoardProdInfo.class)) +// .build(); +// details.add(detail); +// }else { +// details = null; +// System.out.println(value.toString()); +// break; +// } +// +// } +// return details; + return null; } private void handleOrderPlateImportExcelVO(OrderPlateImportExcelVO orderPlateImportExcelVO, StringBuilder value) { diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelClassField.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelClassField.java new file mode 100644 index 000000000..1b9c04614 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelClassField.java @@ -0,0 +1,78 @@ +package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; + + +import java.util.LinkedHashMap; + +/** + * @author sunnyzyq + * @date 2021/12/17 + */ +public class ExcelClassField { + + /** 字段名称 */ + private String fieldName; + + /** 表头名称 */ + private String name; + + /** 映射关系 */ + private LinkedHashMap kvMap; + + /** 示例值 */ + private Object example; + + /** 排序 */ + private int sort; + + /** 是否为注解字段:0-否,1-是 */ + private int hasAnnotation; + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LinkedHashMap getKvMap() { + return kvMap; + } + + public void setKvMap(LinkedHashMap kvMap) { + this.kvMap = kvMap; + } + + public Object getExample() { + return example; + } + + public void setExample(Object example) { + this.example = example; + } + + public int getSort() { + return sort; + } + + public void setSort(int sort) { + this.sort = sort; + } + + public int getHasAnnotation() { + return hasAnnotation; + } + + public void setHasAnnotation(int hasAnnotation) { + this.hasAnnotation = hasAnnotation; + } + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelExport.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelExport.java new file mode 100644 index 000000000..98ef2f4df --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelExport.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author sunnyzyq + * @date 2021/12/17 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExcelExport { + + /** 字段名称 */ + String value(); + + /** 导出排序先后: 数字越小越靠前(默认按Java类字段顺序导出) */ + int sort() default 0; + + /** 导出映射,格式如:0-未知;1-男;2-女 */ + String kv() default ""; + + /** 导出模板示例值(有值的话,直接取该值,不做映射) */ + String example() default ""; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelImport.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelImport.java new file mode 100644 index 000000000..d6283042c --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelImport.java @@ -0,0 +1,31 @@ +package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author sunnyzyq + * @date 2021/12/17 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ExcelImport { + + /** 字段名称 */ + String value(); + + /** 导出映射,格式如:0-未知;1-男;2-女 */ + String kv() default ""; + + /** 是否为必填字段(默认为非必填) */ + boolean required() default false; + + /** 最大长度(默认255) */ + int maxLength() default 255; + + /** 导入唯一性验证(多个字段则取联合验证) */ + boolean unique() default false; + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelUtils.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelUtils.java new file mode 100644 index 000000000..d553b6cc9 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/ExcelUtils.java @@ -0,0 +1,1005 @@ +package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.apache.poi.hssf.usermodel.HSSFDataValidation; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.usermodel.ClientAnchor.AnchorType; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFClientAnchor; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URL; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.Map.Entry; +import java.util.regex.Pattern; + +/** + * Excel导入导出工具类 + * 原文链接(不定时增加新功能): https://zyqok.blog.csdn.net/article/details/121994504 + * + * @author sunnyzyq + * @date 2021/12/17 + */ +@SuppressWarnings("unused") +public class ExcelUtils { + + private static final String XLSX = ".xlsx"; + private static final String XLS = ".xls"; + public static final String ROW_MERGE = "row_merge"; + public static final String COLUMN_MERGE = "column_merge"; + private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; + private static final String ROW_NUM = "rowNum"; + private static final String ROW_DATA = "rowData"; + private static final String ROW_TIPS = "rowTips"; + private static final int CELL_OTHER = 0; + private static final int CELL_ROW_MERGE = 1; + private static final int CELL_COLUMN_MERGE = 2; + private static final int IMG_HEIGHT = 30; + private static final int IMG_WIDTH = 30; + private static final char LEAN_LINE = '/'; + private static final int BYTES_DEFAULT_LENGTH = 10240; + private static final NumberFormat NUMBER_FORMAT = NumberFormat.getNumberInstance(); + + public static List readFile(File file, Class clazz) throws Exception { + JSONArray array = readFile(file); + return getBeanList(array, clazz); + } + + public static List readMultipartFile(MultipartFile mFile, Class clazz) throws Exception { + JSONArray array = readMultipartFile(mFile); + return getBeanList(array, clazz); + } + + public static JSONArray readFile(File file) throws Exception { + return readExcel(null, file); + } + + public static JSONArray readMultipartFile(MultipartFile mFile) throws Exception { + return readExcel(mFile, null); + } + + public static Map readFileManySheet(File file) throws Exception { + return readExcelManySheet(null, file); + } + + public static Map readFileManySheet(MultipartFile file) throws Exception { + return readExcelManySheet(file, null); + } + + private static List getBeanList(JSONArray array, Class clazz) throws Exception { + List list = new ArrayList<>(); + Map uniqueMap = new HashMap<>(16); + for (int i = 0; i < array.size(); i++) { + list.add(getBean(clazz, array.getJSONObject(i), uniqueMap)); + } + return list; + } + + /** + * 获取每个对象的数据 + */ + private static T getBean(Class c, JSONObject obj, Map uniqueMap) throws Exception { + T t = c.newInstance(); + Field[] fields = c.getDeclaredFields(); + List errMsgList = new ArrayList<>(); + boolean hasRowTipsField = false; + StringBuilder uniqueBuilder = new StringBuilder(); + int rowNum = 0; + for (Field field : fields) { + // 行号 + if (field.getName().equals(ROW_NUM)) { + rowNum = obj.getInteger(ROW_NUM); + field.setAccessible(true); + field.set(t, rowNum); + continue; + } + // 是否需要设置异常信息 + if (field.getName().equals(ROW_TIPS)) { + hasRowTipsField = true; + continue; + } + // 原始数据 + if (field.getName().equals(ROW_DATA)) { + field.setAccessible(true); + field.set(t, obj.toString()); + continue; + } + // 设置对应属性值 + setFieldValue(t, field, obj, uniqueBuilder, errMsgList); + } + // 数据唯一性校验 + if (uniqueBuilder.length() > 0) { + if (uniqueMap.containsValue(uniqueBuilder.toString())) { + Set rowNumKeys = uniqueMap.keySet(); + for (Integer num : rowNumKeys) { + if (uniqueMap.get(num).equals(uniqueBuilder.toString())) { + errMsgList.add(String.format("数据唯一性校验失败,(%s)与第%s行重复)", uniqueBuilder, num)); + } + } + } else { + uniqueMap.put(rowNum, uniqueBuilder.toString()); + } + } + // 失败处理 + if (errMsgList.isEmpty() && !hasRowTipsField) { + return t; + } + StringBuilder sb = new StringBuilder(); + int size = errMsgList.size(); + for (int i = 0; i < size; i++) { + if (i == size - 1) { + sb.append(errMsgList.get(i)); + } else { + sb.append(errMsgList.get(i)).append(";"); + } + } + // 设置错误信息 + for (Field field : fields) { + if (field.getName().equals(ROW_TIPS)) { + field.setAccessible(true); + field.set(t, sb.toString()); + } + } + return t; + } + + private static void setFieldValue(T t, Field field, JSONObject obj, StringBuilder uniqueBuilder, List errMsgList) { + // 获取 ExcelImport 注解属性 + ExcelImport annotation = field.getAnnotation(ExcelImport.class); + if (annotation == null) { + return; + } + String cname = annotation.value(); + if (cname.trim().length() == 0) { + return; + } + // 获取具体值 + String val = null; + if (obj.containsKey(cname)) { + val = getString(obj.getString(cname)); + } + if (val == null) { + return; + } + field.setAccessible(true); + // 判断是否必填 + boolean require = annotation.required(); + if (require && val.isEmpty()) { + errMsgList.add(String.format("[%s]不能为空", cname)); + return; + } + // 数据唯一性获取 + boolean unique = annotation.unique(); + if (unique) { + if (uniqueBuilder.length() > 0) { + uniqueBuilder.append("--").append(val); + } else { + uniqueBuilder.append(val); + } + } + // 判断是否超过最大长度 + int maxLength = annotation.maxLength(); + if (maxLength > 0 && val.length() > maxLength) { + errMsgList.add(String.format("[%s]长度不能超过%s个字符(当前%s个字符)", cname, maxLength, val.length())); + } + // 判断当前属性是否有映射关系 + LinkedHashMap kvMap = getKvMap(annotation.kv()); + if (!kvMap.isEmpty()) { + boolean isMatch = false; + for (String key : kvMap.keySet()) { + if (kvMap.get(key).equals(val)) { + val = key; + isMatch = true; + break; + } + } + if (!isMatch) { + errMsgList.add(String.format("[%s]的值不正确(当前值为%s)", cname, val)); + return; + } + } + // 其余情况根据类型赋值 + String fieldClassName = field.getType().getSimpleName(); + try { + if ("String".equalsIgnoreCase(fieldClassName)) { + field.set(t, val); + } else if ("boolean".equalsIgnoreCase(fieldClassName)) { + field.set(t, Boolean.valueOf(val)); + } else if ("int".equalsIgnoreCase(fieldClassName) || "Integer".equals(fieldClassName)) { + try { + field.set(t, Integer.valueOf(val)); + } catch (NumberFormatException e) { + errMsgList.add(String.format("[%s]的值格式不正确(当前值为%s)", cname, val)); + } + } else if ("double".equalsIgnoreCase(fieldClassName)) { + field.set(t, Double.valueOf(val)); + } else if ("long".equalsIgnoreCase(fieldClassName)) { + field.set(t, Long.valueOf(val)); + } else if ("BigDecimal".equalsIgnoreCase(fieldClassName)) { + field.set(t, new BigDecimal(val)); + } else if ("Date".equalsIgnoreCase(fieldClassName)) { + try { + field.set(t, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(val)); + } catch (Exception e) { + field.set(t, new SimpleDateFormat("yyyy-MM-dd").parse(val)); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static Map readExcelManySheet(MultipartFile mFile, File file) throws IOException { + Workbook book = getWorkbook(mFile, file); + if (book == null) { + return Collections.emptyMap(); + } + Map map = new LinkedHashMap<>(); + for (int i = 0; i < book.getNumberOfSheets(); i++) { + Sheet sheet = book.getSheetAt(i); + JSONArray arr = readSheet(sheet); + map.put(sheet.getSheetName(), arr); + } + book.close(); + return map; + } + + private static JSONArray readExcel(MultipartFile mFile, File file) throws IOException { + Workbook book = getWorkbook(mFile, file); + if (book == null) { + return new JSONArray(); + } + JSONArray array = readSheet(book.getSheetAt(0)); + book.close(); + return array; + } + + private static Workbook getWorkbook(MultipartFile mFile, File file) throws IOException { + boolean fileNotExist = (file == null || !file.exists()); + if (mFile == null && fileNotExist) { + return null; + } + // 解析表格数据 + InputStream in; + String fileName; + if (mFile != null) { + // 上传文件解析 + in = mFile.getInputStream(); + fileName = getString(mFile.getOriginalFilename()).toLowerCase(); + } else { + // 本地文件解析 + in = new FileInputStream(file); + fileName = file.getName().toLowerCase(); + } + Workbook book; + if (fileName.endsWith(XLSX)) { + book = new XSSFWorkbook(in); + } else if (fileName.endsWith(XLS)) { + POIFSFileSystem poifsFileSystem = new POIFSFileSystem(in); + book = new HSSFWorkbook(poifsFileSystem); + } else { + return null; + } + in.close(); + return book; + } + + private static JSONArray readSheet(Sheet sheet) { + // 首行下标 + int rowStart = sheet.getFirstRowNum(); + // 尾行下标 + int rowEnd = sheet.getLastRowNum(); + // 获取表头行 + Row headRow = sheet.getRow(rowStart); + if (headRow == null) { + return new JSONArray(); + } + int cellStart = headRow.getFirstCellNum(); + int cellEnd = headRow.getLastCellNum(); + Map keyMap = new HashMap<>(); + for (int j = cellStart; j < cellEnd; j++) { + // 获取表头数据 + String val = getCellValue(headRow.getCell(j)); + if (val != null && val.trim().length() != 0) { + keyMap.put(j, val); + } + } + // 如果表头没有数据则不进行解析 + if (keyMap.isEmpty()) { + return (JSONArray) Collections.emptyList(); + } + // 获取每行JSON对象的值 + JSONArray array = new JSONArray(); + // 如果首行与尾行相同,表明只有一行,返回表头数据 + if (rowStart == rowEnd) { + JSONObject obj = new JSONObject(); + // 添加行号 + obj.put(ROW_NUM, 1); + for (int i : keyMap.keySet()) { + obj.put(keyMap.get(i), ""); + } + array.add(obj); + return array; + } + for (int i = rowStart + 1; i <= rowEnd; i++) { + Row eachRow = sheet.getRow(i); + JSONObject obj = new JSONObject(); + // 添加行号 + obj.put(ROW_NUM, i + 1); + StringBuilder sb = new StringBuilder(); + for (int k = cellStart; k < cellEnd; k++) { + if (eachRow != null) { + String val = getCellValue(eachRow.getCell(k)); + // 所有数据添加到里面,用于判断该行是否为空 + sb.append(val); + obj.put(keyMap.get(k), val); + } + } + if (sb.length() > 0) { + array.add(obj); + } + } + return array; + } + + private static String getCellValue(Cell cell) { + // 空白或空 + if (cell == null || cell.getCellTypeEnum() == CellType.BLANK) { + return ""; + } + // String类型 + if (cell.getCellTypeEnum() == CellType.STRING) { + String val = cell.getStringCellValue(); + if (val == null || val.trim().length() == 0) { + return ""; + } + return val.trim(); + } + // 数字类型 + if (cell.getCellTypeEnum() == CellType.NUMERIC) { + String s = cell.getNumericCellValue() + ""; + // 去掉尾巴上的小数点0 + if (Pattern.matches(".*\\.0*", s)) { + return s.split("\\.")[0]; + } else { + return s; + } + } + // 布尔值类型 + if (cell.getCellTypeEnum() == CellType.BOOLEAN) { + return cell.getBooleanCellValue() + ""; + } + // 错误类型 + return cell.getCellFormula(); + } + + public static void exportTemplate(HttpServletResponse response, String fileName, Class clazz) { + exportTemplate(response, fileName, fileName, clazz, false); + } + + public static void exportTemplate(HttpServletResponse response, String fileName, String sheetName, + Class clazz) { + exportTemplate(response, fileName, sheetName, clazz, false); + } + + public static void exportTemplate(HttpServletResponse response, String fileName, Class clazz, + boolean isContainExample) { + exportTemplate(response, fileName, fileName, clazz, isContainExample); + } + + public static void exportTemplate(HttpServletResponse response, String fileName, String sheetName, + Class clazz, boolean isContainExample) { + // 获取表头字段 + List headFieldList = getExcelClassFieldList(clazz); + // 获取表头数据和示例数据 + List> sheetDataList = new ArrayList<>(); + List headList = new ArrayList<>(); + List exampleList = new ArrayList<>(); + Map> selectMap = new LinkedHashMap<>(); + for (int i = 0; i < headFieldList.size(); i++) { + ExcelClassField each = headFieldList.get(i); + headList.add(each.getName()); + exampleList.add(each.getExample()); + LinkedHashMap kvMap = each.getKvMap(); + if (kvMap != null && kvMap.size() > 0) { + selectMap.put(i, new ArrayList<>(kvMap.values())); + } + } + sheetDataList.add(headList); + if (isContainExample) { + sheetDataList.add(exampleList); + } + // 导出数据 + export(response, fileName, sheetName, sheetDataList, selectMap); + } + + private static List getExcelClassFieldList(Class clazz) { + // 解析所有字段 + Field[] fields = clazz.getDeclaredFields(); + boolean hasExportAnnotation = false; + Map> map = new LinkedHashMap<>(); + List sortList = new ArrayList<>(); + for (Field field : fields) { + ExcelClassField cf = getExcelClassField(field); + if (cf.getHasAnnotation() == 1) { + hasExportAnnotation = true; + } + int sort = cf.getSort(); + if (map.containsKey(sort)) { + map.get(sort).add(cf); + } else { + List list = new ArrayList<>(); + list.add(cf); + sortList.add(sort); + map.put(sort, list); + } + } + Collections.sort(sortList); + // 获取表头 + List headFieldList = new ArrayList<>(); + if (hasExportAnnotation) { + for (Integer sort : sortList) { + for (ExcelClassField cf : map.get(sort)) { + if (cf.getHasAnnotation() == 1) { + headFieldList.add(cf); + } + } + } + } else { + headFieldList.addAll(map.get(0)); + } + return headFieldList; + } + + private static ExcelClassField getExcelClassField(Field field) { + ExcelClassField cf = new ExcelClassField(); + String fieldName = field.getName(); + cf.setFieldName(fieldName); + ExcelExport annotation = field.getAnnotation(ExcelExport.class); + // 无 ExcelExport 注解情况 + if (annotation == null) { + cf.setHasAnnotation(0); + cf.setName(fieldName); + cf.setSort(0); + return cf; + } + // 有 ExcelExport 注解情况 + cf.setHasAnnotation(1); + cf.setName(annotation.value()); + String example = getString(annotation.example()); + if (!example.isEmpty()) { + if (isNumeric(example) && example.length() < 8) { + cf.setExample(Double.valueOf(example)); + } else { + cf.setExample(example); + } + } else { + cf.setExample(""); + } + cf.setSort(annotation.sort()); + // 解析映射 + String kv = getString(annotation.kv()); + cf.setKvMap(getKvMap(kv)); + return cf; + } + + private static LinkedHashMap getKvMap(String kv) { + LinkedHashMap kvMap = new LinkedHashMap<>(); + if (kv.isEmpty()) { + return kvMap; + } + String[] kvs = kv.split(";"); + if (kvs.length == 0) { + return kvMap; + } + for (String each : kvs) { + String[] eachKv = getString(each).split("-"); + if (eachKv.length != 2) { + continue; + } + String k = eachKv[0]; + String v = eachKv[1]; + if (k.isEmpty() || v.isEmpty()) { + continue; + } + kvMap.put(k, v); + } + return kvMap; + } + + /** + * 导出表格到本地 + * + * @param file 本地文件对象 + * @param sheetData 导出数据 + */ + public static void exportFile(File file, List> sheetData) { + if (file == null) { + System.out.println("文件创建失败"); + return; + } + if (sheetData == null) { + sheetData = new ArrayList<>(); + } + Map>> map = new HashMap<>(); + map.put(file.getName(), sheetData); + export(null, file, file.getName(), map, null); + } + + /** + * 导出表格到本地 + * + * @param 导出数据类似,和K类型保持一致 + * @param filePath 文件父路径(如:D:/doc/excel/) + * @param fileName 文件名称(不带尾缀,如:学生表) + * @param list 导出数据 + * @throws IOException IO异常 + */ + public static File exportFile(String filePath, String fileName, List list) throws IOException { + File file = getFile(filePath, fileName); + List> sheetData = getSheetData(list); + exportFile(file, sheetData); + return file; + } + + /** + * 获取文件 + * + * @param filePath filePath 文件父路径(如:D:/doc/excel/) + * @param fileName 文件名称(不带尾缀,如:用户表) + * @return 本地File文件对象 + */ + private static File getFile(String filePath, String fileName) throws IOException { + String dirPath = getString(filePath); + String fileFullPath; + if (dirPath.isEmpty()) { + fileFullPath = fileName; + } else { + // 判定文件夹是否存在,如果不存在,则级联创建 + File dirFile = new File(dirPath); + if (!dirFile.exists()) { + boolean mkdirs = dirFile.mkdirs(); + if (!mkdirs) { + return null; + } + } + // 获取文件夹全名 + if (dirPath.endsWith(String.valueOf(LEAN_LINE))) { + fileFullPath = dirPath + fileName + XLSX; + } else { + fileFullPath = dirPath + LEAN_LINE + fileName + XLSX; + } + } + System.out.println(fileFullPath); + File file = new File(fileFullPath); + if (!file.exists()) { + boolean result = file.createNewFile(); + if (!result) { + return null; + } + } + return file; + } + + private static List> getSheetData(List list) { + // 获取表头字段 + List excelClassFieldList = getExcelClassFieldList(list.get(0).getClass()); + List headFieldList = new ArrayList<>(); + List headList = new ArrayList<>(); + Map headFieldMap = new HashMap<>(); + for (ExcelClassField each : excelClassFieldList) { + String fieldName = each.getFieldName(); + headFieldList.add(fieldName); + headFieldMap.put(fieldName, each); + headList.add(each.getName()); + } + // 添加表头名称 + List> sheetDataList = new ArrayList<>(); + sheetDataList.add(headList); + // 获取表数据 + for (T t : list) { + Map fieldDataMap = getFieldDataMap(t); + Set fieldDataKeys = fieldDataMap.keySet(); + List rowList = new ArrayList<>(); + for (String headField : headFieldList) { + if (!fieldDataKeys.contains(headField)) { + continue; + } + Object data = fieldDataMap.get(headField); + if (data == null) { + rowList.add(""); + continue; + } + ExcelClassField cf = headFieldMap.get(headField); + // 判断是否有映射关系 + LinkedHashMap kvMap = cf.getKvMap(); + if (kvMap == null || kvMap.isEmpty()) { + rowList.add(data); + continue; + } + String val = kvMap.get(data.toString()); + if (isNumeric(val)) { + rowList.add(Double.valueOf(val)); + } else { + rowList.add(val); + } + } + sheetDataList.add(rowList); + } + return sheetDataList; + } + + private static Map getFieldDataMap(T t) { + Map map = new HashMap<>(); + Field[] fields = t.getClass().getDeclaredFields(); + try { + for (Field field : fields) { + String fieldName = field.getName(); + field.setAccessible(true); + Object object = field.get(t); + map.put(fieldName, object); + } + } catch (IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } + return map; + } + + public static void exportEmpty(HttpServletResponse response, String fileName) { + List> sheetDataList = new ArrayList<>(); + List headList = new ArrayList<>(); + headList.add("导出无数据"); + sheetDataList.add(headList); + export(response, fileName, sheetDataList); + } + + public static void export(HttpServletResponse response, String fileName, List> sheetDataList) { + export(response, fileName, fileName, sheetDataList, null); + } + + public static void exportManySheet(HttpServletResponse response, String fileName, Map>> sheetMap) { + export(response, null, fileName, sheetMap, null); + } + + + public static void export(HttpServletResponse response, String fileName, String sheetName, + List> sheetDataList) { + export(response, fileName, sheetName, sheetDataList, null); + } + + public static void export(HttpServletResponse response, String fileName, String sheetName, + List> sheetDataList, Map> selectMap) { + + Map>> map = new HashMap<>(); + map.put(sheetName, sheetDataList); + export(response, null, fileName, map, selectMap); + } + + public static void export(HttpServletResponse response, String fileName, List list, Class template) { + // list 是否为空 + boolean lisIsEmpty = list == null || list.isEmpty(); + // 如果模板数据为空,且导入的数据为空,则导出空文件 + if (template == null && lisIsEmpty) { + exportEmpty(response, fileName); + return; + } + // 如果 list 数据,则导出模板数据 + if (lisIsEmpty) { + exportTemplate(response, fileName, template); + return; + } + // 导出数据 + List> sheetDataList = getSheetData(list); + export(response, fileName, sheetDataList); + } + + public static void export(HttpServletResponse response, String fileName, List> sheetDataList, Map> selectMap) { + export(response, fileName, fileName, sheetDataList, selectMap); + } + + private static void export(HttpServletResponse response, File file, String fileName, + Map>> sheetMap, Map> selectMap) { + // 整个 Excel 表格 book 对象 + SXSSFWorkbook book = new SXSSFWorkbook(); + // 每个 Sheet 页 + Set>>> entries = sheetMap.entrySet(); + for (Entry>> entry : entries) { + List> sheetDataList = entry.getValue(); + Sheet sheet = book.createSheet(entry.getKey()); + Drawing patriarch = sheet.createDrawingPatriarch(); + // 设置表头背景色(灰色) + CellStyle headStyle = book.createCellStyle(); + headStyle.setFillForegroundColor(IndexedColors.GREY_80_PERCENT.index); + headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + headStyle.setAlignment(HorizontalAlignment.CENTER); + headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.index); + // 设置表身背景色(默认色) + CellStyle rowStyle = book.createCellStyle(); + rowStyle.setAlignment(HorizontalAlignment.CENTER); + rowStyle.setVerticalAlignment(VerticalAlignment.CENTER); + // 设置表格列宽度(默认为15个字节) + sheet.setDefaultColumnWidth(15); + // 创建合并算法数组 + int rowLength = sheetDataList.size(); + int columnLength = sheetDataList.get(0).size(); + int[][] mergeArray = new int[rowLength][columnLength]; + for (int i = 0; i < sheetDataList.size(); i++) { + // 每个 Sheet 页中的行数据 + Row row = sheet.createRow(i); + List rowList = sheetDataList.get(i); + for (int j = 0; j < rowList.size(); j++) { + // 每个行数据中的单元格数据 + Object o = rowList.get(j); + int v = 0; + if (o instanceof URL) { + // 如果要导出图片的话, 链接需要传递 URL 对象 + setCellPicture(book, row, patriarch, i, j, (URL) o); + } else { + Cell cell = row.createCell(j); + if (i == 0) { + // 第一行为表头行,采用灰色底背景 + v = setCellValue(cell, o, headStyle); + } else { + // 其他行为数据行,默认白底色 + v = setCellValue(cell, o, rowStyle); + } + } + mergeArray[i][j] = v; + } + } + // 合并单元格 + mergeCells(sheet, mergeArray); + // 设置下拉列表 + setSelect(sheet, selectMap); + } + // 写数据 + if (response != null) { + // 前端导出 + try { + write(response, book, fileName); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + // 本地导出 + FileOutputStream fos; + try { + fos = new FileOutputStream(file); + ByteArrayOutputStream ops = new ByteArrayOutputStream(); + book.write(ops); + fos.write(ops.toByteArray()); + fos.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 合并当前Sheet页的单元格 + * + * @param sheet 当前 sheet 页 + * @param mergeArray 合并单元格算法 + */ + private static void mergeCells(Sheet sheet, int[][] mergeArray) { + // 横向合并 + for (int x = 0; x < mergeArray.length; x++) { + int[] arr = mergeArray[x]; + boolean merge = false; + int y1 = 0; + int y2 = 0; + for (int y = 0; y < arr.length; y++) { + int value = arr[y]; + if (value == CELL_COLUMN_MERGE) { + if (!merge) { + y1 = y; + } + y2 = y; + merge = true; + } else { + merge = false; + if (y1 > 0) { + sheet.addMergedRegion(new CellRangeAddress(x, x, (y1 - 1), y2)); + } + y1 = 0; + y2 = 0; + } + } + if (y1 > 0) { + sheet.addMergedRegion(new CellRangeAddress(x, x, (y1 - 1), y2)); + } + } + // 纵向合并 + int xLen = mergeArray.length; + int yLen = mergeArray[0].length; + for (int y = 0; y < yLen; y++) { + boolean merge = false; + int x1 = 0; + int x2 = 0; + for (int x = 0; x < xLen; x++) { + int value = mergeArray[x][y]; + if (value == CELL_ROW_MERGE) { + if (!merge) { + x1 = x; + } + x2 = x; + merge = true; + } else { + merge = false; + if (x1 > 0) { + sheet.addMergedRegion(new CellRangeAddress((x1 - 1), x2, y, y)); + } + x1 = 0; + x2 = 0; + } + } + if (x1 > 0) { + sheet.addMergedRegion(new CellRangeAddress((x1 - 1), x2, y, y)); + } + } + } + + private static void write(HttpServletResponse response, SXSSFWorkbook book, String fileName) throws IOException { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + String name = new String(fileName.getBytes("GBK"), "ISO8859_1") + XLSX; + response.addHeader("Content-Disposition", "attachment;filename=" + name); + ServletOutputStream out = response.getOutputStream(); + book.write(out); + out.flush(); + out.close(); + } + + private static int setCellValue(Cell cell, Object o, CellStyle style) { + // 设置样式 + cell.setCellStyle(style); + // 数据为空时 + if (o == null) { + cell.setCellType(CellType.STRING); + cell.setCellValue(""); + return CELL_OTHER; + } + // 是否为字符串 + if (o instanceof String) { + String s = o.toString(); + // 当数字类型长度超过8位时,改为字符串类型显示(Excel数字超过一定长度会显示为科学计数法) + if (isNumeric(s) && s.length() < 8) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(Double.parseDouble(s)); + return CELL_OTHER; + } else { + cell.setCellType(CellType.STRING); + cell.setCellValue(s); + } + if (s.equals(ROW_MERGE)) { + return CELL_ROW_MERGE; + } else if (s.equals(COLUMN_MERGE)) { + return CELL_COLUMN_MERGE; + } else { + return CELL_OTHER; + } + } + // 是否为字符串 + if (o instanceof Integer || o instanceof Long || o instanceof Double || o instanceof Float) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(Double.parseDouble(o.toString())); + return CELL_OTHER; + } + // 是否为Boolean + if (o instanceof Boolean) { + cell.setCellType(CellType.BOOLEAN); + cell.setCellValue((Boolean) o); + return CELL_OTHER; + } + // 如果是BigDecimal,则默认3位小数 + if (o instanceof BigDecimal) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(((BigDecimal) o).setScale(3, RoundingMode.HALF_UP).doubleValue()); + return CELL_OTHER; + } + // 如果是Date数据,则显示格式化数据 + if (o instanceof Date) { + cell.setCellType(CellType.STRING); + cell.setCellValue(formatDate((Date) o)); + return CELL_OTHER; + } + // 如果是其他,则默认字符串类型 + cell.setCellType(CellType.STRING); + cell.setCellValue(o.toString()); + return CELL_OTHER; + } + + private static void setCellPicture(SXSSFWorkbook wb, Row sr, Drawing patriarch, int x, int y, URL url) { + // 设置图片宽高 + sr.setHeight((short) (IMG_WIDTH * IMG_HEIGHT)); + // (jdk1.7版本try中定义流可自动关闭) + try (InputStream is = url.openStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + byte[] buff = new byte[BYTES_DEFAULT_LENGTH]; + int rc; + while ((rc = is.read(buff, 0, BYTES_DEFAULT_LENGTH)) > 0) { + outputStream.write(buff, 0, rc); + } + // 设置图片位置 + XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, y, x, y + 1, x + 1); + // 设置这个,图片会自动填满单元格的长宽 + anchor.setAnchorType(AnchorType.MOVE_AND_RESIZE); + patriarch.createPicture(anchor, wb.addPicture(outputStream.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static String formatDate(Date date) { + if (date == null) { + return ""; + } + SimpleDateFormat format = new SimpleDateFormat(DATE_FORMAT); + return format.format(date); + } + + private static void setSelect(Sheet sheet, Map> selectMap) { + if (selectMap == null || selectMap.isEmpty()) { + return; + } + Set>> entrySet = selectMap.entrySet(); + for (Entry> entry : entrySet) { + int y = entry.getKey(); + List list = entry.getValue(); + if (list == null || list.isEmpty()) { + continue; + } + String[] arr = new String[list.size()]; + for (int i = 0; i < list.size(); i++) { + arr[i] = list.get(i); + } + DataValidationHelper helper = sheet.getDataValidationHelper(); + CellRangeAddressList addressList = new CellRangeAddressList(1, 65000, y, y); + DataValidationConstraint dvc = helper.createExplicitListConstraint(arr); + DataValidation dv = helper.createValidation(dvc, addressList); + if (dv instanceof HSSFDataValidation) { + dv.setSuppressDropDownArrow(false); + } else { + dv.setSuppressDropDownArrow(true); + dv.setShowErrorBox(true); + } + sheet.addValidationData(dv); + } + } + + private static boolean isNumeric(String str) { + if (Objects.nonNull(str) && "0.0".equals(str)) { + return true; + } + for (int i = str.length(); --i >= 0; ) { + if (!Character.isDigit(str.charAt(i))) { + return false; + } + } + return true; + } + + private static String getString(String s) { + if (s == null) { + return ""; + } + if (s.isEmpty()) { + return s; + } + return s.trim(); + } + +} diff --git a/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/OrderImportVO.java b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/OrderImportVO.java new file mode 100644 index 000000000..05eac3f86 --- /dev/null +++ b/cf-module-prod-executor/cf-module-prod-executor-biz/src/main/java/com/cf/imes/module/executor/util/fileConversion/admin/files/excel/excelPoi/OrderImportVO.java @@ -0,0 +1,221 @@ +package com.cf.imes.module.executor.util.fileConversion.admin.files.excel.excelPoi; + + +import com.alibaba.excel.annotation.ExcelProperty; +import com.cf.imes.framework.excel.core.annotations.DictFormat; +import com.cf.imes.framework.excel.core.convert.DictConvert; +import com.cf.imes.module.system.enums.DictTypeConstants; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 生产单 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = false) // 设置 chain = false,避免生产单导入有问 +public class OrderImportVO { + + // 行号 + private Integer rowNum; + + // 行数据 + private String rowData; + + // 错误提示信息 + private String rowTips; + + @ExcelProperty(value = "序号") + @JsonIgnore + private int ordinal; + + @ExcelProperty(value = "类型", converter = DictConvert.class) + @JsonIgnore + @DictFormat(DictTypeConstants.PRODUCT_TYPE) + @ExcelImport(value = "类型", required = true) + private int goodType; + + @ExcelProperty(value = "物料编码") + @JsonIgnore + private String goodsId; + + @ExcelProperty(value = "商品名称") + @JsonIgnore + private String goodsName; + + @ExcelProperty(value = "材质") + @JsonIgnore + private String material; + + @ExcelProperty(value = "颜色") + @JsonIgnore + private String color; + + @ExcelProperty(value = "厂家") + @JsonIgnore + private String factory; + + @ExcelProperty(value = "品牌") + @JsonIgnore + private String brand; + + @ExcelProperty(value = "型号") + @JsonIgnore + private String model; + + @ExcelProperty(value = "规格") + @JsonIgnore + private String spec; + + @ExcelProperty(value = "单位") + @JsonIgnore + private String unit; + + @ExcelProperty(value = "数量") + @JsonIgnore + @NotNull + private Double goodsNumber; + + @ExcelProperty(value = "房间") + @JsonIgnore + private String roomsName; + + @ExcelProperty(value = "柜体") + @JsonIgnore + private String cabinetsName; + + @ExcelProperty(value = "板名称") + @JsonIgnore + private String name; + + @ExcelProperty(value = "板号") + @JsonIgnore + private String plateNo; + + @ExcelProperty(value = "成品长") + @JsonIgnore + private BigDecimal height; + + @ExcelProperty(value = "成品宽") + @JsonIgnore + private BigDecimal width; + + @ExcelProperty(value = "开料长") + @JsonIgnore + private BigDecimal splitHeight; + + @ExcelProperty(value = "开料宽") + @JsonIgnore + private BigDecimal splitWidth; + + @ExcelProperty(value = "厚") + @JsonIgnore + private BigDecimal splitThickness; + + @ExcelProperty(value = "左封边") + @JsonIgnore + private BigDecimal sealLeft; + + @ExcelProperty(value = "右封边") + @JsonIgnore + private BigDecimal sealRight; + + @ExcelProperty(value = "上封边") + @JsonIgnore + private BigDecimal sealUp; + + @ExcelProperty(value = "下封边") + @JsonIgnore + private BigDecimal sealDown; + + @ExcelProperty(value = "组合类型", converter = DictConvert.class) + @JsonIgnore + @DictFormat(DictTypeConstants.SYNTHESIS_TYPE) + private int synthesis; + + @JsonIgnore + private String synthesisTypeName;//组合类型的名称 + + @ExcelProperty(value = "组合名称") + @JsonIgnore + private String combinationName; + + @ExcelProperty(value = "排版面", converter = DictConvert.class) + @JsonIgnore + @DictFormat(DictTypeConstants.YPOGRAPHY_TYPE) + private int typographicFace; + + @ExcelProperty(value = "纹路", converter = DictConvert.class) + @JsonIgnore + @DictFormat(DictTypeConstants.GRAIN_TYPE) + private int texture; + + @ExcelProperty(value = "开门方向", converter = DictConvert.class) + @JsonIgnore + @DictFormat(DictTypeConstants.DOOR_OPENING_DIRECTIONS) + private int openDoorType; + + @ExcelProperty(value = "上传结果") + @JsonIgnore + private String result; + + @ExcelProperty(value = "备注1") + private String remark1; + + @ExcelProperty(value = "备注2") + private String remark2; + + @ExcelProperty(value = "备注3") + private String remark3; + + @ExcelProperty(value = "备注4") + private String remark4; + + @ExcelProperty(value = "备注5") + private String remark5; + + @ExcelProperty(value = "备注6") + private String remark6; + + @ExcelProperty(value = "备注7") + private String remark7; + + @ExcelProperty(value = "备注8") + private String remark8; + + @ExcelProperty(value = "备注9") + private String remark9; + + @ExcelProperty(value = "备注10") + private String remark10; + + @ExcelProperty(value = "备注") + @JsonIgnore + private String remark; + + + + //备注转json数据 + public String remarkJSON() { + ObjectMapper objectMapper = new ObjectMapper(); + // 设置实体类字段的值 + try { + String json = objectMapper.writeValueAsString(this); + return json; + } catch (Exception e) { + e.printStackTrace(); + return "{}"; + } + } + +} \ No newline at end of file diff --git a/cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/api/plate/PlateApi.java b/cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/api/plate/PlateApi.java new file mode 100644 index 000000000..16332c191 --- /dev/null +++ b/cf-module-prod-manage/cf-module-prod-manage-api/src/main/java/com/cf/imes/module/manage/api/plate/PlateApi.java @@ -0,0 +1,23 @@ +package com.cf.imes.module.manage.api.plate; + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.module.manage.enums.ApiConstants; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(name = ApiConstants.NAME) // TODO 晨丰:fallbackFactory = +@Tag(name = "RPC 服务 - 多组织") +public interface PlateApi { + + String PREFIX = ApiConstants.PREFIX + "/plate"; + + @GetMapping(PREFIX +"/get") + @Operation(summary = "获得板材信息表") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + CommonResult getPlate(@RequestParam("id") Long id); + +} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/api/plate/PlateServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/api/plate/PlateServiceImpl.java new file mode 100644 index 000000000..aa9ae8869 --- /dev/null +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/api/plate/PlateServiceImpl.java @@ -0,0 +1,24 @@ +package com.cf.imes.module.manage.api.plate; + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.module.manage.dal.dataobject.plate.PlateDO; +import com.cf.imes.module.manage.service.plate.PlateService; + +import javax.annotation.Resource; + +import static com.cf.imes.framework.common.pojo.CommonResult.success; + +public class PlateServiceImpl implements PlateApi{ + + @Resource + private PlateService plateService; + + @Override + public CommonResult getPlate(Long id) { + PlateDO plateDO = plateService.getPlate(id); + if (plateDO == null) { + return success(false); + } + return success(true); + } +} diff --git a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java index cea03b91f..276ba4dbd 100644 --- a/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java +++ b/cf-module-prod-manage/cf-module-prod-manage-biz/src/main/java/com/cf/imes/module/manage/service/plate/PlateServiceImpl.java @@ -4,8 +4,6 @@ import cn.hutool.core.collection.CollUtil; import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.pojo.CommonResult; -import com.cf.imes.framework.security.core.LoginUser; -import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; 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.controller.admin.plate.vo.plate.PlatePageReqVO; diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java index b0840dbc2..64a2b2972 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java @@ -223,5 +223,8 @@ public interface ErrorCodeConstants { //=========== 柜体信息 1-002-035-000 ============ ErrorCode ORDER_GROUP_NOT_EXISTS = new ErrorCode(1_002_036_001, "加工组信息不存在"); + //=========== 应用信息 1-002-037-000 ============ + ErrorCode APPLICATION_NOT_EXISTS = new ErrorCode(1_002_037_001, "应用信息不存在"); + ErrorCode APPLICATION_LOGIN_USER_DISABLED = new ErrorCode(1_002_037_001, "应用登陆失败"); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/ApplicationController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/ApplicationController.java new file mode 100644 index 000000000..7b362eaec --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/ApplicationController.java @@ -0,0 +1,81 @@ +package com.cf.imes.module.system.controller.admin.application; + +import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationPageReqVO; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationRespVO; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationSaveReqVO; +import com.cf.imes.module.system.controller.admin.application.vo.auth.ApplicationLoginRespVO; +import com.cf.imes.module.system.dal.dataobject.application.ApplicationDO; +import com.cf.imes.module.system.service.application.ApplicationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import static com.cf.imes.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - 应用注册信息") +@RestController +@RequestMapping("/system/application") +@Validated +public class ApplicationController { + + @Resource + private ApplicationService applicationService; + + @PostMapping("/create") + @Operation(summary = "新建应用注册") + @PreAuthorize("@ss.hasPermission('system:application:create')") + public CommonResult createApplication(@Valid @RequestBody ApplicationSaveReqVO createReqVO) { + return success(applicationService.createApplication(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新应用注册") + @PreAuthorize("@ss.hasPermission('system:application:update')") + public CommonResult updateApplication(@Valid @RequestBody ApplicationSaveReqVO updateReqVO) { + applicationService.updateApplication(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除应用注册") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:application:delete')") + public CommonResult deleteApplication(@RequestParam("id") Long id) { + applicationService.deleteApplication(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得应用注册") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:application:query')") + public CommonResult getApplication(@RequestParam("id") Long id) { + ApplicationDO applicationDO = applicationService.getApplication(id); + return success(BeanUtils.toBean(applicationDO, ApplicationRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得应用注册分页") + @PreAuthorize("@ss.hasPermission('system:application:query')") + public CommonResult> getApplicationPage(@Valid ApplicationPageReqVO pageReqVO) { + PageResult pageResult = applicationService.getApplicationPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ApplicationRespVO.class)); + } + + @PostMapping("/appLogin") + @Operation(summary = "应用登陆") + @PreAuthorize("@ss.hasPermission('system:application:create')") + public CommonResult loginApplication(@Valid @RequestBody ApplicationRespVO applicationRespVO) { + return success(applicationService.loginApplication(applicationRespVO)); + } + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/application/ApplicationPageReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/application/ApplicationPageReqVO.java new file mode 100644 index 000000000..ff326cf63 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/application/ApplicationPageReqVO.java @@ -0,0 +1,47 @@ +package com.cf.imes.module.system.controller.admin.application.vo.application; + +import com.cf.imes.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +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 ApplicationPageReqVO extends PageParam { + + @Schema(description = "应用标识", example = "okk") + private String appId; + + @Schema(description = "应用密钥", example = "121gfrsg5sb4gs") + private String appKey; + + @Schema(description = "服务器IP列表", example = "0.0.0.0") + private String serverIp; + + @Schema(description = "应用简称") + private String code; + + @Schema(description = "应用名") + private String name; + + @Schema(description = "应用主体") + private String company; + + @Schema(description = "状态: 0停用,1正常") + private Boolean status; + + @Schema(description = "备注") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/application/ApplicationRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/application/ApplicationRespVO.java new file mode 100644 index 000000000..250f5a596 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/application/ApplicationRespVO.java @@ -0,0 +1,57 @@ +package com.cf.imes.module.system.controller.admin.application.vo.application; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +import static com.cf.imes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 应用注册表 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ApplicationRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "4109") + @ExcelProperty("主键") + private int id; + + @Schema(description = "应用标识", example = "okk") + @ExcelProperty("应用标识") + private String appId; + + @Schema(description = "应用密钥", example = "121gfrsg5sb4gs") + @ExcelProperty("应用密钥") + private String appKey; + + @Schema(description = "服务器IP列表", example = "0.0.0.0") + @ExcelProperty("服务器IP列表") + private String serverIp; + + @Schema(description = "应用简称") + @ExcelProperty("应用简称") + private String code; + + @Schema(description = "应用名") + @ExcelProperty("应用名") + private String name; + + @Schema(description = "应用主体") + @ExcelProperty("应用主体") + private String company; + + @Schema(description = "状态: 0停用,1正常") + @ExcelProperty("状态") + private Boolean status; + + @Schema(description = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间") + @ExcelProperty("创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/application/ApplicationSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/application/ApplicationSaveReqVO.java new file mode 100644 index 000000000..18efdb749 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/application/ApplicationSaveReqVO.java @@ -0,0 +1,48 @@ +package com.cf.imes.module.system.controller.admin.application.vo.application; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 应用注册表新增/修改 Request VO") +@Data +public class ApplicationSaveReqVO{ + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "4109") + private Long id; + + @Schema(description = "应用标识", example = "okk") + @NotNull(message = "应用标识不能为空") + private String appId; + +// @Schema(description = "应用密钥", example = "121gfrsg5sb4gs") +// @NotNull(message = "应用密钥不能为空") +// private String appKey; + +// private String appSecret; + + @Schema(description = "服务器IP列表", example = "0.0.0.0") + @NotNull(message = "服务器IP列表不能为空") + private String serverIp; + + @Schema(description = "应用简称") + @NotNull(message = "应用简称不能为空") + private String code; + + @Schema(description = "应用名") + @NotNull(message = "应用名不能为空") + private String name; + + @Schema(description = "应用主体") + @NotNull(message = "应用主体不能为空") + private String company; + + @Schema(description = "状态: 0停用,1正常") + @NotNull(message = "不能为空") + private Boolean status; + + @Schema(description = "备注") + private String remark; + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/auth/ApplicationLoginRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/auth/ApplicationLoginRespVO.java new file mode 100644 index 000000000..f9e71fc69 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/application/vo/auth/ApplicationLoginRespVO.java @@ -0,0 +1,31 @@ +package com.cf.imes.module.system.controller.admin.application.vo.auth; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 应用登录 Response VO") +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ApplicationLoginRespVO { + + @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer appId; + + @Schema(description = "访问令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "happy") + private String accessToken; + + @Schema(description = "刷新令牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "nice") + private String refreshToken; + + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime expiresTime; + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java index 2c800892f..12aa27d18 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/process/ProcessController.java @@ -5,7 +5,6 @@ import javax.validation.Valid; import javax.servlet.http.HttpServletResponse; -import cn.hutool.core.collection.CollUtil; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; @@ -103,5 +102,4 @@ public class ProcessController { List processUser = processService.getAllProcess(); return success(BeanUtils.toBean(processUser, ProcessDO.class)); } - } \ No newline at end of file diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserController.java index 25f039023..f0629c4cc 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/UserController.java @@ -5,6 +5,7 @@ import com.cf.imes.framework.common.enums.CommonStatusEnum; import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.pojo.PageParam; import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.excel.core.util.ExcelUtils; import com.cf.imes.framework.operatelog.core.annotations.OperateLog; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; @@ -175,4 +176,11 @@ public class UserController { return success(userService.importUserList(list, updateSupport)); } + @GetMapping("/list-terms-simple") + @Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项") + @Parameter(name = "name", description = "用户名称", required = false, example = "晨丰") + public CommonResult> getSimpleUserList(@RequestParam(value = "name", required = false) String name) { + List list = userService.getUserListByTerms(CommonStatusEnum.ENABLE.getStatus() , name); + return success(BeanUtils.toBean(list, UserRespVO.class)); + } } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserTermsReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserTermsReqVO.java new file mode 100644 index 000000000..57ed70e8d --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/user/vo/user/UserTermsReqVO.java @@ -0,0 +1,23 @@ +package com.cf.imes.module.system.controller.admin.user.vo.user; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 用户信息 Response VO") +@Data +@ExcelIgnoreUnannotated +public class UserTermsReqVO extends UserRespVO{ + + /** + * 拼音首字母 + */ + private String pyFirstChar; + /** + * 全拼 + */ + private String pyAll; + + private Long organId; + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/application/ApplicationDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/application/ApplicationDO.java new file mode 100644 index 000000000..71f072f82 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/application/ApplicationDO.java @@ -0,0 +1,66 @@ +package com.cf.imes.module.system.dal.dataobject.application; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 应用信息 process DO + * + * @author 晨丰科技 + */ +@TableName("application") +@KeySequence("application_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ApplicationDO extends BaseDO { + + /** + * 应用 ID + */ + @TableId + private int id; + /** + * 应用标识 + */ + private String appId; + /** + * 应用密钥 + */ + private String appKey; + /** + * 应用私钥 + */ + private String appSecret; + /** + * 服务器IP列表 + */ + private String serverIp; + /** + * 应用简称 + */ + private String code; + /** + * 应用名 + */ + private String name; + /** + * 应用主体 + */ + private String company; + /** + * 状态 + */ + private Boolean status; + /** + * 备注 + */ + private String remark; + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/application/ApplicationMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/application/ApplicationMapper.java new file mode 100644 index 000000000..f46db8694 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/application/ApplicationMapper.java @@ -0,0 +1,38 @@ +package com.cf.imes.module.system.dal.mysql.application; + +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationPageReqVO; +import com.cf.imes.module.system.dal.dataobject.application.ApplicationDO; +import com.cf.imes.module.system.dal.dataobject.user.AdminUserDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 应用信息表 process Mapper + * + * @author 晨丰科技 + */ +@Mapper +public interface ApplicationMapper extends BaseMapperX { + + default PageResult selectPage(ApplicationPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(ApplicationDO::getName, reqVO.getName()) + .eqIfPresent(ApplicationDO::getAppId, reqVO.getAppId()) + .eqIfPresent(ApplicationDO::getAppKey, reqVO.getAppKey()) + .eqIfPresent(ApplicationDO::getCode, reqVO.getCode()) + .eqIfPresent(ApplicationDO::getServerIp, reqVO.getServerIp()) + .eqIfPresent(ApplicationDO::getCompany, reqVO.getCompany()) + .eqIfPresent(ApplicationDO::getStatus, reqVO.getStatus()) + .eqIfPresent(ApplicationDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(ApplicationDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(ApplicationDO::getId)); + } + + default ApplicationDO selectByAppId(String appId) { + return selectOne(ApplicationDO::getAppId, appId); + } +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java index cc4d1cc39..225b907a7 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/process/ProcessMapper.java @@ -1,11 +1,13 @@ package com.cf.imes.module.system.dal.mysql.process; +import com.baomidou.mybatisplus.core.metadata.IPage; 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.system.controller.admin.process.vo.process.ProcessPageReqVO; import com.cf.imes.module.system.dal.dataobject.process.ProcessDO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -35,23 +37,7 @@ public interface ProcessMapper extends BaseMapperX { .orderByDesc(ProcessDO::getId)); } -// default PageResult selectPage(ProcessPageReqVO reqVO) { -// return selectPage(reqVO, new LambdaQueryWrapperX() -// .likeIfPresent(ProcessPageReqVO::getName, reqVO.getName()) -// .eqIfPresent(ProcessPageReqVO::getPieceRate, reqVO.getPieceRate()) -// .eqIfPresent(ProcessPageReqVO::getPieceType, reqVO.getPieceType()) -// .eqIfPresent(ProcessPageReqVO::getType, reqVO.getType()) -// .eqIfPresent(ProcessPageReqVO::getIsCustom, reqVO.getIsCustom()) -// .eqIfPresent(ProcessPageReqVO::getIsDealer, reqVO.getIsDealer()) -// .eqIfPresent(ProcessPageReqVO::getSort, reqVO.getSort()) -// .eqIfPresent(ProcessPageReqVO::getHourCapacity, reqVO.getHourCapacity()) -// .eqIfPresent(ProcessPageReqVO::getUnit, reqVO.getUnit()) -// .eqIfPresent(ProcessPageReqVO::getIsEnabled, reqVO.getIsEnabled()) -// .betweenIfPresent(ProcessPageReqVO::getPrepareTime, reqVO.getPrepareTime()) -// .eqIfPresent(ProcessPageReqVO::getDescription, reqVO.getDescription()) -// .betweenIfPresent(ProcessPageReqVO::getCreateTime, reqVO.getCreateTime()) -// .orderByDesc(ProcessPageReqVO::getId)); -// } + IPage selectProcessPage(@Param("page") IPage page , @Param("page") ProcessPageReqVO reqVO); default List selectAll() { return selectList(new LambdaQueryWrapperX() diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java index d6856a9e5..c385e55af 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/user/AdminUserMapper.java @@ -1,6 +1,7 @@ package com.cf.imes.module.system.dal.mysql.user; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; @@ -69,4 +70,14 @@ public interface AdminUserMapper extends BaseMapperX { return selectList(AdminUserDO::getDeptId, deptIds); } + default List selectListByTerms(Integer status, String namePyAll,String namePyFirstChar,String name) { + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(AdminUserDO::getStatus, status) + .likeIfPresent(AdminUserDO::getNickname, name) + .or(StrUtil.isNotBlank(name)) + .likeIfPresent(AdminUserDO::getPinyinFull, namePyAll) + .or(StrUtil.isNotBlank(namePyAll)) + .likeIfPresent(AdminUserDO::getPinyinInitial, namePyFirstChar) + .orderByDesc(AdminUserDO::getId)); + } } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/application/ApplicationService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/application/ApplicationService.java new file mode 100644 index 000000000..a49966be3 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/application/ApplicationService.java @@ -0,0 +1,66 @@ +package com.cf.imes.module.system.service.application; + +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationPageReqVO; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationRespVO; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationSaveReqVO; +import com.cf.imes.module.system.controller.admin.application.vo.auth.ApplicationLoginRespVO; +import com.cf.imes.module.system.dal.dataobject.application.ApplicationDO; + +import javax.validation.Valid; +import java.util.List; + +public interface ApplicationService { + + /** + * 创建应用信息表 application + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Integer createApplication(@Valid ApplicationSaveReqVO createReqVO); + + /** + * 更新应用信息表 application + * + * @param updateReqVO 更新信息 + */ + void updateApplication(@Valid ApplicationSaveReqVO updateReqVO); + + /** + * 删除应用信息表 application + * + * @param id 编号 + */ + void deleteApplication(Long id); + + /** + * 获得应用信息表 application + * + * @param id 编号 + * @return 工序信息表 application + */ + ApplicationDO getApplication(Long id); + + /** + * 获得应用信息表 application + * + * @param pageReqVO 分页查询 + * @return 工序信息表 application + */ + PageResult getApplicationPage(ApplicationPageReqVO pageReqVO); + + /** + * 获得所有应用信息表 application + * + * @return 工序信息表 application + */ + List getAllApplication(); + + /** + * 应用登陆 + * @param reqVO: 登陆信息 + * @return 登录结果 + */ + ApplicationLoginRespVO loginApplication(@Valid ApplicationRespVO reqVO); +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/application/ApplicationServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/application/ApplicationServiceImpl.java new file mode 100644 index 000000000..ec15e1573 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/application/ApplicationServiceImpl.java @@ -0,0 +1,141 @@ +package com.cf.imes.module.system.service.application; + +import com.cf.imes.framework.common.exception.ServerException; +import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.common.util.monitor.TracerUtils; +import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.common.util.servlet.ServletUtils; +import com.cf.imes.framework.organ.core.context.OrganContextHolder; +import com.cf.imes.module.system.api.logger.dto.LoginLogCreateReqDTO; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationPageReqVO; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationRespVO; +import com.cf.imes.module.system.controller.admin.application.vo.application.ApplicationSaveReqVO; +import com.cf.imes.module.system.controller.admin.application.vo.auth.ApplicationLoginRespVO; +import com.cf.imes.module.system.controller.admin.auth.vo.AuthLoginRespVO; +import com.cf.imes.module.system.convert.auth.AuthConvert; +import com.cf.imes.module.system.dal.dataobject.application.ApplicationDO; +import com.cf.imes.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; +import com.cf.imes.module.system.dal.dataobject.organ.OrganizationDO; +import com.cf.imes.module.system.dal.mysql.application.ApplicationMapper; +import com.cf.imes.module.system.enums.ErrorCodeConstants; +import com.cf.imes.module.system.enums.logger.LoginLogTypeEnum; +import com.cf.imes.module.system.enums.logger.LoginResultEnum; +import com.cf.imes.module.system.enums.oauth2.OAuth2ClientConstants; +import com.cf.imes.module.system.service.oauth2.OAuth2TokenService; +import com.cf.imes.module.system.util.rsa.AsymmetricAlgorithmUtil; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; + +import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.APPLICATION_NOT_EXISTS; + +/** + * 应用信息表 application Service 实现类 + * + * @author 晨丰科技 + */ +@Service +@Validated +public class ApplicationServiceImpl implements ApplicationService{ + + @Resource + private ApplicationMapper applicationMapper; + + @Resource + private OAuth2TokenService oauth2TokenService; + + @Override + public Integer createApplication(ApplicationSaveReqVO createReqVO) { + // 插入 + LinkedList priKeyAndPubKey = AsymmetricAlgorithmUtil.getPriKeyAndPubKey(); + String privateKey = priKeyAndPubKey.get(0); + String publicKey = priKeyAndPubKey.get(1); + String appKey = AsymmetricAlgorithmUtil.encryptByPublic(createReqVO.getAppId(), publicKey); +// 公钥加密,私钥解密 + ApplicationDO applicationDO = BeanUtils.toBean(createReqVO, ApplicationDO.class) + .setAppKey(appKey).setAppSecret(privateKey); + applicationMapper.insert(applicationDO); + // 返回 + return applicationDO.getId(); + } + + @Override + public void updateApplication(ApplicationSaveReqVO updateReqVO) { + // 校验存在 + validateApplicationExists(updateReqVO.getId()); + // 更新 + ApplicationDO updateObj = BeanUtils.toBean(updateReqVO, ApplicationDO.class); + applicationMapper.updateById(updateObj); + } + + @Override + public void deleteApplication(Long id) { + // 校验存在 + validateApplicationExists(id); + // 删除 + applicationMapper.deleteById(id); + } + + private void validateApplicationExists(Long id) { + if (applicationMapper.selectById(id) == null) { + throw exception(APPLICATION_NOT_EXISTS); + } + } + + @Override + public ApplicationDO getApplication(Long id) { + return applicationMapper.selectById(id); + } + + @Override + public PageResult getApplicationPage(ApplicationPageReqVO pageReqVO) { + return applicationMapper.selectPage(pageReqVO); + } + + @Override + public List getAllApplication() { + return null; + } + + @Override + public ApplicationLoginRespVO loginApplication(ApplicationRespVO reqVO) { + ApplicationDO app = applicationMapper.selectByAppId(reqVO.getAppId()); + if (Objects.isNull(app)) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLICATION_NOT_EXISTS); + } +// 公钥加密,私钥解密 + String appId = AsymmetricAlgorithmUtil.encryptByPublic(reqVO.getAppKey(), app.getAppSecret()); + if (!appId.equals(app.getAppId())) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.APPLICATION_LOGIN_USER_DISABLED); + } + // 创建 Token 令牌,记录登录日志 + return BeanUtils.toBean(createTokenAfterLoginSuccess(app.getId(), app.getAppId(), LoginLogTypeEnum.LOGIN_USERNAME), ApplicationLoginRespVO.class).setAppId(app.getId()); + } + + private AuthLoginRespVO createTokenAfterLoginSuccess(Integer userId, String username, LoginLogTypeEnum logType) { +// Long organId = OrganContextHolder.getOrganId(); +// OrganizationDO organ = organService.getOrgan(organId); +// if(Objects.isNull(organ)) { +// throw new ServerException(10023,"组织不存在"); +// } + // 创建访问令牌 + OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken( + 1L, + null, + OAuth2ClientConstants.CLIENT_ID_DEFAULT, + null, + null, + null, + null, + null); + // 构建返回结果 + return AuthConvert.INSTANCE.convert(accessTokenDO); + } + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java index c74c843fa..7fa8fb700 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/process/ProcessServiceImpl.java @@ -1,6 +1,8 @@ package com.cf.imes.module.system.service.process; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.cf.imes.framework.common.util.pinyin.PinYinUtils; import com.cf.imes.module.system.controller.admin.process.vo.process.*; import com.cf.imes.module.system.controller.admin.process.vo.processUser.ProcessAndUserSaveReqVO; @@ -142,31 +144,9 @@ public class ProcessServiceImpl implements ProcessService { @Override public PageResult getProcessPageAll(ProcessPageReqVO pageReqVO) { - PageResult processList = processMapper.selectPage(pageReqVO); - PageResult processRespVOPageResult = new PageResult(); - - processRespVOPageResult.setTotal(processList.getTotal()); - processList.getList().forEach(processDO -> { - ProcessRespVO processRespVO = BeanUtils.toBean(processDO, ProcessRespVO.class); - StringBuilder userIdBuilder = new StringBuilder(); - List userIdListsByProcessId = processUserService.getProcessUser(processDO.getId()); - if (userIdListsByProcessId != null) { - for (ProcessUserDO processUser : userIdListsByProcessId) { - if (processUser != null && processUser.getUserId() != null) { - if (adminUserService.getUser(processUser.getUserId()) != null) { - userIdBuilder.append(",").append(processUser.getUserId()); - } - if (pageReqVO.getUserId() != null && pageReqVO.getUserId().equals("")) { - if (processUser.getUserId().equals(pageReqVO.getUserId())) - break; - } - } - } - } - processRespVO.setUsers(userIdBuilder.length() > 0 ? userIdBuilder.substring(1) : ""); - processRespVOPageResult.getList().add(processRespVO); - }); - return processRespVOPageResult; + PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + IPage processRespVOPageResult = processMapper.selectProcessPage(page,BeanUtils.toBean(pageReqVO, ProcessPageReqVO.class)); + return new PageResult(BeanUtils.toBean(processRespVOPageResult.getRecords(), ProcessRespVO.class), processRespVOPageResult.getTotal()); } @Override diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserService.java index fedf15a07..34be2df8e 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserService.java @@ -207,4 +207,13 @@ public interface AdminUserService { */ boolean isPasswordMatch(String rawPassword, String encodedPassword); + /** + * 获得指定状态和名称的用户们 + * + * @param status 状态 + * @param name 用户名称 + * @return 用户们 + */ + List getUserListByTerms(Integer status , String name); + } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java index 87259dc9e..abd326554 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/user/AdminUserServiceImpl.java @@ -475,6 +475,17 @@ public class AdminUserServiceImpl implements AdminUserService { return passwordEncoder.matches(rawPassword, encodedPassword); } + @Override + public List getUserListByTerms(Integer status, String name) { + String namePyFirstChar = ""; + String namePyAll = ""; + if(StrUtil.isNotBlank(name)) { + namePyFirstChar = PinYinUtils.convertToPinyin(name); + namePyAll = PinYinUtils.convertToPinyin(name).replaceAll(" ", ""); + } + return userMapper.selectListByTerms(status, namePyAll, namePyFirstChar, name); + } + /** * 对密码进行加密 * diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessMapper.xml b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessMapper.xml new file mode 100644 index 000000000..a71e81ef0 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/process/ProcessMapper.xml @@ -0,0 +1,45 @@ + + + + + \ No newline at end of file