diff --git a/mes-framework/mes-common/src/main/java/com/chanko/yunxi/mes/framework/common/util/io/FileUtils.java b/mes-framework/mes-common/src/main/java/com/chanko/yunxi/mes/framework/common/util/io/FileUtils.java index 9f2929c8..bf6ba391 100644 --- a/mes-framework/mes-common/src/main/java/com/chanko/yunxi/mes/framework/common/util/io/FileUtils.java +++ b/mes-framework/mes-common/src/main/java/com/chanko/yunxi/mes/framework/common/util/io/FileUtils.java @@ -3,6 +3,7 @@ package com.chanko.yunxi.mes.framework.common.util.io; import cn.hutool.core.io.FileTypeUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.lang.UUID; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.DigestUtil; @@ -64,7 +65,7 @@ public class FileUtils { } /** - * 生成文件路径 + * 生成文件路径(存在问题!慎用!同文件多处使用将致错乱) * * @param content 文件内容 * @param originalName 原始文件名 @@ -81,4 +82,20 @@ public class FileUtils { return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content)); } + /** + * 生成文件路径 uuid + * + * @param originalName 原始文件名 + * @return path,唯一不可重复 + */ + public static String generatePath(String originalName) { + String uuid = UUID.randomUUID().toString(true); + // 情况一:如果存在 name,则优先使用 name 的后缀 + if (StrUtil.isNotBlank(originalName)) { + String extName = FileNameUtil.extName(originalName); + return StrUtil.isBlank(extName) ? uuid : uuid + "." + extName; + } + return uuid; + } + } diff --git a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/annotations/OperateLog.java b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/annotations/OperateLog.java index 75b5001a..d8ddce32 100644 --- a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/annotations/OperateLog.java +++ b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/annotations/OperateLog.java @@ -38,6 +38,14 @@ public @interface OperateLog { * 实际并不是数组,因为枚举不能设置 null 作为默认值 */ OperateTypeEnum[] type() default {}; + /** + * 业务类型 + */ + String businessType() default ""; + /** + * 业务类型id + */ + long businessId() default 0L; // ========== 开关字段 ========== diff --git a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/aop/OperateLogAspect.java b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/aop/OperateLogAspect.java index f1981f6c..694ab3a4 100644 --- a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/aop/OperateLogAspect.java +++ b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/aop/OperateLogAspect.java @@ -88,11 +88,11 @@ public class OperateLogAspect { private Object around0(ProceedingJoinPoint joinPoint, com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog operateLog, Operation operation) throws Throwable { - // 目前,只有管理员,才记录操作日志!所以非管理员,直接调用,不进行记录 + /*// 目前,只有管理员,才记录操作日志!所以非管理员,直接调用,不进行记录 Integer userType = WebFrameworkUtils.getLoginUserType(); if (!Objects.equals(userType, UserTypeEnum.ADMIN.getValue())) { return joinPoint.proceed(); - } + }*/ // 记录开始时间 LocalDateTime startTime = LocalDateTime.now(); @@ -159,11 +159,20 @@ public class OperateLogAspect { fillRequestFields(operateLogObj); // 补全方法信息 fillMethodFields(operateLogObj, joinPoint, operateLog, startTime, result, exception); + // 补全业务信息 + fillBusinessFields(operateLogObj, operateLog); // 异步记录日志 operateLogFrameworkService.createOperateLog(operateLogObj); } + private static void fillBusinessFields(OperateLog operateLogObj, com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog operateLog) { + if(operateLog != null){ + operateLogObj.setBusinessType(operateLog.businessType()) + .setBusinessId(operateLog.businessId()); + } + } + private static void fillUserFields(OperateLog operateLogObj) { operateLogObj.setUserId(WebFrameworkUtils.getLoginUserId()); operateLogObj.setUserType(WebFrameworkUtils.getLoginUserType()); diff --git a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/enums/OperateTypeEnum.java b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/enums/OperateTypeEnum.java index 608119c1..70198a87 100644 --- a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/enums/OperateTypeEnum.java +++ b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/enums/OperateTypeEnum.java @@ -40,6 +40,34 @@ public enum OperateTypeEnum { * 导入 */ IMPORT(6), + /* + * 保存 + * */ + SAVE(7), + /* + * 送审 + * */ + SUBMIT_AUDIT(8), + /* + * 审核 + * */ + AUDIT(9), + /* + * 批准 + * */ + APPROVE(10), + /* + * 打回 + * */ + REPULSE(11), + /* + * 变更 + * */ + ALTER(12), + /* + * 终止 + * */ + TERMINATE(13), /** * 其它 * diff --git a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLog.java b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLog.java index 955a1780..01ff2759 100644 --- a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLog.java +++ b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLog.java @@ -17,7 +17,14 @@ public class OperateLog { * 链路追踪编号 */ private String traceId; - + /** + * 业务类型 用于业务关联 + */ + private String businessType; + /** + * 业务id + */ + private Long businessId; /** * 用户编号 */ diff --git a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLogFrameworkService.java b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLogFrameworkService.java index 169f606a..3e55b025 100644 --- a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLogFrameworkService.java +++ b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLogFrameworkService.java @@ -1,5 +1,8 @@ package com.chanko.yunxi.mes.framework.operatelog.core.service; +import javax.servlet.http.HttpServletRequest; +import java.time.LocalDateTime; + /** * 操作日志 Framework Service 接口 * @@ -14,4 +17,15 @@ public interface OperateLogFrameworkService { */ void createOperateLog(OperateLog operateLog); + /** + * 记录操作日志 + * + * @param request + * @param startTime + * @param businessType + * @param businessId + * @param type + * @param content + */ + void createOperateLog(HttpServletRequest request, LocalDateTime startTime, String businessType, Long businessId, Integer type, String content); } diff --git a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java index 3fcf7835..9f1624e4 100644 --- a/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java +++ b/mes-framework/mes-spring-boot-starter-biz-operatelog/src/main/java/com/chanko/yunxi/mes/framework/operatelog/core/service/OperateLogFrameworkServiceImpl.java @@ -1,11 +1,20 @@ package com.chanko.yunxi.mes.framework.operatelog.core.service; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import com.chanko.yunxi.mes.framework.common.util.monitor.TracerUtils; +import com.chanko.yunxi.mes.framework.common.util.servlet.ServletUtils; +import com.chanko.yunxi.mes.framework.web.core.util.WebFrameworkUtils; import com.chanko.yunxi.mes.module.system.api.logger.OperateLogApi; import com.chanko.yunxi.mes.module.system.api.logger.dto.OperateLogCreateReqDTO; import lombok.RequiredArgsConstructor; import org.springframework.scheduling.annotation.Async; +import javax.servlet.http.HttpServletRequest; +import java.time.LocalDateTime; + +import static com.chanko.yunxi.mes.framework.common.exception.enums.GlobalErrorCodeConstants.SUCCESS; + /** * 操作日志 Framework Service 实现类 * @@ -25,4 +34,28 @@ public class OperateLogFrameworkServiceImpl implements OperateLogFrameworkServic operateLogApi.createOperateLog(reqDTO); } + @Override + public void createOperateLog(HttpServletRequest request, LocalDateTime startTime, String businessType, Long businessId, Integer type, String content) { + OperateLog operateLogObj = new OperateLog(); + operateLogObj.setTraceId(TracerUtils.getTraceId()); + operateLogObj.setStartTime(startTime); + operateLogObj.setBusinessType(businessType); + operateLogObj.setBusinessId(businessId); + operateLogObj.setUserId(WebFrameworkUtils.getLoginUserId()); + operateLogObj.setUserType(WebFrameworkUtils.getLoginUserType()); + operateLogObj.setModule("ignore"); + operateLogObj.setName("ignore"); + operateLogObj.setType(type); + operateLogObj.setContent(content); + operateLogObj.setRequestMethod(request.getMethod()); + operateLogObj.setRequestUrl(request.getRequestURI()); + operateLogObj.setUserIp(ServletUtils.getClientIP(request)); + operateLogObj.setUserAgent(ServletUtils.getUserAgent(request)); + operateLogObj.setJavaMethod(request.getMethod()); + operateLogObj.setDuration((int) (LocalDateTimeUtil.between(startTime, LocalDateTime.now()).toMillis())); + operateLogObj.setResultCode(SUCCESS.getCode()); + OperateLogCreateReqDTO reqDTO = BeanUtil.toBean(operateLogObj, OperateLogCreateReqDTO.class); + operateLogApi.createOperateLog(reqDTO); + } + } diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/BusinesTypeEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/BusinesTypeEnum.java new file mode 100644 index 00000000..9bb966ae --- /dev/null +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/BusinesTypeEnum.java @@ -0,0 +1,21 @@ +package com.chanko.yunxi.mes.module.heli.enums; + +import lombok.Getter; + +/** + * 业务类型枚举 + * @author chenxi + * @date 2024-01-15 05:39 + */ +@Getter +public enum BusinesTypeEnum { + + PROJECT_ORDER("销售订单"), + PROJECT_ORDER_SNAPSHOT("销售订单快照"); + + private String description; + + BusinesTypeEnum(String description) { + this.description = description; + } +} diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/BusinessFileTypeEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/BusinessFileTypeEnum.java new file mode 100644 index 00000000..f210c61b --- /dev/null +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/BusinessFileTypeEnum.java @@ -0,0 +1,21 @@ +package com.chanko.yunxi.mes.module.heli.enums; + +import lombok.Getter; + +/** + * 业务文件类型 + * @author chenxi + * @date 2024-01-16 10:38 + */ +@Getter +public enum BusinessFileTypeEnum { + + CONTRACT("合同"), + TECHNOLOGY_PROTOCOL("技术协议"); + + private String description; + + BusinessFileTypeEnum(String description) { + this.description = description; + } +} diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/CodeEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/CodeEnum.java index ee275297..83269644 100644 --- a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/CodeEnum.java +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/CodeEnum.java @@ -25,6 +25,10 @@ public enum CodeEnum { * 仓库 Wa+四位流水号 * 入库单号 WI+年月日+4位流水号 * 出库单号 WO+年月日+4位流水号 + * 盘点单 WC+年月日+4位流水号 + * 业务订单 客户编号+年+月+月度顺序号(三位流水) + * 发货单 HL+年月+月度顺序号(三位流水) + * * */ FACTORY("工厂", "Fa", 4), DEPT("部门", "De", 4), @@ -36,6 +40,8 @@ public enum CodeEnum { WAREHOUSE("仓库", "Wa", 4), STOCK_IN("入库单", "WI", 4, "yyyyMMdd"), STOCK_OUT("出库单", "WO", 4, "yyyyMMdd"), + PROJECT_ORDER("业务订单", 3, "yyyyMM"), + PROJECT_DELIVERY_ORDER("发货单", "HL", 3, "yyyyMM"), ; @@ -63,11 +69,23 @@ public enum CodeEnum { this.sequenceArgsLength = 3; } + CodeEnum(String description, int sequenceLength, String dateFormat) { + this.description = description; + this.sequenceLength = sequenceLength; + this.dateFormat = dateFormat; + this.sequenceTemplate = "%s%s%0"+sequenceLength+"d"; + this.sequenceArgsLength = 3; + } + public String getCode(String suffix){ + return getCode(this.prefix, suffix); + } + + public String getCode(String prefix, String suffix){ String sequenceNo = suffix.length() > this.sequenceLength ? suffix.substring(suffix.length() - this.sequenceLength) : suffix; Object[] args = new Object[this.sequenceArgsLength]; int i = 0; - args[i++] = this.prefix; + args[i++] = prefix; if(!StringUtils.isEmpty(this.dateFormat)){ args[i++] = (new SimpleDateFormat(this.dateFormat).format(new Date())); } diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/ErrorCodeConstants.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/ErrorCodeConstants.java index 7449d06f..2736cbd0 100644 --- a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/ErrorCodeConstants.java +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/ErrorCodeConstants.java @@ -13,19 +13,23 @@ import com.chanko.yunxi.mes.framework.common.exception.ErrorCode; * 000 通用 * 001 基础信息 * 002 组织架构 + * 003 库存管理 + * 004 订单管理 * 第三段,3 位,错误码 */ public interface ErrorCodeConstants { ErrorCode CODE_REPEAT = new ErrorCode(1_000_001, "编码不能重复"); + ErrorCode INVALID_OPERATE = new ErrorCode(1_000_002, "无效操作"); - /*基础信息*/ + /************基础信息**********/ ErrorCode MATERIAL_NOT_EXISTS = new ErrorCode(1_001_001, "物料不存在"); ErrorCode COMPOSITION_NOT_EXISTS = new ErrorCode(1_001_002, "材质不存在"); ErrorCode CLIENT_NOT_EXISTS = new ErrorCode(1_001_003, "客户信息不存在"); ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode( 1_001_004, "客户新表信息不存在"); ErrorCode SUPPLIER_NOT_EXISTS = new ErrorCode(1_001_005, "供应商不存在"); ErrorCode PROCEDURE_NOT_EXISTS = new ErrorCode(1_001_006, "工序不存在"); + ErrorCode SERIAL_NUMBER_NOT_EXISTS = new ErrorCode(1_001_007, "序列号记录不存在"); /*********组织架构************/ ErrorCode WORKSHOP_NOT_EXISTS = new ErrorCode(1_002_001, "车间不存在"); @@ -36,7 +40,11 @@ public interface ErrorCodeConstants { ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1_003_001, "仓库不存在"); ErrorCode RG_NOT_EXISTS = new ErrorCode(1_003_002, "库区不存在"); ErrorCode PN_NOT_EXISTS = new ErrorCode(1_003_003, "库位不存在"); + ErrorCode STORAGE_NOT_EXISTS = new ErrorCode(1_003_004,"库存不存在"); + ErrorCode STORAGE_MAT_NOT_EXISTS = new ErrorCode(1_003_005, "物料不存在"); + ErrorCode STORAGE_LOG_NOT_EXISTS = new ErrorCode(1_003_006, "库存日志不存在"); - + /************订单管理***********/ + ErrorCode PROJECT_ORDER_NOT_EXISTS = new ErrorCode(1_004_001, "项目订单不存在"); } diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/ProjectOrderStatusEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/ProjectOrderStatusEnum.java new file mode 100644 index 00000000..8109eb95 --- /dev/null +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/ProjectOrderStatusEnum.java @@ -0,0 +1,28 @@ +package com.chanko.yunxi.mes.module.heli.enums; + +import lombok.Getter; + +/** + * 项目订单状态枚举 + * @author chenxi + * @date 2024-01-18 01:19 + */ +@Getter +public enum ProjectOrderStatusEnum { + REPULSE(3, "已打回"), + SAVE(4, "已保存"), + ALTER(8, "发起变更"), + SUBMIT_AUDIT(8, "已送审"), + AUDIT(16, "已审核"), + APPROVE(32, "已启动"), + TERMINATE(64, "已终止") + ; + + private int code; + private String description; + + ProjectOrderStatusEnum(int code, String description) { + this.code = code; + this.description = description; + } +} diff --git a/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/YesOrNoEnum.java b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/YesOrNoEnum.java new file mode 100644 index 00000000..e1e6de4e --- /dev/null +++ b/mes-module-heli/mes-module-heli-api/src/main/java/com/chanko/yunxi/mes/module/heli/enums/YesOrNoEnum.java @@ -0,0 +1,20 @@ +package com.chanko.yunxi.mes.module.heli.enums; + +import lombok.Getter; + +/** + * 是否枚举 + * @author chenxi + * @date 2024-01-18 02:31 + */ +@Getter +public enum YesOrNoEnum { + + YES(1), NO(0); + + private int code; + + YesOrNoEnum(int code) { + this.code = code; + } +} diff --git a/mes-module-heli/mes-module-heli-biz/pom.xml b/mes-module-heli/mes-module-heli-biz/pom.xml index 556fb794..f6debc24 100644 --- a/mes-module-heli/mes-module-heli-biz/pom.xml +++ b/mes-module-heli/mes-module-heli-biz/pom.xml @@ -32,6 +32,11 @@ mes-module-system-biz ${revision} + + com.chanko.yunxi + mes-module-infra-biz + ${revision} + @@ -117,6 +122,12 @@ mes-spring-boot-starter-file + + com.github.dadiyang + equator + 1.0.4 + + diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/ProjectOrderController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/ProjectOrderController.java new file mode 100644 index 00000000..0b502e34 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/ProjectOrderController.java @@ -0,0 +1,143 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder; + +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; +import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; +import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; +import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum; +import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService; +import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.ProjectOrderPageReqVO; +import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.ProjectOrderRespVO; +import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.ProjectOrderSaveReqVO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO; +import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum; +import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService; +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.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.List; + +import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; +import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 项目订单") +@RestController +@RequestMapping("/heli/project-order") +@Validated +public class ProjectOrderController { + + @Resource + private ProjectOrderService projectOrderService; + + @Resource + private OperateLogFrameworkService operateLogFrameworkService; + + @Resource + private HttpServletRequest request; + + @PostMapping("/create") + @Operation(summary = "创建项目订单") + @PreAuthorize("@ss.hasPermission('heli:project-order:create')") + public CommonResult createProjectOrder(@Valid @RequestBody ProjectOrderSaveReqVO createReqVO) { + return success(projectOrderService.createProjectOrder(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新项目订单") + @PreAuthorize("@ss.hasPermission('heli:project-order:update')") + public CommonResult updateProjectOrder(@Valid @RequestBody ProjectOrderSaveReqVO updateReqVO) { + projectOrderService.updateProjectOrder(updateReqVO); + return success(true); + } + + @PostMapping("/operate") + @Operation(summary = "操作项目订单") + @PreAuthorize("@ss.hasPermission('heli:project-order:update')") + @OperateLog(enable = false) + @Transactional(rollbackFor = Exception.class) + public CommonResult operateProjectOrder(@Valid @RequestBody ProjectOrderSaveReqVO operateReqVO) { + LocalDateTime startTime = LocalDateTime.now(); + projectOrderService.operateProjectOrder(operateReqVO); + + // 手动记录日志 + operateLogFrameworkService.createOperateLog(request, + startTime, + BusinesTypeEnum.PROJECT_ORDER.name(), + operateReqVO.getId(), + OperateTypeEnum.valueOf(operateReqVO.getActive()).getType(), + operateReqVO.getActiveOpinion()); + + // 批准、终止记录快照 + switch (OperateTypeEnum.valueOf(operateReqVO.getActive())){ + case APPROVE: + case TERMINATE: + projectOrderService.createProjectOrderSnapshot(operateReqVO); + break; + } + return success(operateReqVO.getId()); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除项目订单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('heli:project-order:delete')") + public CommonResult deleteProjectOrder(@RequestParam("id") Long id) { + projectOrderService.deleteProjectOrder(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得项目订单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('heli:project-order:query')") + public CommonResult getProjectOrder(@RequestParam("id") Long id) { + ProjectOrderDO projectOrder = projectOrderService.getProjectOrder(id); + return success(BeanUtils.toBean(projectOrder, ProjectOrderRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得项目订单分页") + @PreAuthorize("@ss.hasPermission('heli:project-order:query')") + public CommonResult> getProjectOrderPage(@Valid ProjectOrderPageReqVO pageReqVO) { + PageResult pageResult = projectOrderService.getProjectOrderPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, ProjectOrderRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出项目订单 Excel") + @PreAuthorize("@ss.hasPermission('heli:project-order:export')") + @OperateLog(type = EXPORT) + public void exportProjectOrderExcel(@Valid ProjectOrderPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = projectOrderService.getProjectOrderPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "项目订单.xls", "数据", ProjectOrderRespVO.class, + BeanUtils.toBean(list, ProjectOrderRespVO.class)); + } + + // ==================== 子表(项目订单子项目) ==================== + + @GetMapping("/project-order-sub/list-by-project-order-id") + @Operation(summary = "获得项目订单子项目列表") + @Parameter(name = "projectOrderId", description = "项目订单id") + @PreAuthorize("@ss.hasPermission('heli:project-order:query')") + public CommonResult> getProjectOrderSubListByProjectOrderId(@RequestParam("projectOrderId") Long projectOrderId) { + return success(projectOrderService.getProjectOrderSubListByProjectOrderId(projectOrderId)); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/vo/ProjectOrderPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/vo/ProjectOrderPageReqVO.java new file mode 100644 index 00000000..bfadefcf --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/vo/ProjectOrderPageReqVO.java @@ -0,0 +1,133 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.chanko.yunxi.mes.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 ProjectOrderPageReqVO extends PageParam { + + @Schema(description = "项目编号,唯一") + private String code; + + @Schema(description = "单据状态 已保存/已送审/已审核/已启动/已打回/已终止", example = "1") + private Integer orderStatus; + + @Schema(description = "单据状态列表") + private List orderStatusList; + + @Schema(description = "发货状态 未发货/部分发货/全部发货", example = "1") + private Integer deliveryStatus; + + @Schema(description = "提出部门id", example = "9959") + private Long businessDeptId; + + @Schema(description = "客户id", example = "27214") + private Long customerId; + + @Schema(description = "模具名称", example = "赵六") + private String mouldName; + + @Schema(description = "业务线") + private String businessLine; + + @Schema(description = "图号") + private String blueprintNo; + + @Schema(description = "是否有价格", example = "28491") + private Integer hasPrice; + + @Schema(description = "价格 保留四位小数", example = "24218") + private BigDecimal price; + + @Schema(description = "币种") + private String currency; + + @Schema(description = "项目开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] projectStartTime; + + @Schema(description = "项目结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] projectEndTime; + + @Schema(description = "是否紧急") + private Integer isUrgency; + + @Schema(description = "性质 新制|维修") + private Integer property; + + @Schema(description = "可引用的原有技术") + private String referenceTechnology; + + @Schema(description = "是否已变更") + private Integer hasAlter; + + @Schema(description = "上一次变更时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] lastAlterTime; + + @Schema(description = "检验要求") + private String qualityRequirement; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "有无合同") + private Integer hasContract; + + @Schema(description = "有无技术协议") + private Integer hasTechnologyProtocol; + + @Schema(description = "有无图纸/数模") + private Integer hasBlueprint; + + @Schema(description = "图纸/数模 说明", example = "你猜") + private String blueprintRemark; + + @Schema(description = "状态,1表示正常,2表示禁用", example = "1") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "合同编号") + private String contractNo; + + @Schema(description = "业务员") + private Long businessMan; + + @Schema(description = "客户名称") + private String customerName; + + @Schema(description = "客户名称") + private String businessManName; + + @Schema(description = "是否快照") + private Integer isSnapshot; + + @Schema(description = "快照原始id", example = "19436") + private Long snapshotId; + + @Schema(description = "快照原始单据号") + private String snapshotCode; + + @Schema(description = "单据日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] orderTime; + + @Schema(description = "快照原始单据日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] snapshotOrderTime; + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/vo/ProjectOrderRespVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/vo/ProjectOrderRespVO.java new file mode 100644 index 00000000..f0f01981 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/vo/ProjectOrderRespVO.java @@ -0,0 +1,182 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat; +import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Set; + +@Schema(description = "管理后台 - 项目订单 Response VO") +@Data +@ExcelIgnoreUnannotated +public class ProjectOrderRespVO { + + @Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED, example = "17481") + @ExcelProperty("自增字段,唯一") + private Long id; + + @Schema(description = "项目编号,唯一", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("项目编号,唯一") + private String code; + + @Schema(description = "单据状态 已保存/已送审/已审核/已启动/已打回/已终止", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "单据状态 已保存/已送审/已审核/已启动/已打回/已终止", converter = DictConvert.class) + @DictFormat("heli_project_order_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer orderStatus; + + @Schema(description = "发货状态 未发货/部分发货/全部发货", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "发货状态 未发货/部分发货/全部发货", converter = DictConvert.class) + @DictFormat("heli_delivery_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer deliveryStatus; + + @Schema(description = "提出部门id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9959") + private Long businessDeptId; + + @Schema(description = "提出部门", requiredMode = Schema.RequiredMode.REQUIRED, example = "9959") + @ExcelProperty("提出部门") + private String businessDeptName; + + @Schema(description = "客户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "27214") + private Long customerId; + + @Schema(description = "客户", requiredMode = Schema.RequiredMode.REQUIRED, example = "27214") + @ExcelProperty("客户") + private String customerName; + + @Schema(description = "模具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @ExcelProperty("模具名称") + private String mouldName; + + @Schema(description = "业务线", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "业务线", converter = DictConvert.class) + @DictFormat("heli_business_line") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private String businessLine; + + @Schema(description = "图号") + @ExcelProperty("图号") + private String blueprintNo; + + @Schema(description = "是否有价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "28491") + @ExcelProperty(value = "是否有价格", converter = DictConvert.class) + @DictFormat("heli_common_is_or_not") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer hasPrice; + + @Schema(description = "价格 保留四位小数", example = "24218") + @ExcelProperty("价格 保留四位小数") + private BigDecimal price; + + @Schema(description = "币种") + @ExcelProperty(value = "币种", converter = DictConvert.class) + @DictFormat("heli_currency") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private String currency; + + @Schema(description = "项目开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("项目开始时间") + private LocalDateTime projectStartTime; + + @Schema(description = "项目结束时间") + @ExcelProperty("项目结束时间") + private LocalDateTime projectEndTime; + + @Schema(description = "是否紧急", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "是否紧急", converter = DictConvert.class) + @DictFormat("heli_common_is_or_not") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer isUrgency; + + @Schema(description = "性质 新制|维修", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "性质 新制|维修", converter = DictConvert.class) + @DictFormat("heli_project_property") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer property; + + @Schema(description = "可引用的原有技术") + @ExcelProperty("可引用的原有技术") + private String referenceTechnology; + + @Schema(description = "是否已变更", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "是否已变更", converter = DictConvert.class) + @DictFormat("heli_common_is_or_not") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer hasAlter; + + @Schema(description = "上一次变更时间") + @ExcelProperty("上一次变更时间") + private LocalDateTime lastAlterTime; + + @Schema(description = "检验要求") + @ExcelProperty("检验要求") + private String qualityRequirement; + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "有无合同", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "有无合同", converter = DictConvert.class) + @DictFormat("heli_common_is_or_not") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer hasContract; + + @Schema(description = "有无技术协议", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "有无技术协议", converter = DictConvert.class) + @DictFormat("heli_common_is_or_not") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer hasTechnologyProtocol; + + @Schema(description = "有无图纸/数模", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "有无图纸/数模", converter = DictConvert.class) + @DictFormat("heli_common_is_or_not") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer hasBlueprint; + + @Schema(description = "图纸/数模 说明", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") + @ExcelProperty("图纸/数模 说明") + private String blueprintRemark; + + @Schema(description = "状态,1表示正常,2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("状态,1表示正常,2表示禁用") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "业务员id", requiredMode = Schema.RequiredMode.REQUIRED) + private Long businessMan; + + @Schema(description = "业务员", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("业务员") + private String businessManName; + + @Schema(description = "合同编号") + @ExcelProperty("合同编号") + private String contractNo; + + @Schema(description = "是否快照", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "是否快照", converter = DictConvert.class) + @DictFormat("heli_common_is_or_not") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer isSnapshot; + + @Schema(description = "快照原始id", example = "19436") + @ExcelProperty("快照原始id") + private Long snapshotId; + + @Schema(description = "快照原始单据号") + @ExcelProperty("快照原始单据号") + private String snapshotCode; + + @Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("单据日期") + private LocalDateTime orderTime; + + @Schema(description = "快照原始单据日期") + @ExcelProperty("快照原始单据日期") + private LocalDateTime snapshotOrderTime; + + @Schema(description = "变更的字段列表") + private Set alterFieldNames; + + @Schema(description = "创建人名称") + private String creatorName; + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/vo/ProjectOrderSaveReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/vo/ProjectOrderSaveReqVO.java new file mode 100644 index 00000000..3431f4bf --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/projectorder/vo/ProjectOrderSaveReqVO.java @@ -0,0 +1,143 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo; + +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 项目订单新增/修改 Request VO") +@Data +public class ProjectOrderSaveReqVO { + + @Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED, example = "17481") + private Long id; + + @Schema(description = "项目编号,唯一", requiredMode = Schema.RequiredMode.REQUIRED) + private String code; + + @Schema(description = "单据状态 已保存/已送审/已审核/已启动/已打回/已终止", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "单据状态 已保存/已送审/已审核/已启动/已打回/已终止不能为空") + private Integer orderStatus; + + @Schema(description = "发货状态 未发货/部分发货/全部发货", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "发货状态 未发货/部分发货/全部发货不能为空") + private Integer deliveryStatus; + + @Schema(description = "提出部门id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9959") + @NotNull(message = "提出部门id不能为空") + private Long businessDeptId; + + @Schema(description = "客户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "27214") + @NotNull(message = "客户id不能为空") + private Long customerId; + + @Schema(description = "模具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") + @NotEmpty(message = "模具名称不能为空") + private String mouldName; + + @Schema(description = "业务线", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "业务线不能为空") + private String businessLine; + + @Schema(description = "图号") + private String blueprintNo; + + @Schema(description = "是否有价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "28491") + @NotNull(message = "是否有价格不能为空") + private Integer hasPrice; + + @Schema(description = "价格 保留四位小数", example = "24218") + private BigDecimal price; + + @Schema(description = "币种") + private String currency; + + @Schema(description = "项目开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "项目开始时间不能为空") + private LocalDateTime projectStartTime; + + @Schema(description = "项目结束时间") + private LocalDateTime projectEndTime; + + @Schema(description = "是否紧急", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否紧急不能为空") + private Integer isUrgency; + + @Schema(description = "性质 新制|维修", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "性质 新制|维修不能为空") + private Integer property; + + @Schema(description = "可引用的原有技术") + private String referenceTechnology; + + @Schema(description = "是否已变更", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否已变更不能为空") + private Integer hasAlter; + + @Schema(description = "上一次变更时间") + private LocalDateTime lastAlterTime; + + @Schema(description = "检验要求") + private String qualityRequirement; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "有无合同", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "有无合同不能为空") + private Integer hasContract; + + @Schema(description = "有无技术协议", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "有无技术协议不能为空") + private Integer hasTechnologyProtocol; + + @Schema(description = "有无图纸/数模", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "有无图纸/数模不能为空") + private Integer hasBlueprint; + + @Schema(description = "图纸/数模 说明", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") + private String blueprintRemark; + + @Schema(description = "状态,1表示正常,2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态,1表示正常,2表示禁用不能为空") + private Integer status; + + @Schema(description = "业务员", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "业务员不能为空") + private Long businessMan; + + @Schema(description = "合同编号") + private String contractNo; + + @Schema(description = "操作类型") + @NotBlank(message = "操作类型不能为空") + private String active; + + @Schema(description = "操作意见") + private String activeOpinion; + + @Schema(description = "项目订单子项目列表") + private List projectOrderSubs; + + @Schema(description = "是否快照", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer isSnapshot; + + @Schema(description = "快照原始id", example = "19436") + private Long snapshotId; + + @Schema(description = "快照原始单据号") + private String snapshotCode; + + @Schema(description = "单据日期", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime orderTime; + + @Schema(description = "快照原始单据日期") + private LocalDateTime snapshotOrderTime; + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/SerialNumberController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/SerialNumberController.java new file mode 100644 index 00000000..9561474d --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/SerialNumberController.java @@ -0,0 +1,95 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; +import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; + +import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; + +import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; +import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; +import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; + +@Tag(name = "管理后台 - 序列号记录") +@RestController +@RequestMapping("/heli/serial-number") +@Validated +public class SerialNumberController { + + @Resource + private SerialNumberService serialNumberService; + + @PostMapping("/create") + @Operation(summary = "创建序列号记录") + @PreAuthorize("@ss.hasPermission('heli:serial-number:create')") + public CommonResult createSerialNumber(@Valid @RequestBody SerialNumberSaveReqVO createReqVO) { + return success(serialNumberService.createSerialNumber(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新序列号记录") + @PreAuthorize("@ss.hasPermission('heli:serial-number:update')") + public CommonResult updateSerialNumber(@Valid @RequestBody SerialNumberSaveReqVO updateReqVO) { + serialNumberService.updateSerialNumber(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除序列号记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('heli:serial-number:delete')") + public CommonResult deleteSerialNumber(@RequestParam("id") Long id) { + serialNumberService.deleteSerialNumber(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得序列号记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('heli:serial-number:query')") + public CommonResult getSerialNumber(@RequestParam("id") Long id) { + SerialNumberDO serialNumber = serialNumberService.getSerialNumber(id); + return success(BeanUtils.toBean(serialNumber, SerialNumberRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得序列号记录分页") + @PreAuthorize("@ss.hasPermission('heli:serial-number:query')") + public CommonResult> getSerialNumberPage(@Valid SerialNumberPageReqVO pageReqVO) { + PageResult pageResult = serialNumberService.getSerialNumberPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, SerialNumberRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出序列号记录 Excel") + @PreAuthorize("@ss.hasPermission('heli:serial-number:export')") + @OperateLog(type = EXPORT) + public void exportSerialNumberExcel(@Valid SerialNumberPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = serialNumberService.getSerialNumberPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "序列号记录.xls", "数据", SerialNumberRespVO.class, + BeanUtils.toBean(list, SerialNumberRespVO.class)); + } + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/vo/SerialNumberPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/vo/SerialNumberPageReqVO.java new file mode 100644 index 00000000..4e1177c4 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/vo/SerialNumberPageReqVO.java @@ -0,0 +1,34 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.chanko.yunxi.mes.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 SerialNumberPageReqVO extends PageParam { + + @Schema(description = "业务类型 用于业务关联", example = "1") + private String businessType; + + @Schema(description = "序列参考段") + private String segment; + + @Schema(description = "序列号") + private Long serialNumber; + + @Schema(description = "状态,1表示正常,2表示禁用", example = "2") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/vo/SerialNumberRespVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/vo/SerialNumberRespVO.java new file mode 100644 index 00000000..5d474028 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/vo/SerialNumberRespVO.java @@ -0,0 +1,40 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 序列号记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class SerialNumberRespVO { + + @Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED, example = "23892") + @ExcelProperty("自增字段,唯一") + private Long id; + + @Schema(description = "业务类型 用于业务关联", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("业务类型 用于业务关联") + private String businessType; + + @Schema(description = "序列参考段", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("序列参考段") + private String segment; + + @Schema(description = "序列号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("序列号") + private Long serialNumber; + + @Schema(description = "状态,1表示正常,2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty("状态,1表示正常,2表示禁用") + private Integer status; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/vo/SerialNumberSaveReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/vo/SerialNumberSaveReqVO.java new file mode 100644 index 00000000..79e3d3cb --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/serialnumber/vo/SerialNumberSaveReqVO.java @@ -0,0 +1,32 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; + +@Schema(description = "管理后台 - 序列号记录新增/修改 Request VO") +@Data +public class SerialNumberSaveReqVO { + + @Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED, example = "23892") + private Long id; + + @Schema(description = "业务类型 用于业务关联", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "业务类型 用于业务关联不能为空") + private String businessType; + + @Schema(description = "序列参考段", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "序列参考段不能为空") + private String segment; + + @Schema(description = "序列号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "序列号不能为空") + private Long serialNumber; + + @Schema(description = "状态,1表示正常,2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "状态,1表示正常,2表示禁用不能为空") + private Integer status; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/StorageController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/StorageController.java new file mode 100644 index 00000000..1eeed880 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/StorageController.java @@ -0,0 +1,119 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storage; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.time.LocalDateTime; +import java.util.*; +import java.io.IOException; + +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; +import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; + +import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; + +import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; +import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.chanko.yunxi.mes.module.heli.controller.admin.storage.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO; +import com.chanko.yunxi.mes.module.heli.service.storage.StorageService; + +@Tag(name = "管理后台 - 入/出库") +@RestController +@RequestMapping("/heli/storage") +@Validated +public class StorageController { + + @Resource + private StorageService storageService; + + @PostMapping("/create") + @Operation(summary = "创建入/出库") + @PreAuthorize("@ss.hasPermission('heli:storage:create')") + public CommonResult createStorage(@Valid @RequestBody StorageSaveReqVO createReqVO) { + return success(storageService.createStorage(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新入/出库") + @PreAuthorize("@ss.hasPermission('heli:storage:update')") + public CommonResult updateStorage(@Valid @RequestBody StorageSaveReqVO updateReqVO) { + storageService.updateStorage(updateReqVO); + return success(true); + } + @PutMapping("/update-status") + @Operation(summary = "更新入/出库") + @PreAuthorize("@ss.hasPermission('heli:storage:update')") + public CommonResult updateStorageStatus(@Valid @RequestBody StorageSaveReqVO updateReqVO) { + StorageDO targetDo = storageService.getStorage(updateReqVO.getId()); + targetDo.setStatus(updateReqVO.getStatus()); + + LocalDateTime currTime = LocalDateTime.now(); + if(updateReqVO.getStatus().equals(2) && updateReqVO.getStockType().equals(1)){ + targetDo.setKeeper(updateReqVO.getKeeper()); + targetDo.setKeeperTime(currTime); + } else if(updateReqVO.getStatus().equals(2) && updateReqVO.getStockType().equals(2)){ + targetDo.setOutbound(updateReqVO.getOutbound()); + targetDo.setOutboundTime(currTime); + }else{ + targetDo.setCancel(updateReqVO.getCancel()); + targetDo.setCancelTime(currTime); + } + updateReqVO = BeanUtils.toBean(targetDo, StorageSaveReqVO.class); + + storageService.updateStorage(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除入/出库") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('heli:storage:delete')") + public CommonResult deleteStorage(@RequestParam("id") Long id) { + storageService.deleteStorage(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得入/出库") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('heli:storage:query')") + public CommonResult getStorage(@RequestParam("id") Long id) { + StorageDO storage = storageService.getStorage(id); + return success(BeanUtils.toBean(storage, StorageRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得入/出库分页") + @PreAuthorize("@ss.hasPermission('heli:storage:query')") + public CommonResult> getStoragePage(@Valid StoragePageReqVO pageReqVO) { + PageResult pageResult = storageService.getStoragePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, StorageRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出入/出库 Excel") + @PreAuthorize("@ss.hasPermission('heli:storage:export')") + @OperateLog(type = EXPORT) + public void exportStorageExcel(@Valid StoragePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = storageService.getStoragePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "入/出库.xls", "数据", StorageRespVO.class, + BeanUtils.toBean(list, StorageRespVO.class)); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/vo/StoragePageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/vo/StoragePageReqVO.java new file mode 100644 index 00000000..28b308be --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/vo/StoragePageReqVO.java @@ -0,0 +1,86 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storage.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.chanko.yunxi.mes.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 StoragePageReqVO extends PageParam { + + @Schema(description = "入库出库大类型:1为入库,2为出库", example = "2") + private Integer stockType; + + @Schema(description = "入库类型(字典):1为采购入库,2为盘盈入库,3为其他入库", example = "1") + private Integer stockInType; + + @Schema(description = "出库类型(字典):1为领料出库,2为销售出库,3为盘亏出库,4为其他出库", example = "2") + private Integer stockOutType; + + @Schema(description = "入/出库单号") + private String stockNo; + + @Schema(description = "上游单号") + private Long headerNo; + + @Schema(description = "备注", example = "你说的对") + private String description; + + @Schema(description = "状态:1为保存;2为提交;3为作废", example = "1") + private Integer status; + + @Schema(description = "仓库Id,对应 wms_wh 表中的Id", example = "28079") + private Long whId; + + @Schema(description = "记录的创建人,对应员工表中的 Id") + private String creator; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "记录的修改人,对应员工表中的 Id") + private String updater; + + @Schema(description = "更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] updateTime; + + @Schema(description = "入库人") + private Long keeper; + + @Schema(description = "入库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] keeperTime; + + @Schema(description = "出库人") + private Long outbound; + + @Schema(description = "出库时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] outboundTime; + + @Schema(description = "作废人") + private Long cancel; + + @Schema(description = "作废时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] cancelTime; + + @Schema(description = "物料编码") + private String matNo; + + @Schema(description = "物料名称") + private String matName; + + + + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/vo/StorageRespVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/vo/StorageRespVO.java new file mode 100644 index 00000000..97202674 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/vo/StorageRespVO.java @@ -0,0 +1,91 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; +import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat; +import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 入/出库 Response VO") +@Data +@ExcelIgnoreUnannotated +public class StorageRespVO { + + @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24890") + @ExcelProperty("主键id") + private Long id; + + @Schema(description = "入库出库大类型:1为入库,2为出库", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @ExcelProperty(value = "入库出库大类型:1为入库,2为出库", converter = DictConvert.class) + @DictFormat("heli_storage_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer stockType; + + @Schema(description = "入库类型(字典):1为采购入库,2为盘盈入库,3为其他入库", example = "1") + @ExcelProperty(value = "入库类型(字典):1为采购入库,2为盘盈入库,3为其他入库", converter = DictConvert.class) + @DictFormat("heli_storage_in_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer stockInType; + + @Schema(description = "出库类型(字典):1为领料出库,2为销售出库,3为盘亏出库,4为其他出库", example = "2") + @ExcelProperty(value = "出库类型(字典):1为领料出库,2为销售出库,3为盘亏出库,4为其他出库", converter = DictConvert.class) + @DictFormat("heli_storage_out_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer stockOutType; + + @Schema(description = "入/出库单号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("入/出库单号") + private String stockNo; + + @Schema(description = "上游单号") + @ExcelProperty("上游单号") + private Long headerNo; + + @Schema(description = "备注", example = "你说的对") + @ExcelProperty("备注") + private String description; + + @Schema(description = "状态:1为保存;2为提交;3为作废", example = "1") + @ExcelProperty(value = "状态:1为保存;2为提交;3为作废", converter = DictConvert.class) + @DictFormat("heli_common_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Integer status; + + @Schema(description = "仓库Id,对应 wms_wh 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "28079") + @ExcelProperty("仓库Id,对应 wms_wh 表中的Id") + private Long whId; + + @Schema(description = "创建人") + @ExcelProperty("创建人") + private Long creator; + + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "入库人") + @ExcelProperty("入库人") + private Long keeper; + + @Schema(description = "入库时间") + @ExcelProperty("入库时间") + private LocalDateTime keeperTime; + + @Schema(description = "出库人") + @ExcelProperty("出库人") + private Long outbound; + + @Schema(description = "出库时间") + @ExcelProperty("出库时间") + private LocalDateTime outboundTime; + + @Schema(description = "作废人") + @ExcelProperty("作废人") + private Long cancel; + + @Schema(description = "作废时间") + @ExcelProperty("作废时间") + private LocalDateTime cancelTime; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/vo/StorageSaveReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/vo/StorageSaveReqVO.java new file mode 100644 index 00000000..6615ea69 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storage/vo/StorageSaveReqVO.java @@ -0,0 +1,62 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 入/出库新增/修改 Request VO") +@Data +public class StorageSaveReqVO { + + @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24890") + private Long id; + + @Schema(description = "入库出库大类型:1为入库,2为出库", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "入库出库大类型:1为入库,2为出库不能为空") + private Integer stockType; + + @Schema(description = "入库类型(字典):1为采购入库,2为盘盈入库,3为其他入库", example = "1") + private Integer stockInType; + + @Schema(description = "出库类型(字典):1为领料出库,2为销售出库,3为盘亏出库,4为其他出库", example = "2") + private Integer stockOutType; + + @Schema(description = "入/出库单号", requiredMode = Schema.RequiredMode.REQUIRED) + private String stockNo; + + @Schema(description = "上游单号") + private Long headerNo; + + @Schema(description = "备注", example = "你说的对") + private String description; + + @Schema(description = "状态:1为保存;2为提交;3为作废", example = "1") + private Integer status; + + @Schema(description = "仓库Id,对应 wms_wh 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "28079") + @NotNull(message = "仓库Id,对应 wms_wh 表中的Id不能为空") + private Long whId; + + @Schema(description = "入库人") + private Long keeper; + + @Schema(description = "入库时间") + private LocalDateTime keeperTime; + + @Schema(description = "出库人") + private Long outbound; + + @Schema(description = "出库时间") + private LocalDateTime outboundTime; + + @Schema(description = "作废人") + private Long cancel; + + @Schema(description = "作废时间") + private LocalDateTime cancelTime; + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/StorageLogController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/StorageLogController.java new file mode 100644 index 00000000..8d1b3883 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/StorageLogController.java @@ -0,0 +1,95 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storagelog; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; +import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; + +import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; + +import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; +import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO; +import com.chanko.yunxi.mes.module.heli.service.storagelog.StorageLogService; + +@Tag(name = "管理后台 - 入/出库日志") +@RestController +@RequestMapping("/heli/storage-log") +@Validated +public class StorageLogController { + + @Resource + private StorageLogService storageLogService; + + @PostMapping("/create") + @Operation(summary = "创建入/出库日志") + @PreAuthorize("@ss.hasPermission('heli:storage-log:create')") + public CommonResult createStorageLog(@Valid @RequestBody StorageLogSaveReqVO createReqVO) { + return success(storageLogService.createStorageLog(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新入/出库日志") + @PreAuthorize("@ss.hasPermission('heli:storage-log:update')") + public CommonResult updateStorageLog(@Valid @RequestBody StorageLogSaveReqVO updateReqVO) { + storageLogService.updateStorageLog(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除入/出库日志") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('heli:storage-log:delete')") + public CommonResult deleteStorageLog(@RequestParam("id") Long id) { + storageLogService.deleteStorageLog(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得入/出库日志") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('heli:storage-log:query')") + public CommonResult getStorageLog(@RequestParam("id") Long id) { + StorageLogDO storageLog = storageLogService.getStorageLog(id); + return success(BeanUtils.toBean(storageLog, StorageLogRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得入/出库日志分页") + @PreAuthorize("@ss.hasPermission('heli:storage-log:query')") + public CommonResult> getStorageLogPage(@Valid StorageLogPageReqVO pageReqVO) { + PageResult pageResult = storageLogService.getStorageLogPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, StorageLogRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出入/出库日志 Excel") + @PreAuthorize("@ss.hasPermission('heli:storage-log:export')") + @OperateLog(type = EXPORT) + public void exportStorageLogExcel(@Valid StorageLogPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = storageLogService.getStorageLogPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "入/出库日志.xls", "数据", StorageLogRespVO.class, + BeanUtils.toBean(list, StorageLogRespVO.class)); + } + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogPageReqVO.java new file mode 100644 index 00000000..da341cc6 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogPageReqVO.java @@ -0,0 +1,60 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.chanko.yunxi.mes.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 StorageLogPageReqVO extends PageParam { + + @Schema(description = "入/出库Id", example = "3528") + private Long stockId; + + @Schema(description = "物料 Id,对应 base_material表中的 Id 列", example = "21832") + private Long matId; + + @Schema(description = "仓库 Id,对应 wms_wh 表中的Id", example = "3") + private Long whId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", example = "15108") + private Long rgId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", example = "3954") + private Long pnId; + + @Schema(description = "库存良品数量") + private BigDecimal storageOkQty; + + @Schema(description = "批次号") + private String lotNo; + + @Schema(description = "状态") + private String status; + + @Schema(description = "备注", example = "你说的对") + private String description; + + @Schema(description = "记录的创建人,对应员工表中的 Id") + private String creator; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "记录的修改人,对应员工表中的 Id") + private String updater; + + @Schema(description = "更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] updateTime; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogRespVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogRespVO.java new file mode 100644 index 00000000..3c6a2d4a --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogRespVO.java @@ -0,0 +1,57 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 入/出库日志 Response VO") +@Data +@ExcelIgnoreUnannotated +public class StorageLogRespVO { + + @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8048") + @ExcelProperty("主键id") + private Long id; + + @Schema(description = "入/出库Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3528") + @ExcelProperty("入/出库Id") + private Long stockId; + + @Schema(description = "物料 Id,对应 base_material表中的 Id 列", requiredMode = Schema.RequiredMode.REQUIRED, example = "21832") + @ExcelProperty("物料 Id,对应 base_material表中的 Id 列") + private Long matId; + + @Schema(description = "仓库 Id,对应 wms_wh 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") + @ExcelProperty("仓库 Id,对应 wms_wh 表中的Id") + private Long whId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15108") + @ExcelProperty("库区 Id,对应 wms_rg 表中的Id") + private Long rgId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3954") + @ExcelProperty("库区 Id,对应 wms_rg 表中的Id") + private Long pnId; + + @Schema(description = "库存良品数量") + @ExcelProperty("库存良品数量") + private BigDecimal storageOkQty; + + @Schema(description = "批次号") + @ExcelProperty("批次号") + private String lotNo; + + @Schema(description = "备注", example = "你说的对") + @ExcelProperty("备注") + private String description; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogSaveReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogSaveReqVO.java new file mode 100644 index 00000000..3dd4bfdc --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagelog/vo/StorageLogSaveReqVO.java @@ -0,0 +1,49 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 入/出库日志新增/修改 Request VO") +@Data +public class StorageLogSaveReqVO { + + @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "8048") + private Long id; + + @Schema(description = "入/出库Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3528") + @NotNull(message = "入/出库Id不能为空") + private Long stockId; + + @Schema(description = "物料 Id,对应 base_material表中的 Id 列", requiredMode = Schema.RequiredMode.REQUIRED, example = "21832") + @NotNull(message = "物料 Id,对应 base_material表中的 Id 列不能为空") + private Long matId; + + @Schema(description = "仓库 Id,对应 wms_wh 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3") + @NotNull(message = "仓库 Id,对应 wms_wh 表中的Id不能为空") + private Long whId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15108") + @NotNull(message = "库区 Id,对应 wms_rg 表中的Id不能为空") + private Long rgId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "3954") + @NotNull(message = "库区 Id,对应 wms_rg 表中的Id不能为空") + private Long pnId; + + @Schema(description = "库存良品数量") + private BigDecimal storageOkQty; + + @Schema(description = "批次号") + private String lotNo; + + @Schema(description = "备注", example = "你说的对") + private String description; + + @Schema(description = "状态", example = "你说的对") + private Integer status; + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/StorageMatController.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/StorageMatController.java new file mode 100644 index 00000000..00f3b61d --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/StorageMatController.java @@ -0,0 +1,118 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storagemat; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; +import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; + +import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; + +import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; +import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*; + +import com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO; +import com.chanko.yunxi.mes.module.heli.service.storagemat.StorageMatService; + +@Tag(name = "管理后台 - 入/出库物料") +@RestController +@RequestMapping("/heli/storage-mat") +@Validated +public class StorageMatController { + + @Resource + private StorageMatService storageMatService; + + @PostMapping("/create") + @Operation(summary = "创建入/出库物料") + @PreAuthorize("@ss.hasPermission('heli:storage-mat:create')") + public CommonResult createStorageMat(@Valid @RequestBody StorageMatSaveReqVO createReqVO) { + return success(storageMatService.createStorageMat(createReqVO)); + } + + @PostMapping("/create-batch") + @Operation(summary = "批量创建入/出库物料") + @PreAuthorize("@ss.hasPermission('heli:storage-mat:create')") + public CommonResult createStorageMat(@Valid @RequestBody List createReqVO,@RequestParam("stockid") Long stockid) { + + storageMatService.deleteStorageMatList(stockid); + for (StorageMatSaveReqVO item : createReqVO) { + item.setId(null); + storageMatService.createStorageMat(item); + } + return success(1L); + } + + @PutMapping("/update") + @Operation(summary = "更新入/出库物料") + @PreAuthorize("@ss.hasPermission('heli:storage-mat:update')") + public CommonResult updateStorageMat(@Valid @RequestBody StorageMatSaveReqVO updateReqVO) { + storageMatService.updateStorageMat(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除入/出库物料") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('heli:storage-mat:delete')") + public CommonResult deleteStorageMat(@RequestParam("id") Long id) { + storageMatService.deleteStorageMat(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得入/出库物料") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('heli:storage-mat:query')") + public CommonResult getStorageMat(@RequestParam("id") Long id) { + StorageMatDO storageMat = storageMatService.getStorageMat(id); + return success(BeanUtils.toBean(storageMat, StorageMatRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得入/出库物料分页") + @PreAuthorize("@ss.hasPermission('heli:storage-mat:query')") + public CommonResult> getStorageMatPage(@Valid StorageMatPageReqVO pageReqVO) { + PageResult pageResult = storageMatService.getStorageMatPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, StorageMatRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出入/出库物料 Excel") + @PreAuthorize("@ss.hasPermission('heli:storage-mat:export')") + @OperateLog(type = EXPORT) + public void exportStorageMatExcel(@Valid StorageMatPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = storageMatService.getStorageMatPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "入/出库物料.xls", "数据", StorageMatRespVO.class, + BeanUtils.toBean(list, StorageMatRespVO.class)); + } + + + @GetMapping("/get-materials") + @Operation(summary = "获得入/出库物料") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('heli:storage-mat:query')") + public CommonResult> getStorageMatList() { + List list = storageMatService.getStorageMatList(); + return success(BeanUtils.toBean(list, StorageMatValidRespVO.class)); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatPageReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatPageReqVO.java new file mode 100644 index 00000000..90fc9b58 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatPageReqVO.java @@ -0,0 +1,60 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.chanko.yunxi.mes.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 StorageMatPageReqVO extends PageParam { + + @Schema(description = "入/出库Id", example = "19477") + private Long stockId; + + @Schema(description = "物料 Id,对应 base_material表中的 Id 列", example = "3400") + private Long matId; + + @Schema(description = "仓库 Id,对应 wms_wh 表中的Id", example = "31860") + private Long whId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", example = "13060") + private Long rgId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", example = "25544") + private Long pnId; + + @Schema(description = "库存良品数量") + private BigDecimal storageOkQty; + + @Schema(description = "批次号") + private String lotNo; + + @Schema(description = "子项目编号") + private String projectNo; + + @Schema(description = "备注", example = "你猜") + private String description; + + @Schema(description = "记录的创建人,对应员工表中的 Id") + private String creator; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + + @Schema(description = "记录的修改人,对应员工表中的 Id") + private String updater; + + @Schema(description = "更新时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] updateTime; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatRespVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatRespVO.java new file mode 100644 index 00000000..f3099b86 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatRespVO.java @@ -0,0 +1,61 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 入/出库物料 Response VO") +@Data +@ExcelIgnoreUnannotated +public class StorageMatRespVO { + + @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29383") + @ExcelProperty("主键id") + private Long id; + + @Schema(description = "入/出库Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19477") + @ExcelProperty("入/出库Id") + private Long stockId; + + @Schema(description = "物料 Id,对应 base_material表中的 Id 列", requiredMode = Schema.RequiredMode.REQUIRED, example = "3400") + @ExcelProperty("物料 Id,对应 base_material表中的 Id 列") + private Long matId; + + @Schema(description = "仓库 Id,对应 wms_wh 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31860") + @ExcelProperty("仓库 Id,对应 wms_wh 表中的Id") + private Long whId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13060") + @ExcelProperty("库区 Id,对应 wms_rg 表中的Id") + private Long rgId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25544") + @ExcelProperty("库区 Id,对应 wms_rg 表中的Id") + private Long pnId; + + @Schema(description = "库存良品数量") + @ExcelProperty("库存良品数量") + private BigDecimal storageOkQty; + + @Schema(description = "批次号") + @ExcelProperty("批次号") + private String lotNo; + + @Schema(description = "子项目编号") + @ExcelProperty("子项目编号") + private String projectNo; + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String description; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatSaveReqVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatSaveReqVO.java new file mode 100644 index 00000000..02dbe5be --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatSaveReqVO.java @@ -0,0 +1,49 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 入/出库物料新增/修改 Request VO") +@Data +public class StorageMatSaveReqVO { + + @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29383") + private Long id; + + @Schema(description = "入/出库Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19477") + @NotNull(message = "入/出库Id不能为空") + private Long stockId; + + @Schema(description = "物料 Id,对应 base_material表中的 Id 列", requiredMode = Schema.RequiredMode.REQUIRED, example = "3400") + @NotNull(message = "物料 Id,对应 base_material表中的 Id 列不能为空") + private Long matId; + + @Schema(description = "仓库 Id,对应 wms_wh 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "31860") + @NotNull(message = "仓库 Id,对应 wms_wh 表中的Id不能为空") + private Long whId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13060") + @NotNull(message = "库区 Id,对应 wms_rg 表中的Id不能为空") + private Long rgId; + + @Schema(description = "库区 Id,对应 wms_rg 表中的Id", requiredMode = Schema.RequiredMode.REQUIRED, example = "25544") + @NotNull(message = "库区 Id,对应 wms_rg 表中的Id不能为空") + private Long pnId; + + @Schema(description = "库存良品数量") + private BigDecimal storageOkQty; + + @Schema(description = "批次号") + private String lotNo; + + @Schema(description = "子项目编号") + private String projectNo; + + @Schema(description = "备注", example = "你猜") + private String description; + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatValidRespVO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatValidRespVO.java new file mode 100644 index 00000000..edcee734 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/controller/admin/storagemat/vo/StorageMatValidRespVO.java @@ -0,0 +1,39 @@ +package com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +@Data +public class StorageMatValidRespVO { + + private Long matId; + + private String matName; + + private String matCode; + + private String materialType; + + private Long whId; + + private Long rgId; + + private Long pnId; + + private BigDecimal matRest; + + private String lotNo; + + private String matSpec; + + private String matUnit; + + private String storageOkQty; + + private String description; + + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderDO.java new file mode 100644 index 00000000..d8e3599e --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderDO.java @@ -0,0 +1,274 @@ +package com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; +import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum; +import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderStatusEnum; +import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Set; + +/** + * 项目订单 DO + * + * @author 管理员 + */ +@TableName("project_order") +@KeySequence("project_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ProjectOrderDO extends BaseDO { + + /** + * 自增字段,唯一 + */ + @TableId + private Long id; + /** + * 项目编号,唯一 + */ + private String code; + /** + * 单据状态 已保存/已送审/已审核/已启动/已打回/已终止 + * + * 枚举 {@link TODO heli_project_order_status 对应的类} + */ + private Integer orderStatus; + /** + * 发货状态 未发货/部分发货/全部发货 + * + * 枚举 {@link TODO heli_delivery_status 对应的类} + */ + private Integer deliveryStatus; + /** + * 提出部门id + */ + private Long businessDeptId; + /** + * 客户id + */ + private Long customerId; + /** + * 模具名称 + */ + private String mouldName; + /** + * 业务线 + * + * 枚举 {@link TODO heli_business_line 对应的类} + */ + private String businessLine; + /** + * 图号 + */ + private String blueprintNo; + /** + * 是否有价格 + * + * 枚举 {@link TODO heli_common_is_or_not 对应的类} + */ + private Integer hasPrice; + /** + * 价格 保留四位小数 + */ + private BigDecimal price; + /** + * 币种 + * + * 枚举 {@link TODO heli_currency 对应的类} + */ + private String currency; + /** + * 项目开始时间 + */ + private LocalDateTime projectStartTime; + /** + * 项目结束时间 + */ + private LocalDateTime projectEndTime; + /** + * 是否紧急 + * + * 枚举 {@link TODO heli_common_is_or_not 对应的类} + */ + private Integer isUrgency; + /** + * 性质 新制|维修 + * + * 枚举 {@link TODO heli_project_property 对应的类} + */ + private Integer property; + /** + * 可引用的原有技术 + */ + private String referenceTechnology; + /** + * 是否已变更 + * + * 枚举 {@link TODO heli_common_is_or_not 对应的类} + */ + private Integer hasAlter; + /** + * 上一次变更时间 + */ + private LocalDateTime lastAlterTime; + /** + * 检验要求 + */ + private String qualityRequirement; + /** + * 备注 + */ + private String remark; + /** + * 有无合同 + * + * 枚举 {@link TODO heli_common_is_or_not 对应的类} + */ + private Integer hasContract; + /** + * 有无技术协议 + * + * 枚举 {@link TODO heli_common_is_or_not 对应的类} + */ + private Integer hasTechnologyProtocol; + /** + * 有无图纸/数模 + * + * 枚举 {@link TODO heli_common_is_or_not 对应的类} + */ + private Integer hasBlueprint; + /** + * 图纸/数模 说明 + */ + private String blueprintRemark; + /** + * 状态,1表示正常,2表示禁用 + */ + private Integer status; + /** + * 业务员 + */ + private Long businessMan; + /** + * 合同编号 + */ + private String contractNo; + /** + * 是否快照 + * + * 枚举 {@link TODO heli_common_is_or_not 对应的类} + */ + private Integer isSnapshot; + /** + * 快照原始id + */ + private Long snapshotId; + /** + * 快照原始单据号 + */ + private String snapshotCode; + /** + * 单据日期 + */ + private LocalDateTime orderTime; + /** + * 快照原始单据日期 + */ + private LocalDateTime snapshotOrderTime; + + @TableField(exist = false) + private String businessDeptName; + + @TableField(exist = false) + private String customerName; + + @TableField(exist = false) + private String businessManName; + + @TableField(exist = false) + private String creatorName; + + @TableField(exist = false) + private String auditName; + + @TableField(exist = false) + private Long auditTime; + + @TableField(exist = false) + private String approveName; + + @TableField(exist = false) + private Long approveTime; + + /** + * 变更的字段列表 + * */ + @TableField(exist = false) + private Set alterFieldNames; + + public boolean canSave(){ + return this.orderStatus.intValue() <= ProjectOrderStatusEnum.SAVE.getCode(); + } + + public boolean canSubmitAudit(){ + return this.orderStatus.intValue() < ProjectOrderStatusEnum.SUBMIT_AUDIT.getCode(); + } + + public boolean canAudit(){ + return this.orderStatus.intValue() == ProjectOrderStatusEnum.SUBMIT_AUDIT.getCode(); + } + + public boolean canApprove(){ + return this.orderStatus.intValue() == ProjectOrderStatusEnum.AUDIT.getCode(); + } + + public boolean canTerminate(){ + return this.orderStatus.intValue() == ProjectOrderStatusEnum.APPROVE.getCode(); + } + + public boolean canRepulse(){ + return this.orderStatus.intValue() == ProjectOrderStatusEnum.SUBMIT_AUDIT.getCode() || + this.orderStatus.intValue() == ProjectOrderStatusEnum.AUDIT.getCode(); + } + + public boolean canDelete(){ + return this.orderStatus.intValue() == ProjectOrderStatusEnum.SAVE.getCode() && this.hasAlter.intValue() == YesOrNoEnum.NO.getCode(); + } + + public boolean canOperate(OperateTypeEnum operateTypeEnum){ + switch (operateTypeEnum){ + case SAVE: + return canSave(); + case SUBMIT_AUDIT: + return canSubmitAudit(); + case AUDIT: + return canAudit(); + case APPROVE: + return canApprove(); + case REPULSE: + return canRepulse(); + case TERMINATE: + return canTerminate(); + case ALTER: + return canAlter(); + default: + return false; + } + } + + private boolean canAlter() { + return this.orderStatus.intValue() == ProjectOrderStatusEnum.APPROVE.getCode(); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderSubDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderSubDO.java new file mode 100644 index 00000000..2eced4e7 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/projectorder/ProjectOrderSubDO.java @@ -0,0 +1,80 @@ +package com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +import java.util.Set; + +/** + * 项目订单子项目 DO + * + * @author 管理员 + */ +@TableName("project_order_sub") +@KeySequence("project_order_sub_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ProjectOrderSubDO extends BaseDO { + + /** + * 自增字段,唯一 + */ + @TableId + private Long id; + /** + * 项目订单id + */ + private Long projectOrderId; + /** + * 子项目名称,唯一 + */ + private String name; + /** + * 设备型号 + */ + private String deviceModel; + /** + * 数量 + */ + private Integer amount; + /** + * 材质 + */ + private Long compositionId; + /** + * 备注 + */ + private String remark; + /** + * 状态,1表示正常,2表示禁用 + */ + private Boolean status; + /** + * 单位 + */ + private String unit; + + /** + * 删除 物理删除 + */ + private Boolean deleted; + /** + * 变更的字段列表 + * */ + @TableField(exist = false) + private Set alterFieldNames; + + /** + * 材质 + */ + @TableField(exist = false) + private String compositionName; +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/serialnumber/SerialNumberDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/serialnumber/SerialNumberDO.java new file mode 100644 index 00000000..e6053195 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/serialnumber/SerialNumberDO.java @@ -0,0 +1,46 @@ +package com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; +import lombok.*; + +/** + * 序列号记录 DO + * + * @author 管理员 + */ +@TableName("base_serial_number") +@KeySequence("base_serial_number_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SerialNumberDO extends BaseDO { + + /** + * 自增字段,唯一 + */ + @TableId + private Long id; + /** + * 业务类型 用于业务关联 + */ + private String businessType; + /** + * 序列参考段 + */ + private String segment; + /** + * 序列号 + */ + private Long serialNumber; + /** + * 状态,1表示正常,2表示禁用 + */ + private Integer status; + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storage/StorageDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storage/StorageDO.java new file mode 100644 index 00000000..eb8540d7 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storage/StorageDO.java @@ -0,0 +1,102 @@ +package com.chanko.yunxi.mes.module.heli.dal.dataobject.storage; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; + +/** + * 入/出库 DO + * + * @author 管理员 + */ +@TableName("wms_storage") +@KeySequence("wms_storage_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StorageDO extends BaseDO { + + /** + * 主键id + */ + @TableId + private Long id; + /** + * 入库出库大类型:1为入库,2为出库 + * + * 枚举 {@link TODO heli_storage_type 对应的类} + */ + private Integer stockType; + /** + * 入库类型(字典):1为采购入库,2为盘盈入库,3为其他入库 + * + * 枚举 {@link TODO heli_storage_in_type 对应的类} + */ + private Integer stockInType; + /** + * 出库类型(字典):1为领料出库,2为销售出库,3为盘亏出库,4为其他出库 + * + * 枚举 {@link TODO heli_storage_out_type 对应的类} + */ + private Integer stockOutType; + /** + * 入/出库单号 + */ + private String stockNo; + /** + * 上游单号 + */ + private Long headerNo; + /** + * 备注 + */ + private String description; + /** + * 状态:1为保存;2为提交;3为作废 + * + * 枚举 {@link TODO heli_common_status 对应的类} + */ + private Integer status; + /** + * 仓库Id,对应 wms_wh 表中的Id + */ + private Long whId; + /** + * 入库人 + */ + private Long keeper; + /** + * 入库时间 + */ + private LocalDateTime keeperTime; + /** + * 出库人 + */ + private Long outbound; + /** + * 出库时间 + */ + private LocalDateTime outboundTime; + /** + * 作废人 + */ + private Long cancel; + /** + * 作废时间 + */ + private LocalDateTime cancelTime; + /** + * 创建时间 + */ + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagelog/StorageLogDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagelog/StorageLogDO.java new file mode 100644 index 00000000..a3149927 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagelog/StorageLogDO.java @@ -0,0 +1,69 @@ +package com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; + +/** + * 入/出库日志 DO + * + * @author 管理员 + */ +@TableName("wms_storage_log") +@KeySequence("wms_storage_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StorageLogDO extends BaseDO { + + /** + * 主键id + */ + @TableId + private Long id; + /** + * 入/出库Id + */ + private Long stockId; + /** + * 物料 Id,对应 base_material表中的 Id 列 + */ + private Long matId; + /** + * 仓库 Id,对应 wms_wh 表中的Id + */ + private Long whId; + /** + * 库区 Id,对应 wms_rg 表中的Id + */ + private Long rgId; + /** + * 库区 Id,对应 wms_rg 表中的Id + */ + private Long pnId; + /** + * 库存良品数量 + */ + private BigDecimal storageOkQty; + /** + * 批次号 + */ + private String lotNo; + /** + * 备注 + */ + private String description; + + /** + * 状态 + */ + private Integer status; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagemat/StorageMatDO.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagemat/StorageMatDO.java new file mode 100644 index 00000000..aff87301 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/dataobject/storagemat/StorageMatDO.java @@ -0,0 +1,68 @@ +package com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat; + +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; + +/** + * 入/出库物料 DO + * + * @author 管理员 + */ +@TableName("wms_storage_mat") +@KeySequence("wms_storage_mat_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StorageMatDO extends BaseDO { + + /** + * 主键id + */ + @TableId + private Long id; + /** + * 入/出库Id + */ + private Long stockId; + /** + * 物料 Id,对应 base_material表中的 Id 列 + */ + private Long matId; + /** + * 仓库 Id,对应 wms_wh 表中的Id + */ + private Long whId; + /** + * 库区 Id,对应 wms_rg 表中的Id + */ + private Long rgId; + /** + * 库区 Id,对应 wms_rg 表中的Id + */ + private Long pnId; + /** + * 库存良品数量 + */ + private BigDecimal storageOkQty; + /** + * 批次号 + */ + private String lotNo; + /** + * 子项目编号 + */ + private String projectNo; + /** + * 备注 + */ + private String description; + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/projectorder/ProjectOrderMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/projectorder/ProjectOrderMapper.java new file mode 100644 index 00000000..c608230b --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/projectorder/ProjectOrderMapper.java @@ -0,0 +1,59 @@ +package com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder; + +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; +import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.ProjectOrderPageReqVO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; +import com.chanko.yunxi.mes.module.system.dal.dataobject.dept.DeptDO; +import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.util.StringUtils; + +/** + * 项目订单 Mapper + * + * @author 管理员 + */ +@Mapper +public interface ProjectOrderMapper extends BaseMapperX { + + default PageResult selectPage(ProjectOrderPageReqVO reqVO) { + MPJLambdaWrapper query = new MPJLambdaWrapper<>(); + query.selectAll(ProjectOrderDO.class) + .select("u.nickname as businessManName", "d.name as businessDeptName", "e.name as customerName") + .leftJoin(AdminUserDO.class, "u", AdminUserDO::getId, ProjectOrderDO::getBusinessMan) + .leftJoin(DeptDO.class, "d", DeptDO::getId, ProjectOrderDO::getBusinessDeptId) + .leftJoin(CustomerDO.class, "e", CustomerDO::getId, ProjectOrderDO::getCustomerId) + .disableSubLogicDel() + .orderByDesc(ProjectOrderDO::getId); + query.like(!StringUtils.isEmpty(reqVO.getCode()), ProjectOrderDO::getCode, reqVO.getCode()) + .like(!StringUtils.isEmpty(reqVO.getCustomerName()), "e.name", reqVO.getCustomerName()) + .like(!StringUtils.isEmpty(reqVO.getBusinessManName()), "u.nickname", reqVO.getBusinessManName()) + .like(!StringUtils.isEmpty(reqVO.getMouldName()), ProjectOrderDO::getMouldName, reqVO.getMouldName()) + .eq(reqVO.getHasPrice() != null, ProjectOrderDO::getHasPrice, reqVO.getHasPrice()) + .eq(reqVO.getOrderStatus() != null, ProjectOrderDO::getOrderStatus, reqVO.getOrderStatus()) + .eq(reqVO.getDeliveryStatus() != null, ProjectOrderDO::getDeliveryStatus, reqVO.getDeliveryStatus()) + .in(reqVO.getOrderStatusList() != null && !reqVO.getOrderStatusList().isEmpty(), ProjectOrderDO::getOrderStatus, reqVO.getOrderStatusList()) + .eq(reqVO.getIsSnapshot() != null, ProjectOrderDO::getIsSnapshot, reqVO.getIsSnapshot()) + .like(!StringUtils.isEmpty(reqVO.getSnapshotCode()), ProjectOrderDO::getSnapshotCode, reqVO.getSnapshotCode()); + ; + return selectPage(reqVO, query); + } + + default ProjectOrderDO selectById(Long id) { + MPJLambdaWrapper query = new MPJLambdaWrapper<>(); + query.selectAll(ProjectOrderDO.class) + .select("u.nickname as businessManName", "d.name as businessDeptName", "u1.nickname as creatorName") + .leftJoin(AdminUserDO.class, "u", AdminUserDO::getId, ProjectOrderDO::getBusinessMan) + .leftJoin(AdminUserDO.class, "u1", AdminUserDO::getId, ProjectOrderDO::getCreator) + .leftJoin(DeptDO.class, "d", DeptDO::getId, ProjectOrderDO::getBusinessDeptId) + .eq(ProjectOrderDO::getId, id) + .last("LIMIT 1") + .disableSubLogicDel(); + return selectOne(query); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/projectorder/ProjectOrderSubMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/projectorder/ProjectOrderSubMapper.java new file mode 100644 index 00000000..2e23093f --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/projectorder/ProjectOrderSubMapper.java @@ -0,0 +1,36 @@ +package com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder; + +import java.util.*; + +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 项目订单子项目 Mapper + * + * @author 管理员 + */ +@Mapper +public interface ProjectOrderSubMapper extends BaseMapperX { + + default List selectListByProjectOrderId(Long projectOrderId) { + MPJLambdaWrapper query = new MPJLambdaWrapper<>(); + query.selectAll(ProjectOrderSubDO.class) + .select("b.name as compositionName") + .leftJoin(CompositionDO.class, "b", CompositionDO::getId, ProjectOrderSubDO::getCompositionId) + .disableSubLogicDel() + .eq(ProjectOrderSubDO::getProjectOrderId, projectOrderId); + return selectList(query); + } + + default int deleteByProjectOrderId(Long projectOrderId) { + return delete(ProjectOrderSubDO::getProjectOrderId, projectOrderId); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/serialnumber/SerialNumberMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/serialnumber/SerialNumberMapper.java new file mode 100644 index 00000000..51559f5f --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/serialnumber/SerialNumberMapper.java @@ -0,0 +1,30 @@ +package com.chanko.yunxi.mes.module.heli.dal.mysql.serialnumber; + +import java.util.*; + +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; +import org.apache.ibatis.annotations.Mapper; +import com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber.vo.*; + +/** + * 序列号记录 Mapper + * + * @author 管理员 + */ +@Mapper +public interface SerialNumberMapper extends BaseMapperX { + + default PageResult selectPage(SerialNumberPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(SerialNumberDO::getBusinessType, reqVO.getBusinessType()) + .eqIfPresent(SerialNumberDO::getSegment, reqVO.getSegment()) + .eqIfPresent(SerialNumberDO::getSerialNumber, reqVO.getSerialNumber()) + .eqIfPresent(SerialNumberDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(SerialNumberDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(SerialNumberDO::getId)); + } + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storage/StorageMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storage/StorageMapper.java new file mode 100644 index 00000000..f6735725 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storage/StorageMapper.java @@ -0,0 +1,67 @@ +package com.chanko.yunxi.mes.module.heli.dal.mysql.storage; + +import java.util.*; + +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO; +import com.chanko.yunxi.mes.module.system.dal.dataobject.dept.DeptDO; +import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import org.apache.ibatis.annotations.Mapper; +import com.chanko.yunxi.mes.module.heli.controller.admin.storage.vo.*; +import org.springframework.util.StringUtils; + +/** + * 入/出库 Mapper + * + * @author 管理员 + */ +@Mapper +public interface StorageMapper extends BaseMapperX { + + default PageResult selectPage(StoragePageReqVO reqVO) { + MPJLambdaWrapper query = new MPJLambdaWrapper<>(); + query.selectAll(StorageDO.class) + .leftJoin(StorageMatDO.class, "sm", StorageMatDO::getStockId, StorageDO::getId) + .leftJoin(MaterialDO.class, "mat", MaterialDO::getId, StorageMatDO::getMatId) + .orderByDesc(StorageDO::getId); + + query.like(!StringUtils.isEmpty(reqVO.getMatNo()), MaterialDO::getCode, reqVO.getMatNo()) + .like(!StringUtils.isEmpty(reqVO.getMatName()), MaterialDO::getName, reqVO.getMatName()) + .like(!StringUtils.isEmpty(reqVO.getStockNo()),StorageDO::getStockNo, reqVO.getStockNo()) + .like(!StringUtils.isEmpty(reqVO.getHeaderNo()),StorageDO::getHeaderNo, reqVO.getHeaderNo()) + .eq(reqVO.getStockType() != null,StorageDO::getStockType, reqVO.getStockType()) + .eq(reqVO.getStockInType() != null,StorageDO::getStockInType, reqVO.getStockInType()) + .eq(reqVO.getWhId() != null,StorageDO::getWhId, reqVO.getWhId()) + .eq(reqVO.getStatus() != null,StorageDO::getStatus, reqVO.getStatus()).distinct(); + + return selectPage(reqVO,query); +// return selectPage(reqVO, new LambdaQueryWrapperX() +// .eqIfPresent(StorageDO::getStockType, reqVO.getStockType()) +// .eqIfPresent(StorageDO::getStockInType, reqVO.getStockInType()) +// .eqIfPresent(StorageDO::getStockOutType, reqVO.getStockOutType()) +// .eqIfPresent(StorageDO::getStockNo, reqVO.getStockNo()) +// .eqIfPresent(StorageDO::getHeaderNo, reqVO.getHeaderNo()) +// .eqIfPresent(StorageDO::getDescription, reqVO.getDescription()) +// .eqIfPresent(StorageDO::getStatus, reqVO.getStatus()) +// .eqIfPresent(StorageDO::getWhId, reqVO.getWhId()) +// .eqIfPresent(StorageDO::getCreator, reqVO.getCreator()) +// .betweenIfPresent(StorageDO::getCreateTime, reqVO.getCreateTime()) +// .eqIfPresent(StorageDO::getUpdater, reqVO.getUpdater()) +// .betweenIfPresent(StorageDO::getUpdateTime, reqVO.getUpdateTime()) +// .eqIfPresent(StorageDO::getKeeper, reqVO.getKeeper()) +// .betweenIfPresent(StorageDO::getKeeperTime, reqVO.getKeeperTime()) +// .eqIfPresent(StorageDO::getOutbound, reqVO.getOutbound()) +// .betweenIfPresent(StorageDO::getOutboundTime, reqVO.getOutboundTime()) +// .eqIfPresent(StorageDO::getCancel, reqVO.getCancel()) +// .betweenIfPresent(StorageDO::getCancelTime, reqVO.getCancelTime()) +// .orderByDesc(StorageDO::getId)); + } + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagelog/StorageLogMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagelog/StorageLogMapper.java new file mode 100644 index 00000000..22ccdcc5 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagelog/StorageLogMapper.java @@ -0,0 +1,37 @@ +package com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog; + +import java.util.*; + +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO; +import org.apache.ibatis.annotations.Mapper; +import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.*; + +/** + * 入/出库日志 Mapper + * + * @author 管理员 + */ +@Mapper +public interface StorageLogMapper extends BaseMapperX { + + default PageResult selectPage(StorageLogPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(StorageLogDO::getStockId, reqVO.getStockId()) + .eqIfPresent(StorageLogDO::getMatId, reqVO.getMatId()) + .eqIfPresent(StorageLogDO::getWhId, reqVO.getWhId()) + .eqIfPresent(StorageLogDO::getRgId, reqVO.getRgId()) + .eqIfPresent(StorageLogDO::getPnId, reqVO.getPnId()) + .eqIfPresent(StorageLogDO::getStorageOkQty, reqVO.getStorageOkQty()) + .eqIfPresent(StorageLogDO::getLotNo, reqVO.getLotNo()) + .eqIfPresent(StorageLogDO::getDescription, reqVO.getDescription()) + .eqIfPresent(StorageLogDO::getCreator, reqVO.getCreator()) + .betweenIfPresent(StorageLogDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(StorageLogDO::getUpdater, reqVO.getUpdater()) + .betweenIfPresent(StorageLogDO::getUpdateTime, reqVO.getUpdateTime()) + .orderByDesc(StorageLogDO::getId)); + } + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagemat/StorageMatMapper.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagemat/StorageMatMapper.java new file mode 100644 index 00000000..22be3ced --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/dal/mysql/storagemat/StorageMatMapper.java @@ -0,0 +1,37 @@ +package com.chanko.yunxi.mes.module.heli.dal.mysql.storagemat; + +import java.util.*; + +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO; +import org.apache.ibatis.annotations.Mapper; +import com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo.*; + +/** + * 入/出库物料 Mapper + * + * @author 管理员 + */ +@Mapper +public interface StorageMatMapper extends BaseMapperX { + + default PageResult selectPage(StorageMatPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(StorageMatDO::getStockId, reqVO.getStockId()) + .eqIfPresent(StorageMatDO::getMatId, reqVO.getMatId()) + .eqIfPresent(StorageMatDO::getWhId, reqVO.getWhId()) + .eqIfPresent(StorageMatDO::getRgId, reqVO.getRgId()) + .eqIfPresent(StorageMatDO::getPnId, reqVO.getPnId()) + .eqIfPresent(StorageMatDO::getStorageOkQty, reqVO.getStorageOkQty()) + .eqIfPresent(StorageMatDO::getLotNo, reqVO.getLotNo()) + .eqIfPresent(StorageMatDO::getDescription, reqVO.getDescription()) + .eqIfPresent(StorageMatDO::getCreator, reqVO.getCreator()) + .betweenIfPresent(StorageMatDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(StorageMatDO::getUpdater, reqVO.getUpdater()) + .betweenIfPresent(StorageMatDO::getUpdateTime, reqVO.getUpdateTime()) + .orderByDesc(StorageMatDO::getId)); + } + List selectStorageMatValid(); +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderService.java new file mode 100644 index 00000000..5d53d67c --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderService.java @@ -0,0 +1,77 @@ +package com.chanko.yunxi.mes.module.heli.service.projectorder; + +import java.util.*; +import javax.validation.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; + +/** + * 项目订单 Service 接口 + * + * @author 管理员 + */ +public interface ProjectOrderService { + + /** + * 创建项目订单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createProjectOrder(@Valid ProjectOrderSaveReqVO createReqVO); + + /** + * 更新项目订单 + * + * @param updateReqVO 更新信息 + */ + void updateProjectOrder(@Valid ProjectOrderSaveReqVO updateReqVO); + + /** + * 删除项目订单 + * + * @param id 编号 + */ + void deleteProjectOrder(Long id); + + /** + * 获得项目订单 + * + * @param id 编号 + * @return 项目订单 + */ + ProjectOrderDO getProjectOrder(Long id); + + /** + * 获得项目订单分页 + * + * @param pageReqVO 分页查询 + * @return 项目订单分页 + */ + PageResult getProjectOrderPage(ProjectOrderPageReqVO pageReqVO); + + // ==================== 子表(项目订单子项目) ==================== + + /** + * 获得项目订单子项目列表 + * + * @param projectOrderId 项目订单id + * @return 项目订单子项目列表 + */ + List getProjectOrderSubListByProjectOrderId(Long projectOrderId); + + /** + * 操作 项目订单 + * @param operateReqVO + */ + void operateProjectOrder(ProjectOrderSaveReqVO operateReqVO); + + /** + * 记录快照 + * @param operateReqVO + */ + void createProjectOrderSnapshot(ProjectOrderSaveReqVO operateReqVO); +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderServiceImpl.java new file mode 100644 index 00000000..be3fe589 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/projectorder/ProjectOrderServiceImpl.java @@ -0,0 +1,286 @@ +package com.chanko.yunxi.mes.module.heli.service.projectorder; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; +import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum; +import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.ProjectOrderPageReqVO; +import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.ProjectOrderSaveReqVO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; +import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper; +import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper; +import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum; +import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderStatusEnum; +import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum; +import com.chanko.yunxi.mes.module.heli.service.customer.CustomerService; +import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; +import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO; +import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO; +import com.chanko.yunxi.mes.module.infra.service.file.FileService; +import com.github.dadiyang.equator.FieldInfo; +import com.github.dadiyang.equator.GetterBaseEquator; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_ORDER; +import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.INVALID_OPERATE; +import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.PROJECT_ORDER_NOT_EXISTS; + +/** + * 项目订单 Service 实现类 + * + * @author 管理员 + */ +@Slf4j +@Service +@Validated +public class ProjectOrderServiceImpl implements ProjectOrderService { + + private static final GetterBaseEquator FIELD_EQUATOR = new GetterBaseEquator(); + + @Resource + private ProjectOrderMapper projectOrderMapper; + @Resource + private ProjectOrderSubMapper projectOrderSubMapper; + + @Resource + private SerialNumberService serialNumberService; + + @Resource + private CustomerService customerService; + + @Resource + private FileService fileService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) { + // 插入 + createReqVO.setOrderTime(LocalDateTime.now()); + ProjectOrderDO projectOrder = BeanUtils.toBean(createReqVO, ProjectOrderDO.class); + // 月度流水号 + SerialNumberDO serialNumberDO = serialNumberService.getSerialNumber(BusinesTypeEnum.PROJECT_ORDER.name(), new SimpleDateFormat("yyyyMM").format(new Date())); + serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1); + // 客户编号 + CustomerDO customer = customerService.getCustomer(projectOrder.getCustomerId()); + projectOrder.setCode(PROJECT_ORDER.getCode(customer.getCode(), serialNumberDO.getSerialNumber().toString())); + projectOrderMapper.insert(projectOrder); + + // 插入子表 + createProjectOrderSubList(projectOrder.getId(), createReqVO.getProjectOrderSubs()); + createReqVO.setId(projectOrder.getId()).setCode(projectOrder.getCode()); + + // 回写序列记录 + serialNumberService.updateSerialNumber(serialNumberDO); + // 返回 + return projectOrder.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void createProjectOrderSnapshot(ProjectOrderSaveReqVO createReqVO) { + ProjectOrderDO projectOrder = BeanUtils.toBean(createReqVO, ProjectOrderDO.class); + // 快照流水号 + SerialNumberDO serialNumberDO = serialNumberService.getSerialNumber(BusinesTypeEnum.PROJECT_ORDER_SNAPSHOT.name(), projectOrder.getCode()); + serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1); + projectOrder.setId(null) + .setIsSnapshot(YesOrNoEnum.YES.getCode()) + .setSnapshotId(createReqVO.getId()) + .setSnapshotCode(createReqVO.getCode()) + .setSnapshotOrderTime(createReqVO.getOrderTime()) + .setCode(String.format("%s-%s", createReqVO.getCode(), serialNumberDO.getSerialNumber().intValue())) + .setOrderTime(LocalDateTime.now()) + ; + projectOrderMapper.insert(projectOrder); + // 子项目 + createProjectOrderSubList(projectOrder.getId(), createReqVO.getProjectOrderSubs()); + // 附件 + PageResult filePage = fileService.getFilePage(new FilePageReqVO() {{ + setPageNo(1); + setPageSize(99); + setBusinessId(createReqVO.getId()); + setBusinessType(BusinesTypeEnum.PROJECT_ORDER.name()); + }}); + if(filePage.getTotal() > 0){ + List list = filePage.getList(); + list.forEach(fileDO -> { + fileDO.setId(null) + .setBusinessId(projectOrder.getId()) + .setBusinessType(BusinesTypeEnum.PROJECT_ORDER_SNAPSHOT.name()); + }); + fileService.insertBatch(list); + } + // 回写序列记录 + serialNumberService.updateSerialNumber(serialNumberDO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateProjectOrder(ProjectOrderSaveReqVO updateReqVO) { + // 校验存在 + ProjectOrderDO oldDO = validateProjectOrderExists(updateReqVO.getId()); + if(!oldDO.canOperate(OperateTypeEnum.valueOf(updateReqVO.getActive()))){ + throw exception(INVALID_OPERATE); + } + // 更新 + ProjectOrderDO updateObj = BeanUtils.toBean(updateReqVO, ProjectOrderDO.class); + updateObj.setOrderStatus(ProjectOrderStatusEnum.valueOf(updateReqVO.getActive()).getCode()); + projectOrderMapper.updateById(updateObj); + updateReqVO.setOrderStatus(updateObj.getOrderStatus()); + + // 更新子表 + updateProjectOrderSubList(updateReqVO.getId(), updateReqVO.getProjectOrderSubs()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteProjectOrder(Long id) { + // 校验存在 + ProjectOrderDO projectOrderDO = validateProjectOrderExists(id); + if(!projectOrderDO.canDelete()){ + throw exception(INVALID_OPERATE); + } + // 删除 + projectOrderMapper.deleteById(id); + + // 删除子表 + deleteProjectOrderSubByProjectOrderId(id); + } + + private ProjectOrderDO validateProjectOrderExists(Long id) { + ProjectOrderDO projectOrderDO = projectOrderMapper.selectOne(new LambdaQueryWrapper() {{ + eq(ProjectOrderDO::getId, id); + last("LIMIT 1 FOR UPDATE"); + }}); + if (projectOrderDO == null) { + throw exception(PROJECT_ORDER_NOT_EXISTS); + } + return projectOrderDO; + } + + @Override + public ProjectOrderDO getProjectOrder(Long id) { + ProjectOrderDO projectOrderDO = projectOrderMapper.selectById(id); + // 查询最近归档历史并对比变化字段 + try { + ProjectOrderDO lastSnapshot = projectOrderMapper.selectOne(new LambdaQueryWrapper() {{ + eq(ProjectOrderDO::getSnapshotId, id); + orderByDesc(ProjectOrderDO::getId); + last("LIMIT 1"); + }}); + if(lastSnapshot != null){ + List diffFields = FIELD_EQUATOR.getDiffFields(projectOrderDO, lastSnapshot); + projectOrderDO.setAlterFieldNames(diffFields.stream().map(FieldInfo::getFieldName).collect(Collectors.toSet())); + + // 附件 + List fileList = new ArrayList<>(16); + PageResult filePage = fileService.getFilePage(new FilePageReqVO() {{ + setPageNo(1); + setPageSize(99); + setBusinessId(id); + setBusinessType(BusinesTypeEnum.PROJECT_ORDER.name()); + }}); + if(filePage.getTotal() > 0) { + fileList.addAll(filePage.getList()); + } + + List lastSnapshotFilelist = new ArrayList<>(16);; + PageResult lastSnapshotFilePage = fileService.getFilePage(new FilePageReqVO() {{ + setPageNo(1); + setPageSize(99); + setBusinessId(lastSnapshot.getId()); + setBusinessType(BusinesTypeEnum.PROJECT_ORDER_SNAPSHOT.name()); + }}); + if(lastSnapshotFilePage.getTotal() > 0) { + lastSnapshotFilelist.addAll(lastSnapshotFilePage.getList()); + } + if(fileList.size() != lastSnapshotFilelist.size()){ + projectOrderDO.getAlterFieldNames().add("attachments"); + }else{ + boolean allMatch = fileList.stream().allMatch(fileDO -> lastSnapshotFilelist.stream().anyMatch(sFile -> fileDO.getPath().equals(sFile.getPath()))); + if(!allMatch){ + projectOrderDO.getAlterFieldNames().add("attachments"); + } + } + } + }catch (Exception e){ + // do nothing + log.error("generate alterFieldNames error, id: {}, exception: {}", id, e.getMessage(), e); + } + return projectOrderDO; + } + + @Override + public PageResult getProjectOrderPage(ProjectOrderPageReqVO pageReqVO) { + return projectOrderMapper.selectPage(pageReqVO); + } + + // ==================== 子表(项目订单子项目) ==================== + + @Override + public List getProjectOrderSubListByProjectOrderId(Long projectOrderId) { + List projectOrderSubDOList = projectOrderSubMapper.selectListByProjectOrderId(projectOrderId); + if(!projectOrderSubDOList.isEmpty()){ + // 查询最近归档历史并对比变化字段 + try { + ProjectOrderDO lastSnapshot = projectOrderMapper.selectOne(new LambdaQueryWrapper() {{ + eq(ProjectOrderDO::getSnapshotId, projectOrderId); + orderByDesc(ProjectOrderDO::getId); + last("LIMIT 1"); + }}); + if(lastSnapshot != null){ + List lastSnapshotSubDOList = projectOrderSubMapper.selectList(ProjectOrderSubDO::getProjectOrderId, lastSnapshot.getId()); + Map> nameGroups = lastSnapshotSubDOList.stream().collect(Collectors.groupingBy(ProjectOrderSubDO::getName)); + projectOrderSubDOList.forEach(projectOrderSubDO -> { + List lastSnapshotSubs = nameGroups.get(projectOrderSubDO.getName()); + if(lastSnapshotSubs.isEmpty()) return; + List diffFields = FIELD_EQUATOR.getDiffFields(projectOrderSubDO, lastSnapshotSubs.get(0)); + projectOrderSubDO.setAlterFieldNames(diffFields.stream().map(FieldInfo::getFieldName).collect(Collectors.toSet())); + }); + } + }catch (Exception e){ + log.error("generate sub alterFieldNames error, id: {}, exception: {}", projectOrderId, e.getMessage(), e); + } + + } + return projectOrderSubDOList; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void operateProjectOrder(ProjectOrderSaveReqVO operateReqVO) { + if(operateReqVO.getId() == null){ + createProjectOrder(operateReqVO); + }else{ + updateProjectOrder(operateReqVO); + } + } + + private void createProjectOrderSubList(Long projectOrderId, List list) { + list.forEach(o -> o.setId(null).setProjectOrderId(projectOrderId)); + projectOrderSubMapper.insertBatch(list); + } + + private void updateProjectOrderSubList(Long projectOrderId, List list) { + deleteProjectOrderSubByProjectOrderId(projectOrderId); + list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新 + createProjectOrderSubList(projectOrderId, list); + } + + private void deleteProjectOrderSubByProjectOrderId(Long projectOrderId) { + projectOrderSubMapper.deleteByProjectOrderId(projectOrderId); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/serialnumber/SerialNumberService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/serialnumber/SerialNumberService.java new file mode 100644 index 00000000..01bd55a0 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/serialnumber/SerialNumberService.java @@ -0,0 +1,70 @@ +package com.chanko.yunxi.mes.module.heli.service.serialnumber; + +import java.text.SimpleDateFormat; +import java.util.*; +import javax.validation.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; + +/** + * 序列号记录 Service 接口 + * + * @author 管理员 + */ +public interface SerialNumberService { + + /** + * 创建序列号记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createSerialNumber(@Valid SerialNumberSaveReqVO createReqVO); + + /** + * 更新序列号记录 + * + * @param updateReqVO 更新信息 + */ + void updateSerialNumber(@Valid SerialNumberSaveReqVO updateReqVO); + + /** + * 更新序列号记录 + * + * @param serialNumberDO 更新信息 + */ + void updateSerialNumber(SerialNumberDO serialNumberDO); + + /** + * 删除序列号记录 + * + * @param id 编号 + */ + void deleteSerialNumber(Long id); + + /** + * 获得序列号记录 + * + * @param id 编号 + * @return 序列号记录 + */ + SerialNumberDO getSerialNumber(Long id); + + /** + * 获得序列号记录分页 + * + * @param pageReqVO 分页查询 + * @return 序列号记录分页 + */ + PageResult getSerialNumberPage(SerialNumberPageReqVO pageReqVO); + + /** + * 获取序列号记录 + * @param businessType + * @param segment + * @return + */ + SerialNumberDO getSerialNumber(String businessType, String segment); +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/serialnumber/SerialNumberServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/serialnumber/SerialNumberServiceImpl.java new file mode 100644 index 00000000..b8d68ced --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/serialnumber/SerialNumberServiceImpl.java @@ -0,0 +1,109 @@ +package com.chanko.yunxi.mes.module.heli.service.serialnumber; + +import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.text.SimpleDateFormat; +import java.util.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; + +import com.chanko.yunxi.mes.module.heli.dal.mysql.serialnumber.SerialNumberMapper; + +import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; + +/** + * 序列号记录 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class SerialNumberServiceImpl implements SerialNumberService { + + @Resource + private SerialNumberMapper serialNumberMapper; + + @Override + public Long createSerialNumber(SerialNumberSaveReqVO createReqVO) { + // 插入 + SerialNumberDO serialNumber = BeanUtils.toBean(createReqVO, SerialNumberDO.class); + serialNumberMapper.insert(serialNumber); + // 返回 + return serialNumber.getId(); + } + + @Override + public void updateSerialNumber(SerialNumberSaveReqVO updateReqVO) { + // 校验存在 + validateSerialNumberExists(updateReqVO.getId()); + // 更新 + SerialNumberDO updateObj = BeanUtils.toBean(updateReqVO, SerialNumberDO.class); + serialNumberMapper.updateById(updateObj); + } + + @Override + public void updateSerialNumber(SerialNumberDO serialNumberDO) { + serialNumberMapper.updateById(serialNumberDO); + } + + @Override + public void deleteSerialNumber(Long id) { + // 校验存在 + validateSerialNumberExists(id); + // 删除 + serialNumberMapper.deleteById(id); + } + + private void validateSerialNumberExists(Long id) { + if (serialNumberMapper.selectById(id) == null) { + throw exception(SERIAL_NUMBER_NOT_EXISTS); + } + } + + @Override + public SerialNumberDO getSerialNumber(Long id) { + return serialNumberMapper.selectById(id); + } + + @Override + public PageResult getSerialNumberPage(SerialNumberPageReqVO pageReqVO) { + return serialNumberMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public SerialNumberDO getSerialNumber(String businessType, String segment) { + LambdaQueryWrapperX query = new LambdaQueryWrapperX() {{ + eq(SerialNumberDO::getBusinessType, businessType); + eq(SerialNumberDO::getSegment, segment); + last("LIMIT 1 FOR UPDATE"); + }}; + SerialNumberDO serialNumberDO = serialNumberMapper.selectOne(query); + if(serialNumberDO == null){ + // 初始化一条数据 + try { + serialNumberDO = new SerialNumberDO(); + serialNumberDO.setBusinessType(businessType) + .setSegment(segment) + .setSerialNumber(0l); + serialNumberMapper.insert(serialNumberDO); + }catch (Exception e){ + // do nothing + } + // 二次获取 + serialNumberDO = serialNumberMapper.selectOne(query); + } + return serialNumberDO; + } + + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storage/StorageService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storage/StorageService.java new file mode 100644 index 00000000..c03c0434 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storage/StorageService.java @@ -0,0 +1,55 @@ +package com.chanko.yunxi.mes.module.heli.service.storage; + +import java.util.*; +import javax.validation.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.storage.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; + +/** + * 入/出库 Service 接口 + * + * @author 管理员 + */ +public interface StorageService { + + /** + * 创建入/出库 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createStorage(@Valid StorageSaveReqVO createReqVO); + + /** + * 更新入/出库 + * + * @param updateReqVO 更新信息 + */ + void updateStorage(@Valid StorageSaveReqVO updateReqVO); + + /** + * 删除入/出库 + * + * @param id 编号 + */ + void deleteStorage(Long id); + + /** + * 获得入/出库 + * + * @param id 编号 + * @return 入/出库 + */ + StorageDO getStorage(Long id); + + /** + * 获得入/出库分页 + * + * @param pageReqVO 分页查询 + * @return 入/出库分页 + */ + PageResult getStoragePage(StoragePageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storage/StorageServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storage/StorageServiceImpl.java new file mode 100644 index 00000000..b5ce293c --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storage/StorageServiceImpl.java @@ -0,0 +1,81 @@ +package com.chanko.yunxi.mes.module.heli.service.storage; + +import cn.hutool.core.lang.UUID; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.storage.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; + +import com.chanko.yunxi.mes.module.heli.dal.mysql.storage.StorageMapper; + +import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.STOCK_IN; +import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.WAREHOUSE; +import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; + +/** + * 入/出库 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class StorageServiceImpl implements StorageService { + + @Resource + private StorageMapper storageMapper; + + @Override + public Long createStorage(StorageSaveReqVO createReqVO) { + // 插入 + StorageDO storage = BeanUtils.toBean(createReqVO, StorageDO.class); + storage.setStockNo(UUID.fastUUID().toString(true)); + storageMapper.insert(storage); + + storage.setStockNo(STOCK_IN.getCode(storage.getId().toString())); + storageMapper.updateById(storage); + // 返回 + return storage.getId(); + } + + @Override + public void updateStorage(StorageSaveReqVO updateReqVO) { + // 校验存在 + validateStorageExists(updateReqVO.getId()); + // 更新 + StorageDO updateObj = BeanUtils.toBean(updateReqVO, StorageDO.class); + storageMapper.updateById(updateObj); + } + + @Override + public void deleteStorage(Long id) { + // 校验存在 + validateStorageExists(id); + // 删除 + storageMapper.deleteById(id); + } + + private void validateStorageExists(Long id) { + if (storageMapper.selectById(id) == null) { + throw exception(STORAGE_NOT_EXISTS); + } + } + + @Override + public StorageDO getStorage(Long id) { + return storageMapper.selectById(id); + } + + @Override + public PageResult getStoragePage(StoragePageReqVO pageReqVO) { + return storageMapper.selectPage(pageReqVO); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogService.java new file mode 100644 index 00000000..f0a4fd87 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogService.java @@ -0,0 +1,55 @@ +package com.chanko.yunxi.mes.module.heli.service.storagelog; + +import java.util.*; +import javax.validation.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; + +/** + * 入/出库日志 Service 接口 + * + * @author 管理员 + */ +public interface StorageLogService { + + /** + * 创建入/出库日志 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createStorageLog(@Valid StorageLogSaveReqVO createReqVO); + + /** + * 更新入/出库日志 + * + * @param updateReqVO 更新信息 + */ + void updateStorageLog(@Valid StorageLogSaveReqVO updateReqVO); + + /** + * 删除入/出库日志 + * + * @param id 编号 + */ + void deleteStorageLog(Long id); + + /** + * 获得入/出库日志 + * + * @param id 编号 + * @return 入/出库日志 + */ + StorageLogDO getStorageLog(Long id); + + /** + * 获得入/出库日志分页 + * + * @param pageReqVO 分页查询 + * @return 入/出库日志分页 + */ + PageResult getStorageLogPage(StorageLogPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogServiceImpl.java new file mode 100644 index 00000000..f3de4675 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagelog/StorageLogServiceImpl.java @@ -0,0 +1,74 @@ +package com.chanko.yunxi.mes.module.heli.service.storagelog; + +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; + +import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogMapper; + +import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; + +/** + * 入/出库日志 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class StorageLogServiceImpl implements StorageLogService { + + @Resource + private StorageLogMapper storageLogMapper; + + @Override + public Long createStorageLog(StorageLogSaveReqVO createReqVO) { + // 插入 + StorageLogDO storageLog = BeanUtils.toBean(createReqVO, StorageLogDO.class); + storageLogMapper.insert(storageLog); + // 返回 + return storageLog.getId(); + } + + @Override + public void updateStorageLog(StorageLogSaveReqVO updateReqVO) { + // 校验存在 + validateStorageLogExists(updateReqVO.getId()); + // 更新 + StorageLogDO updateObj = BeanUtils.toBean(updateReqVO, StorageLogDO.class); + storageLogMapper.updateById(updateObj); + } + + @Override + public void deleteStorageLog(Long id) { + // 校验存在 + validateStorageLogExists(id); + // 删除 + storageLogMapper.deleteById(id); + } + + private void validateStorageLogExists(Long id) { + if (storageLogMapper.selectById(id) == null) { + throw exception(STORAGE_LOG_NOT_EXISTS); + } + } + + @Override + public StorageLogDO getStorageLog(Long id) { + return storageLogMapper.selectById(id); + } + + @Override + public PageResult getStorageLogPage(StorageLogPageReqVO pageReqVO) { + return storageLogMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagemat/StorageMatService.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagemat/StorageMatService.java new file mode 100644 index 00000000..f0703944 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagemat/StorageMatService.java @@ -0,0 +1,64 @@ +package com.chanko.yunxi.mes.module.heli.service.storagemat; + +import java.util.*; +import javax.validation.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; + +/** + * 入/出库物料 Service 接口 + * + * @author 管理员 + */ +public interface StorageMatService { + + /** + * 创建入/出库物料 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createStorageMat(@Valid StorageMatSaveReqVO createReqVO); + + /** + * 更新入/出库物料 + * + * @param updateReqVO 更新信息 + */ + void updateStorageMat(@Valid StorageMatSaveReqVO updateReqVO); + + /** + * 删除入/出库物料 + * + * @param id 编号 + */ + void deleteStorageMat(Long id); + + /** + * 获得入/出库物料 + * + * @param id 编号 + * @return 入/出库物料 + */ + StorageMatDO getStorageMat(Long id); + + /** + * 获得入/出库物料分页 + * + * @param pageReqVO 分页查询 + * @return 入/出库物料分页 + */ + PageResult getStorageMatPage(StorageMatPageReqVO pageReqVO); + + /** + * 获得入/出库物料列表 + * + * @return 入/出库物料分页 + */ + List getStorageMatList(); + + int deleteStorageMatList(Long stockid); + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagemat/StorageMatServiceImpl.java b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagemat/StorageMatServiceImpl.java new file mode 100644 index 00000000..475850b8 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/java/com/chanko/yunxi/mes/module/heli/service/storagemat/StorageMatServiceImpl.java @@ -0,0 +1,94 @@ +package com.chanko.yunxi.mes.module.heli.service.storagemat; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; +import com.google.common.collect.Maps; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo.*; +import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO; +import com.chanko.yunxi.mes.framework.common.pojo.PageResult; +import com.chanko.yunxi.mes.framework.common.pojo.PageParam; +import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; + +import com.chanko.yunxi.mes.module.heli.dal.mysql.storagemat.StorageMatMapper; + +import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; + +/** + * 入/出库物料 Service 实现类 + * + * @author 管理员 + */ +@Service +@Validated +public class StorageMatServiceImpl implements StorageMatService { + + @Resource + private StorageMatMapper storageMatMapper; + + @Resource + private StorageMatMapper storageMatGlobalMapper; + + @Override + public Long createStorageMat(StorageMatSaveReqVO createReqVO) { + // 插入 + StorageMatDO storageMat = BeanUtils.toBean(createReqVO, StorageMatDO.class); + storageMatMapper.insert(storageMat); + // 返回 + return storageMat.getId(); + } + + @Override + public void updateStorageMat(StorageMatSaveReqVO updateReqVO) { + // 校验存在 + validateStorageMatExists(updateReqVO.getId()); + // 更新 + StorageMatDO updateObj = BeanUtils.toBean(updateReqVO, StorageMatDO.class); + storageMatMapper.updateById(updateObj); + } + + @Override + public void deleteStorageMat(Long id) { + // 校验存在 + validateStorageMatExists(id); + // 删除 + storageMatMapper.deleteById(id); + } + + private void validateStorageMatExists(Long id) { + if (storageMatMapper.selectById(id) == null) { + throw exception(STORAGE_MAT_NOT_EXISTS); + } + } + + @Override + public StorageMatDO getStorageMat(Long id) { + return storageMatMapper.selectById(id); + } + + @Override + public PageResult getStorageMatPage(StorageMatPageReqVO pageReqVO) { + return storageMatMapper.selectPage(pageReqVO); + } + + @Override + public List getStorageMatList() { + return storageMatMapper.selectStorageMatValid(); + } + + @Override + public int deleteStorageMatList(Long stockid) { + //删除条件 + Map columnMap = Maps.newHashMap(); + columnMap.put("stock_id", stockid); + + return storageMatMapper.deleteByMap(columnMap); + } + +} diff --git a/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/projectorder/ProjectOrderMapper.xml b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/projectorder/ProjectOrderMapper.xml new file mode 100644 index 00000000..9ba81c8a --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/projectorder/ProjectOrderMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/serialnumber/SerialNumberMapper.xml b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/serialnumber/SerialNumberMapper.xml new file mode 100644 index 00000000..f0ee16df --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/serialnumber/SerialNumberMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/storage/StorageMapper.xml b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/storage/StorageMapper.xml new file mode 100644 index 00000000..e8588bc5 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/storage/StorageMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/storagelog/StorageLogMapper.xml b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/storagelog/StorageLogMapper.xml new file mode 100644 index 00000000..d89a38b3 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/storagelog/StorageLogMapper.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/storagemat/StorageMatMapper.xml b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/storagemat/StorageMatMapper.xml new file mode 100644 index 00000000..6b49bac5 --- /dev/null +++ b/mes-module-heli/mes-module-heli-biz/src/main/resources/mapper/storagemat/StorageMatMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mes-module-heli/mes-module-heli-biz/src/test/java/com/chanko/yunxi/mes/module/heli/service/procedure/ProcedureServiceImplTest.java b/mes-module-heli/mes-module-heli-biz/src/test/java/com/chanko/yunxi/mes/module/heli/service/procedure/ProcedureServiceImplTest.java deleted file mode 100644 index 1ea36d1d..00000000 --- a/mes-module-heli/mes-module-heli-biz/src/test/java/com/chanko/yunxi/mes/module/heli/service/procedure/ProcedureServiceImplTest.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.chanko.yunxi.mes.module.heli.service.procedure; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.mock.mockito.MockBean; - -import javax.annotation.Resource; - -import com.chanko.yunxi.mes.framework.test.core.ut.BaseDbUnitTest; - -import com.chanko.yunxi.mes.module.heli.controller.admin.procedure.vo.*; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.procedure.ProcedureDO; -import com.chanko.yunxi.mes.module.heli.dal.mysql.procedure.ProcedureMapper; -import com.chanko.yunxi.mes.framework.common.pojo.PageResult; - -import javax.annotation.Resource; -import org.springframework.context.annotation.Import; -import java.util.*; -import java.time.LocalDateTime; - -import static cn.hutool.core.util.RandomUtil.*; -import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; -import static com.chanko.yunxi.mes.framework.test.core.util.AssertUtils.*; -import static com.chanko.yunxi.mes.framework.test.core.util.RandomUtils.*; -import static com.chanko.yunxi.mes.framework.common.util.date.LocalDateTimeUtils.*; -import static com.chanko.yunxi.mes.framework.common.util.object.ObjectUtils.*; -import static com.chanko.yunxi.mes.framework.common.util.date.DateUtils.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -/** - * {@link ProcedureServiceImpl} 的单元测试类 - * - * @author 管理员 - */ -@Import(ProcedureServiceImpl.class) -public class ProcedureServiceImplTest extends BaseDbUnitTest { - - @Resource - private ProcedureServiceImpl procedureService; - - @Resource - private ProcedureMapper procedureMapper; - - @Test - public void testCreateProcedure_success() { - // 准备参数 - ProcedureSaveReqVO createReqVO = randomPojo(ProcedureSaveReqVO.class).setId(null); - - // 调用 - Long procedureId = procedureService.createProcedure(createReqVO); - // 断言 - assertNotNull(procedureId); - // 校验记录的属性是否正确 - ProcedureDO procedure = procedureMapper.selectById(procedureId); - assertPojoEquals(createReqVO, procedure, "id"); - } - - @Test - public void testUpdateProcedure_success() { - // mock 数据 - ProcedureDO dbProcedure = randomPojo(ProcedureDO.class); - procedureMapper.insert(dbProcedure);// @Sql: 先插入出一条存在的数据 - // 准备参数 - ProcedureSaveReqVO updateReqVO = randomPojo(ProcedureSaveReqVO.class, o -> { - o.setId(dbProcedure.getId()); // 设置更新的 ID - }); - - // 调用 - procedureService.updateProcedure(updateReqVO); - // 校验是否更新正确 - ProcedureDO procedure = procedureMapper.selectById(updateReqVO.getId()); // 获取最新的 - assertPojoEquals(updateReqVO, procedure); - } - - @Test - public void testUpdateProcedure_notExists() { - // 准备参数 - ProcedureSaveReqVO updateReqVO = randomPojo(ProcedureSaveReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> procedureService.updateProcedure(updateReqVO), PROCEDURE_NOT_EXISTS); - } - - @Test - public void testDeleteProcedure_success() { - // mock 数据 - ProcedureDO dbProcedure = randomPojo(ProcedureDO.class); - procedureMapper.insert(dbProcedure);// @Sql: 先插入出一条存在的数据 - // 准备参数 - Long id = dbProcedure.getId(); - - // 调用 - procedureService.deleteProcedure(id); - // 校验数据不存在了 - assertNull(procedureMapper.selectById(id)); - } - - @Test - public void testDeleteProcedure_notExists() { - // 准备参数 - Long id = randomLongId(); - - // 调用, 并断言异常 - assertServiceException(() -> procedureService.deleteProcedure(id), PROCEDURE_NOT_EXISTS); - } - - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGetProcedurePage() { - // mock 数据 - ProcedureDO dbProcedure = randomPojo(ProcedureDO.class, o -> { // 等会查询到 - o.setCode(null); - o.setName(null); - o.setDescription(null); - o.setStatus(null); - o.setCreator(null); - o.setCreateTime(null); - o.setUpdater(null); - o.setUpdateTime(null); - o.setDeleted(null); - o.setTenantId(null); - o.setIsReport(null); - o.setWid(null); - }); - procedureMapper.insert(dbProcedure); - // 测试 code 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setCode(null))); - // 测试 name 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setName(null))); - // 测试 description 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setDescription(null))); - // 测试 status 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setStatus(null))); - // 测试 creator 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setCreator(null))); - // 测试 createTime 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setCreateTime(null))); - // 测试 updater 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setUpdater(null))); - // 测试 updateTime 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setUpdateTime(null))); - // 测试 deleted 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setDeleted(null))); - // 测试 tenantId 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setTenantId(null))); - // 测试 isReport 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setIsReport(null))); - // 测试 wid 不匹配 - procedureMapper.insert(cloneIgnoreId(dbProcedure, o -> o.setWid(null))); - // 准备参数 - ProcedurePageReqVO reqVO = new ProcedurePageReqVO(); - reqVO.setCode(null); - reqVO.setName(null); - reqVO.setDescription(null); - reqVO.setStatus(null); - reqVO.setCreator(null); - reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - reqVO.setUpdater(null); - reqVO.setUpdateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - reqVO.setDeleted(null); - reqVO.setTenantId(null); - reqVO.setIsReport(null); - reqVO.setWid(null); - - // 调用 - PageResult pageResult = procedureService.getProcedurePage(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(dbProcedure, pageResult.getList().get(0)); - } - -} \ No newline at end of file diff --git a/mes-module-infra/mes-module-infra-api/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApi.java b/mes-module-infra/mes-module-infra-api/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApi.java index 660c3754..33f8d232 100644 --- a/mes-module-infra/mes-module-infra-api/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApi.java +++ b/mes-module-infra/mes-module-infra-api/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApi.java @@ -45,8 +45,9 @@ public interface FileApi { * @param content * @param businessType * @param businessId + * @param businessFileType * @return */ - String createFile(String name, String path, byte[] content, String businessType, Long businessId); + String createFile(String name, String path, byte[] content, String businessType, Long businessId, String businessFileType); } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApiImpl.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApiImpl.java index 5beb1b24..6caaa331 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApiImpl.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/api/file/FileApiImpl.java @@ -20,12 +20,12 @@ public class FileApiImpl implements FileApi { @Override public String createFile(String name, String path, byte[] content) { - return fileService.createFile(name, path, content, null, null); + return fileService.createFile(name, path, content, null, null, null); } @Override - public String createFile(String name, String path, byte[] content, String businessType, Long businessId) { - return fileService.createFile(name, path, content, businessType, businessId); + public String createFile(String name, String path, byte[] content, String businessType, Long businessId, String businessFileType) { + return fileService.createFile(name, path, content, businessType, businessId, businessFileType); } } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/FileController.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/FileController.java index b2f37da3..d6bc4909 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/FileController.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/FileController.java @@ -48,7 +48,7 @@ public class FileController { public CommonResult uploadFile(FileUploadReqVO uploadReqVO) throws Exception { MultipartFile file = uploadReqVO.getFile(); String path = uploadReqVO.getPath(); - return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId())); + return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId(), uploadReqVO.getBusinessFileType())); } @PostMapping("/uploadBatch") @@ -57,7 +57,7 @@ public class FileController { public CommonResult uploadFileBatch(FileUploadBatchReqVO uploadReqVO) throws Exception { MultipartFile[] files = uploadReqVO.getFiles(); for (MultipartFile file : files) { - fileService.createFile(file.getOriginalFilename(), null, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId()); + fileService.createFile(file.getOriginalFilename(), null, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId(), uploadReqVO.getBusinessFileType()); } return success(null); } @@ -71,6 +71,15 @@ public class FileController { return success(true); } + @DeleteMapping("/deleteLogic") + @Operation(summary = "删除文件(逻辑删除)") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('infra:file:delete')") + public CommonResult deleteFileLogic(@RequestParam("id") Long id) throws Exception { + fileService.deleteFileLogic(id); + return success(true); + } + @GetMapping("/{configId}/get/**") @PermitAll @Operation(summary = "下载文件") diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileRespVO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileRespVO.java index 04baaf88..d49933fe 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileRespVO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileRespVO.java @@ -21,6 +21,9 @@ public class FileRespVO { @Schema(description = "业务id", example = "18052") private Long businessId; + @Schema(description = "业务文件类型 用于业务关联", example = "1") + private String businessFileType; + @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "mes.jpg") private String path; diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadBatchReqVO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadBatchReqVO.java index 086ba3ce..f16bfd7c 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadBatchReqVO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadBatchReqVO.java @@ -16,10 +16,13 @@ public class FileUploadBatchReqVO { @NotEmpty(message = "上传文件不能为空") private MultipartFile[] files; - @Schema(description = "文件业务类型") + @Schema(description = "业务类型") private String businessType; - @Schema(description = "文件业务id") + @Schema(description = "业务id") private Long businessId; + @Schema(description = "业务文件类型") + private String businessFileType; + } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java index 8f60a19b..9cd87a98 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/admin/file/vo/file/FileUploadReqVO.java @@ -17,10 +17,13 @@ public class FileUploadReqVO { @Schema(description = "文件附件", example = "mesyuanma.png") private String path; - @Schema(description = "文件业务类型") + @Schema(description = "业务类型") private String businessType; - @Schema(description = "文件业务id") + @Schema(description = "业务id") private Long businessId; + @Schema(description = "业务文件类型") + private String businessFileType; + } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/AppFileController.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/AppFileController.java index b13e0b51..0131d619 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/AppFileController.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/AppFileController.java @@ -32,7 +32,7 @@ public class AppFileController { public CommonResult uploadFile(AppFileUploadReqVO uploadReqVO) throws Exception { MultipartFile file = uploadReqVO.getFile(); String path = uploadReqVO.getPath(); - return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId())); + return success(fileService.createFile(file.getOriginalFilename(), path, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId(), uploadReqVO.getBusinessFileType())); } } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/vo/AppFileUploadReqVO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/vo/AppFileUploadReqVO.java index 1c9e220b..b651b28a 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/vo/AppFileUploadReqVO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/controller/app/file/vo/AppFileUploadReqVO.java @@ -14,12 +14,15 @@ public class AppFileUploadReqVO { @NotNull(message = "文件附件不能为空") private MultipartFile file; - @Schema(description = "文件业务类型") + @Schema(description = "业务类型") private String businessType; - @Schema(description = "文件业务id") + @Schema(description = "业务id") private Long businessId; + @Schema(description = "业务文件类型") + private String businessFileType; + @Schema(description = "文件附件", example = "mesyuanma.png") private String path; diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/dataobject/file/FileDO.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/dataobject/file/FileDO.java index 7ff0e629..a4b2bbcc 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/dataobject/file/FileDO.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/dal/dataobject/file/FileDO.java @@ -39,6 +39,10 @@ public class FileDO extends BaseDO { * 业务id */ private Long businessId; + /** + * 业务文件类型 用于业务关联 + */ + private String businessFileType; /** * 原文件名 */ diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileService.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileService.java index 8966e109..dd56ec2e 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileService.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileService.java @@ -4,6 +4,8 @@ import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO; import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO; +import java.util.List; + /** * 文件 Service 接口 * @@ -22,14 +24,15 @@ public interface FileService { /** * 保存文件,并返回文件的访问路径 * - * @param name 文件名称 - * @param path 文件路径 - * @param content 文件内容 + * @param name 文件名称 + * @param path 文件路径 + * @param content 文件内容 * @param businessType * @param businessId + * @param businessFileType * @return 文件路径 */ - String createFile(String name, String path, byte[] content, String businessType, Long businessId); + String createFile(String name, String path, byte[] content, String businessType, Long businessId, String businessFileType); /** * 删除文件 @@ -47,4 +50,15 @@ public interface FileService { */ byte[] getFileContent(Long configId, String path) throws Exception; + /** + * 删除文件(逻辑删除) + * @param id + */ + void deleteFileLogic(Long id); + + /** + * 批量插入 + * @param fileDOList + */ + void insertBatch(List fileDOList); } diff --git a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileServiceImpl.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileServiceImpl.java index 787cab51..398429e1 100644 --- a/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileServiceImpl.java +++ b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileServiceImpl.java @@ -14,6 +14,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.List; + import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; @@ -38,11 +40,11 @@ public class FileServiceImpl implements FileService { @Override @SneakyThrows - public String createFile(String name, String path, byte[] content, String businessType, Long businessId) { + public String createFile(String name, String path, byte[] content, String businessType, Long businessId, String businessFileType) { // 计算默认的 path 名 String type = FileTypeUtils.getMineType(content, name); if (StrUtil.isEmpty(path)) { - path = FileUtils.generatePath(content, name); + path = FileUtils.generatePath(name); } // 如果 name 为空,则使用 path 填充 if (StrUtil.isEmpty(name)) { @@ -58,6 +60,7 @@ public class FileServiceImpl implements FileService { FileDO file = new FileDO(); file.setBusinessId(businessId); file.setBusinessType(businessType); + file.setBusinessFileType(businessFileType); file.setConfigId(client.getId()); file.setName(name); file.setPath(path); @@ -97,4 +100,17 @@ public class FileServiceImpl implements FileService { return client.getContent(path); } + @Override + public void deleteFileLogic(Long id) { + // 校验存在 + validateFileExists(id); + // 删除记录 + fileMapper.deleteById(id); + } + + @Override + public void insertBatch(List fileDOList){ + fileMapper.insertBatch(fileDOList); + } + } diff --git a/mes-module-system/mes-module-system-api/src/main/java/com/chanko/yunxi/mes/module/system/api/logger/dto/OperateLogCreateReqDTO.java b/mes-module-system/mes-module-system-api/src/main/java/com/chanko/yunxi/mes/module/system/api/logger/dto/OperateLogCreateReqDTO.java index 1d2546eb..6bf4584b 100644 --- a/mes-module-system/mes-module-system-api/src/main/java/com/chanko/yunxi/mes/module/system/api/logger/dto/OperateLogCreateReqDTO.java +++ b/mes-module-system/mes-module-system-api/src/main/java/com/chanko/yunxi/mes/module/system/api/logger/dto/OperateLogCreateReqDTO.java @@ -17,7 +17,14 @@ public class OperateLogCreateReqDTO { * 链路追踪编号 */ private String traceId; - + /** + * 业务类型 用于业务关联 + */ + private String businessType; + /** + * 业务id + */ + private Long businessId; /** * 用户编号 */ diff --git a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/auth/AuthController.java b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/auth/AuthController.java index 2df9ddc8..41c9f45c 100644 --- a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/auth/AuthController.java +++ b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/auth/AuthController.java @@ -10,11 +10,13 @@ import com.chanko.yunxi.mes.framework.security.config.SecurityProperties; import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils; import com.chanko.yunxi.mes.module.system.controller.admin.auth.vo.*; import com.chanko.yunxi.mes.module.system.convert.auth.AuthConvert; +import com.chanko.yunxi.mes.module.system.dal.dataobject.dept.PostDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.permission.MenuDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.permission.RoleDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.chanko.yunxi.mes.module.system.enums.logger.LoginLogTypeEnum; import com.chanko.yunxi.mes.module.system.service.auth.AdminAuthService; +import com.chanko.yunxi.mes.module.system.service.dept.PostService; import com.chanko.yunxi.mes.module.system.service.permission.MenuService; import com.chanko.yunxi.mes.module.system.service.permission.PermissionService; import com.chanko.yunxi.mes.module.system.service.permission.RoleService; @@ -32,6 +34,7 @@ import javax.annotation.Resource; import javax.annotation.security.PermitAll; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; @@ -59,9 +62,10 @@ public class AuthController { private PermissionService permissionService; @Resource private SocialClientService socialClientService; - @Resource private SecurityProperties securityProperties; + @Resource + private PostService postService; @PostMapping("/login") @PermitAll @@ -105,7 +109,7 @@ public class AuthController { // 1.2 获得角色列表 Set roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId()); if (CollUtil.isEmpty(roleIds)) { - return success(AuthConvert.INSTANCE.convert(user, Collections.emptyList(), Collections.emptyList())); + return success(AuthConvert.INSTANCE.convert(user, Collections.emptyList(), Collections.emptyList(), Collections.emptyList())); } List roles = roleService.getRoleList(roleIds); roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); // 移除禁用的角色 @@ -115,8 +119,15 @@ public class AuthController { List menuList = menuService.getMenuList(menuIds); menuList.removeIf(menu -> !CommonStatusEnum.ENABLE.getStatus().equals(menu.getStatus())); // 移除禁用的菜单 + // 1.4 获得岗位信息 + List postList = new ArrayList<>(8); + if(user.getPostIds() != null && user.getPostIds().size() > 0){ + postList = postService.getPostList(user.getPostIds()); + postList.removeIf(post -> !CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())); // 移除禁用的岗位 + } + // 2. 拼接结果返回 - return success(AuthConvert.INSTANCE.convert(user, roles, menuList)); + return success(AuthConvert.INSTANCE.convert(user, roles, menuList, postList)); } // ========== 短信登录相关 ========== diff --git a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java index 49b6d045..8b4d6b40 100644 --- a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java +++ b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/auth/vo/AuthPermissionInfoRespVO.java @@ -28,6 +28,9 @@ public class AuthPermissionInfoRespVO { @Schema(description = "菜单树", requiredMode = Schema.RequiredMode.REQUIRED) private List menus; + @Schema(description = "岗位数组", requiredMode = Schema.RequiredMode.REQUIRED) + private Set posts; + @Schema(description = "用户信息 VO") @Data @NoArgsConstructor diff --git a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java index a4507ae4..d39de5fa 100644 --- a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java +++ b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/logger/vo/operatelog/OperateLogPageReqVO.java @@ -6,6 +6,7 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; +import java.util.List; import static com.chanko.yunxi.mes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -16,12 +17,21 @@ public class OperateLogPageReqVO extends PageParam { @Schema(description = "操作模块,模拟匹配", example = "订单") private String module; + @Schema(description = "业务类型 用于业务关联", example = "2") + private String businessType; + + @Schema(description = "业务id", example = "18297") + private Long businessId; + @Schema(description = "用户昵称,模拟匹配", example = "芋道") private String userNickname; @Schema(description = "操作分类,参见 OperateLogTypeEnum 枚举类", example = "1") private Integer type; + @Schema(description = "操作分类列表", example = "1") + private List typeList; + @Schema(description = "操作状态", example = "true") private Boolean success; diff --git a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java index 111ff86c..5efc20bb 100644 --- a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java +++ b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/logger/vo/operatelog/OperateLogRespVO.java @@ -24,6 +24,12 @@ public class OperateLogRespVO { @Schema(description = "链路追踪编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "89aca178-a370-411c-ae02-3f0d672be4ab") private String traceId; + @Schema(description = "业务类型 用于业务关联", example = "2") + private String businessType; + + @Schema(description = "业务id", example = "18297") + private Long businessId; + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long userId; diff --git a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java index a773ac30..4d005efc 100644 --- a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java +++ b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/controller/admin/user/vo/profile/UserProfileUpdateReqVO.java @@ -1,8 +1,8 @@ package com.chanko.yunxi.mes.module.system.controller.admin.user.vo.profile; +import com.chanko.yunxi.mes.framework.common.validation.Mobile; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Email; import javax.validation.constraints.Size; @@ -22,7 +22,7 @@ public class UserProfileUpdateReqVO { private String email; @Schema(description = "手机号码", example = "15601691300") - @Length(min = 11, max = 11, message = "手机号长度必须 11 位") + @Mobile private String mobile; @Schema(description = "用户性别,参见 SexEnum 枚举类", example = "1") diff --git a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/convert/auth/AuthConvert.java b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/convert/auth/AuthConvert.java index 001bb6dc..09eaa3ed 100644 --- a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/convert/auth/AuthConvert.java +++ b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/convert/auth/AuthConvert.java @@ -5,6 +5,7 @@ import com.chanko.yunxi.mes.module.system.api.sms.dto.code.SmsCodeSendReqDTO; import com.chanko.yunxi.mes.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import com.chanko.yunxi.mes.module.system.api.social.dto.SocialUserBindReqDTO; import com.chanko.yunxi.mes.module.system.controller.admin.auth.vo.*; +import com.chanko.yunxi.mes.module.system.dal.dataobject.dept.PostDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.permission.MenuDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.permission.RoleDO; @@ -27,7 +28,7 @@ public interface AuthConvert { AuthLoginRespVO convert(OAuth2AccessTokenDO bean); - default AuthPermissionInfoRespVO convert(AdminUserDO user, List roleList, List menuList) { + default AuthPermissionInfoRespVO convert(AdminUserDO user, List roleList, List menuList, List postList) { return AuthPermissionInfoRespVO.builder() .user(AuthPermissionInfoRespVO.UserVO.builder().id(user.getId()).nickname(user.getNickname()).avatar(user.getAvatar()).build()) .roles(convertSet(roleList, RoleDO::getCode)) @@ -35,6 +36,8 @@ public interface AuthConvert { .permissions(convertSet(menuList, MenuDO::getPermission)) // 菜单树 .menus(buildMenuTree(menuList)) + // 岗位列表 + .posts(convertSet(postList, PostDO::getCode)) .build(); } diff --git a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/dal/dataobject/logger/OperateLogDO.java b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/dal/dataobject/logger/OperateLogDO.java index 91a37619..47e3f7dd 100644 --- a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/dal/dataobject/logger/OperateLogDO.java +++ b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/dal/dataobject/logger/OperateLogDO.java @@ -47,6 +47,14 @@ public class OperateLogDO extends BaseDO { * 一般来说,通过链路追踪编号,可以将访问日志,错误日志,链路追踪日志,logger 打印日志等,结合在一起,从而进行排错。 */ private String traceId; + /** + * 业务类型 用于业务关联 + */ + private String businessType; + /** + * 业务id + */ + private Long businessId; /** * 用户编号 * diff --git a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/dal/mysql/logger/OperateLogMapper.java b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/dal/mysql/logger/OperateLogMapper.java index 5c181d00..cc2d99d7 100644 --- a/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/dal/mysql/logger/OperateLogMapper.java +++ b/mes-module-system/mes-module-system-biz/src/main/java/com/chanko/yunxi/mes/module/system/dal/mysql/logger/OperateLogMapper.java @@ -15,10 +15,14 @@ public interface OperateLogMapper extends BaseMapperX { default PageResult selectPage(OperateLogPageReqVO reqVO, Collection userIds) { LambdaQueryWrapperX query = new LambdaQueryWrapperX() + .eqIfPresent(OperateLogDO::getBusinessType, reqVO.getBusinessType()) + .eqIfPresent(OperateLogDO::getBusinessId, reqVO.getBusinessId()) .likeIfPresent(OperateLogDO::getModule, reqVO.getModule()) .inIfPresent(OperateLogDO::getUserId, userIds) .eqIfPresent(OperateLogDO::getType, reqVO.getType()) - .betweenIfPresent(OperateLogDO::getStartTime, reqVO.getStartTime()); + .betweenIfPresent(OperateLogDO::getStartTime, reqVO.getStartTime()) + .inIfPresent(OperateLogDO::getType, reqVO.getTypeList()) + ; if (Boolean.TRUE.equals(reqVO.getSuccess())) { query.eq(OperateLogDO::getResultCode, GlobalErrorCodeConstants.SUCCESS.getCode()); } else if (Boolean.FALSE.equals(reqVO.getSuccess())) { diff --git a/mes-server/pom.xml b/mes-server/pom.xml index 86aa05ab..4b66340c 100644 --- a/mes-server/pom.xml +++ b/mes-server/pom.xml @@ -18,9 +18,20 @@ 从而实现提供 RESTful API 给 mes-ui-admin、mes-ui-user 等前端项目。 本质上来说,它就是个空壳(容器)! - https://github.com/YunaiV/ruoyi-vue-pro + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.jupiter + junit-jupiter + 5.4.0 + test + + com.chanko.yunxi mes-module-system-biz diff --git a/mes-server/src/main/resources/application-dev.yaml b/mes-server/src/main/resources/application-dev.yaml index 95523470..8fcba233 100644 --- a/mes-server/src/main/resources/application-dev.yaml +++ b/mes-server/src/main/resources/application-dev.yaml @@ -152,7 +152,7 @@ spring: # 日志文件配置 logging: file: - name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 + name: ${logback.path}/${spring.application.name}.log # 日志文件名,全路径 --- #################### 微信公众号相关配置 #################### wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 diff --git a/mes-server/src/main/resources/application-local.yaml b/mes-server/src/main/resources/application-local.yaml index fe011c1b..08bf7ade 100644 --- a/mes-server/src/main/resources/application-local.yaml +++ b/mes-server/src/main/resources/application-local.yaml @@ -152,7 +152,7 @@ spring: # 日志文件配置 logging: file: - name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 + name: ${logback.path}/${spring.application.name}.log # 日志文件名,全路径 level: com.chanko.yunxi.mes.module.heli: debug diff --git a/mes-server/src/main/resources/application-pro.yaml b/mes-server/src/main/resources/application-pro.yaml new file mode 100644 index 00000000..d7b91946 --- /dev/null +++ b/mes-server/src/main/resources/application-pro.yaml @@ -0,0 +1,216 @@ +server: + port: 8080 + +--- #################### 数据库相关配置 #################### + +spring: + # 数据源配置项 + autoconfigure: + exclude: + - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源 + datasource: + druid: # Druid 【监控】相关的全局配置 + web-stat-filter: + enabled: true + stat-view-servlet: + enabled: true + allow: # 设置白名单,不填则允许所有访问 + url-pattern: /druid/* + login-username: # 控制台管理用户名和密码 + login-password: + filter: + stat: + enabled: true + log-slow-sql: true # 慢 SQL 记录 + slow-sql-millis: 100 + merge-sql: true + wall: + config: + multi-statement-allow: true + dynamic: # 多数据源配置 + druid: # Druid 【连接池】相关的全局配置 + initial-size: 5 # 初始连接数 + min-idle: 10 # 最小连接池数量 + max-active: 20 # 最大连接池数量 + max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒 + time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒 + min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒 + max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒 + validation-query: SELECT 1 # 配置检测连接是否有效 + test-while-idle: true + test-on-borrow: false + test-on-return: false + primary: master + datasource: + master: + name: mes-heli + url: jdbc:mysql://localhost:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true + driver-class-name: com.mysql.jdbc.Driver + username: root + password: 'heli,12#$' + # slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 + # name: ruoyi-vue-pro + # url: jdbc:mysql://localhost:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true + # driver-class-name: com.mysql.jdbc.Driver + # username: root + # password: 3WLiVUBEwTbvAfsh + + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + redis: + host: localhost # 地址 + port: 6379 # 端口 + database: 3 # 数据库索引 + password: 'heli,redis12#$' # 密码,建议生产环境开启 + +--- #################### 定时任务相关配置 #################### + +# Quartz 配置项,对应 QuartzProperties 配置类 +spring: + quartz: + auto-startup: true # 测试环境,需要开启 Job + scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName + job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 + wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true + properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 + org: + quartz: + # Scheduler 相关配置 + scheduler: + instanceName: schedulerName + instanceId: AUTO # 自动生成 instance ID + # JobStore 相关配置 + jobStore: + # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162 + class: org.springframework.scheduling.quartz.LocalDataSourceJobStore + isClustered: true # 是集群模式 + clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒 + misfireThreshold: 60000 # misfire 阀值,单位:毫秒。 + # 线程池相关配置 + threadPool: + threadCount: 25 # 线程池大小。默认为 10 。 + threadPriority: 5 # 线程优先级 + class: org.quartz.simpl.SimpleThreadPool # 线程池类型 + jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 + initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 + +--- #################### 消息队列相关 #################### + +# rocketmq 配置项,对应 RocketMQProperties 配置类 +rocketmq: + name-server: 127.0.0.1:9876 # RocketMQ Namesrv + +spring: + # RabbitMQ 配置项,对应 RabbitProperties 配置类 + rabbitmq: + host: 127.0.0.1 # RabbitMQ 服务的地址 + port: 5672 # RabbitMQ 服务的端口 + username: guest # RabbitMQ 服务的账号 + password: guest # RabbitMQ 服务的密码 + # Kafka 配置项,对应 KafkaProperties 配置类 + kafka: + bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 + +--- #################### 服务保障相关配置 #################### + +# Lock4j 配置项 +lock4j: + acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒 + expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒 + +# Resilience4j 配置项 +resilience4j: + ratelimiter: + instances: + backendA: + limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50 + limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500 + timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s + register-health-indicator: true # 是否注册到健康监测 + +--- #################### 监控相关配置 #################### + +# Actuator 监控端点的配置项 +management: + endpoints: + web: + base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + +# Spring Boot Admin 配置项 +spring: + boot: + admin: + # Spring Boot Admin Client 客户端的相关配置 + client: + url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址 + instance: + service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME] + # Spring Boot Admin Server 服务端的相关配置 + context-path: /admin # 配置 Spring + +# 日志文件配置 +logging: + file: + name: ${logback.path}/${spring.application.name}.log # 日志文件名,全路径 + level: + com.chanko.yunxi.mes.module.heli: debug + +--- #################### 微信公众号相关配置 #################### +wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档 + mp: + # 公众号配置(必填) + app-id: wx041349c6f39b268b + secret: 5abee519483bc9f8cb37ce280e814bd0 + # 存储配置,解决 AccessToken 的跨节点的共享 + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wx # Redis Key 的前缀 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档 + appid: wx63c280fe3248a3e7 + secret: 6f270509224a7ae1296bbf1c8cb97aed + config-storage: + type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取 + key-prefix: wa # Redis Key 的前缀 + http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台 + +--- #################### 芋道相关配置 #################### + +# 芋道配置项,设置当前项目所有自定义的配置 +mes: + xss: + enable: false + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 + pay: + order-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/order # 支付渠道的【支付】回调地址 + refund-notify-url: http://yunai.natapp1.cc/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址 + demo: true # 开启演示模式 + tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc + +justauth: + enabled: true + type: + DINGTALK: # 钉钉 + client-id: dingvrnreaje3yqvzhxg + client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI + ignore-check-redirect-uri: true + WECHAT_ENTERPRISE: # 企业微信 + client-id: wwd411c69a39ad2e54 + client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw + agent-id: 1000004 + ignore-check-redirect-uri: true + cache: + type: REDIS + prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: + timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 +wx: + mp: + useRedis: false + defaultContent: \u60A8\u597D\uFF0C\u6709\u4EC0\u4E48\u95EE\u9898\uFF1F + redisConfig: + host: 127.0.0.1 + port: 6379 + password: diff --git a/mes-server/src/main/resources/application.yaml b/mes-server/src/main/resources/application.yaml index 5331b08d..0cf712da 100644 --- a/mes-server/src/main/resources/application.yaml +++ b/mes-server/src/main/resources/application.yaml @@ -1,3 +1,5 @@ +logback: + path: D:\files\mes-heli\logs spring: application: name: mes-server diff --git a/mes-server/src/main/resources/logback-spring.xml b/mes-server/src/main/resources/logback-spring.xml index a3bc2e57..3444adea 100644 --- a/mes-server/src/main/resources/logback-spring.xml +++ b/mes-server/src/main/resources/logback-spring.xml @@ -47,14 +47,14 @@ - + @@ -65,11 +65,11 @@ - + - + - + diff --git a/mes-ui/mes-ui-admin-vue3/.env.base b/mes-ui/mes-ui-admin-vue3/.env.base index f8f0caa3..58b155d2 100644 --- a/mes-ui/mes-ui-admin-vue3/.env.base +++ b/mes-ui/mes-ui-admin-vue3/.env.base @@ -4,13 +4,13 @@ NODE_ENV=development VITE_DEV=true # 请求路径 -VITE_BASE_URL='http://192.168.0.137:8080' +VITE_BASE_URL='http://127.0.0.1:8080' # 上传路径 -VITE_UPLOAD_URL='http://192.168.0.137:8080/admin-api/infra/file/upload' +VITE_UPLOAD_URL='http://127.0.0.1:8080/admin-api/infra/file/upload' # 上传路径 -VITE_UPLOAD_BATCH_URL='http://192.168.0.137:8080/admin-api/infra/file/uploadBatch' +VITE_UPLOAD_BATCH_URL='http://127.0.0.1:8080/admin-api/infra/file/uploadBatch' # 接口前缀 VITE_API_BASEPATH=/dev-api diff --git a/mes-ui/mes-ui-admin-vue3/.env.pro b/mes-ui/mes-ui-admin-vue3/.env.pro index 8348e02e..06df38b2 100644 --- a/mes-ui/mes-ui-admin-vue3/.env.pro +++ b/mes-ui/mes-ui-admin-vue3/.env.pro @@ -4,10 +4,13 @@ NODE_ENV=production VITE_DEV=false # 请求路径 -VITE_BASE_URL='http://localhost:48080' +VITE_BASE_URL='http://localhost:8080' # 上传路径 -VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload' +VITE_UPLOAD_URL='http://localhost:8080/admin-api/infra/file/upload' + +# 上传路径 +VITE_UPLOAD_BATCH_URL='http://localhost:8080/admin-api/infra/file/uploadBatch' # 接口前缀 VITE_API_BASEPATH= diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/projectorder/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/projectorder/index.ts new file mode 100644 index 00000000..b95f811e --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/projectorder/index.ts @@ -0,0 +1,81 @@ +import request from '@/config/axios' + +export interface ProjectOrderVO { + id: number + code: string + orderStatus: number + deliveryStatus: number + businessDeptId: number + customerId: number + mouldName: string + businessLine: string + blueprintNo: string + hasPrice: number + price: number + currency: string + projectStartTime: Date + projectEndTime: Date + isUrgency: number + property: number + referenceTechnology: string + hasAlter: number + lastAlterTime: Date + qualityRequirement: string + remark: string + hasContract: number + hasTechnologyProtocol: number + hasBlueprint: number + blueprintRemark: string + status: number + businessMan: number + contractNo: string + active: string + activeOpinion: string + projectOrderSubs: any + isSnapshot: number + snapshotId: number + snapshotCode: string + orderTime: Date + snapshotOrderTime: Date +} + +// 查询项目订单分页 +export const getProjectOrderPage = async (params) => { + return await request.get({ url: `/heli/project-order/page`, params }) +} + +// 查询项目订单详情 +export const getProjectOrder = async (id: number) => { + return await request.get({ url: `/heli/project-order/get?id=` + id }) +} + +// 新增项目订单 +export const createProjectOrder = async (data: ProjectOrderVO) => { + return await request.post({ url: `/heli/project-order/create`, data }) +} + +// 修改项目订单 +export const updateProjectOrder = async (data: ProjectOrderVO) => { + return await request.put({ url: `/heli/project-order/update`, data }) +} + +// 删除项目订单 +export const deleteProjectOrder = async (id: number) => { + return await request.delete({ url: `/heli/project-order/delete?id=` + id }) +} + +// 导出项目订单 Excel +export const exportProjectOrder = async (params) => { + return await request.download({ url: `/heli/project-order/export-excel`, params }) +} + +// ==================== 子表(项目订单子项目) ==================== + +// 获得项目订单子项目列表 +export const getProjectOrderSubListByProjectOrderId = async (projectOrderId) => { + return await request.get({ url: `/heli/project-order/project-order-sub/list-by-project-order-id?projectOrderId=` + projectOrderId }) +} + +export async function operateProjectOrder(data: ProjectOrderVO) { + return await request.post({ url: `/heli/project-order/operate`, data }) +} diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/storage/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/storage/index.ts new file mode 100644 index 00000000..995c7c06 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/storage/index.ts @@ -0,0 +1,53 @@ +import request from '@/config/axios' + +export interface StorageVO { + id: number + stockType: number + stockInType: number + stockOutType: number + stockNo: string + headerNo: number + description: string + status: number + whId: number + keeper: number + keeperTime: Date + outbound: number + outboundTime: Date + cancel: number + cancelTime: Date +} + +// 查询入/出库分页 +export const getStoragePage = async (params) => { + return await request.get({ url: `/heli/storage/page`, params }) +} + +// 查询入/出库详情 +export const getStorage = async (id: number) => { + return await request.get({ url: `/heli/storage/get?id=` + id }) +} + +// 新增入/出库 +export const createStorage = async (data: StorageVO) => { + return await request.post({ url: `/heli/storage/create`, data }) +} + +// 修改入/出库 +export const updateStorage = async (data: StorageVO) => { + return await request.put({ url: `/heli/storage/update`, data }) +} +// 修改入/出库 +export const updateStorageStatus = async (data: StorageVO) => { + return await request.put({ url: `/heli/storage/update-status`, data }) +} + +// 删除入/出库 +export const deleteStorage = async (id: number) => { + return await request.delete({ url: `/heli/storage/delete?id=` + id }) +} + +// 导出入/出库 Excel +export const exportStorage = async (params) => { + return await request.download({ url: `/heli/storage/export-excel`, params }) +} diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/storagelog/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/storagelog/index.ts new file mode 100644 index 00000000..e479f3f9 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/storagelog/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +export interface StorageLogVO { + id: number + stockId: number + matId: number + whId: number + rgId: number + pnId: number + storageOkQty: number + lotNo: string + description: string +} + +// 查询入/出库日志分页 +export const getStorageLogPage = async (params) => { + return await request.get({ url: `/heli/storage-log/page`, params }) +} + +// 查询入/出库日志详情 +export const getStorageLog = async (id: number) => { + return await request.get({ url: `/heli/storage-log/get?id=` + id }) +} + +// 新增入/出库日志 +export const createStorageLog = async (data: StorageLogVO) => { + return await request.post({ url: `/heli/storage-log/create`, data }) +} + +// 修改入/出库日志 +export const updateStorageLog = async (data: StorageLogVO) => { + return await request.put({ url: `/heli/storage-log/update`, data }) +} + +// 删除入/出库日志 +export const deleteStorageLog = async (id: number) => { + return await request.delete({ url: `/heli/storage-log/delete?id=` + id }) +} + +// 导出入/出库日志 Excel +export const exportStorageLog = async (params) => { + return await request.download({ url: `/heli/storage-log/export-excel`, params }) +} \ No newline at end of file diff --git a/mes-ui/mes-ui-admin-vue3/src/api/heli/storagemat/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/heli/storagemat/index.ts new file mode 100644 index 00000000..8bc6f8fe --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/api/heli/storagemat/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' + +export interface StorageMatVO { + id: number + stockId: number + matId: number + whId: number + rgId: number + pnId: number + storageOkQty: number + lotNo: string + projectNo: string + description: string +} + +// 查询入/出库物料详情 +export const getStorageMatList = async () => { + return await request.get({ url: `/heli/storage-mat/get-materials`}) +} + +// 查询入/出库物料分页 +export const getStorageMatPage = async (params) => { + return await request.get({ url: `/heli/storage-mat/page`, params }) +} + +// 查询入/出库物料详情 +export const getStorageMat = async (id: number) => { + return await request.get({ url: `/heli/storage-mat/get?id=` + id }) +} + +// 新增入/出库物料 +export const createStorageMat = async (data: StorageMatVO) => { + return await request.post({ url: `/heli/storage-mat/create`, data }) +} + +// 批量新增入/出库物料 +export const createStorageMatBatch = async (data: StorageMatVO[],id:number) => { + return await request.post({ url: `/heli/storage-mat/create-batch?stockid=`+id, data }) +} + + +// 修改入/出库物料 +export const updateStorageMat = async (data: StorageMatVO) => { + return await request.put({ url: `/heli/storage-mat/update`, data }) +} + +// 删除入/出库物料 +export const deleteStorageMat = async (id: number) => { + return await request.delete({ url: `/heli/storage-mat/delete?id=` + id }) +} + +// 导出入/出库物料 Excel +export const exportStorageMat = async (params) => { + return await request.download({ url: `/heli/storage-mat/export-excel`, params }) +} diff --git a/mes-ui/mes-ui-admin-vue3/src/api/infra/file/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/infra/file/index.ts index f64bc0d6..478fb9fd 100644 --- a/mes-ui/mes-ui-admin-vue3/src/api/infra/file/index.ts +++ b/mes-ui/mes-ui-admin-vue3/src/api/infra/file/index.ts @@ -4,6 +4,9 @@ export interface FilePageReqVO extends PageParam { path?: string type?: string createTime?: Date[] + businessType: string + businessId: number + businessFileType: string } // 查询文件列表 @@ -15,3 +18,13 @@ export const getFilePage = (params: FilePageReqVO) => { export const deleteFile = (id: number) => { return request.delete({ url: '/infra/file/delete?id=' + id }) } + +// 下载文件 +export const downloadFile = async (url) => { + return await request.download({ url: url }) +} + +// 删除文件 +export const deleteFileLogic = (id: number) => { + return request.delete({ url: '/infra/file/deleteLogic?id=' + id }) +} diff --git a/mes-ui/mes-ui-admin-vue3/src/assets/imgs/exlogo.png b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/exlogo.png new file mode 100644 index 00000000..ec2c529b Binary files /dev/null and b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/exlogo.png differ diff --git a/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status16.png b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status16.png new file mode 100644 index 00000000..9ed57d74 Binary files /dev/null and b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status16.png differ diff --git a/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status3.png b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status3.png new file mode 100644 index 00000000..9042e1b1 Binary files /dev/null and b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status3.png differ diff --git a/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status32.png b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status32.png new file mode 100644 index 00000000..699ed6bc Binary files /dev/null and b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status32.png differ diff --git a/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status64.png b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status64.png new file mode 100644 index 00000000..824a7122 Binary files /dev/null and b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status64.png differ diff --git a/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status8.png b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status8.png new file mode 100644 index 00000000..b384b2fb Binary files /dev/null and b/mes-ui/mes-ui-admin-vue3/src/assets/imgs/status/status8.png differ diff --git a/mes-ui/mes-ui-admin-vue3/src/components/UploadFile/src/UploadFileBatch.vue b/mes-ui/mes-ui-admin-vue3/src/components/UploadFile/src/UploadFileBatch.vue index 1cfe25a1..5d8a3c0a 100644 --- a/mes-ui/mes-ui-admin-vue3/src/components/UploadFile/src/UploadFileBatch.vue +++ b/mes-ui/mes-ui-admin-vue3/src/components/UploadFile/src/UploadFileBatch.vue @@ -10,7 +10,7 @@ :auto-upload="autoUpload" :action="updateUrl" :headers="uploadHeaders" - :data="{'businessType': businessType, 'businessId': businessId}" + :data="{'businessType': businessType, 'businessId': businessId, 'businessFileType': businessFileType}" :limit="props.limit" :drag="drag" :before-upload="beforeUpload" @@ -44,8 +44,9 @@ const message = useMessage() // 消息弹窗 const emit = defineEmits(['update:modelValue']) const props = defineProps({ - businessType: propTypes.string, - businessId: propTypes.number, + businessType: propTypes.string, // 业务类型 + businessId: propTypes.number, // 业务id + businessFileType: propTypes.string, // 业务文件类型 区分不同业务文件 modelValue: propTypes.oneOfType([String, Array]).isRequired, title: propTypes.string.def('文件上传'), updateUrl: propTypes.string.def(import.meta.env.VITE_UPLOAD_BATCH_URL), diff --git a/mes-ui/mes-ui-admin-vue3/src/directives/index.ts b/mes-ui/mes-ui-admin-vue3/src/directives/index.ts index 89cc8ba1..b0bc635a 100644 --- a/mes-ui/mes-ui-admin-vue3/src/directives/index.ts +++ b/mes-ui/mes-ui-admin-vue3/src/directives/index.ts @@ -1,6 +1,7 @@ import type { App } from 'vue' import { hasRole } from './permission/hasRole' import { hasPermi } from './permission/hasPermi' +import { hasPost } from './permission/hasPost' /** * 导出指令:v-xxx @@ -10,4 +11,5 @@ import { hasPermi } from './permission/hasPermi' export const setupAuth = (app: App) => { hasRole(app) hasPermi(app) + hasPost(app) } diff --git a/mes-ui/mes-ui-admin-vue3/src/directives/permission/hasPost.ts b/mes-ui/mes-ui-admin-vue3/src/directives/permission/hasPost.ts new file mode 100644 index 00000000..ae301fc1 --- /dev/null +++ b/mes-ui/mes-ui-admin-vue3/src/directives/permission/hasPost.ts @@ -0,0 +1,26 @@ +import type { App } from 'vue' +import { CACHE_KEY, useCache } from '@/hooks/web/useCache' + +const { t } = useI18n() // 国际化 + +export function hasPost(app: App) { + app.directive('hasPost', (el, binding) => { + const { wsCache } = useCache() + const { value } = binding + const posts = wsCache.get(CACHE_KEY.USER).posts + console.log(posts); + if (value && value instanceof Array && value.length > 0) { + const postFlag = value + + const hasPost = posts.some((post: string) => { + return postFlag.includes(post) + }) + + if (!hasPost) { + el.parentNode && el.parentNode.removeChild(el) + } + } else { + throw new Error(t('permission.hasPost')) + } + }) +} diff --git a/mes-ui/mes-ui-admin-vue3/src/layout/components/AppView.vue b/mes-ui/mes-ui-admin-vue3/src/layout/components/AppView.vue index ffdf11f5..e5698433 100644 --- a/mes-ui/mes-ui-admin-vue3/src/layout/components/AppView.vue +++ b/mes-ui/mes-ui-admin-vue3/src/layout/components/AppView.vue @@ -20,6 +20,15 @@ const getCaches = computed((): string[] => { }) const tagsView = computed(() => appStore.getTagsView) + +const isRouterAlive = ref(true) +const reload = () => { + isRouterAlive.value = false; + nextTick(() => { + isRouterAlive.value = true; + }) +} +provide('reload', reload)