【需求】bom完善

pull/4/head
zengchenxi 8 months ago
parent a8702ce3d3
commit 8130db9f25

@ -72,6 +72,14 @@ public enum OperateTypeEnum {
*
* */
DELIVER(14),
/*
*
* */
SUBMIT(15),
/*
*
* */
CANCEL_SUBMIT(16),
/**
*
*

@ -58,6 +58,7 @@ public interface ErrorCodeConstants {
/************工艺设计***********/
ErrorCode PROCESS_DESIGN_NOT_EXISTS = new ErrorCode(1_006_001, "工艺设计不存在");
ErrorCode PROCESS_BOM_NOT_EXISTS = new ErrorCode(1_006_002, "工艺bom不存在");
ErrorCode PROCESS_BOM_DETAIL_NOT_EXISTS = new ErrorCode(1_006_003, "工艺bom明细不存在");
/************生产计划管理***********/
ErrorCode PLAN_NOT_EXISTS = new ErrorCode(1_007_001, "生产计划不存在");
ErrorCode PLAN_SUB_NOT_EXISTS = new ErrorCode(1_007_002, "生产计划子项目不存在");

@ -0,0 +1,24 @@
package com.chanko.yunxi.mes.module.heli.enums;
import lombok.Getter;
/**
* bom
* @author chenxi
* @date 2024-02-26 11:25
*/
@Getter
public enum ProcessBomStatusEnum {
SAVE(1, "已保存"),
SUBMIT(2, "已提交"),
TERMINATE(3, "已终止");
private int code;
private String description;
ProcessBomStatusEnum(int code, String description) {
this.code = code;
this.description = description;
}
}

@ -1,34 +1,38 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.processbom;
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.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.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.processbom.vo.*;
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.processbom.vo.ProcessBomPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomRespVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbomdetail.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import com.chanko.yunxi.mes.module.heli.service.processbom.ProcessBomService;
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 = "管理后台 - 工艺bom")
@RestController
@ -39,6 +43,12 @@ public class ProcessBomController {
@Resource
private ProcessBomService processBomService;
@Resource
private OperateLogFrameworkService operateLogFrameworkService;
@Resource
private HttpServletRequest request;
@PostMapping("/create")
@Operation(summary = "创建工艺bom")
@PreAuthorize("@ss.hasPermission('heli:process-bom:create')")
@ -54,6 +64,26 @@ public class ProcessBomController {
return success(true);
}
@PostMapping("/operate")
@Operation(summary = "操作工艺bom")
@PreAuthorize("@ss.hasPermission('heli:process-bom:update')")
@OperateLog(enable = false)
@Transactional(rollbackFor = Exception.class)
public CommonResult<Long> operateProcessBom(@Valid @RequestBody ProcessBomSaveReqVO operateReqVO) {
LocalDateTime startTime = LocalDateTime.now();
processBomService.operateProcessBom(operateReqVO);
// 手动记录日志
operateLogFrameworkService.createOperateLog(request,
startTime,
BusinesTypeEnum.PROCESS_BOM.name(),
operateReqVO.getId(),
OperateTypeEnum.valueOf(operateReqVO.getActive()).getType(),
operateReqVO.getActiveOpinion());
return success(operateReqVO.getId());
}
@DeleteMapping("/delete")
@Operation(summary = "删除工艺bom")
@Parameter(name = "id", description = "编号", required = true)

@ -56,4 +56,11 @@ public class ProcessBomSaveReqVO {
@Schema(description = "工艺bom明细列表")
private List<ProcessBomDetailDO> processBomDetails;
@Schema(description = "操作类型")
@NotBlank(message = "操作类型不能为空")
private String active;
@Schema(description = "操作意见")
private String activeOpinion;
}

@ -1,5 +1,7 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
@ -78,4 +80,29 @@ public class ProcessBomDO extends BaseDO {
@TableField(exist = false)
private String projectName;
public boolean canSave(){
return ProcessBomStatusEnum.SAVE.getCode() == this.bomStatus.intValue();
}
public boolean canSubmit(){
return ProcessBomStatusEnum.SAVE.getCode() == this.bomStatus.intValue();
}
public boolean canCancel(){
return ProcessBomStatusEnum.SUBMIT.getCode() == this.bomStatus.intValue();
}
public boolean canOperate(OperateTypeEnum operateTypeEnum) {
switch (operateTypeEnum){
case SAVE:
return canSave();
case SUBMIT:
return canSubmit();
case CANCEL_SUBMIT:
return canCancel();
default:
return false;
}
}
}

@ -63,4 +63,5 @@ public interface ProcessBomService {
*/
List<ProcessBomDetailDO> getProcessBomDetailListByBomId(Long bomId);
void operateProcessBom(ProcessBomSaveReqVO operateReqVO);
}

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.service.processbom;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -41,7 +42,7 @@ public class ProcessBomServiceImpl implements ProcessBomService {
processBomMapper.insert(processBom);
// 插入子表
createProcessBomDetailList(processBom.getId(), createReqVO.getProcessBomDetails());
if(createReqVO.getProcessBomDetails() != null && !createReqVO.getProcessBomDetails().isEmpty()) createProcessBomDetailList(processBom.getId(), createReqVO.getProcessBomDetails());
// 返回
return processBom.getId();
}
@ -51,8 +52,18 @@ public class ProcessBomServiceImpl implements ProcessBomService {
public void updateProcessBom(ProcessBomSaveReqVO updateReqVO) {
// 校验存在
validateProcessBomExists(updateReqVO.getId());
// 提交的时候 明细不容许为空
if(OperateTypeEnum.valueOf(updateReqVO.getActive()) == OperateTypeEnum.SUBMIT){
if(updateReqVO.getProcessBomDetails() == null || updateReqVO.getProcessBomDetails().isEmpty()){
throw exception(PROCESS_BOM_DETAIL_NOT_EXISTS);
}
}
// 更新
ProcessBomDO updateObj = BeanUtils.toBean(updateReqVO, ProcessBomDO.class);
if(!updateObj.canOperate(OperateTypeEnum.valueOf(updateReqVO.getActive()))){
throw exception(INVALID_OPERATE);
}
processBomMapper.updateById(updateObj);
// 更新子表
@ -94,6 +105,16 @@ public class ProcessBomServiceImpl implements ProcessBomService {
return processBomDetailMapper.selectListByBomId(bomId);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void operateProcessBom(ProcessBomSaveReqVO operateReqVO) {
if(operateReqVO.getId() == null){
createProcessBom(operateReqVO);
}else{
updateProcessBom(operateReqVO);
}
}
private void createProcessBomDetailList(Long bomId, List<ProcessBomDetailDO> list) {
list.forEach(o -> o.setBomId(bomId));
processBomDetailMapper.insertBatch(list);

@ -12,6 +12,8 @@ export interface ProcessBomVO {
bomStatus: number
remark: string
status: number
active: string
activeOpinion: string
}
// 查询工艺bom分页
@ -50,3 +52,7 @@ export const exportProcessBom = async (params) => {
export const getProcessBomDetailListByBomId = async (bomId) => {
return await request.get({ url: `/heli/process-bom/process-bom-detail/list-by-bom-id?bomId=` + bomId })
}
export async function operateProcessBom(data: ProcessBomVO) {
return await request.post({ url: `/heli/process-bom/operate`, data })
}

@ -92,9 +92,9 @@
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column fixed label="序号" type="index" width="60" />
<el-table-column label="BOM编号" align="center" prop="code" width="220" />
<el-table-column label="计划单号" align="center" prop="planCode" width="180" />
<el-table-column label="项目编号" align="center" prop="projectCode" width="220" />
<el-table-column fixed label="BOM编号" align="center" prop="code" width="220" />
<el-table-column fixed label="计划单号" align="center" prop="planCode" width="180" />
<el-table-column fixed label="项目编号" align="center" prop="projectCode" width="220" />
<el-table-column label="客户名称" align="center" prop="customerName" width="240" />
<el-table-column label="项目名称" align="center" prop="projectName" width="180" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" width="180" />
@ -105,13 +105,13 @@
:formatter="dateFormatter"
width="220"
/>
<el-table-column label="BOM版本号" align="center" prop="version" width="140" />
<el-table-column label="单据状态" align="center" prop="bomStatus" width="140">
<el-table-column fixed="right" label="BOM版本号" align="center" prop="version" width="140" />
<el-table-column fixed="right" label="单据状态" align="center" prop="bomStatus" width="140">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BOM_STATUS" :value="scope.row.bomStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="160">
<el-table-column fixed="right" label="操作" align="center" width="160">
<template #default="scope">
<el-button
link

@ -114,12 +114,11 @@
<template #header><span class="hl-table_header">*</span>材质</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.compositionId`" :rules="subFormRules.compositionId" class="mb-0px!">
<CompositionSelect v-model="row.compositionId" />
<CompositionSelect v-model="row.compositionId" @update:newValue="(val) => {row.compositionId = val.id;}"/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="规格型号" prop="spec" width="140">
<template #header><span class="hl-table_header">*</span>规格型号</template>
<template #default="scope">
<span v-if="scope.row.type == '1'" v-html="scope.row.spec"></span>
<el-input v-else v-model="scope.row.spec" />
@ -316,7 +315,12 @@ const submitForm = async (operate) => {
const data = formData.value as unknown as ProcessBomApi.ProcessBomVO
let bomId = await ProcessBomApi.operateProcessBom(data)
message.success(t('common.operationSuccess'))
commonStore.setStore('active', 'update');
let jumpActive = 'update'
if(operate == 'SUBMIT'){
jumpActive = 'detail'
}
commonStore.setStore('active', jumpActive);
commonStore.setStore('id', bomId);
reload()
} finally {

Loading…
Cancel
Save