【功能优化】订单详情页面完善+新增序列号记录表辅助编号生成

pull/1/head
zengchenxi 9 months ago
parent a7b183d786
commit add027b3e8

@ -1,5 +1,8 @@
package com.chanko.yunxi.mes.framework.operatelog.core.service; package com.chanko.yunxi.mes.framework.operatelog.core.service;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
/** /**
* Framework Service * Framework Service
* *
@ -14,4 +17,15 @@ public interface OperateLogFrameworkService {
*/ */
void createOperateLog(OperateLog operateLog); 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; package com.chanko.yunxi.mes.framework.operatelog.core.service;
import cn.hutool.core.bean.BeanUtil; 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.OperateLogApi;
import com.chanko.yunxi.mes.module.system.api.logger.dto.OperateLogCreateReqDTO; import com.chanko.yunxi.mes.module.system.api.logger.dto.OperateLogCreateReqDTO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Async; 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 * Framework Service
* *
@ -25,4 +34,28 @@ public class OperateLogFrameworkServiceImpl implements OperateLogFrameworkServic
operateLogApi.createOperateLog(reqDTO); 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);
}
} }

@ -25,6 +25,10 @@ public enum CodeEnum {
* Wa+ * Wa+
* WI++4 * WI++4
* WO++4 * WO++4
* WC++4
* +++
* HL++
*
* */ * */
FACTORY("工厂", "Fa", 4), FACTORY("工厂", "Fa", 4),
DEPT("部门", "De", 4), DEPT("部门", "De", 4),
@ -36,6 +40,8 @@ public enum CodeEnum {
WAREHOUSE("仓库", "Wa", 4), WAREHOUSE("仓库", "Wa", 4),
STOCK_IN("入库单", "WI", 4, "yyyyMMdd"), STOCK_IN("入库单", "WI", 4, "yyyyMMdd"),
STOCK_OUT("出库单", "WO", 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; 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){ 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; String sequenceNo = suffix.length() > this.sequenceLength ? suffix.substring(suffix.length() - this.sequenceLength) : suffix;
Object[] args = new Object[this.sequenceArgsLength]; Object[] args = new Object[this.sequenceArgsLength];
int i = 0; int i = 0;
args[i++] = this.prefix; args[i++] = prefix;
if(!StringUtils.isEmpty(this.dateFormat)){ if(!StringUtils.isEmpty(this.dateFormat)){
args[i++] = (new SimpleDateFormat(this.dateFormat).format(new Date())); args[i++] = (new SimpleDateFormat(this.dateFormat).format(new Date()));
} }

@ -20,14 +20,16 @@ import com.chanko.yunxi.mes.framework.common.exception.ErrorCode;
public interface ErrorCodeConstants { public interface ErrorCodeConstants {
ErrorCode CODE_REPEAT = new ErrorCode(1_000_001, "编码不能重复"); 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 MATERIAL_NOT_EXISTS = new ErrorCode(1_001_001, "物料不存在");
ErrorCode COMPOSITION_NOT_EXISTS = new ErrorCode(1_001_002, "材质不存在"); ErrorCode COMPOSITION_NOT_EXISTS = new ErrorCode(1_001_002, "材质不存在");
ErrorCode CLIENT_NOT_EXISTS = new ErrorCode(1_001_003, "客户信息不存在"); ErrorCode CLIENT_NOT_EXISTS = new ErrorCode(1_001_003, "客户信息不存在");
ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode( 1_001_004, "客户新表信息不存在"); ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode( 1_001_004, "客户新表信息不存在");
ErrorCode SUPPLIER_NOT_EXISTS = new ErrorCode(1_001_005, "供应商不存在"); ErrorCode SUPPLIER_NOT_EXISTS = new ErrorCode(1_001_005, "供应商不存在");
ErrorCode PROCEDURE_NOT_EXISTS = new ErrorCode(1_001_006, "工序不存在"); 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, "车间不存在"); ErrorCode WORKSHOP_NOT_EXISTS = new ErrorCode(1_002_001, "车间不存在");

@ -0,0 +1,27 @@
package com.chanko.yunxi.mes.module.heli.enums;
import lombok.Getter;
/**
*
* @author chenxi
* @date 2024-01-18 01:19
*/
@Getter
public enum ProjectOrderStatusEnum {
REPULSE(3, "已打回"),
SAVE(4, "已保存"),
SUBMIT_AUDIT(8, "已送审"),
AUDIT(16, "已审核"),
APPROVE(32, "已启动"),
TERMINATE(64, "已终止")
;
private int code;
private String description;
ProjectOrderStatusEnum(int code, String description) {
this.code = code;
this.description = description;
}
}

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

@ -1,106 +1,133 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder; package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder;
import org.springframework.web.bind.annotation.*; import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import javax.annotation.Resource; import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import org.springframework.validation.annotation.Validated; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import org.springframework.security.access.prepost.PreAuthorize; import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import io.swagger.v3.oas.annotations.tags.Tag; import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
import io.swagger.v3.oas.annotations.Parameter; import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog;
import io.swagger.v3.oas.annotations.Operation; import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
import javax.validation.constraints.*; import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.ProjectOrderPageReqVO;
import javax.validation.*; import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.ProjectOrderRespVO;
import javax.servlet.http.*; import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.ProjectOrderSaveReqVO;
import java.util.*; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import java.io.IOException; 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.framework.common.pojo.PageParam; import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import io.swagger.v3.oas.annotations.Operation;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; import io.swagger.v3.oas.annotations.Parameter;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; import io.swagger.v3.oas.annotations.tags.Tag;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils; import org.springframework.web.bind.annotation.*;
import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog; import javax.annotation.Resource;
import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.*; import javax.validation.Valid;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import java.io.IOException;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO; import java.time.LocalDateTime;
import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService; import java.util.List;
@Tag(name = "管理后台 - 项目订单") import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
@RestController import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@RequestMapping("/heli/project-order")
@Validated @Tag(name = "管理后台 - 项目订单")
public class ProjectOrderController { @RestController
@RequestMapping("/heli/project-order")
@Resource @Validated
private ProjectOrderService projectOrderService; public class ProjectOrderController {
@PostMapping("/create") @Resource
@Operation(summary = "创建项目订单") private ProjectOrderService projectOrderService;
@PreAuthorize("@ss.hasPermission('heli:project-order:create')")
public CommonResult<Long> createProjectOrder(@Valid @RequestBody ProjectOrderSaveReqVO createReqVO) { @Resource
return success(projectOrderService.createProjectOrder(createReqVO)); private OperateLogFrameworkService operateLogFrameworkService;
}
@Resource
@PutMapping("/update") private HttpServletRequest request;
@Operation(summary = "更新项目订单")
@PreAuthorize("@ss.hasPermission('heli:project-order:update')") @PostMapping("/create")
public CommonResult<Boolean> updateProjectOrder(@Valid @RequestBody ProjectOrderSaveReqVO updateReqVO) { @Operation(summary = "创建项目订单")
projectOrderService.updateProjectOrder(updateReqVO); @PreAuthorize("@ss.hasPermission('heli:project-order:create')")
return success(true); public CommonResult<Long> createProjectOrder(@Valid @RequestBody ProjectOrderSaveReqVO createReqVO) {
} return success(projectOrderService.createProjectOrder(createReqVO));
}
@DeleteMapping("/delete")
@Operation(summary = "删除项目订单") @PutMapping("/update")
@Parameter(name = "id", description = "编号", required = true) @Operation(summary = "更新项目订单")
@PreAuthorize("@ss.hasPermission('heli:project-order:delete')") @PreAuthorize("@ss.hasPermission('heli:project-order:update')")
public CommonResult<Boolean> deleteProjectOrder(@RequestParam("id") Long id) { public CommonResult<Boolean> updateProjectOrder(@Valid @RequestBody ProjectOrderSaveReqVO updateReqVO) {
projectOrderService.deleteProjectOrder(id); projectOrderService.updateProjectOrder(updateReqVO);
return success(true); return success(true);
} }
@GetMapping("/get") @PostMapping("/operate")
@Operation(summary = "获得项目订单") @Operation(summary = "操作项目订单")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('heli:project-order:update')")
@PreAuthorize("@ss.hasPermission('heli:project-order:query')") @OperateLog(enable = false)
public CommonResult<ProjectOrderRespVO> getProjectOrder(@RequestParam("id") Long id) { public CommonResult<Long> operateProjectOrder(@Valid @RequestBody ProjectOrderSaveReqVO operateReqVO) {
ProjectOrderDO projectOrder = projectOrderService.getProjectOrder(id); LocalDateTime startTime = LocalDateTime.now();
return success(BeanUtils.toBean(projectOrder, ProjectOrderRespVO.class)); projectOrderService.operateProjectOrder(operateReqVO);
}
// 手动记录日志
@GetMapping("/page") operateLogFrameworkService.createOperateLog(request,
@Operation(summary = "获得项目订单分页") startTime,
@PreAuthorize("@ss.hasPermission('heli:project-order:query')") BusinesTypeEnum.PROJECT_ORDER.name(),
public CommonResult<PageResult<ProjectOrderRespVO>> getProjectOrderPage(@Valid ProjectOrderPageReqVO pageReqVO) { operateReqVO.getId(),
PageResult<ProjectOrderDO> pageResult = projectOrderService.getProjectOrderPage(pageReqVO); OperateTypeEnum.valueOf(operateReqVO.getActive()).getType(),
return success(BeanUtils.toBean(pageResult, ProjectOrderRespVO.class)); operateReqVO.getActiveOpinion());
} return success(operateReqVO.getId());
}
@GetMapping("/export-excel")
@Operation(summary = "导出项目订单 Excel") @DeleteMapping("/delete")
@PreAuthorize("@ss.hasPermission('heli:project-order:export')") @Operation(summary = "删除项目订单")
@OperateLog(type = EXPORT) @Parameter(name = "id", description = "编号", required = true)
public void exportProjectOrderExcel(@Valid ProjectOrderPageReqVO pageReqVO, @PreAuthorize("@ss.hasPermission('heli:project-order:delete')")
HttpServletResponse response) throws IOException { public CommonResult<Boolean> deleteProjectOrder(@RequestParam("id") Long id) {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); projectOrderService.deleteProjectOrder(id);
List<ProjectOrderDO> list = projectOrderService.getProjectOrderPage(pageReqVO).getList(); return success(true);
// 导出 Excel }
ExcelUtils.write(response, "项目订单.xls", "数据", ProjectOrderRespVO.class,
BeanUtils.toBean(list, ProjectOrderRespVO.class)); @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) {
@GetMapping("/project-order-sub/list-by-project-order-id") ProjectOrderDO projectOrder = projectOrderService.getProjectOrder(id);
@Operation(summary = "获得项目订单子项目列表") return success(BeanUtils.toBean(projectOrder, ProjectOrderRespVO.class));
@Parameter(name = "projectOrderId", description = "项目订单id") }
@PreAuthorize("@ss.hasPermission('heli:project-order:query')")
public CommonResult<List<ProjectOrderSubDO>> getProjectOrderSubListByProjectOrderId(@RequestParam("projectOrderId") Long projectOrderId) { @GetMapping("/page")
return success(projectOrderService.getProjectOrderSubListByProjectOrderId(projectOrderId)); @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));
}
}

@ -1,14 +1,15 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo; 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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.Data;
import java.util.*;
import javax.validation.constraints.*; import javax.validation.constraints.NotBlank;
import java.util.*; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal; import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO; import java.util.List;
@Schema(description = "管理后台 - 项目订单新增/修改 Request VO") @Schema(description = "管理后台 - 项目订单新增/修改 Request VO")
@Data @Data
@ -18,7 +19,6 @@ public class ProjectOrderSaveReqVO {
private Long id; private Long id;
@Schema(description = "项目编号,唯一", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "项目编号,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "项目编号,唯一不能为空")
private String code; private String code;
@Schema(description = "单据状态 已保存/已送审/已审核/已启动/已打回/已终止", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "单据状态 已保存/已送审/已审核/已启动/已打回/已终止", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ -116,6 +116,13 @@ public class ProjectOrderSaveReqVO {
@Schema(description = "合同编号") @Schema(description = "合同编号")
private String contractNo; private String contractNo;
@Schema(description = "操作类型")
@NotBlank(message = "操作类型不能为空")
private String active;
@Schema(description = "操作意见")
private String activeOpinion;
@Schema(description = "项目订单子项目列表") @Schema(description = "项目订单子项目列表")
private List<ProjectOrderSubDO> projectOrderSubs; private List<ProjectOrderSubDO> projectOrderSubs;

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

@ -1,5 +1,8 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder; package com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderStatusEnum;
import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -162,4 +165,52 @@ public class ProjectOrderDO extends BaseDO {
*/ */
private String contractNo; private String contractNo;
public boolean canSave(){
return this.orderStatus.intValue() <= ProjectOrderStatusEnum.SAVE.getCode();
}
public boolean canSubmitAudit(){
return this.orderStatus.intValue() < ProjectOrderStatusEnum.SUBMIT_AUDIT.getCode();
}
public boolean canAudit(){
return this.orderStatus.intValue() == ProjectOrderStatusEnum.SUBMIT_AUDIT.getCode();
}
public boolean canApprove(){
return this.orderStatus.intValue() == ProjectOrderStatusEnum.AUDIT.getCode();
}
public boolean canTerminate(){
return this.orderStatus.intValue() == ProjectOrderStatusEnum.AUDIT.getCode();
}
public boolean canRepulse(){
return this.orderStatus.intValue() == ProjectOrderStatusEnum.SUBMIT_AUDIT.getCode() ||
this.orderStatus.intValue() == ProjectOrderStatusEnum.AUDIT.getCode();
}
public boolean canDelete(){
return this.orderStatus.intValue() == ProjectOrderStatusEnum.SAVE.getCode() && this.hasAlter.intValue() == YesOrNoEnum.NO.getCode();
}
public boolean canOperate(final OperateTypeEnum operateTypeEnum){
switch (operateTypeEnum){
case SAVE:
return canSave();
case SUBMIT_AUDIT:
return canSubmitAudit();
case AUDIT:
return canAudit();
case APPROVE:
return canApprove();
case REPULSE:
return canRepulse();
case TERMINATE:
return canTerminate();
default:
return false;
}
}
} }

@ -60,4 +60,9 @@ public class ProjectOrderSubDO extends BaseDO {
*/ */
private String unit; private String unit;
/**
*
*/
private Boolean deleted;
} }

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

@ -1,66 +1,71 @@
package com.chanko.yunxi.mes.module.heli.service.projectorder; package com.chanko.yunxi.mes.module.heli.service.projectorder;
import java.util.*; import java.util.*;
import javax.validation.*; import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.*; 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.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO; 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.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam; import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/** /**
* Service * Service
* *
* @author * @author
*/ */
public interface ProjectOrderService { public interface ProjectOrderService {
/** /**
* *
* *
* @param createReqVO * @param createReqVO
* @return * @return
*/ */
Long createProjectOrder(@Valid ProjectOrderSaveReqVO createReqVO); Long createProjectOrder(@Valid ProjectOrderSaveReqVO createReqVO);
/** /**
* *
* *
* @param updateReqVO * @param updateReqVO
*/ */
void updateProjectOrder(@Valid ProjectOrderSaveReqVO updateReqVO); void updateProjectOrder(@Valid ProjectOrderSaveReqVO updateReqVO);
/** /**
* *
* *
* @param id * @param id
*/ */
void deleteProjectOrder(Long id); void deleteProjectOrder(Long id);
/** /**
* *
* *
* @param id * @param id
* @return * @return
*/ */
ProjectOrderDO getProjectOrder(Long id); ProjectOrderDO getProjectOrder(Long id);
/** /**
* *
* *
* @param pageReqVO * @param pageReqVO
* @return * @return
*/ */
PageResult<ProjectOrderDO> getProjectOrderPage(ProjectOrderPageReqVO pageReqVO); PageResult<ProjectOrderDO> getProjectOrderPage(ProjectOrderPageReqVO pageReqVO);
// ==================== 子表(项目订单子项目) ==================== // ==================== 子表(项目订单子项目) ====================
/** /**
* *
* *
* @param projectOrderId id * @param projectOrderId id
* @return * @return
*/ */
List<ProjectOrderSubDO> getProjectOrderSubListByProjectOrderId(Long projectOrderId); List<ProjectOrderSubDO> getProjectOrderSubListByProjectOrderId(Long projectOrderId);
} /**
*
* @param operateReqVO
*/
void operateProjectOrder(ProjectOrderSaveReqVO operateReqVO);
}

@ -1,23 +1,33 @@
package com.chanko.yunxi.mes.module.heli.service.projectorder; package com.chanko.yunxi.mes.module.heli.service.projectorder;
import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub.ProjectOrderSubDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; import com.chanko.yunxi.mes.framework.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.ProjectOrderMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import com.chanko.yunxi.mes.module.heli.service.customer.CustomerService;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_ORDER;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.INVALID_OPERATE;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.PROJECT_ORDER_NOT_EXISTS;
/** /**
* Service * Service
@ -33,15 +43,28 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Resource @Resource
private ProjectOrderSubMapper projectOrderSubMapper; private ProjectOrderSubMapper projectOrderSubMapper;
@Resource
private SerialNumberService serialNumberService;
@Resource
private CustomerService customerService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) { public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) {
// 插入 // 插入
ProjectOrderDO projectOrder = BeanUtils.toBean(createReqVO, ProjectOrderDO.class); 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); projectOrderMapper.insert(projectOrder);
// 插入子表 // 插入子表
createProjectOrderSubList(projectOrder.getId(), createReqVO.getProjectOrderSubs()); createProjectOrderSubList(projectOrder.getId(), createReqVO.getProjectOrderSubs());
createReqVO.setId(projectOrder.getId());
// 返回 // 返回
return projectOrder.getId(); return projectOrder.getId();
} }
@ -50,7 +73,10 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateProjectOrder(ProjectOrderSaveReqVO updateReqVO) { public void updateProjectOrder(ProjectOrderSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
validateProjectOrderExists(updateReqVO.getId()); ProjectOrderDO oldDO = validateProjectOrderExists(updateReqVO.getId());
if(!oldDO.canOperate(OperateTypeEnum.valueOf(updateReqVO.getActive()))){
throw exception(INVALID_OPERATE);
}
// 更新 // 更新
ProjectOrderDO updateObj = BeanUtils.toBean(updateReqVO, ProjectOrderDO.class); ProjectOrderDO updateObj = BeanUtils.toBean(updateReqVO, ProjectOrderDO.class);
projectOrderMapper.updateById(updateObj); projectOrderMapper.updateById(updateObj);
@ -63,7 +89,10 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteProjectOrder(Long id) { public void deleteProjectOrder(Long id) {
// 校验存在 // 校验存在
validateProjectOrderExists(id); ProjectOrderDO projectOrderDO = validateProjectOrderExists(id);
if(!projectOrderDO.canDelete()){
throw exception(INVALID_OPERATE);
}
// 删除 // 删除
projectOrderMapper.deleteById(id); projectOrderMapper.deleteById(id);
@ -71,10 +100,15 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
deleteProjectOrderSubByProjectOrderId(id); deleteProjectOrderSubByProjectOrderId(id);
} }
private void validateProjectOrderExists(Long id) { private ProjectOrderDO validateProjectOrderExists(Long id) {
if (projectOrderMapper.selectById(id) == null) { 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); throw exception(PROJECT_ORDER_NOT_EXISTS);
} }
return projectOrderDO;
} }
@Override @Override
@ -94,6 +128,16 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
return projectOrderSubMapper.selectListByProjectOrderId(projectOrderId); return projectOrderSubMapper.selectListByProjectOrderId(projectOrderId);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void operateProjectOrder(ProjectOrderSaveReqVO operateReqVO) {
if(operateReqVO.getId() == null){
createProjectOrder(operateReqVO);
}else{
updateProjectOrder(operateReqVO);
}
}
private void createProjectOrderSubList(Long projectOrderId, List<ProjectOrderSubDO> list) { private void createProjectOrderSubList(Long projectOrderId, List<ProjectOrderSubDO> list) {
list.forEach(o -> o.setProjectOrderId(projectOrderId)); list.forEach(o -> o.setProjectOrderId(projectOrderId));
projectOrderSubMapper.insertBatch(list); projectOrderSubMapper.insertBatch(list);

@ -0,0 +1,63 @@
package com.chanko.yunxi.mes.module.heli.service.serialnumber;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/**
* Service
*
* @author
*/
public interface SerialNumberService {
/**
*
*
* @param createReqVO
* @return
*/
Long createSerialNumber(@Valid SerialNumberSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateSerialNumber(@Valid SerialNumberSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteSerialNumber(Long id);
/**
*
*
* @param id
* @return
*/
SerialNumberDO getSerialNumber(Long id);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<SerialNumberDO> getSerialNumberPage(SerialNumberPageReqVO pageReqVO);
/**
*
* @param businessType
* @param segment
* @return
*/
SerialNumberDO getSerialNumber(String businessType, String segment);
}

@ -0,0 +1,104 @@
package com.chanko.yunxi.mes.module.heli.service.serialnumber;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.serialnumber.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.dal.mysql.serialnumber.SerialNumberMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class SerialNumberServiceImpl implements SerialNumberService {
@Resource
private SerialNumberMapper serialNumberMapper;
@Override
public Long createSerialNumber(SerialNumberSaveReqVO createReqVO) {
// 插入
SerialNumberDO serialNumber = BeanUtils.toBean(createReqVO, SerialNumberDO.class);
serialNumberMapper.insert(serialNumber);
// 返回
return serialNumber.getId();
}
@Override
public void updateSerialNumber(SerialNumberSaveReqVO updateReqVO) {
// 校验存在
validateSerialNumberExists(updateReqVO.getId());
// 更新
SerialNumberDO updateObj = BeanUtils.toBean(updateReqVO, SerialNumberDO.class);
serialNumberMapper.updateById(updateObj);
}
@Override
public void deleteSerialNumber(Long id) {
// 校验存在
validateSerialNumberExists(id);
// 删除
serialNumberMapper.deleteById(id);
}
private void validateSerialNumberExists(Long id) {
if (serialNumberMapper.selectById(id) == null) {
throw exception(SERIAL_NUMBER_NOT_EXISTS);
}
}
@Override
public SerialNumberDO getSerialNumber(Long id) {
return serialNumberMapper.selectById(id);
}
@Override
public PageResult<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, BusinesTypeEnum.PROJECT_ORDER.name());
eq(SerialNumberDO::getSegment, segment);
last("LIMIT 1 FOR UPDATE");
}};
SerialNumberDO serialNumberDO = serialNumberMapper.selectOne(query);
if(serialNumberDO == null){
// 初始化一条数据
try {
serialNumberDO = new SerialNumberDO();
serialNumberDO.setBusinessType(businessType)
.setSegment(segment)
.setSerialNumber(0l);
serialNumberMapper.insert(serialNumberDO);
}catch (Exception e){
// do nothing
}
// 二次获取
serialNumberDO = serialNumberMapper.selectOne(query);
}
return serialNumberDO;
}
}

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

@ -21,6 +21,9 @@ public class FileRespVO {
@Schema(description = "业务id", example = "18052") @Schema(description = "业务id", example = "18052")
private Long businessId; private Long businessId;
@Schema(description = "业务文件类型 用于业务关联", example = "1")
private String businessFileType;
@Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "mes.jpg") @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "mes.jpg")
private String path; private String path;

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

@ -58,6 +58,7 @@ public class FileServiceImpl implements FileService {
FileDO file = new FileDO(); FileDO file = new FileDO();
file.setBusinessId(businessId); file.setBusinessId(businessId);
file.setBusinessType(businessType); file.setBusinessType(businessType);
file.setBusinessFileType(businessFileType);
file.setConfigId(client.getId()); file.setConfigId(client.getId());
file.setName(name); file.setName(name);
file.setPath(path); file.setPath(path);

@ -29,6 +29,10 @@ export interface ProjectOrderVO {
status: number status: number
businessMan: number businessMan: number
contractNo: string contractNo: string
active: string
activeOpinion: string
projectOrderSubs: any
} }
// 查询项目订单分页 // 查询项目订单分页
@ -67,3 +71,7 @@ export const exportProjectOrder = async (params) => {
export const getProjectOrderSubListByProjectOrderId = async (projectOrderId) => { export const getProjectOrderSubListByProjectOrderId = async (projectOrderId) => {
return await request.get({ url: `/heli/project-order/project-order-sub/list-by-project-order-id?projectOrderId=` + 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 })
}

@ -4,6 +4,9 @@ export interface FilePageReqVO extends PageParam {
path?: string path?: string
type?: string type?: string
createTime?: Date[] createTime?: Date[]
businessType: string
businessId: number
businessFileType: string
} }
// 查询文件列表 // 查询文件列表

@ -20,6 +20,15 @@ const getCaches = computed((): string[] => {
}) })
const tagsView = computed(() => appStore.getTagsView) const tagsView = computed(() => appStore.getTagsView)
const isRouterAlive = ref(true)
const reload = () => {
isRouterAlive.value = false;
nextTick(() => {
isRouterAlive.value = true;
})
}
provide('reload', reload)
</script> </script>
<template> <template>
@ -49,7 +58,7 @@ const tagsView = computed(() => appStore.getTagsView)
} }
]" ]"
> >
<router-view> <router-view v-if="isRouterAlive">
<template #default="{ Component, route }"> <template #default="{ Component, route }">
<keep-alive :include="getCaches"> <keep-alive :include="getCaches">
<component :is="Component" :key="route.fullPath" /> <component :is="Component" :key="route.fullPath" />

@ -54,7 +54,9 @@ export default {
updateTime: 'Update Time', updateTime: 'Update Time',
copy: 'Copy', copy: 'Copy',
copySuccess: 'Copy Success', copySuccess: 'Copy Success',
copyError: 'Copy Error' copyError: 'Copy Error',
operationSuccess: 'Operation Success',
operationFailed: 'Operation Failed',
}, },
error: { error: {
noPermission: `Sorry, you don't have permission to access this page.`, noPermission: `Sorry, you don't have permission to access this page.`,

@ -54,7 +54,9 @@ export default {
updateTime: '更新时间', updateTime: '更新时间',
copy: '复制', copy: '复制',
copySuccess: '复制成功', copySuccess: '复制成功',
copyError: '复制失败' copyError: '复制失败',
operationSuccess: '操作成功',
operationFailed: '操作失败',
}, },
error: { error: {
noPermission: `抱歉,您无权访问此页面。`, noPermission: `抱歉,您无权访问此页面。`,

@ -1,7 +1,7 @@
<template> <template>
<el-card class="hl-card"> <el-card class="hl-card">
<template #header> <template #header>
<span>编辑</span> <span><span v-html="dialogTitle"></span></span>
</template> </template>
<el-form <el-form
ref="formRef" ref="formRef"
@ -142,7 +142,7 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="客户名称" prop="customerId"> <el-form-item label="客户名称" prop="customerId">
<el-select v-model="formData.customerId" <el-select v-model="formData.customerId"
placeholder="请输入负责人" placeholder="请输入客户名称"
:remote-method="remoteCustomerSearch" :remote-method="remoteCustomerSearch"
remote-show-suffix remote-show-suffix
remote remote
@ -208,8 +208,8 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注" prop="description"> <el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="formData.description" show-word-limit maxlength="200"/> <el-input type="textarea" v-model="formData.remark" show-word-limit maxlength="200"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -240,11 +240,15 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="价格(元)" prop="price"> <el-form-item label="价格(元)" prop="price">
<el-input v-model="formData.price" placeholder="请输入价格(元)" > <el-input-number v-model="formData.price" :disabled="formData.hasPrice == 0 && (formData.price = '')" placeholder="请输入价格(元)" :controls="false" :min="0" :precision="6" />
<template #append> <el-select v-model="formData.currency" placeholder="请选择币种">
{{getDictLabel(DICT_TYPE.HELI_CURRENCY, formData.currency)}} <el-option
</template> v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CURRENCY)"
</el-input> :key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -311,7 +315,7 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="" label-width="0" prop="blueprintRemark"> <el-form-item label="" label-width="0" prop="blueprintRemark">
<el-input v-model="formData.blueprintRemark" /> <el-input v-model="formData.blueprintRemark" placeholder="请输入图纸/数模说明" :disabled="formData.hasBlueprint == 0 && (formData.blueprintRemark = '')"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -352,7 +356,7 @@
<el-table-column label="数量" min-width="150"> <el-table-column label="数量" min-width="150">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!"> <el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!">
<el-input v-model="row.amount" placeholder="请输入数量" /> <el-input-number v-model="row.amount" placeholder="请输入数量" :min="0" :precision="0"/>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
@ -436,7 +440,7 @@
name="files" name="files"
:show-file-list="false" :show-file-list="false"
:auto-upload="false" :auto-upload="false"
:data="{'businessType': 'PROJECT_ORDER', 'businessId': formData.id, 'businessFileType': 'CONTRACT'}" :data="contractUploadData"
:on-change="contractUploadChange" :on-change="contractUploadChange"
class="upload-file-uploader" class="upload-file-uploader"
> >
@ -451,7 +455,7 @@
name="files" name="files"
:show-file-list="false" :show-file-list="false"
:auto-upload="false" :auto-upload="false"
:data="{'businessType': 'PROJECT_ORDER', 'businessId': formData.id, 'businessFileType': 'TECHNOLOGY_PROTOCOL'}" :data="protocolUploadData"
:on-change="protocolUploadChange" :on-change="protocolUploadChange"
class="upload-file-uploader" class="upload-file-uploader"
> >
@ -480,31 +484,59 @@
</el-col> </el-col>
</el-row> </el-row>
</el-card> </el-card>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-table :data="formData.operateLogs" class="hl-table">
<el-table-column prop="type" label="操作" align="center" >
<template #default="scope">
{{getDictLabel(DICT_TYPE.SYSTEM_OPERATE_TYPE, scope.row.type)}}
</template>
</el-table-column>
<el-table-column prop="userNickname" label="操作人" align="center" />
<el-table-column
label="操作时间"
align="center"
prop="startTime"
width="180"
:formatter="dateFormatter"
/>
<el-table-column prop="content" label="操作意见" align="center" />
</el-table>
</el-card>
</el-col>
</el-row>
</el-card>
</el-form> </el-form>
<div class="text-center hl-footer"> <div class="text-center hl-footer">
<el-button @click="() => router.back()" size="large"> </el-button> <el-button @click="() => router.back()" size="large"> </el-button>
<el-button @click="formData.active='SAVE' && submitForm" type="success" :disabled="formLoading" size="large" <el-button @click="submitForm('SAVE')" type="success" size="large"
> </el-button > </el-button
> >
<el-button @click="formData.active='SUBMIT_AUDIT' && submitForm" type="primary" :disabled="formLoading" size="large" <el-button @click="submitForm('SUBMIT_AUDIT')" type="primary" size="large"
> </el-button > </el-button
> >
<el-button @click="formData.active='AUDIT' && submitForm" type="primary" :disabled="formLoading" size="large" <el-button @click="submitForm('AUDIT')" type="primary" size="large"
> </el-button > </el-button
> >
<el-button @click="formData.active='APPROVE' && submitForm" type="primary" :disabled="formLoading" size="large" <el-button @click="submitForm('APPROVE')" type="primary" size="large"
> </el-button > </el-button
> >
<el-button @click="formData.active='REPULSE' && submitForm" type="danger" :disabled="formLoading" size="large" <el-button @click="submitForm('REPULSE')" type="danger" size="large"
> </el-button > </el-button
> >
<el-button @click="formData.active='TERMINATE' && submitForm" type="danger" :disabled="formLoading" size="large" <el-button @click="submitForm('TERMINATE')" type="danger" size="large"
>直接终止</el-button >直接终止</el-button
> >
</div> </div>
</el-card> </el-card>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {inject} from 'vue'
import {getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel} from '@/utils/dict' import {getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel} from '@/utils/dict'
import * as ProjectOrderApi from '@/api/heli/projectorder' import * as ProjectOrderApi from '@/api/heli/projectorder'
import {dateFormatter, formatDate} from "@/utils/formatTime"; import {dateFormatter, formatDate} from "@/utils/formatTime";
@ -515,25 +547,26 @@ import * as CustomerApi from "@/api/heli/customer/index"
import * as CompositionApi from "@/api/heli/composition/index" import * as CompositionApi from "@/api/heli/composition/index"
import {getAccessToken, getTenantId} from "@/utils/auth"; import {getAccessToken, getTenantId} from "@/utils/auth";
import {UploadUserFile} from "element-plus"; import {UploadUserFile} from "element-plus";
import {deleteFile, downloadFile} from "@/api/infra/file"; import {deleteFile, downloadFile, getFilePage} from "@/api/infra/file";
import {propTypes} from "@/utils/propTypes"; import {propTypes} from "@/utils/propTypes";
import download from "@/utils/download"; import download from "@/utils/download";
import {useUserStore} from "@/store/modules/user"; import {useUserStore} from "@/store/modules/user";
import {getUserProfile} from "@/api/system/user/profile"; import {getUserProfile} from "@/api/system/user/profile";
import {getOperateLogPage} from "@/api/system/operatelog";
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
const { query } = useRoute() const { query } = useRoute()
const router = useRouter(); const router = useRouter();
const reload = inject('reload')
const dialogVisible = ref(false) //
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formType = ref('') // create - update - const formType = ref('') // create - update -
const formData = ref({ const formData = ref({
id: undefined, id: undefined,
code: undefined, code: undefined,
orderStatus: undefined, orderStatus: 4,
deliveryStatus: 1, deliveryStatus: 1,
businessDeptId: undefined, businessDeptId: undefined,
customerId: undefined, customerId: undefined,
@ -556,13 +589,15 @@ const formData = ref({
hasTechnologyProtocol: 0, hasTechnologyProtocol: 0,
hasBlueprint: 0, hasBlueprint: 0,
blueprintRemark: undefined, blueprintRemark: undefined,
status: undefined, status: 1,
businessMan: undefined, businessMan: undefined,
createTime: new Date(), createTime: new Date(),
projectOrderSubs: [], projectOrderSubs: [],
attachments: [], attachments: [],
operateLogs: [],
contractNo: undefined, contractNo: undefined,
active: '' active: '',
activeOpinion: ''
}) })
const formRules = reactive({ const formRules = reactive({
businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }], businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }],
@ -651,7 +686,6 @@ const projectOrderSubFormRef = ref()
/** 打开弹窗 */ /** 打开弹窗 */
const queryData = async (type: string, id?: number) => { const queryData = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type) dialogTitle.value = t('action.' + type)
formType.value = type formType.value = type
resetForm() resetForm()
@ -660,6 +694,26 @@ const queryData = async (type: string, id?: number) => {
try { try {
if (id) { if (id) {
formData.value = await ProjectOrderApi.getProjectOrder(id) formData.value = await ProjectOrderApi.getProjectOrder(id)
//
formData.value.projectOrderSubs = await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(id);
//
let logParams = {
pageNo: 1,
pageSize: 99,
businessId: id,
businessType: 'PROJECT_ORDER'
}
formData.value.operateLogs = (await getOperateLogPage(logParams)).list;
//
let attParams = {
pageNo: 1,
pageSize: 99,
businessId: id,
businessType: 'PROJECT_ORDER'
}
formData.value.attachments = (await getFilePage(attParams)).list;
} }
// //
deptList.value = handleTree(await DeptApi.getSimpleDeptList()) deptList.value = handleTree(await DeptApi.getSimpleDeptList())
@ -697,7 +751,6 @@ const queryData = async (type: string, id?: number) => {
// //
formData.value.businessMan = useUserStore().getUser.id // formData.value.businessMan = useUserStore().getUser.id //
const userProfile = await getUserProfile(formData.value.businessMan); const userProfile = await getUserProfile(formData.value.businessMan);
console.log(userProfile)
if(userProfile.dept){ if(userProfile.dept){
formData.value.businessDeptId = userProfile.dept.id; formData.value.businessDeptId = userProfile.dept.id;
} }
@ -706,8 +759,9 @@ const queryData = async (type: string, id?: number) => {
} }
} }
const submitForm = async () => { const submitForm = async (active) => {
// //
formData.value.active = active;
await formRef.value.validate() await formRef.value.validate()
// //
try { try {
@ -719,17 +773,21 @@ const submitForm = async () => {
formLoading.value = true formLoading.value = true
try { try {
const data = formData.value as unknown as ProjectOrderApi.ProjectOrderVO const data = formData.value as unknown as ProjectOrderApi.ProjectOrderVO
// const orderId = await ProjectOrderApi.operateProjectOrder(data)
data.projectOrderSubs = projectOrderSubFormRef.value.getData() message.success(t('common.operationSuccess'))
if (formType.value === 'create') { //
await ProjectOrderApi.createProjectOrder(data) if(contractUploadFiles.value.length > 0){
message.success(t('common.createSuccess')) contractUploadData.value = {'businessType': 'PROJECT_ORDER', 'businessId': orderId, 'businessFileType': 'CONTRACT'};
} else { contractUploadRef.value!.submit();
await ProjectOrderApi.updateProjectOrder(data)
message.success(t('common.updateSuccess'))
} }
dialogVisible.value = false if(protocolUploadFiles.value.length > 0){
} finally { protocolUploadData.value = {'businessType': 'PROJECT_ORDER', 'businessId': orderId, 'businessFileType': 'TECHNOLOGY_PROTOCOL'};
protocolUploadRef.value!.submit();
}
//
reload();
query.id = orderId;
}finally {
formLoading.value = false formLoading.value = false
} }
} }
@ -745,7 +803,7 @@ const onAddItem = () => {
compositionId: undefined, compositionId: undefined,
unit: undefined, unit: undefined,
remark: undefined, remark: undefined,
status: undefined, status: 1,
} }
row.projectOrderId = formData.value.id row.projectOrderId = formData.value.id
formData.value.projectOrderSubs.push(row) formData.value.projectOrderSubs.push(row)
@ -758,9 +816,11 @@ const onDeleteItem = (index) => {
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL) const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
const contractUploadRef = ref(); const contractUploadRef = ref();
const contractUploadFiles = ref<UploadUserFile[]>([]); const contractUploadFiles = ref<UploadUserFile[]>([]);
const contractUploadData = ref({});
const protocolUploadRef = ref(); const protocolUploadRef = ref();
const protocolUploadFiles = ref<UploadUserFile[]>([]); const protocolUploadFiles = ref<UploadUserFile[]>([]);
const protocolUploadData = ref({});
const contractUploadChange = (file, files) => { const contractUploadChange = (file, files) => {
contractUploadFiles.value = files; contractUploadFiles.value = files;
@ -782,7 +842,7 @@ const refreshAttachments = (files, type) => {
} }
// //
formData.value.attachments.sort((v1,v2) => { formData.value.attachments.sort((v1,v2) => {
return v1.businessFileType == v2.businessFileType ? 0 : 1; return v1.createTime - v2.createTime < 0;
}) })
} }
@ -817,7 +877,7 @@ const resetForm = () => {
formData.value = { formData.value = {
id: undefined, id: undefined,
code: undefined, code: undefined,
orderStatus: undefined, orderStatus: 4,
deliveryStatus: 1, deliveryStatus: 1,
businessDeptId: undefined, businessDeptId: undefined,
customerId: undefined, customerId: undefined,
@ -840,12 +900,14 @@ const resetForm = () => {
hasTechnologyProtocol: 0, hasTechnologyProtocol: 0,
hasBlueprint: 0, hasBlueprint: 0,
blueprintRemark: undefined, blueprintRemark: undefined,
status: undefined, status: 1,
businessMan: undefined, businessMan: undefined,
createTime: new Date(), createTime: new Date(),
projectOrderSubs: [], projectOrderSubs: [],
attachments: [], attachments: [],
contractNo: undefined, contractNo: undefined,
active: '',
activeOpinion: ''
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }

@ -181,20 +181,34 @@
<template #default="scope"> <template #default="scope">
<el-button <el-button
link link
type="primary" type="danger"
@click="openDetail('update', scope.row.id)" @click="handleDelete(scope.row.id)"
v-hasPermi="['heli:project-order:update']" v-if="scope.row.orderStatus == 4 && scope.row.hasAlter == 0"
> >
编辑 删除
</el-button> </el-button>
<el-button <el-button
link link
type="danger" type="primary"
@click="handleDelete(scope.row.id)" @click="openDetail('update', scope.row.id)"
v-hasPermi="['heli:project-order:delete']" v-if="scope.row.orderStatus == 4 || scope.row.orderStatus == 3"
> >
删除 编辑
</el-button> </el-button>
<el-dropdown @command="(command) => handleCommand(command, scope.row.id)">
<span class="el-dropdown-link">
更多<el-icon class="el-icon--right"><arrow-down /></el-icon>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item command="detail">查看详情</el-dropdown-item>
<el-dropdown-item command="printProject">打印开发项目启动单</el-dropdown-item>
<el-dropdown-item command="alterProject">订单变更</el-dropdown-item>
<el-dropdown-item command="viewAlterProject">查看变更日志</el-dropdown-item>
<el-dropdown-item command="delivery">去发货</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -321,6 +335,14 @@ const handleExport = async () => {
} }
} }
const handleCommand = async (command, id) => {
switch (command){
case 'detail':
openDetail('detail', id);
break;
}
}
/** 初始化 **/ /** 初始化 **/
onMounted(() => { onMounted(() => {
getList() getList()

@ -118,3 +118,20 @@ CREATE TABLE `project_order_sub` (
ALTER TABLE project_order ADD COLUMN `contract_no` VARCHAR ( 128 ) COMMENT '模具名称' AFTER customer_id; ALTER TABLE project_order ADD COLUMN `contract_no` VARCHAR ( 128 ) COMMENT '模具名称' AFTER customer_id;
ALTER TABLE project_order_sub ADD COLUMN `unit` CHAR ( 1 ) NOT NULL COMMENT '单位' AFTER amount; ALTER TABLE project_order_sub ADD COLUMN `unit` CHAR ( 1 ) NOT NULL COMMENT '单位' AFTER amount;
DROP TABLE IF EXISTS `base_serial_number`;
CREATE TABLE `base_serial_number` (
`id` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`business_type` VARCHAR ( 32 ) NOT NULL COMMENT '业务类型 用于业务关联',
`segment` VARCHAR ( 16 ) NOT NULL COMMENT '序列参考段',
`serial_number` BIGINT ( 20 ) NOT NULL DEFAULT '0' COMMENT '序列号',
`status` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '状态,1表示正常2表示禁用',
`creator` VARCHAR ( 64 ) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR ( 64 ) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT ( 1 ) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT ( 20 ) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY ( `id` ) USING BTREE,
UNIQUE KEY `uk_business_segment` ( `business_type`, `segment` ) USING BTREE
) ENGINE = InnoDB COMMENT = '序列号记录表';

Loading…
Cancel
Save