release_1.1.0 #1

Merged
Ghost merged 134 commits from dev into master 9 months ago

@ -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;
}
}

@ -38,6 +38,14 @@ public @interface OperateLog {
* null
*/
OperateTypeEnum[] type() default {};
/**
*
*/
String businessType() default "";
/**
* id
*/
long businessId() default 0L;
// ========== 开关字段 ==========

@ -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());

@ -40,6 +40,34 @@ public enum OperateTypeEnum {
*
*/
IMPORT(6),
/*
*
* */
SAVE(7),
/*
*
* */
SUBMIT_AUDIT(8),
/*
*
* */
AUDIT(9),
/*
*
* */
APPROVE(10),
/*
*
* */
REPULSE(11),
/*
*
* */
ALTER(12),
/*
*
* */
TERMINATE(13),
/**
*
*

@ -17,7 +17,14 @@ public class OperateLog {
*
*/
private String traceId;
/**
*
*/
private String businessType;
/**
* id
*/
private Long businessId;
/**
*
*/

@ -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);
}

@ -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);
}
}

@ -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;
}
}

@ -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;
}
}

@ -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()));
}

@ -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, "项目订单不存在");
}

@ -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;
}
}

@ -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;
}
}

@ -32,6 +32,11 @@
<artifactId>mes-module-system-biz</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.chanko.yunxi</groupId>
<artifactId>mes-module-infra-biz</artifactId>
<version>${revision}</version>
</dependency>
<!-- 业务组件 -->
<dependency>
@ -117,6 +122,12 @@
<artifactId>mes-spring-boot-starter-file</artifactId>
</dependency>
<dependency>
<groupId>com.github.dadiyang</groupId>
<artifactId>equator</artifactId>
<version>1.0.4</version>
</dependency>
</dependencies>
</project>

@ -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<Long> createProjectOrder(@Valid @RequestBody ProjectOrderSaveReqVO createReqVO) {
return success(projectOrderService.createProjectOrder(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新项目订单")
@PreAuthorize("@ss.hasPermission('heli:project-order:update')")
public CommonResult<Boolean> 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<Long> 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<Boolean> 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<ProjectOrderRespVO> 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<PageResult<ProjectOrderRespVO>> getProjectOrderPage(@Valid ProjectOrderPageReqVO pageReqVO) {
PageResult<ProjectOrderDO> 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<ProjectOrderDO> 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<List<ProjectOrderSubDO>> getProjectOrderSubListByProjectOrderId(@RequestParam("projectOrderId") Long projectOrderId) {
return success(projectOrderService.getProjectOrderSubListByProjectOrderId(projectOrderId));
}
}

@ -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<Integer> 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;
}

@ -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<String> alterFieldNames;
@Schema(description = "创建人名称")
private String creatorName;
}

@ -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<ProjectOrderSubDO> 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;
}

@ -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<Long> createSerialNumber(@Valid @RequestBody SerialNumberSaveReqVO createReqVO) {
return success(serialNumberService.createSerialNumber(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新序列号记录")
@PreAuthorize("@ss.hasPermission('heli:serial-number:update')")
public CommonResult<Boolean> 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<Boolean> 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<SerialNumberRespVO> 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<PageResult<SerialNumberRespVO>> getSerialNumberPage(@Valid SerialNumberPageReqVO pageReqVO) {
PageResult<SerialNumberDO> 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<SerialNumberDO> list = serialNumberService.getSerialNumberPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "序列号记录.xls", "数据", SerialNumberRespVO.class,
BeanUtils.toBean(list, SerialNumberRespVO.class));
}
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<Long> createStorage(@Valid @RequestBody StorageSaveReqVO createReqVO) {
return success(storageService.createStorage(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新入/出库")
@PreAuthorize("@ss.hasPermission('heli:storage:update')")
public CommonResult<Boolean> updateStorage(@Valid @RequestBody StorageSaveReqVO updateReqVO) {
storageService.updateStorage(updateReqVO);
return success(true);
}
@PutMapping("/update-status")
@Operation(summary = "更新入/出库")
@PreAuthorize("@ss.hasPermission('heli:storage:update')")
public CommonResult<Boolean> 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<Boolean> 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<StorageRespVO> 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<PageResult<StorageRespVO>> getStoragePage(@Valid StoragePageReqVO pageReqVO) {
PageResult<StorageDO> 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<StorageDO> list = storageService.getStoragePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "入/出库.xls", "数据", StorageRespVO.class,
BeanUtils.toBean(list, StorageRespVO.class));
}
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<Long> createStorageLog(@Valid @RequestBody StorageLogSaveReqVO createReqVO) {
return success(storageLogService.createStorageLog(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新入/出库日志")
@PreAuthorize("@ss.hasPermission('heli:storage-log:update')")
public CommonResult<Boolean> 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<Boolean> 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<StorageLogRespVO> 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<PageResult<StorageLogRespVO>> getStorageLogPage(@Valid StorageLogPageReqVO pageReqVO) {
PageResult<StorageLogDO> 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<StorageLogDO> list = storageLogService.getStorageLogPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "入/出库日志.xls", "数据", StorageLogRespVO.class,
BeanUtils.toBean(list, StorageLogRespVO.class));
}
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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<Long> createStorageMat(@Valid @RequestBody StorageMatSaveReqVO createReqVO) {
return success(storageMatService.createStorageMat(createReqVO));
}
@PostMapping("/create-batch")
@Operation(summary = "批量创建入/出库物料")
@PreAuthorize("@ss.hasPermission('heli:storage-mat:create')")
public CommonResult<Long> createStorageMat(@Valid @RequestBody List<StorageMatSaveReqVO> 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<Boolean> 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<Boolean> 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<StorageMatRespVO> 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<PageResult<StorageMatRespVO>> getStorageMatPage(@Valid StorageMatPageReqVO pageReqVO) {
PageResult<StorageMatDO> 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<StorageMatDO> 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<List<StorageMatValidRespVO>> getStorageMatList() {
List<StorageMatValidRespVO> list = storageMatService.getStorageMatList();
return success(BeanUtils.toBean(list, StorageMatValidRespVO.class));
}
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
}

@ -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;
/**
* ,12
*/
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<String> 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();
}
}

@ -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;
/**
* ,12
*/
private Boolean status;
/**
*
*/
private String unit;
/**
*
*/
private Boolean deleted;
/**
*
* */
@TableField(exist = false)
private Set<String> alterFieldNames;
/**
*
*/
@TableField(exist = false)
private String compositionName;
}

@ -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;
/**
* ,12
*/
private Integer status;
}

@ -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;
/**
* 12
*
* {@link TODO heli_storage_type }
*/
private Integer stockType;
/**
* ()123
*
* {@link TODO heli_storage_in_type }
*/
private Integer stockInType;
/**
* ()1234
*
* {@link TODO heli_storage_out_type }
*/
private Integer stockOutType;
/**
* /
*/
private String stockNo;
/**
*
*/
private Long headerNo;
/**
*
*/
private String description;
/**
* 123
*
* {@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;
}

@ -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;
}

@ -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;
}

@ -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<ProjectOrderDO> {
default PageResult<ProjectOrderDO> selectPage(ProjectOrderPageReqVO reqVO) {
MPJLambdaWrapper<ProjectOrderDO> 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<ProjectOrderDO> 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);
}
}

@ -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<ProjectOrderSubDO> {
default List<ProjectOrderSubDO> selectListByProjectOrderId(Long projectOrderId) {
MPJLambdaWrapper<ProjectOrderSubDO> 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);
}
}

@ -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<SerialNumberDO> {
default PageResult<SerialNumberDO> selectPage(SerialNumberPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<SerialNumberDO>()
.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));
}
}

@ -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<StorageDO> {
default PageResult<StorageDO> selectPage(StoragePageReqVO reqVO) {
MPJLambdaWrapper<StorageDO> 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<StorageDO>()
// .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));
}
}

@ -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<StorageLogDO> {
default PageResult<StorageLogDO> selectPage(StorageLogPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<StorageLogDO>()
.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));
}
}

@ -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<StorageMatDO> {
default PageResult<StorageMatDO> selectPage(StorageMatPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<StorageMatDO>()
.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<StorageMatValidRespVO> selectStorageMatValid();
}

@ -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<ProjectOrderDO> getProjectOrderPage(ProjectOrderPageReqVO pageReqVO);
// ==================== 子表(项目订单子项目) ====================
/**
*
*
* @param projectOrderId id
* @return
*/
List<ProjectOrderSubDO> getProjectOrderSubListByProjectOrderId(Long projectOrderId);
/**
*
* @param operateReqVO
*/
void operateProjectOrder(ProjectOrderSaveReqVO operateReqVO);
/**
*
* @param operateReqVO
*/
void createProjectOrderSnapshot(ProjectOrderSaveReqVO operateReqVO);
}

@ -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<FileDO> filePage = fileService.getFilePage(new FilePageReqVO() {{
setPageNo(1);
setPageSize(99);
setBusinessId(createReqVO.getId());
setBusinessType(BusinesTypeEnum.PROJECT_ORDER.name());
}});
if(filePage.getTotal() > 0){
List<FileDO> 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<ProjectOrderDO>() {{
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<ProjectOrderDO>() {{
eq(ProjectOrderDO::getSnapshotId, id);
orderByDesc(ProjectOrderDO::getId);
last("LIMIT 1");
}});
if(lastSnapshot != null){
List<FieldInfo> diffFields = FIELD_EQUATOR.getDiffFields(projectOrderDO, lastSnapshot);
projectOrderDO.setAlterFieldNames(diffFields.stream().map(FieldInfo::getFieldName).collect(Collectors.toSet()));
// 附件
List<FileDO> fileList = new ArrayList<>(16);
PageResult<FileDO> 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<FileDO> lastSnapshotFilelist = new ArrayList<>(16);;
PageResult<FileDO> 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<ProjectOrderDO> getProjectOrderPage(ProjectOrderPageReqVO pageReqVO) {
return projectOrderMapper.selectPage(pageReqVO);
}
// ==================== 子表(项目订单子项目) ====================
@Override
public List<ProjectOrderSubDO> getProjectOrderSubListByProjectOrderId(Long projectOrderId) {
List<ProjectOrderSubDO> projectOrderSubDOList = projectOrderSubMapper.selectListByProjectOrderId(projectOrderId);
if(!projectOrderSubDOList.isEmpty()){
// 查询最近归档历史并对比变化字段
try {
ProjectOrderDO lastSnapshot = projectOrderMapper.selectOne(new LambdaQueryWrapper<ProjectOrderDO>() {{
eq(ProjectOrderDO::getSnapshotId, projectOrderId);
orderByDesc(ProjectOrderDO::getId);
last("LIMIT 1");
}});
if(lastSnapshot != null){
List<ProjectOrderSubDO> lastSnapshotSubDOList = projectOrderSubMapper.selectList(ProjectOrderSubDO::getProjectOrderId, lastSnapshot.getId());
Map<String, List<ProjectOrderSubDO>> nameGroups = lastSnapshotSubDOList.stream().collect(Collectors.groupingBy(ProjectOrderSubDO::getName));
projectOrderSubDOList.forEach(projectOrderSubDO -> {
List<ProjectOrderSubDO> lastSnapshotSubs = nameGroups.get(projectOrderSubDO.getName());
if(lastSnapshotSubs.isEmpty()) return;
List<FieldInfo> 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<ProjectOrderSubDO> list) {
list.forEach(o -> o.setId(null).setProjectOrderId(projectOrderId));
projectOrderSubMapper.insertBatch(list);
}
private void updateProjectOrderSubList(Long projectOrderId, List<ProjectOrderSubDO> list) {
deleteProjectOrderSubByProjectOrderId(projectOrderId);
list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下1id 冲突2updateTime 不更新
createProjectOrderSubList(projectOrderId, list);
}
private void deleteProjectOrderSubByProjectOrderId(Long projectOrderId) {
projectOrderSubMapper.deleteByProjectOrderId(projectOrderId);
}
}

@ -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<SerialNumberDO> getSerialNumberPage(SerialNumberPageReqVO pageReqVO);
/**
*
* @param businessType
* @param segment
* @return
*/
SerialNumberDO getSerialNumber(String businessType, String segment);
}

@ -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<SerialNumberDO> getSerialNumberPage(SerialNumberPageReqVO pageReqVO) {
return serialNumberMapper.selectPage(pageReqVO);
}
@Override
@Transactional(rollbackFor = Exception.class)
public SerialNumberDO getSerialNumber(String businessType, String segment) {
LambdaQueryWrapperX<SerialNumberDO> query = new LambdaQueryWrapperX<SerialNumberDO>() {{
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;
}
}

@ -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<StorageDO> getStoragePage(StoragePageReqVO pageReqVO);
}

@ -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<StorageDO> getStoragePage(StoragePageReqVO pageReqVO) {
return storageMapper.selectPage(pageReqVO);
}
}

@ -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<StorageLogDO> getStorageLogPage(StorageLogPageReqVO pageReqVO);
}

@ -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<StorageLogDO> getStorageLogPage(StorageLogPageReqVO pageReqVO) {
return storageLogMapper.selectPage(pageReqVO);
}
}

@ -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<StorageMatDO> getStorageMatPage(StorageMatPageReqVO pageReqVO);
/**
* /
*
* @return /
*/
List<StorageMatValidRespVO> getStorageMatList();
int deleteStorageMatList(Long stockid);
}

@ -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<StorageMatDO> getStorageMatPage(StorageMatPageReqVO pageReqVO) {
return storageMatMapper.selectPage(pageReqVO);
}
@Override
public List<StorageMatValidRespVO> getStorageMatList() {
return storageMatMapper.selectStorageMatValid();
}
@Override
public int deleteStorageMatList(Long stockid) {
//删除条件
Map<String, Object> columnMap = Maps.newHashMap();
columnMap.put("stock_id", stockid);
return storageMatMapper.deleteByMap(columnMap);
}
}

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chanko.yunxi.mes.module.heli.dal.mysql.serialnumber.SerialNumberMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chanko.yunxi.mes.module.heli.dal.mysql.storage.StorageMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="selectStorageMatLogList" resultType="com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO">
select * from v_storage_material_log
</select>
</mapper>

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chanko.yunxi.mes.module.heli.dal.mysql.storagemat.StorageMatMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<resultMap id="StorageMatValidRespVO" type="com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo.StorageMatValidRespVO">
<result property="matId" column="mat_id"/>
<result property="matName" column="mat_name"/>
<result property="matCode" column="mat_code"/>
<result property="materialType" column="material_type"/>
<result property="whId" column="wh_id"/>
<result property="rgId" column="rg_id"/>
<result property="pnId" column="pn_id"/>
<result property="matSpec" column="mat_spec"/>
<result property="matUnit" column="mat_unit"/>
<result property="lotNo" column="lot_no"/>
<result property="matRest" column="mat_rest"/>
<result property="storageOkQty" column="storage_ok_qty"/>
</resultMap>
<select id="selectStorageMatValid" resultType="com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo.StorageMatValidRespVO">
select mat_id,mat_name,mat_code,mat_rest,material_type,wh_id,rg_id,pn_id,spec as mat_spec,unit as mat_unit,lot_no,storage_ok_qty from v_storage_material_amount where mat_rest > 0
</select>
</mapper>

@ -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<ProcedureDO> pageResult = procedureService.getProcedurePage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbProcedure, pageResult.getList().get(0));
}
}

@ -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);
}

@ -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);
}
}

@ -48,7 +48,7 @@ public class FileController {
public CommonResult<String> 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<Void> 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<Boolean> deleteFileLogic(@RequestParam("id") Long id) throws Exception {
fileService.deleteFileLogic(id);
return success(true);
}
@GetMapping("/{configId}/get/**")
@PermitAll
@Operation(summary = "下载文件")

@ -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;

@ -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;
}

@ -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;
}

@ -32,7 +32,7 @@ public class AppFileController {
public CommonResult<String> 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()));
}
}

@ -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;

@ -39,6 +39,10 @@ public class FileDO extends BaseDO {
* id
*/
private Long businessId;
/**
*
*/
private String businessFileType;
/**
*
*/

@ -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
*
@ -27,9 +29,10 @@ public interface FileService {
* @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<FileDO> fileDOList);
}

@ -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<FileDO> fileDOList){
fileMapper.insertBatch(fileDOList);
}
}

@ -17,7 +17,14 @@ public class OperateLogCreateReqDTO {
*
*/
private String traceId;
/**
*
*/
private String businessType;
/**
* id
*/
private Long businessId;
/**
*
*/

@ -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<Long> 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<RoleDO> roles = roleService.getRoleList(roleIds);
roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); // 移除禁用的角色
@ -115,8 +119,15 @@ public class AuthController {
List<MenuDO> menuList = menuService.getMenuList(menuIds);
menuList.removeIf(menu -> !CommonStatusEnum.ENABLE.getStatus().equals(menu.getStatus())); // 移除禁用的菜单
// 1.4 获得岗位信息
List<PostDO> 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));
}
// ========== 短信登录相关 ==========

@ -28,6 +28,9 @@ public class AuthPermissionInfoRespVO {
@Schema(description = "菜单树", requiredMode = Schema.RequiredMode.REQUIRED)
private List<MenuVO> menus;
@Schema(description = "岗位数组", requiredMode = Schema.RequiredMode.REQUIRED)
private Set<String> posts;
@Schema(description = "用户信息 VO")
@Data
@NoArgsConstructor

@ -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<Integer> typeList;
@Schema(description = "操作状态", example = "true")
private Boolean success;

@ -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;

@ -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")

@ -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<RoleDO> roleList, List<MenuDO> menuList) {
default AuthPermissionInfoRespVO convert(AdminUserDO user, List<RoleDO> roleList, List<MenuDO> menuList, List<PostDO> 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();
}

@ -47,6 +47,14 @@ public class OperateLogDO extends BaseDO {
* 访logger
*/
private String traceId;
/**
*
*/
private String businessType;
/**
* id
*/
private Long businessId;
/**
*
*

@ -15,10 +15,14 @@ public interface OperateLogMapper extends BaseMapperX<OperateLogDO> {
default PageResult<OperateLogDO> selectPage(OperateLogPageReqVO reqVO, Collection<Long> userIds) {
LambdaQueryWrapperX<OperateLogDO> query = new LambdaQueryWrapperX<OperateLogDO>()
.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())) {

@ -18,9 +18,20 @@
从而实现提供 RESTful API 给 mes-ui-admin、mes-ui-user 等前端项目。
本质上来说,它就是个空壳(容器)!
</description>
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.chanko.yunxi</groupId>
<artifactId>mes-module-system-biz</artifactId>

@ -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 文档

@ -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

@ -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:

@ -1,3 +1,5 @@
logback:
path: D:\files\mes-heli\logs
spring:
application:
name: mes-server

@ -47,14 +47,14 @@
<appender-ref ref="FILE"/>
</appender>
<!-- SkyWalking GRPC 日志收集实现日志中心。注意SkyWalking 8.4.0 版本开始支持 -->
<!-- SkyWalking GRPC 日志收集实现日志中心。注意SkyWalking 8.4.0 版本开始支持
<appender name="GRPC" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${PATTERN_DEFAULT}</pattern>
</layout>
</encoder>
</appender>
</appender> -->
<!-- 本地环境 -->
<springProfile name="local">
@ -65,11 +65,11 @@
</root>
</springProfile>
<!-- 其它环境 -->
<springProfile name="dev,test,stage,prod,default">
<springProfile name="dev,test,stage,pro,default">
<root level="INFO">
<appender-ref ref="STDOUT"/>
<!--<appender-ref ref="STDOUT"/>-->
<appender-ref ref="ASYNC"/>
<appender-ref ref="GRPC"/>
<!--<appender-ref ref="GRPC"/>-->
</root>
</springProfile>

@ -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

@ -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=

@ -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 })
}

@ -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 })
}

@ -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 })
}

@ -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 })
}

@ -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 })
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save