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/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 2dcec43c..8f6cb1df 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 @@ -20,14 +20,16 @@ import com.chanko.yunxi.mes.framework.common.exception.ErrorCode; 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, "车间不存在"); 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..2bb4c8e6 --- /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,27 @@ +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, "已保存"), + 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/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 index 7e16cd9d..6424d4e9 100644 --- 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 @@ -1,106 +1,133 @@ -package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder; - -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.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.module.heli.service.projectorder.ProjectOrderService; - -@Tag(name = "管理后台 - 项目订单") -@RestController -@RequestMapping("/heli/project-order") -@Validated -public class ProjectOrderController { - - @Resource - private ProjectOrderService projectOrderService; - - @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); - } - - @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)); - } - -} \ No newline at end of file +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.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) + 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()); + 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/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 index 87c5a761..6cac2174 100644 --- 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 @@ -1,14 +1,15 @@ 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.*; -import java.util.*; -import javax.validation.constraints.*; -import java.util.*; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import java.math.BigDecimal; -import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; -import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO; +import java.util.List; @Schema(description = "管理后台 - 项目订单新增/修改 Request VO") @Data @@ -18,7 +19,6 @@ public class ProjectOrderSaveReqVO { private Long id; @Schema(description = "项目编号,唯一", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "项目编号,唯一不能为空") private String code; @Schema(description = "单据状态 已保存/已送审/已审核/已启动/已打回/已终止", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @@ -116,6 +116,13 @@ public class ProjectOrderSaveReqVO { @Schema(description = "合同编号") private String contractNo; + @Schema(description = "操作类型") + @NotBlank(message = "操作类型不能为空") + private String active; + + @Schema(description = "操作意见") + private String activeOpinion; + @Schema(description = "项目订单子项目列表") private List projectOrderSubs; 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/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 index cfe59fdb..2e494e19 100644 --- 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 @@ -1,5 +1,8 @@ package com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder; +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.util.*; import java.math.BigDecimal; @@ -162,4 +165,52 @@ public class ProjectOrderDO extends BaseDO { */ private String contractNo; + 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.AUDIT.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(final 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(); + default: + return false; + } + } + } 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 index c744dada..faba23f5 100644 --- 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 @@ -60,4 +60,9 @@ public class ProjectOrderSubDO extends BaseDO { */ private String unit; + /** + * 删除 物理删除 + */ + private Boolean deleted; + } 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/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/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 index 04bb89e2..0951e1de 100644 --- 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 @@ -1,66 +1,71 @@ -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); - -} \ No newline at end of file +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); +} 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 index 125f9f7c..9541ca17 100644 --- 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 @@ -1,23 +1,33 @@ package com.chanko.yunxi.mes.module.heli.service.projectorder; -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.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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.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.service.customer.CustomerService; +import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; +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.util.Date; +import java.util.List; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; +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 实现类 @@ -33,15 +43,28 @@ public class ProjectOrderServiceImpl implements ProjectOrderService { @Resource private ProjectOrderSubMapper projectOrderSubMapper; + @Resource + private SerialNumberService serialNumberService; + + @Resource + private CustomerService customerService; + @Override @Transactional(rollbackFor = Exception.class) public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) { // 插入 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()); // 返回 return projectOrder.getId(); } @@ -50,7 +73,10 @@ public class ProjectOrderServiceImpl implements ProjectOrderService { @Transactional(rollbackFor = Exception.class) public void updateProjectOrder(ProjectOrderSaveReqVO updateReqVO) { // 校验存在 - validateProjectOrderExists(updateReqVO.getId()); + ProjectOrderDO oldDO = validateProjectOrderExists(updateReqVO.getId()); + if(!oldDO.canOperate(OperateTypeEnum.valueOf(updateReqVO.getActive()))){ + throw exception(INVALID_OPERATE); + } // 更新 ProjectOrderDO updateObj = BeanUtils.toBean(updateReqVO, ProjectOrderDO.class); projectOrderMapper.updateById(updateObj); @@ -63,7 +89,10 @@ public class ProjectOrderServiceImpl implements ProjectOrderService { @Transactional(rollbackFor = Exception.class) public void deleteProjectOrder(Long id) { // 校验存在 - validateProjectOrderExists(id); + ProjectOrderDO projectOrderDO = validateProjectOrderExists(id); + if(!projectOrderDO.canDelete()){ + throw exception(INVALID_OPERATE); + } // 删除 projectOrderMapper.deleteById(id); @@ -71,10 +100,15 @@ public class ProjectOrderServiceImpl implements ProjectOrderService { deleteProjectOrderSubByProjectOrderId(id); } - private void validateProjectOrderExists(Long id) { - if (projectOrderMapper.selectById(id) == null) { + 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 @@ -94,6 +128,16 @@ public class ProjectOrderServiceImpl implements ProjectOrderService { return projectOrderSubMapper.selectListByProjectOrderId(projectOrderId); } + @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.setProjectOrderId(projectOrderId)); projectOrderSubMapper.insertBatch(list); 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..ae39ac96 --- /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,63 @@ +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 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..6c864361 --- /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,104 @@ +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 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, BusinesTypeEnum.PROJECT_ORDER.name()); + 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/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-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/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/FileServiceImpl.java b/mes-module-infra/mes-module-infra-biz/src/main/java/com/chanko/yunxi/mes/module/infra/service/file/FileServiceImpl.java index d9b878a3..2d28d3ff 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 @@ -58,6 +58,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); 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 index a9d4fef5..c7c13d71 100644 --- 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 @@ -29,6 +29,10 @@ export interface ProjectOrderVO { status: number businessMan: number contractNo: string + active: string + activeOpinion: string + projectOrderSubs: any + } // 查询项目订单分页 @@ -67,3 +71,7 @@ export const exportProjectOrder = async (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/infra/file/index.ts b/mes-ui/mes-ui-admin-vue3/src/api/infra/file/index.ts index dcf306b8..fe59446c 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 } // 查询文件列表 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)