jevononlie 5 months ago
commit 62b0e4da2e

@ -61,6 +61,17 @@ public class FileController {
}
return success(null);
}
@PostMapping("/uploadWatch")
@Operation(summary = "上传文件(批量)")
@OperateLog(logArgs = false) // 上传文件,没有记录操作日志的必要
public CommonResult<String> uploadFileWatch(FileUploadBatchReqVO uploadReqVO) throws Exception {
MultipartFile[] files = uploadReqVO.getFiles();
String url = "";
for (MultipartFile file : files) {
url = fileService.createFile(file.getOriginalFilename(), null, IoUtil.readBytes(file.getInputStream()), uploadReqVO.getBusinessType(), uploadReqVO.getBusinessId(), uploadReqVO.getBusinessFileType(), uploadReqVO.getBusinessFileRemark());
}
return success(url);
}
@DeleteMapping("/delete")
@Operation(summary = "删除文件")

@ -50,6 +50,9 @@ public interface ErrorCodeConstants {
ErrorCode SCREEN_NOT_EXISTS = new ErrorCode(1_001_013, "大屏数据不存在");
ErrorCode EQUIP_MAINTENANCE_RECORD_NOT_EXISTS = new ErrorCode(1_001_014, "设备维保记录不存在");
ErrorCode SC_EQUIPMENT_NOT_EXISTS = new ErrorCode(1_001_015, "数采设备表不存在");
ErrorCode SYSTEM_PARAMETERS_NOT_EXISTS = new ErrorCode(1_001_016, "系统参数设置不存在");
ErrorCode PROCESS_NOT_EXISTS = new ErrorCode(1_001_017, "工艺路线不存在");
ErrorCode PROCESS_DETAIL_NOT_EXISTS = new ErrorCode(1_001_018, "工艺路线明细不存在");
/*********组织架构************/
ErrorCode WORKSHOP_NOT_EXISTS = new ErrorCode(1_002_001, "车间不存在");

@ -6,8 +6,9 @@ import lombok.Getter;
public enum StorageStatusEnum {
SAVE(1, "保存"),
SUBMIT(2, "提交"),
INVALID(3, "作废");
SUBMIT(2, "送审"),
INVALID(3, "打回"),
AUDIT(4, "审核");
private int code;
private String description;

@ -0,0 +1,22 @@
package com.chanko.yunxi.mes.module.biz.enums;
import lombok.Getter;
/**
*
* @author chenxi
* @date 2024-01-26 12:38
*/
@Getter
public enum SystemParmetersEnum {
TPLUS_INTERFACE_SWITCH("TPlus_interface_whether"),
NEGATIVE_INVENTORY_SWITCH( "negative_inventory_whether"),
OVERTASK_CENTER_LIST("overtask_center_list");
private String description;
SystemParmetersEnum(String description) {
this.description = description;
}
}

@ -2,21 +2,26 @@ package com.chanko.yunxi.mes.module.biz.controller.admin.app;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.biz.controller.admin.app.vo.OverTaskVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.procedure.vo.ProcedureRespVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.workshop.vo.WorkshopRespVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.app.vo.AppVersionVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanWorkshopDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.procedure.ProcedureDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters.SystemParametersDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.workshop.WorkshopDO;
import com.chanko.yunxi.mes.module.biz.dal.mysql.procedure.ProcedureMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.systemparameters.SystemParametersMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.workshop.WorkshopMapper;
import com.chanko.yunxi.mes.module.biz.enums.SystemParmetersEnum;
import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO;
import com.chanko.yunxi.mes.module.infra.service.file.FileService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@ -51,6 +56,9 @@ public class AdminAppController {
@Resource
private ProcedureMapper procedureMapper;
@Resource
private SystemParametersMapper systemParametersMapper;
@GetMapping("/latest")
@Operation(summary = "获取最新app版本")
@ -94,4 +102,19 @@ public class AdminAppController {
;
return success(BeanUtils.toBean(procedureMapper.selectList(query), ProcedureRespVO.class));
}
@GetMapping("/allow-over-task")
@Operation(summary = "是否允许超量报工")
public CommonResult<OverTaskVO> allowOverTask(){
SystemParametersDO systemParametersDO = systemParametersMapper.selectOne("code", SystemParmetersEnum.OVERTASK_CENTER_LIST.getDescription());
OverTaskVO overTaskVO = new OverTaskVO();
if(systemParametersDO == null){
overTaskVO.setIsAllow("0");
overTaskVO.setWorkShops("");
}else{
overTaskVO.setIsAllow(StringUtil.isNotEmpty(systemParametersDO.getCurrentValue())?"1":"0");
overTaskVO.setWorkShops(systemParametersDO.getCurrentValue());
}
return success(overTaskVO);
}
}

@ -0,0 +1,23 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.app.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* app
* @author chenxi
* @date 2024-04-25 09:56
*/
@Data
public class OverTaskVO {
@Schema(description = "")
private String isAllow;
@Schema(description = "允许的车间列表")
private String workShops;
}

@ -0,0 +1,95 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.process;
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.biz.controller.admin.process.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.process.ProcessDO;
import com.chanko.yunxi.mes.module.biz.service.process.ProcessService;
@Tag(name = "管理后台 - 工艺路线")
@RestController
@RequestMapping("/biz/process")
@Validated
public class ProcessController {
@Resource
private ProcessService processService;
@PostMapping("/create")
@Operation(summary = "创建工艺路线")
@PreAuthorize("@ss.hasPermission('biz:process:create')")
public CommonResult<Long> createProcess(@Valid @RequestBody ProcessSaveReqVO createReqVO) {
return success(processService.createProcess(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新工艺路线")
@PreAuthorize("@ss.hasPermission('biz:process:update')")
public CommonResult<Boolean> updateProcess(@Valid @RequestBody ProcessSaveReqVO updateReqVO) {
processService.updateProcess(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除工艺路线")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:process:delete')")
public CommonResult<Boolean> deleteProcess(@RequestParam("id") Long id) {
processService.deleteProcess(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得工艺路线")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:process:query')")
public CommonResult<ProcessRespVO> getProcess(@RequestParam("id") Long id) {
ProcessDO process = processService.getProcess(id);
return success(BeanUtils.toBean(process, ProcessRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得工艺路线分页")
@PreAuthorize("@ss.hasPermission('biz:process:query')")
public CommonResult<PageResult<ProcessRespVO>> getProcessPage(@Valid ProcessPageReqVO pageReqVO) {
PageResult<ProcessDO> pageResult = processService.getProcessPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ProcessRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出工艺路线 Excel")
@PreAuthorize("@ss.hasPermission('biz:process:export')")
@OperateLog(type = EXPORT)
public void exportProcessExcel(@Valid ProcessPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ProcessDO> list = processService.getProcessPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "工艺路线.xls", "数据", ProcessRespVO.class,
BeanUtils.toBean(list, ProcessRespVO.class));
}
}

@ -0,0 +1,34 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.process.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 ProcessPageReqVO extends PageParam {
@Schema(description = "自增字段,唯一")
private Long id;
@Schema(description = "工艺路线编号")
private String code;
@Schema(description = "工艺路线名称,唯一")
private String name;
@Schema(description = "状态,1表示正常2表示禁用")
private Integer status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,39 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.process.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 ProcessRespVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("自增字段,唯一")
private Long id;
@Schema(description = "工艺路线编号")
@ExcelProperty("工艺路线编号")
private String code;
@Schema(description = "工艺路线名称,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("工艺路线名称,唯一")
private String name;
@Schema(description = "状态,1表示正常2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty(value = "状态,1表示正常2表示禁用", converter = DictConvert.class)
@DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
private Integer status;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,27 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.process.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 ProcessSaveReqVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "工艺路线编号")
private String code;
@Schema(description = "工艺路线名称,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "工艺路线名称,唯一不能为空")
private String name;
@Schema(description = "状态,1表示正常2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "状态,1表示正常2表示禁用不能为空")
private Integer status;
}

@ -0,0 +1,95 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.processdetail;
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.biz.controller.admin.processdetail.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processdetail.ProcessDetailDO;
import com.chanko.yunxi.mes.module.biz.service.processdetail.ProcessDetailService;
@Tag(name = "管理后台 - 工艺路线明细")
@RestController
@RequestMapping("/biz/process-detail")
@Validated
public class ProcessDetailController {
@Resource
private ProcessDetailService processDetailService;
@PostMapping("/create")
@Operation(summary = "创建工艺路线明细")
@PreAuthorize("@ss.hasPermission('biz:process-detail:create')")
public CommonResult<Long> createProcessDetail(@Valid @RequestBody ProcessDetailSaveReqVO createReqVO) {
return success(processDetailService.createProcessDetail(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新工艺路线明细")
@PreAuthorize("@ss.hasPermission('biz:process-detail:update')")
public CommonResult<Boolean> updateProcessDetail(@Valid @RequestBody ProcessDetailSaveReqVO updateReqVO) {
processDetailService.updateProcessDetail(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除工艺路线明细")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:process-detail:delete')")
public CommonResult<Boolean> deleteProcessDetail(@RequestParam("id") Long id) {
processDetailService.deleteProcessDetail(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得工艺路线明细")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:process-detail:query')")
public CommonResult<ProcessDetailRespVO> getProcessDetail(@RequestParam("id") Long id) {
ProcessDetailDO processDetail = processDetailService.getProcessDetail(id);
return success(BeanUtils.toBean(processDetail, ProcessDetailRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得工艺路线明细分页")
@PreAuthorize("@ss.hasPermission('biz:process-detail:query')")
public CommonResult<PageResult<ProcessDetailRespVO>> getProcessDetailPage(@Valid ProcessDetailPageReqVO pageReqVO) {
PageResult<ProcessDetailDO> pageResult = processDetailService.getProcessDetailPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ProcessDetailRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出工艺路线明细 Excel")
@PreAuthorize("@ss.hasPermission('biz:process-detail:export')")
@OperateLog(type = EXPORT)
public void exportProcessDetailExcel(@Valid ProcessDetailPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ProcessDetailDO> list = processDetailService.getProcessDetailPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "工艺路线明细.xls", "数据", ProcessDetailRespVO.class,
BeanUtils.toBean(list, ProcessDetailRespVO.class));
}
}

@ -0,0 +1,40 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.processdetail.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 ProcessDetailPageReqVO extends PageParam {
@Schema(description = "自增字段,唯一")
private Long id;
@Schema(description = "工序id")
private Long procedureId;
@Schema(description = "工序顺序号")
private Integer procedureSort;
@Schema(description = "生产设备id")
private Long procedureEquipId;
@Schema(description = "明细类型1为工序2为产品")
private Integer type;
@Schema(description = "产品id物料")
private Long materialId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

@ -0,0 +1,44 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.processdetail.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 ProcessDetailRespVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("自增字段,唯一")
private Long id;
@Schema(description = "工序id")
@ExcelProperty("工序id")
private Long procedureId;
@Schema(description = "工序顺序号")
@ExcelProperty("工序顺序号")
private Integer procedureSort;
@Schema(description = "生产设备id")
@ExcelProperty("生产设备id")
private Long procedureEquipId;
@Schema(description = "明细类型1为工序2为产品")
@ExcelProperty("明细类型1为工序2为产品")
private Integer type;
@Schema(description = "产品id物料")
@ExcelProperty("产品id物料")
private Long materialId;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

@ -0,0 +1,31 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.processdetail.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 ProcessDetailSaveReqVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "工序id")
private Long procedureId;
@Schema(description = "工序顺序号")
private Integer procedureSort;
@Schema(description = "生产设备id")
private Long procedureEquipId;
@Schema(description = "明细类型1为工序2为产品")
private Integer type;
@Schema(description = "产品id物料")
private Long materialId;
}

@ -6,20 +6,25 @@ 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.module.biz.controller.admin.app.vo.OverTaskVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.storage.vo.StoragePageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.storage.vo.StorageRespVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.storage.vo.StorageSaveReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storage.StorageDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storagemat.StorageMatDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters.SystemParametersDO;
import com.chanko.yunxi.mes.module.biz.dal.mysql.systemparameters.SystemParametersMapper;
import com.chanko.yunxi.mes.module.biz.enums.StockTypeEnum;
import com.chanko.yunxi.mes.module.biz.enums.StorageStatusEnum;
import com.chanko.yunxi.mes.module.biz.enums.SystemParmetersEnum;
import com.chanko.yunxi.mes.module.biz.service.storage.StorageService;
import com.chanko.yunxi.mes.module.biz.service.storagelog.StorageLogService;
import com.chanko.yunxi.mes.module.biz.service.storagemat.StorageMatService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jodd.util.StringUtil;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -43,6 +48,9 @@ public class StorageController {
@Resource
private StorageService storageService;
@Resource
private SystemParametersMapper systemParametersMapper;
@Resource
private StorageMatService storageMatService;
@ -74,12 +82,12 @@ public class StorageController {
// 提交或者作废时记录相关操作人
LocalDateTime currTime = LocalDateTime.now();
if(updateReqVO.getStatus().equals(StorageStatusEnum.SUBMIT.getCode()) && updateReqVO.getStockType().equals(StockTypeEnum.IN.getCode())){
targetDo.setKeeper(updateReqVO.getKeeper());
targetDo.setKeeperTime(currTime);
} else if(updateReqVO.getStatus().equals(StorageStatusEnum.SUBMIT.getCode()) && updateReqVO.getStockType().equals(StockTypeEnum.OUT.getCode())){
if(updateReqVO.getStatus().equals(StorageStatusEnum.SUBMIT.getCode()) && updateReqVO.getStockType().equals(StockTypeEnum.OUT.getCode())){
targetDo.setOutbound(updateReqVO.getOutbound());
targetDo.setOutboundTime(currTime);
}else if(updateReqVO.getStatus().equals(StorageStatusEnum.AUDIT.getCode()) && updateReqVO.getStockType().equals(StockTypeEnum.OUT.getCode())){
targetDo.setCancel(updateReqVO.getCancel());
targetDo.setCancelTime(currTime);
}else{
targetDo.setCancel(updateReqVO.getCancel());
targetDo.setCancelTime(currTime);
@ -142,4 +150,17 @@ public class StorageController {
BeanUtils.toBean(list, StorageRespVO.class));
}
@GetMapping("/allow-over-stock")
@Operation(summary = "是否出库允许超库存发货")
public CommonResult<Boolean> allowOverStock(){
SystemParametersDO systemParametersDO = systemParametersMapper.selectOne("code", SystemParmetersEnum.NEGATIVE_INVENTORY_SWITCH.getDescription());
boolean isAllow = false;
if(systemParametersDO != null && systemParametersDO.getCurrentValue().equals("1")){
isAllow = true;
}
return success(isAllow);
}
}

@ -0,0 +1,95 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.systemparameters;
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.biz.controller.admin.systemparameters.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters.SystemParametersDO;
import com.chanko.yunxi.mes.module.biz.service.systemparameters.SystemParametersService;
@Tag(name = "管理后台 - 系统参数设置")
@RestController
@RequestMapping("/biz/system-parameters")
@Validated
public class SystemParametersController {
@Resource
private SystemParametersService systemParametersService;
@PostMapping("/create")
@Operation(summary = "创建系统参数设置")
@PreAuthorize("@ss.hasPermission('biz:system-parameters:create')")
public CommonResult<Long> createSystemParameters(@Valid @RequestBody SystemParametersSaveReqVO createReqVO) {
return success(systemParametersService.createSystemParameters(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新系统参数设置")
@PreAuthorize("@ss.hasPermission('biz:system-parameters:update')")
public CommonResult<Boolean> updateSystemParameters(@Valid @RequestBody SystemParametersSaveReqVO updateReqVO) {
systemParametersService.updateSystemParameters(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除系统参数设置")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:system-parameters:delete')")
public CommonResult<Boolean> deleteSystemParameters(@RequestParam("id") Long id) {
systemParametersService.deleteSystemParameters(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得系统参数设置")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:system-parameters:query')")
public CommonResult<SystemParametersRespVO> getSystemParameters(@RequestParam("id") Long id) {
SystemParametersDO systemParameters = systemParametersService.getSystemParameters(id);
return success(BeanUtils.toBean(systemParameters, SystemParametersRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得系统参数设置分页")
@PreAuthorize("@ss.hasPermission('biz:system-parameters:query')")
public CommonResult<PageResult<SystemParametersRespVO>> getSystemParametersPage(@Valid SystemParametersPageReqVO pageReqVO) {
PageResult<SystemParametersDO> pageResult = systemParametersService.getSystemParametersPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, SystemParametersRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出系统参数设置 Excel")
@PreAuthorize("@ss.hasPermission('biz:system-parameters:export')")
@OperateLog(type = EXPORT)
public void exportSystemParametersExcel(@Valid SystemParametersPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<SystemParametersDO> list = systemParametersService.getSystemParametersPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "系统参数设置.xls", "数据", SystemParametersRespVO.class,
BeanUtils.toBean(list, SystemParametersRespVO.class));
}
}

@ -0,0 +1,40 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.systemparameters.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 SystemParametersPageReqVO extends PageParam {
@Schema(description = "自增字段,唯一")
private Long id;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "参数编码")
private String code;
@Schema(description = "参数名称")
private String name;
@Schema(description = "值范围")
private String scope;
@Schema(description = "当前值")
private String currentValue;
@Schema(description = "备注")
private String description;
}

@ -0,0 +1,44 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.systemparameters.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 SystemParametersRespVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("自增字段,唯一")
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "参数编码")
@ExcelProperty("参数编码")
private String code;
@Schema(description = "参数名称")
@ExcelProperty("参数名称")
private String name;
@Schema(description = "值范围")
@ExcelProperty("值范围")
private String scope;
@Schema(description = "当前值")
@ExcelProperty("当前值")
private String currentValue;
@Schema(description = "备注")
@ExcelProperty("备注")
private String description;
}

@ -0,0 +1,31 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.systemparameters.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 SystemParametersSaveReqVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "参数编码")
private String code;
@Schema(description = "参数名称")
private String name;
@Schema(description = "值范围")
private String scope;
@Schema(description = "当前值")
private String currentValue;
@Schema(description = "备注")
private String description;
}

@ -0,0 +1,22 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.unqualifiednotification.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 品质异常通知单附件信息 Request VO")
@Data
public class UnqualifiedNotificationFileReqVO {
@Schema(description = "时间戳")
private String k;
@Schema(description = "文件地址url")
private String v;
}

@ -70,4 +70,7 @@ public class UnqualifiedNotificationSaveReqVO {
@Schema(description = "操作")
private String active;
@Schema(description = "附件列表")
private List<UnqualifiedNotificationFileReqVO> mediaList;
}

@ -0,0 +1,45 @@
package com.chanko.yunxi.mes.module.biz.dal.dataobject.process;
import lombok.*;
import java.util.*;
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("base_process")
@KeySequence("base_process_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProcessDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
* 线
*/
private String code;
/**
* 线,
*/
private String name;
/**
* ,12
*
* {@link TODO infra_boolean_string }
*/
private Integer status;
}

@ -0,0 +1,51 @@
package com.chanko.yunxi.mes.module.biz.dal.dataobject.processdetail;
import lombok.*;
import java.util.*;
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("base_process_detail")
@KeySequence("base_process_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProcessDetailDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
* id
*/
private Long procedureId;
/**
*
*/
private Integer procedureSort;
/**
* id
*/
private Long procedureEquipId;
/**
* 12
*/
private Integer type;
/**
* id
*/
private Long materialId;
}

@ -0,0 +1,51 @@
package com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters;
import lombok.*;
import java.util.*;
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("base_system_parameters")
@KeySequence("base_system_parameters_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SystemParametersDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
*
*/
private String code;
/**
*
*/
private String name;
/**
*
*/
private String scope;
/**
*
*/
private String currentValue;
/**
*
*/
private String description;
}

@ -0,0 +1,30 @@
package com.chanko.yunxi.mes.module.biz.dal.mysql.process;
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.biz.dal.dataobject.process.ProcessDO;
import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.biz.controller.admin.process.vo.*;
/**
* 线 Mapper
*
* @author
*/
@Mapper
public interface ProcessMapper extends BaseMapperX<ProcessDO> {
default PageResult<ProcessDO> selectPage(ProcessPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ProcessDO>()
.eqIfPresent(ProcessDO::getId, reqVO.getId())
.eqIfPresent(ProcessDO::getCode, reqVO.getCode())
.likeIfPresent(ProcessDO::getName, reqVO.getName())
.eqIfPresent(ProcessDO::getStatus, reqVO.getStatus())
.betweenIfPresent(ProcessDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ProcessDO::getId));
}
}

@ -0,0 +1,32 @@
package com.chanko.yunxi.mes.module.biz.dal.mysql.processdetail;
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.biz.dal.dataobject.processdetail.ProcessDetailDO;
import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.biz.controller.admin.processdetail.vo.*;
/**
* 线 Mapper
*
* @author
*/
@Mapper
public interface ProcessDetailMapper extends BaseMapperX<ProcessDetailDO> {
default PageResult<ProcessDetailDO> selectPage(ProcessDetailPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ProcessDetailDO>()
.eqIfPresent(ProcessDetailDO::getId, reqVO.getId())
.eqIfPresent(ProcessDetailDO::getProcedureId, reqVO.getProcedureId())
.eqIfPresent(ProcessDetailDO::getProcedureSort, reqVO.getProcedureSort())
.eqIfPresent(ProcessDetailDO::getProcedureEquipId, reqVO.getProcedureEquipId())
.eqIfPresent(ProcessDetailDO::getType, reqVO.getType())
.eqIfPresent(ProcessDetailDO::getMaterialId, reqVO.getMaterialId())
.betweenIfPresent(ProcessDetailDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ProcessDetailDO::getId));
}
}

@ -0,0 +1,32 @@
package com.chanko.yunxi.mes.module.biz.dal.mysql.systemparameters;
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.biz.dal.dataobject.systemparameters.SystemParametersDO;
import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.biz.controller.admin.systemparameters.vo.*;
/**
* Mapper
*
* @author
*/
@Mapper
public interface SystemParametersMapper extends BaseMapperX<SystemParametersDO> {
default PageResult<SystemParametersDO> selectPage(SystemParametersPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<SystemParametersDO>()
.eqIfPresent(SystemParametersDO::getId, reqVO.getId())
.betweenIfPresent(SystemParametersDO::getCreateTime, reqVO.getCreateTime())
.likeIfPresent(SystemParametersDO::getCode, reqVO.getCode())
.likeIfPresent(SystemParametersDO::getName, reqVO.getName())
.eqIfPresent(SystemParametersDO::getScope, reqVO.getScope())
.eqIfPresent(SystemParametersDO::getCurrentValue, reqVO.getCurrentValue())
.eqIfPresent(SystemParametersDO::getDescription, reqVO.getDescription())
.orderByDesc(SystemParametersDO::getId));
}
}

@ -67,7 +67,7 @@ public interface TaskDispatchMapper extends BaseMapperX<TaskDispatchDO> {
.select("c.code as projectCode", "c.project_end_time as projectEndTime")
.select("f.name workshopName", "g.end_time requiredCompletedDate", "u1.nickname as ownerName")
.select("d.name as projectSubName", "d.code as projectSubCode", "d.id as materialId")
.select("b.amount", "d.unit", "b.warehouse_id")
.select("b.amount", "d.unit", "b.warehouse_id", "d.spec")
.leftJoin(PlanDO.class, "a", PlanDO::getId, TaskDispatchDO::getPlanId)
.leftJoin(ProjectOrderSubDO.class, "b", ProjectOrderSubDO::getId, TaskDispatchDO::getProjectSubId)
.leftJoin(ProjectOrderDO.class, "c", ProjectOrderDO::getId, ProcessDesignDO::getProjectId)

@ -55,6 +55,7 @@ public interface TaskReportMapper extends BaseMapperX<TaskReportDO> {
.and(!StringUtils.isEmpty(reqVO.getProjectSubName()), Wrapper -> Wrapper.like(MaterialDO::getName, reqVO.getProjectSubName()).or().like(MaterialDO::getCode, reqVO.getProjectSubName()))
.like(!StringUtils.isEmpty(reqVO.getPlanCode()), PlanDO::getPlanNo, reqVO.getPlanCode())
.like(!StringUtils.isEmpty(reqVO.getDispatchCode()), TaskDispatchDO::getCode, reqVO.getDispatchCode())
.like(!StringUtils.isEmpty(reqVO.getAssembleCode()), TaskReportDO::getAssembleCode, reqVO.getAssembleCode())
;

@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanjet.openapi.sdk.java.exception.ChanjetApiException;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.common.util.object.ObjectUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.ChanjetSpi;
import com.chanko.yunxi.mes.module.biz.controller.admin.chanjet.dto.*;
@ -24,6 +25,7 @@ import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderS
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storage.StorageDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storagemat.StorageMatDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters.SystemParametersDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskreport.TaskReportDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.warehouse.WarehouseDO;
@ -34,6 +36,7 @@ import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderMapper
import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderSubMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.storage.StorageMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.supplier.SupplierMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.systemparameters.SystemParametersMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.taskreport.TaskReportMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.warehouse.WarehouseMapper;
@ -114,12 +117,29 @@ public class ChanjetManager {
@Resource
private WarehouseMapper warehouseMapper;
@Resource
private SystemParametersMapper systemParametersMapper;
private Boolean getSystemParameters(){
Boolean chanjet_switch = true;
SystemParametersDO systemParametersDO = systemParametersMapper.selectOne("code",SystemParmetersEnum.TPLUS_INTERFACE_SWITCH.getDescription());
if(systemParametersDO != null){
chanjet_switch = systemParametersDO.getCurrentValue().equals("1")?true:false;
}
return chanjet_switch;
}
/**
*
* @throws ChanjetApiException
*/
@Transactional(rollbackFor = Exception.class)
public void queryDept() throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口
if(!getSystemParameters()) return;
CommonResult<List<QueryDepartmentResVO>> result = chanjetSpi.invokeRetList(QUERY_DEPARTMENT_OR_WORKSHOP, new QueryDepartmentReqVO(new QueryDepartmentDTO()), QueryDepartmentResVO.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
@ -181,6 +201,8 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void queryWorkshop() throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口
if(!getSystemParameters()) return;
CommonResult<List<QueryDepartmentResVO>> result = chanjetSpi.invokeRetList(QUERY_DEPARTMENT_OR_WORKSHOP, new QueryDepartmentReqVO(new QueryDepartmentDTO()), QueryDepartmentResVO.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
@ -242,7 +264,8 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void queryCustomer() throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口
if(!getSystemParameters()) return;
String maxTs = null;
do {
QueryPartnerReqVO.QueryPartnerParamVO paramVO = new QueryPartnerReqVO.QueryPartnerParamVO(maxTs);
@ -316,7 +339,8 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void querySupplier() throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口
if(!getSystemParameters()) return;
String maxTs = null;
do {
QueryPartnerReqVO.QueryPartnerParamVO paramVO = new QueryPartnerReqVO.QueryPartnerParamVO(maxTs);
@ -392,6 +416,7 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public Long createProcedure(ProcedureSaveReqVO createReqVO) throws ChanjetApiException {
Long procedureId = procedureService.createProcedure(createReqVO);
ProcedureDO procedure = procedureService.getProcedure(procedureId);
@ -414,9 +439,12 @@ public class ChanjetManager {
.setName(procedure.getName())
.setCode(procedure.getCode());
CommonResult<Long> result = chanjetSpi.invoke(CREATE_PROCEDURE, new CreateProcedureReqVO(dto), Long.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
CommonResult<Long> result = chanjetSpi.invoke(CREATE_PROCEDURE, new CreateProcedureReqVO(dto), Long.class);
if (!result.isSuccess()) {
throw exception(CALL_API_ERROR);
}
}
return procedureId;
}
@ -429,6 +457,7 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public Long createUser(UserSaveReqVO reqVO) throws ChanjetApiException {
Long id = adminUserService.createUser(reqVO);
AdminUserDO aDO = adminUserService.getUser(id);
@ -448,9 +477,12 @@ public class ChanjetManager {
if(!StringUtils.isEmpty(deptCode)){
dto.setDepartment(new Department(deptCode));
}
CommonResult<Long> result = chanjetSpi.invoke(CREATE_EMPLOYEE, new CreateOrUpdateEmployeeReqVO(dto), Long.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
CommonResult<Long> result = chanjetSpi.invoke(CREATE_EMPLOYEE, new CreateOrUpdateEmployeeReqVO(dto), Long.class);
if (!result.isSuccess()) {
throw exception(CALL_API_ERROR);
}
}
return id;
}
@ -462,6 +494,7 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void updateUser(UserSaveReqVO reqVO) throws ChanjetApiException {
adminUserService.updateUser(reqVO);
AdminUserDO aDO = adminUserService.getUser(reqVO.getId());
@ -482,9 +515,12 @@ public class ChanjetManager {
if(!StringUtils.isEmpty(deptCode)){
dto.setDepartment(new Department(deptCode));
}
CommonResult<Boolean> result = chanjetSpi.invoke(UPDATE_EMPLOYEE, new CreateOrUpdateEmployeeReqVO(dto), Boolean.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
CommonResult<Boolean> result = chanjetSpi.invoke(UPDATE_EMPLOYEE, new CreateOrUpdateEmployeeReqVO(dto), Boolean.class);
if (!result.isSuccess()) {
throw exception(CALL_API_ERROR);
}
}
}
@ -494,7 +530,8 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void queryMaterial() throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口
if(!getSystemParameters()) return ;
String maxTs = null;
HashSet<Long> materialIds = new HashSet<>();
do {
@ -703,7 +740,8 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void queryProjectOrder() throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(!getSystemParameters()) return ;
int pageIndex = 0;
boolean hasMore = false;
List<QuerySaleOrderListResDTO> resulDataList = new ArrayList<>(32);
@ -796,22 +834,26 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public List<BomMaterialVO> queryProcessBom(String materialCode, Long warehouseId) throws ChanjetApiException {
List<BomMaterialVO> resultData = new ArrayList<>(16);
List<BOMChildDTOs> bomDataList = null;
CommonResult<List<QueryBomResVO>> result = chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(materialCode)), QueryBomResVO.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
}
if(CollUtil.isNotEmpty(result.getData())){
QueryBomResVO topLayer = result.getData().get(0);
bomDataList = topLayer.getBOMChildDTOs();
if(CollUtil.isNotEmpty(bomDataList)){
for (BOMChildDTOs dto : bomDataList) {
ChildBOM childBOM = dto.getChildBOM();
if(childBOM != null){
dto.setVersion(childBOM.getVersion())
.setBOMChildDTOs(queryProcessBomById(childBOM.getID()));
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
CommonResult<List<QueryBomResVO>> result = chanjetSpi.invokeRetList(QUERY_BOM, new QueryBomReqVO(new QueryBomReqVO.QueryBomDTO(materialCode)), QueryBomResVO.class);
if (!result.isSuccess()) {
throw exception(CALL_API_ERROR);
}
if (CollUtil.isNotEmpty(result.getData())) {
QueryBomResVO topLayer = result.getData().get(0);
bomDataList = topLayer.getBOMChildDTOs();
if (CollUtil.isNotEmpty(bomDataList)) {
for (BOMChildDTOs dto : bomDataList) {
ChildBOM childBOM = dto.getChildBOM();
if (childBOM != null) {
dto.setVersion(childBOM.getVersion())
.setBOMChildDTOs(queryProcessBomById(childBOM.getID()));
}
}
}
}
@ -868,11 +910,16 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public List<QueryCurrentStockResVO> queryStock(List<String> materialCodeList, Long warehouseId) throws ChanjetApiException {
CommonResult<List<QueryCurrentStockResVO>> result = chanjetSpi.invokeRetList(QUERY_CURRENT_STOCK, new QueryCurrentStockReqVO(new QueryCurrentStockReqVO.QueryCurrentStockParamVO(materialCodeList)), QueryCurrentStockResVO.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
List<QueryCurrentStockResVO> dataList = null;
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
CommonResult<List<QueryCurrentStockResVO>> result = chanjetSpi.invokeRetList(QUERY_CURRENT_STOCK, new QueryCurrentStockReqVO(new QueryCurrentStockReqVO.QueryCurrentStockParamVO(materialCodeList)), QueryCurrentStockResVO.class);
if (!result.isSuccess()) {
throw exception(CALL_API_ERROR);
}
dataList = result.getData();
}
List<QueryCurrentStockResVO> dataList = result.getData();
if(dataList == null) dataList = new ArrayList<>(16);
List<MaterialDO> materialDOList = materialMapper.selectList(MaterialDO::getCode, materialCodeList);
@ -917,7 +964,8 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void queryStockAndInject(List<MaterialDO> materialDOList, Long warehouseId) throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口
if(!getSystemParameters()) return ;
CommonResult<List<QueryCurrentStockResVO>> result = chanjetSpi.invokeRetList(QUERY_CURRENT_STOCK,
new QueryCurrentStockReqVO(new QueryCurrentStockReqVO.QueryCurrentStockParamVO(materialDOList.stream().map(MaterialDO::getCode).collect(Collectors.toList()))),
QueryCurrentStockResVO.class);
@ -951,7 +999,8 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void queryStockAndInject2(List<StorageMatDO> doList, Long warehouseId) throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口
if(!getSystemParameters()) return;
CommonResult<List<QueryCurrentStockResVO>> result = chanjetSpi.invokeRetList(QUERY_CURRENT_STOCK,
new QueryCurrentStockReqVO(new QueryCurrentStockReqVO.QueryCurrentStockParamVO(doList.stream().map(StorageMatDO::getProjectSubCode).collect(Collectors.toList()))),
QueryCurrentStockResVO.class);
@ -983,6 +1032,8 @@ public class ChanjetManager {
* @throws ChanjetApiException
*/
private List<BOMChildDTOs> queryProcessBomById(String bomId) throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口
if(!getSystemParameters()) return null;
List<BOMChildDTOs> resultData = null;
QueryBomReqVO.QueryBomDTO queryBomDTO = new QueryBomReqVO.QueryBomDTO();
queryBomDTO.setID(bomId);
@ -1015,6 +1066,7 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void createTaskReport(Long id) throws ChanjetApiException {
TaskReportDO aDO = taskReportMapper.selectOne(id);
TaskDispatchDetailDO taskDispatchDetailDO = taskDispatchDetailMapper.getTaskDispatchDetail(aDO.getDispatchDetailId());
@ -1041,9 +1093,12 @@ public class ChanjetManager {
reportTeamDetails.add(reportTeamDetail);
reportTeamDetail.setPerson(new Person(aDO.getOwnerUsername()));
CommonResult<ResultResVO> result = chanjetSpi.invoke(CREATE_REPORT, new CreateReportReqVO(dto), ResultResVO.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
CommonResult<ResultResVO> result = chanjetSpi.invoke(CREATE_REPORT, new CreateReportReqVO(dto), ResultResVO.class);
if (!result.isSuccess()) {
throw exception(CALL_API_ERROR);
}
}
}
@ -1054,6 +1109,7 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void deleteTaskReport(Long id) throws ChanjetApiException {
taskReportService.deleteTaskReport(id);
// do nothing
}
@ -1066,6 +1122,7 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void createStockOutOrder(Long id) throws ChanjetApiException {
StorageDO storage = storageMapper.selectById(id);
List<StorageMatDO> matList = storageMatService.getStorageMatListByStockId(id);
if(matList.isEmpty()) return;
@ -1088,9 +1145,12 @@ public class ChanjetManager {
detailList.add(detail);
});
CommonResult<ResultResVO> result = chanjetSpi.invoke(CREATE_STOCK_OUT_ORDER, new CreateStockOutOrderReqVO(dto), ResultResVO.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
CommonResult<ResultResVO> result = chanjetSpi.invoke(CREATE_STOCK_OUT_ORDER, new CreateStockOutOrderReqVO(dto), ResultResVO.class);
if (!result.isSuccess()) {
throw exception(CALL_API_ERROR);
}
}
}
@ -1123,10 +1183,14 @@ public class ChanjetManager {
detailList.add(detail);
});
CommonResult<ResultResVO> result = chanjetSpi.invoke(CREATE_STOCK_IN_ORDER, new CreateStorageReqVO(dto), ResultResVO.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
// 设置为“否”,关闭所有与用友通信的接口;为“是”,打开所有与用友通信的接口
if(getSystemParameters()){
CommonResult<ResultResVO> result = chanjetSpi.invoke(CREATE_STOCK_IN_ORDER, new CreateStorageReqVO(dto), ResultResVO.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);
}
}
}
/**
@ -1172,36 +1236,38 @@ public class ChanjetManager {
;
detailList.add(detail);
});
// 设置为“是”,打开所有与用友通信的接口
if(getSystemParameters()) {
CommonResult<ResultResVO> result = chanjetSpi.invoke(CREATE_PRODUCTION_ORDER, new CreateProductionOrderReqVO(dto), ResultResVO.class);
if (!result.isSuccess() || !result.getData().isSuccess()) {
throw exception(CALL_API_ERROR);
}
CommonResult<ResultResVO> result = chanjetSpi.invoke(CREATE_PRODUCTION_ORDER, new CreateProductionOrderReqVO(dto), ResultResVO.class);
if(!result.isSuccess() || !result.getData().isSuccess()){
throw exception(CALL_API_ERROR);
}
// 暂不考虑失败场景 TODO 重试接口
CommonResult<ResultResVO> result2 = chanjetSpi.invoke(AUDIT_PRODUCTION_ORDER, new AuditProductionOrderReqVO(new AuditProductionOrderReqVO.AuditProductionOrderParamVO(externalCode)), ResultResVO.class);
if(!result2.isSuccess()|| !result2.getData().isSuccess()){
throw new RuntimeException(result2.getMsg());
}
// 暂不考虑失败场景 TODO 重试接口
CommonResult<ResultResVO> result2 = chanjetSpi.invoke(AUDIT_PRODUCTION_ORDER, new AuditProductionOrderReqVO(new AuditProductionOrderReqVO.AuditProductionOrderParamVO(externalCode)), ResultResVO.class);
if (!result2.isSuccess() || !result2.getData().isSuccess()) {
throw new RuntimeException(result2.getMsg());
}
Map<String,String> rMap = JSON.parseObject(JSON.toJSONString(result.getData().getData()), new TypeReference<Map<String,String>>(){{}});
// 查询报工单数据 将id回写至子项目表
Map<String, List<ProjectOrderSubDO>> subGroupByProjectSubCode = subDOList.stream().collect(Collectors.groupingBy(ProjectOrderSubDO::getProjectSubCode));
CommonResult<ListResultResVO> listResult = chanjetSpi.invoke(QUERY_PRODUCTION_ORDER_LIST, new ListProductionOrderReqVO(rMap.get("Code")), ListResultResVO.class);
if(!listResult.isSuccess() || listResult.getData() == null || listResult.getData().getData() == null || listResult.getData().getData().getTotalCount() == 0){
throw new RuntimeException("queryProductionOrder exception: "+JSON.toJSONString(listResult));
}
Map<String, String> rMap = JSON.parseObject(JSON.toJSONString(result.getData().getData()), new TypeReference<Map<String, String>>() {{
}});
// 查询报工单数据 将id回写至子项目表
Map<String, List<ProjectOrderSubDO>> subGroupByProjectSubCode = subDOList.stream().collect(Collectors.groupingBy(ProjectOrderSubDO::getProjectSubCode));
CommonResult<ListResultResVO> listResult = chanjetSpi.invoke(QUERY_PRODUCTION_ORDER_LIST, new ListProductionOrderReqVO(rMap.get("Code")), ListResultResVO.class);
if (!listResult.isSuccess() || listResult.getData() == null || listResult.getData().getData() == null || listResult.getData().getData().getTotalCount() == 0) {
throw new RuntimeException("queryProductionOrder exception: " + JSON.toJSONString(listResult));
}
List<List<String>> listDataList = listResult.getData().getData().getRows();
for (int i = 0; i < listDataList.size(); i++) {
// orderId projectSubCode detailId
List<String> item = listDataList.get(i);
ProjectOrderSubDO subDO = subGroupByProjectSubCode.get(item.get(1)).get(0);
subDO.setProductionId(item.get(0))
.setProductionDetailId(item.get(2));
List<List<String>> listDataList = listResult.getData().getData().getRows();
for (int i = 0; i < listDataList.size(); i++) {
// orderId projectSubCode detailId
List<String> item = listDataList.get(i);
ProjectOrderSubDO subDO = subGroupByProjectSubCode.get(item.get(1)).get(0);
subDO.setProductionId(item.get(0))
.setProductionDetailId(item.get(2));
}
projectOrderSubMapper.updateBatch(subDOList);
}
projectOrderSubMapper.updateBatch(subDOList);
}
/**
@ -1211,6 +1277,8 @@ public class ChanjetManager {
*/
@Transactional(rollbackFor = Exception.class)
public void queryWarehouse() throws ChanjetApiException {
// 设置为“否”,关闭所有与用友通信的接口
if(!getSystemParameters()) return ;
CommonResult<List<QueryWarehouseResVO>> result = chanjetSpi.invokeRetList(QUERY_WAREHOUSE, new QueryWarehouseReqVO(), QueryWarehouseResVO.class);
if(!result.isSuccess()){
throw exception(CALL_API_ERROR);

@ -0,0 +1,55 @@
package com.chanko.yunxi.mes.module.biz.service.process;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.process.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.process.ProcessDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/**
* 线 Service
*
* @author
*/
public interface ProcessService {
/**
* 线
*
* @param createReqVO
* @return
*/
Long createProcess(@Valid ProcessSaveReqVO createReqVO);
/**
* 线
*
* @param updateReqVO
*/
void updateProcess(@Valid ProcessSaveReqVO updateReqVO);
/**
* 线
*
* @param id
*/
void deleteProcess(Long id);
/**
* 线
*
* @param id
* @return 线
*/
ProcessDO getProcess(Long id);
/**
* 线
*
* @param pageReqVO
* @return 线
*/
PageResult<ProcessDO> getProcessPage(ProcessPageReqVO pageReqVO);
}

@ -0,0 +1,74 @@
package com.chanko.yunxi.mes.module.biz.service.process;
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.biz.controller.admin.process.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.process.ProcessDO;
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.biz.dal.mysql.process.ProcessMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.*;
/**
* 线 Service
*
* @author
*/
@Service
@Validated
public class ProcessServiceImpl implements ProcessService {
@Resource
private ProcessMapper processMapper;
@Override
public Long createProcess(ProcessSaveReqVO createReqVO) {
// 插入
ProcessDO process = BeanUtils.toBean(createReqVO, ProcessDO.class);
processMapper.insert(process);
// 返回
return process.getId();
}
@Override
public void updateProcess(ProcessSaveReqVO updateReqVO) {
// 校验存在
validateProcessExists(updateReqVO.getId());
// 更新
ProcessDO updateObj = BeanUtils.toBean(updateReqVO, ProcessDO.class);
processMapper.updateById(updateObj);
}
@Override
public void deleteProcess(Long id) {
// 校验存在
validateProcessExists(id);
// 删除
processMapper.deleteById(id);
}
private void validateProcessExists(Long id) {
if (processMapper.selectById(id) == null) {
throw exception(PROCESS_NOT_EXISTS);
}
}
@Override
public ProcessDO getProcess(Long id) {
return processMapper.selectById(id);
}
@Override
public PageResult<ProcessDO> getProcessPage(ProcessPageReqVO pageReqVO) {
return processMapper.selectPage(pageReqVO);
}
}

@ -0,0 +1,55 @@
package com.chanko.yunxi.mes.module.biz.service.processdetail;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.processdetail.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processdetail.ProcessDetailDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/**
* 线 Service
*
* @author
*/
public interface ProcessDetailService {
/**
* 线
*
* @param createReqVO
* @return
*/
Long createProcessDetail(@Valid ProcessDetailSaveReqVO createReqVO);
/**
* 线
*
* @param updateReqVO
*/
void updateProcessDetail(@Valid ProcessDetailSaveReqVO updateReqVO);
/**
* 线
*
* @param id
*/
void deleteProcessDetail(Long id);
/**
* 线
*
* @param id
* @return 线
*/
ProcessDetailDO getProcessDetail(Long id);
/**
* 线
*
* @param pageReqVO
* @return 线
*/
PageResult<ProcessDetailDO> getProcessDetailPage(ProcessDetailPageReqVO pageReqVO);
}

@ -0,0 +1,74 @@
package com.chanko.yunxi.mes.module.biz.service.processdetail;
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.biz.controller.admin.processdetail.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processdetail.ProcessDetailDO;
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.biz.dal.mysql.processdetail.ProcessDetailMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.*;
/**
* 线 Service
*
* @author
*/
@Service
@Validated
public class ProcessDetailServiceImpl implements ProcessDetailService {
@Resource
private ProcessDetailMapper processDetailMapper;
@Override
public Long createProcessDetail(ProcessDetailSaveReqVO createReqVO) {
// 插入
ProcessDetailDO processDetail = BeanUtils.toBean(createReqVO, ProcessDetailDO.class);
processDetailMapper.insert(processDetail);
// 返回
return processDetail.getId();
}
@Override
public void updateProcessDetail(ProcessDetailSaveReqVO updateReqVO) {
// 校验存在
validateProcessDetailExists(updateReqVO.getId());
// 更新
ProcessDetailDO updateObj = BeanUtils.toBean(updateReqVO, ProcessDetailDO.class);
processDetailMapper.updateById(updateObj);
}
@Override
public void deleteProcessDetail(Long id) {
// 校验存在
validateProcessDetailExists(id);
// 删除
processDetailMapper.deleteById(id);
}
private void validateProcessDetailExists(Long id) {
if (processDetailMapper.selectById(id) == null) {
throw exception(PROCESS_DETAIL_NOT_EXISTS);
}
}
@Override
public ProcessDetailDO getProcessDetail(Long id) {
return processDetailMapper.selectById(id);
}
@Override
public PageResult<ProcessDetailDO> getProcessDetailPage(ProcessDetailPageReqVO pageReqVO) {
return processDetailMapper.selectPage(pageReqVO);
}
}

@ -228,8 +228,7 @@ public class ScreenServiceImpl implements ScreenService {
for (ProjectOrderSubDO subDO : doList) {
productList.add(subDO.getProjectSubName());
rateList.add(new BigDecimal(100)
.subtract(new BigDecimal(subDO.getUnqualifiedQuantity()*100).divide(new BigDecimal(subDO.getAmount())))
.setScale(2, BigDecimal.ROUND_CEILING));
.subtract(new BigDecimal(subDO.getUnqualifiedQuantity()*100).divide(new BigDecimal(subDO.getAmount()),2,BigDecimal.ROUND_CEILING)));
}
screenDO.setData(JSON.toJSONString(resultData));

@ -10,9 +10,12 @@ import com.chanko.yunxi.mes.module.biz.controller.admin.storagemat.vo.StorageMat
import com.chanko.yunxi.mes.module.biz.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storage.StorageDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storagemat.StorageMatDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters.SystemParametersDO;
import com.chanko.yunxi.mes.module.biz.dal.mysql.storage.StorageMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.systemparameters.SystemParametersMapper;
import com.chanko.yunxi.mes.module.biz.enums.CodeEnum;
import com.chanko.yunxi.mes.module.biz.enums.StockTypeEnum;
import com.chanko.yunxi.mes.module.biz.enums.SystemParmetersEnum;
import com.chanko.yunxi.mes.module.biz.manager.CrossOrderManager;
import com.chanko.yunxi.mes.module.biz.service.serialnumber.SerialNumberService;
import com.chanko.yunxi.mes.module.biz.service.storagemat.StorageMatService;
@ -52,6 +55,9 @@ public class StorageServiceImpl implements StorageService {
@Resource
private StorageMatService storageMatService;
@Resource
private SystemParametersMapper systemParametersMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createStorage(StorageSaveReqVO createReqVO) {
@ -92,26 +98,37 @@ public class StorageServiceImpl implements StorageService {
StorageDO updateObj = BeanUtils.toBean(updateReqVO, StorageDO.class);
storageMapper.updateById(updateObj);
// 如为提交同步生成出库单
if(updateObj.getStockType() == StockTypeEnum.OUT.getCode()){
// 数据校验
StorageMatPageReqVO reqVO = new StorageMatPageReqVO();
reqVO.setStockId(updateReqVO.getId())
.setWhId(updateReqVO.getWhId());
List<StorageMatDO> storageMatList = storageMatService.getStorageMatPage(reqVO);
if(CollUtil.isEmpty(storageMatList)) {
throw exception(STORAGE_MAT_NOT_EXISTS);
}
if(OperateTypeEnum.SUBMIT.name().equals(updateReqVO.getActive())){
// 获取系统参数,判断是否允许超量出库
SystemParametersDO systemParametersDO = systemParametersMapper.selectOne("code", SystemParmetersEnum.NEGATIVE_INVENTORY_SWITCH.getDescription());
// 数据校验
StorageMatPageReqVO reqVO = new StorageMatPageReqVO();
reqVO.setStockId(updateReqVO.getId())
.setWhId(updateReqVO.getWhId());
List<StorageMatDO> storageMatList = storageMatService.getStorageMatPage(reqVO);
if(CollUtil.isEmpty(storageMatList)) {
throw exception(STORAGE_MAT_NOT_EXISTS);
}
boolean isAllow = false;
if(systemParametersDO != null && systemParametersDO.getCurrentValue().equals("1")){
isAllow = true;
}
for (StorageMatDO storageMatDO : storageMatList) {
if(storageMatDO.getStorageOkQty().compareTo(new BigDecimal(0)) == 0
|| storageMatDO.getStockQuantity().compareTo(storageMatDO.getStorageOkQty()) < 0){
throw exception(STORAGE_STOCK_QUANTITY_LACK);
}
if(isAllow) {
for (StorageMatDO storageMatDO : storageMatList) {
if (storageMatDO.getStorageOkQty().compareTo(new BigDecimal(0)) == 0
|| storageMatDO.getStockQuantity().compareTo(storageMatDO.getStorageOkQty()) < 0) {
throw exception(STORAGE_STOCK_QUANTITY_LACK);
}
}
}
// 如为提交同步生成出库单
if(updateObj.getStockType() == StockTypeEnum.OUT.getCode()){
// 逻辑变更由提交状态改为审核状态时通过用友接口推送出库单到TPlus
if(OperateTypeEnum.AUDIT.name().equals(updateReqVO.getActive())){
try {
crossOrderManager.createStockOutOrder(updateObj.getId());

@ -0,0 +1,55 @@
package com.chanko.yunxi.mes.module.biz.service.systemparameters;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.systemparameters.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters.SystemParametersDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/**
* Service
*
* @author
*/
public interface SystemParametersService {
/**
*
*
* @param createReqVO
* @return
*/
Long createSystemParameters(@Valid SystemParametersSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updateSystemParameters(@Valid SystemParametersSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deleteSystemParameters(Long id);
/**
*
*
* @param id
* @return
*/
SystemParametersDO getSystemParameters(Long id);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<SystemParametersDO> getSystemParametersPage(SystemParametersPageReqVO pageReqVO);
}

@ -0,0 +1,74 @@
package com.chanko.yunxi.mes.module.biz.service.systemparameters;
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.biz.controller.admin.systemparameters.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters.SystemParametersDO;
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.biz.dal.mysql.systemparameters.SystemParametersMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class SystemParametersServiceImpl implements SystemParametersService {
@Resource
private SystemParametersMapper systemParametersMapper;
@Override
public Long createSystemParameters(SystemParametersSaveReqVO createReqVO) {
// 插入
SystemParametersDO systemParameters = BeanUtils.toBean(createReqVO, SystemParametersDO.class);
systemParametersMapper.insert(systemParameters);
// 返回
return systemParameters.getId();
}
@Override
public void updateSystemParameters(SystemParametersSaveReqVO updateReqVO) {
// 校验存在
validateSystemParametersExists(updateReqVO.getId());
// 更新
SystemParametersDO updateObj = BeanUtils.toBean(updateReqVO, SystemParametersDO.class);
systemParametersMapper.updateById(updateObj);
}
@Override
public void deleteSystemParameters(Long id) {
// 校验存在
validateSystemParametersExists(id);
// 删除
systemParametersMapper.deleteById(id);
}
private void validateSystemParametersExists(Long id) {
if (systemParametersMapper.selectById(id) == null) {
throw exception(SYSTEM_PARAMETERS_NOT_EXISTS);
}
}
@Override
public SystemParametersDO getSystemParameters(Long id) {
return systemParametersMapper.selectById(id);
}
@Override
public PageResult<SystemParametersDO> getSystemParametersPage(SystemParametersPageReqVO pageReqVO) {
return systemParametersMapper.selectPage(pageReqVO);
}
}

@ -4,6 +4,7 @@ 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.framework.security.core.util.SecurityFrameworkUtils;
import com.chanko.yunxi.mes.module.biz.controller.admin.unqualifiednotification.vo.UnqualifiedNotificationFileReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.unqualifiednotification.vo.UnqualifiedNotificationPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.unqualifiednotification.vo.UnqualifiedNotificationSaveReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.serialnumber.SerialNumberDO;
@ -13,6 +14,8 @@ import com.chanko.yunxi.mes.module.biz.enums.BusinessTypeEnum;
import com.chanko.yunxi.mes.module.biz.enums.CodeEnum;
import com.chanko.yunxi.mes.module.biz.enums.UnqualifiedNotificationStatusEnum;
import com.chanko.yunxi.mes.module.biz.service.serialnumber.SerialNumberService;
import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO;
import com.chanko.yunxi.mes.module.infra.dal.mysql.file.FileMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@ -40,6 +43,9 @@ public class UnqualifiedNotificationServiceImpl implements UnqualifiedNotificati
@Resource
private SerialNumberService serialNumberService;
@Resource
private FileMapper fileMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createUnqualifiedNotification(UnqualifiedNotificationSaveReqVO createReqVO) {
@ -52,6 +58,14 @@ public class UnqualifiedNotificationServiceImpl implements UnqualifiedNotificati
unqualifiedNotificationMapper.insert(unqualifiedNotification);
if(createReqVO.getMediaList().stream().count()>0){
for(UnqualifiedNotificationFileReqVO item : createReqVO.getMediaList()){
FileDO fileDO = fileMapper.selectOne("business_id",item.getK());
item.setK(unqualifiedNotification.getId().toString());
fileMapper.updateById(fileDO);
}
}
// 回写序列记录
serialNumberService.updateSerialNumber(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.biz.dal.mysql.process.ProcessMapper">
<!--
一般情况下,尽可能使用 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.biz.dal.mysql.processdetail.ProcessDetailMapper">
<!--
一般情况下,尽可能使用 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.biz.dal.mysql.systemparameters.SystemParametersMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

@ -0,0 +1,154 @@
package com.chanko.yunxi.mes.module.biz.service.systemparameters;
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.biz.controller.admin.systemparameters.vo.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.systemparameters.SystemParametersDO;
import com.chanko.yunxi.mes.module.biz.dal.mysql.systemparameters.SystemParametersMapper;
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.biz.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 SystemParametersServiceImpl}
*
* @author
*/
@Import(SystemParametersServiceImpl.class)
public class SystemParametersServiceImplTest extends BaseDbUnitTest {
@Resource
private SystemParametersServiceImpl systemParametersService;
@Resource
private SystemParametersMapper systemParametersMapper;
@Test
public void testCreateSystemParameters_success() {
// 准备参数
SystemParametersSaveReqVO createReqVO = randomPojo(SystemParametersSaveReqVO.class).setId(null);
// 调用
Long systemParametersId = systemParametersService.createSystemParameters(createReqVO);
// 断言
assertNotNull(systemParametersId);
// 校验记录的属性是否正确
SystemParametersDO systemParameters = systemParametersMapper.selectById(systemParametersId);
assertPojoEquals(createReqVO, systemParameters, "id");
}
@Test
public void testUpdateSystemParameters_success() {
// mock 数据
SystemParametersDO dbSystemParameters = randomPojo(SystemParametersDO.class);
systemParametersMapper.insert(dbSystemParameters);// @Sql: 先插入出一条存在的数据
// 准备参数
SystemParametersSaveReqVO updateReqVO = randomPojo(SystemParametersSaveReqVO.class, o -> {
o.setId(dbSystemParameters.getId()); // 设置更新的 ID
});
// 调用
systemParametersService.updateSystemParameters(updateReqVO);
// 校验是否更新正确
SystemParametersDO systemParameters = systemParametersMapper.selectById(updateReqVO.getId()); // 获取最新的
assertPojoEquals(updateReqVO, systemParameters);
}
@Test
public void testUpdateSystemParameters_notExists() {
// 准备参数
SystemParametersSaveReqVO updateReqVO = randomPojo(SystemParametersSaveReqVO.class);
// 调用, 并断言异常
assertServiceException(() -> systemParametersService.updateSystemParameters(updateReqVO), SYSTEM_PARAMETERS_NOT_EXISTS);
}
@Test
public void testDeleteSystemParameters_success() {
// mock 数据
SystemParametersDO dbSystemParameters = randomPojo(SystemParametersDO.class);
systemParametersMapper.insert(dbSystemParameters);// @Sql: 先插入出一条存在的数据
// 准备参数
Long id = dbSystemParameters.getId();
// 调用
systemParametersService.deleteSystemParameters(id);
// 校验数据不存在了
assertNull(systemParametersMapper.selectById(id));
}
@Test
public void testDeleteSystemParameters_notExists() {
// 准备参数
Long id = randomLongId();
// 调用, 并断言异常
assertServiceException(() -> systemParametersService.deleteSystemParameters(id), SYSTEM_PARAMETERS_NOT_EXISTS);
}
@Test
@Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
public void testGetSystemParametersPage() {
// mock 数据
SystemParametersDO dbSystemParameters = randomPojo(SystemParametersDO.class, o -> { // 等会查询到
o.setId(null);
o.setCreateTime(null);
o.setCode(null);
o.setName(null);
o.setRange(null);
o.setCurrentValue(null);
o.setDescription(null);
});
systemParametersMapper.insert(dbSystemParameters);
// 测试 id 不匹配
systemParametersMapper.insert(cloneIgnoreId(dbSystemParameters, o -> o.setId(null)));
// 测试 createTime 不匹配
systemParametersMapper.insert(cloneIgnoreId(dbSystemParameters, o -> o.setCreateTime(null)));
// 测试 code 不匹配
systemParametersMapper.insert(cloneIgnoreId(dbSystemParameters, o -> o.setCode(null)));
// 测试 name 不匹配
systemParametersMapper.insert(cloneIgnoreId(dbSystemParameters, o -> o.setName(null)));
// 测试 range 不匹配
systemParametersMapper.insert(cloneIgnoreId(dbSystemParameters, o -> o.setRange(null)));
// 测试 currentValue 不匹配
systemParametersMapper.insert(cloneIgnoreId(dbSystemParameters, o -> o.setCurrentValue(null)));
// 测试 description 不匹配
systemParametersMapper.insert(cloneIgnoreId(dbSystemParameters, o -> o.setDescription(null)));
// 准备参数
SystemParametersPageReqVO reqVO = new SystemParametersPageReqVO();
reqVO.setId(null);
reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
reqVO.setCode(null);
reqVO.setName(null);
reqVO.setRange(null);
reqVO.setCurrentValue(null);
reqVO.setDescription(null);
// 调用
PageResult<SystemParametersDO> pageResult = systemParametersService.getSystemParametersPage(reqVO);
// 断言
assertEquals(1, pageResult.getTotal());
assertEquals(1, pageResult.getList().size());
assertPojoEquals(dbSystemParameters, pageResult.getList().get(0));
}
}

@ -0,0 +1,38 @@
import request from '@/config/axios'
export interface ProcessVO {
id: number
code: string
name: string
status: number
}
// 查询工艺路线分页
export const getProcessPage = async (params) => {
return await request.get({ url: `/biz/process/page`, params })
}
// 查询工艺路线详情
export const getProcess = async (id: number) => {
return await request.get({ url: `/biz/process/get?id=` + id })
}
// 新增工艺路线
export const createProcess = async (data: ProcessVO) => {
return await request.post({ url: `/biz/process/create`, data })
}
// 修改工艺路线
export const updateProcess = async (data: ProcessVO) => {
return await request.put({ url: `/biz/process/update`, data })
}
// 删除工艺路线
export const deleteProcess = async (id: number) => {
return await request.delete({ url: `/biz/process/delete?id=` + id })
}
// 导出工艺路线 Excel
export const exportProcess = async (params) => {
return await request.download({ url: `/biz/process/export-excel`, params })
}

@ -0,0 +1,79 @@
import request from '@/config/axios'
export interface ProcessVO {
id: number
code: string
name: string
status: number
matList:[]
procedureList:[]
}
// 查询工艺路线分页
export const getProcessPage = async (params) => {
return await request.get({ url: `/biz/process/page`, params })
}
// 查询工艺路线详情
export const getProcess = async (id: number) => {
return await request.get({ url: `/biz/process/get?id=` + id })
}
// 新增工艺路线
export const createProcess = async (data: ProcessVO) => {
return await request.post({ url: `/biz/process/create`, data })
}
// 修改工艺路线
export const updateProcess = async (data: ProcessVO) => {
return await request.put({ url: `/biz/process/update`, data })
}
// 删除工艺路线
export const deleteProcess = async (id: number) => {
return await request.delete({ url: `/biz/process/delete?id=` + id })
}
// 导出工艺路线 Excel
export const exportProcess = async (params) => {
return await request.download({ url: `/biz/process/export-excel`, params })
}
// 查询工艺路线明细分页
export const getProcessDetailPage = async (params) => {
return await request.get({ url: `/biz/process-detail/page`, params })
}
// 查询工艺路线明细详情
export const getProcessDetail = async (id: number) => {
return await request.get({ url: `/biz/process-detail/get?id=` + id })
}
//===========================================================
export interface ProcessDetailVO {
id: number
procedureId: number
procedureSort: number
procedureEquipId: number
type: number
materialId: number
}
// 新增工艺路线明细
export const createProcessDetail = async (data: ProcessDetailVO) => {
return await request.post({ url: `/biz/process-detail/create`, data })
}
// 修改工艺路线明细
export const updateProcessDetail = async (data: ProcessDetailVO) => {
return await request.put({ url: `/biz/process-detail/update`, data })
}
// 删除工艺路线明细
export const deleteProcessDetail = async (id: number) => {
return await request.delete({ url: `/biz/process-detail/delete?id=` + id })
}
// 导出工艺路线明细 Excel
export const exportProcessDetail = async (params) => {
return await request.download({ url: `/biz/process-detail/export-excel`, params })
}

@ -0,0 +1,40 @@
import request from '@/config/axios'
export interface SystemParametersVO {
id: number
code: string
name: string
scope: string
currentValue: string
description: string
}
// 查询系统参数设置分页
export const getSystemParametersPage = async (params) => {
return await request.get({ url: `/biz/system-parameters/page`, params })
}
// 查询系统参数设置详情
export const getSystemParameters = async (id: number) => {
return await request.get({ url: `/biz/system-parameters/get?id=` + id })
}
// 新增系统参数设置
export const createSystemParameters = async (data: SystemParametersVO) => {
return await request.post({ url: `/biz/system-parameters/create`, data })
}
// 修改系统参数设置
export const updateSystemParameters = async (data: SystemParametersVO) => {
return await request.put({ url: `/biz/system-parameters/update`, data })
}
// 删除系统参数设置
export const deleteSystemParameters = async (id: number) => {
return await request.delete({ url: `/biz/system-parameters/delete?id=` + id })
}
// 导出系统参数设置 Excel
export const exportSystemParameters = async (params) => {
return await request.download({ url: `/biz/system-parameters/export-excel`, params })
}

@ -1,5 +1,5 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<Dialog :title="dialogTitle" v-model="dialogVisible" :width="1400">
<el-form
ref="formRef"
:model="formData"
@ -7,114 +7,246 @@
label-width="150px"
v-loading="formLoading"
>
<el-form-item label="物料图片" prop="logo">
<UploadImg v-model="formData.logo" disabled/>
</el-form-item>
<el-form-item label="物料编码" prop="code">
<el-input disabled v-model="formData.code" placeholder="系统自动生成" class="!w-250px" />
</el-form-item>
<el-form-item label="物料名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入物料名称" disabled class="!w-250px" />
</el-form-item>
<el-form-item label="物料类型" prop="materialType">
<el-select v-model="formData.materialType" disabled clearable placeholder="请选择物料类型" class="!w-250px">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.BIZ_MATERIAL_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="系统单位" prop="unit">
<el-select v-model="formData.unit" disabled clearable placeholder="请选择系统单位" class="!w-250px">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.BIZ_MATERIAL_UNIT)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="物料简称" prop="shortName">
<el-input v-model="formData.shortName" disabled placeholder="请输入物料简称" class="!w-250px" />
</el-form-item>
<el-form-item label="规格/型号" prop="spec">
<el-input v-model="formData.spec" disabled placeholder="请输入规格/型号" class="!w-250px" />
</el-form-item>
<el-form-item label="品牌" prop="brand">
<el-input v-model="formData.brand" disabled placeholder="请输入品牌" class="!w-250px" />
</el-form-item>
<el-form-item label="物料主要来源" prop="mainFrom">
<el-select v-model="formData.mainFrom" disabled clearable placeholder="请选择物料主要来源" class="!w-250px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_MATERIAL_ORIGINAL)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="首选供应商" prop="mainSupplierId">
<!-- <el-select v-model="formData.mainSupplierId"
placeholder="请输入首选供应商"
:remote-method="remoteSupplierSearch"
remote-show-suffix
remote
clearable
reserve-keyword
filterable
:loading="supplierSelectLoading"
class="!w-250px"
>
<el-option
v-for="item in supplierSelectList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select> -->
<SupplierSelect v-model="formData.mainSupplierId" class="!w-250px" @update:newValue="handleSelectedSupplier" disabled />
</el-form-item>
<el-form-item label="销项/进项税率" prop="outputInputTaxRate">
<el-input v-model="formData.outputInputTaxRate" disabled placeholder="请输入销项税率/进项税率" class="!w-250px" >
<template #append>%</template>
</el-input>
</el-form-item>
<el-form-item label="备注" prop="description">
<el-input type="textarea" disabled v-model="formData.description" height="150px" class="!w-500px" show-word-limit maxlength="200"/>
</el-form-item>
<div
class="warncenter"
style="height: 600px; overflow: auto; border: none; padding: 0px 20px"
>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span>
</template>
<template #default>
<el-row>
<el-col :span="8">
<el-form-item label="物料图片" prop="logo">
<UploadImg v-model="formData.logo" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="物料编码" prop="code">
<el-input
disabled
v-model="formData.code"
placeholder="系统自动生成"
class="!w-250px"
/>
</el-form-item>
<el-form-item label="物料类型" prop="materialType">
<el-select
v-model="formData.materialType"
disabled
clearable
placeholder="请选择物料类型"
class="!w-250px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.BIZ_MATERIAL_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="规格/型号" prop="spec">
<el-input
v-model="formData.spec"
disabled
placeholder="请输入规格/型号"
class="!w-250px"
/>
</el-form-item>
<el-form-item label="首选供应商" prop="mainSupplierId">
<SupplierSelect
v-model="formData.mainSupplierId"
class="!w-250px"
@update:newValue="handleSelectedSupplier"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="物料名称" prop="name">
<el-input
v-model="formData.name"
placeholder="请输入物料名称"
disabled
class="!w-250px"
/>
</el-form-item>
<el-form-item label="安全库存" prop="invSafe">
<el-input v-model="formData.invSafe" disabled placeholder="请输入安全库存" class="!w-250px" />
</el-form-item>
<el-form-item label="物料条码" prop="barcode">
<el-input v-model="formData.barcode" disabled placeholder="请输入物料条码" class="!w-250px" />
</el-form-item>
<el-form-item label="启用状态" prop="status">
<el-radio-group v-model="formData.status" disabled>
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_COMMON_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="系统单位" prop="unit">
<el-select
v-model="formData.unit"
disabled
clearable
placeholder="请选择系统单位"
class="!w-250px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.BIZ_MATERIAL_UNIT)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="品牌" prop="brand">
<el-input
v-model="formData.brand"
disabled
placeholder="请输入品牌"
class="!w-250px"
/>
</el-form-item>
<el-form-item label="销项/进项税率" prop="outputInputTaxRate">
<el-input
v-model="formData.outputInputTaxRate"
disabled
placeholder="请输入销项税率/进项税率"
class="!w-250px"
>
<template #append>%</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="物料简称" prop="shortName">
<el-input
v-model="formData.shortName"
disabled
placeholder="请输入物料简称"
class="!w-250px"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="物料主要来源" prop="mainFrom">
<el-select
v-model="formData.mainFrom"
disabled
clearable
placeholder="请选择物料主要来源"
class="!w-250px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_MATERIAL_ORIGINAL)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="启用状态" prop="status">
<el-radio-group v-model="formData.status" disabled>
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_COMMON_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="" label="工艺路线编码">
<el-input
class="!w-250px"
v-model="formData.productPathCode"
@click.prevent="handlecode"
:readonly="!isEditing"
placeholder="工艺路线编码"
>
<template #append
><el-button
:icon="Search"
@click="handlecode"
/></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工艺路线名称" >
<el-input
v-model="formData.productPathName"
disabled
placeholder="工艺路线名称"
class="!w-250px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="description">
<el-input
type="textarea"
disabled
v-model="formData.description"
height="150px"
class="!w-500px"
show-word-limit
maxlength="200"
/>
</el-form-item>
</el-col>
</el-row>
</template>
</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>
<template #default>
<el-row>
<el-col :span="8">
<el-form-item label="安全库存" prop="invSafe">
<el-input
v-model="formData.invSafe"
:disabled="!openupdata"
placeholder="请输入安全库存"
class="!w-250px"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="物料条码" prop="barcode">
<el-input
v-model="formData.barcode"
disabled
placeholder="请输入物料条码"
class="!w-250px"
/>
</el-form-item>
</el-col>
</el-row>
</template>
</el-card>
</div>
</el-form>
<template #footer>
<!-- <el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button> -->
<el-button
@click="submitForm"
type="primary"
:disabled="formLoading"
:style="{ display: openupdata ? '' : 'none' }"
> </el-button
>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
<!-- 表单弹窗添加/修改 -->
<Productpath ref="dialogSelectOnlyref" @success="handleSelectedProductpath" />
</template>
<script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import * as MaterialApi from '@/api/biz/material'
import {getSupplierPage} from "@/api/biz/supplier";
import { getSupplierPage } from '@/api/biz/supplier'
import SupplierSelect from '@/views/biz/hlvuestyle/supplierSelect.vue'
import { Search, Plus } from '@element-plus/icons-vue'
import Productpath from './productpath.vue'
const { t } = useI18n() //
const message = useMessage() //
@ -148,19 +280,19 @@ const formData = ref({
invLowerLimit: undefined,
barcode: undefined,
virtualPart: undefined,
logo: undefined,
logo: undefined
})
const formRules = reactive({
name: [{ required: true, message: '物料名称不能为空', trigger: 'blur' }],
status: [{ required: true, message: '启用状态不能为空', trigger: 'blur' }],
materialType: [{ required: true, message: '物料类型不能为空', trigger: 'change' }],
unit: [{ required: true, message: '系统单位不能为空', trigger: 'change' }],
unit: [{ required: true, message: '系统单位不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
const supplierList = ref<any[]>([]) //
const supplierSelectList = ref<any[]>([])
const supplierSelectLoading = ref(false);
const supplierSelectLoading = ref(false)
const remoteSupplierSearch = (query: string) => {
if (query) {
@ -172,11 +304,18 @@ const remoteSupplierSearch = (query: string) => {
})
}, 200)
} else {
supplierSelectList.value = supplierList.value;
supplierSelectList.value = supplierList.value
}
}
/** 打开弹窗 */
const openupdata = ref(false)
const open = async (type: string, id?: number) => {
if (type == 'update') {
openupdata.value = true
} else {
openupdata.value = false
}
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
@ -190,15 +329,14 @@ const open = async (type: string, id?: number) => {
let params = {
pageNo: 1,
pageSize: 10,
status: "1"
};
const supplierData = await getSupplierPage(params);
supplierList.value = supplierData.list;
supplierSelectList.value = supplierData.list;
status: '1'
}
const supplierData = await getSupplierPage(params)
supplierList.value = supplierData.list
supplierSelectList.value = supplierData.list
} finally {
formLoading.value = false
}
}
defineExpose({ open }) // open
@ -254,14 +392,25 @@ const resetForm = () => {
invLowerLimit: undefined,
barcode: undefined,
virtualPart: undefined,
logo: undefined,
logo: undefined
}
formRef.value?.resetFields()
}
//
//
const dialogSelectOnlyref = ref()
const handlecode = (type: string) => {
dialogSelectOnlyref.value?.open(type)
}
//
const handleSelectedProductpath=(val)=>{
console.log(val);
}
//
const handleSelectedSupplier = (newValue: any) => {
formData.value.mainSupplierId = newValue?.id
}
</script>

@ -120,8 +120,16 @@
<dict-tag :type="DICT_TYPE.BIZ_COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" min-width="120">
<el-table-column fixed="right" label="操作" align="center" min-width="280">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['biz:material:update']"
>
编辑
</el-button>
<el-button
link
type="primary"
@ -130,6 +138,10 @@
>
查看详情
</el-button>
<el-button link
type="primary" @click="openFormPay('detailHPay', scope.row.id)">
设置工时工价
</el-button>
<!-- <el-button
link
type="danger"
@ -152,6 +164,7 @@
</el-card>
<!-- 表单弹窗添加/修改 -->
<MaterialForm ref="formRef" @success="getList" />
<PayForm ref="formPayRef" @success="getList" />
</template>
<script setup lang="ts">
@ -160,6 +173,7 @@ import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as MaterialApi from '@/api/biz/material'
import MaterialForm from './MaterialForm.vue'
import PayForm from './payForm.vue'
defineOptions({ name: 'Material' })
@ -256,7 +270,11 @@ const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
///
const formPayRef = ref()
const openFormPay = (type: string, id?: number) => {
formPayRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {

@ -0,0 +1,106 @@
<template>
<Dialog :title="dialogTitle" width="80%" v-model="dialogVisible" center>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="formData"
ref="formRef"
:rules="formRules"
:inline="true"
label-width="128px"
>
<el-form-item label="工艺路线编码" prop="code">
<el-input v-model="formData.code" placeholder="工艺路线编码" clearable class="!w-240px" />
</el-form-item>
<el-form-item label="工艺路线名称" prop="name">
<el-input v-model="formData.name" placeholder="工艺路线名称" clearable class="!w-240px" />
</el-form-item>
</el-form>
</ContentWrap>
<el-card class="hl-card">
<!-- 列表 -->
<el-table v-loading="loading" :data="list" :stripe="true" class="hl-table">
<el-table-column fixed label="序号" type="index" width="60" />
<el-table-column fixed label="工序编码" align="center" prop="code" min-width="120" />
<el-table-column fixed label="工序名称" align="center" prop="name" min-width="120" />
<el-table-column label="所属车间" align="center" prop="name" min-width="120" />
<el-table-column label="顺序号" align="center" prop="name" min-width="120" />
<el-table-column label="是否需要报工" align="center" prop="name" min-width="120" />
<el-table-column label="默认工资类型" align="center" prop="name" min-width="120" />
<el-table-column label="额定工时" align="center" prop="name" min-width="120" />
<el-table-column label="额定工价" align="center" prop="name" min-width="120" />
<el-table-column label="额定工价" align="center" prop="name" min-width="120" />
<el-table-column fixed="right" label="操作" align="center" prop="name" min-width="120">
<template #default="scope">
<el-button link type="primary" @click="openForm(scope.row.id)"> </el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<template #footer>
<el-button @click="dialogVisible = false" size="large"> </el-button>
<el-button @click="submitForm" type="primary" size="large"> </el-button>
</template>
</Dialog>
<UserForm ref="userref" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter, dateFormatter2, formatDate } from '@/utils/formatTime'
import { ref } from 'vue'
import UserForm from './userForm.vue'
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const loading = ref(false) //
const list = ref([{name: '1'}]) //
const total = ref(0) //
const formData: any = ref({
id: undefined,
code: undefined,
name: undefined
})
const formRules = reactive({
code: [{ required: true, message: '编码,唯一不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
// const data = await
// list.value = data.list
// total.value = data.total
} finally {
loading.value = false
}
}
const emit = defineEmits(['success']) // success
/** 提交表单 */
const submitForm = () => {
dialogVisible.value = false
//
emit('success')
}
//
const userref = ref()
const openForm = (id) => {
userref.value.open(id)
}
/** 打开弹窗 */
const open = async () => {
dialogTitle.value = t('设置工时工价')
dialogVisible.value = true
getList()
}
defineExpose({ open }) // open
</script>

@ -0,0 +1,141 @@
<template>
<Dialog :title="dialogTitle" width="80%" v-model="dialogVisible" center>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="108px">
<el-form-item label="工艺路线编码" prop="code">
<el-input v-model="queryParams.code" placeholder="工艺路线编码" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="工艺路线名称" prop="name">
<el-input v-model="queryParams.name" placeholder="工艺路线名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" /> 查询
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<el-card class="hl-card">
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="tablelist" :stripe="true" class="hl-table" @selection-change="handleSelectionChange"
@row-click="clickRow" ref="multipleTable" selection
>
<el-table-column fixed type="selection" width="40" />
<el-table-column fixed label="序号" type="index" width="60" />
<el-table-column label="工艺路线编码" align="center" prop="code" min-width="220" />
<el-table-column fixed label="工艺路线名称" align="center" prop="name" min-width="220" />
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" />
</ContentWrap>
</el-card>
<template #footer>
<el-button @click="dialogVisible=false" size="large"> </el-button>
<el-button @click="submitForm" type="primary" size="large"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter, dateFormatter2, formatDate } from '@/utils/formatTime'
import { ref } from 'vue'
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
name: undefined,
code: undefined,
orderStatus: 32
})
const queryFormRef = ref() //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
// const data = await ProjectOrderApi.getProjectOrderPage(queryParams)
// list.value = data.list
// total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const tablelist = ref([
{
name: '合立000',
code: 'biz000'
},
{
name: '合立111',
code: 'biz000'
}
])
const multipleTable = ref<InstanceType<typeof ElTable>>()
const multipleSelection:any = ref([])
const handleSelectionChange = (val: []) => {
if (val.length > 1) {
multipleTable.value.clearSelection()
multipleTable.value.toggleRowSelection(val.pop())
} else {
multipleSelection.value = val.pop()
}
}
const clickRow = (row: any) => {
if(row){
multipleTable.value!.toggleRowSelection(row, undefined)
}else{
multipleTable.value!.clearSelection()
}
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = () => {
if (multipleSelection.value.length === 0) {
message.warning('请选择一条数据')
return
}
dialogVisible.value = false
//
emit('success', multipleSelection.value)
}
/** 打开弹窗 */
const open = async () => {
dialogTitle.value = t('common.selectText')
dialogVisible.value = true
handleQuery()
}
defineExpose({ open }) // open
</script>

@ -0,0 +1,109 @@
<template>
<Dialog :title="dialogTitle" width="1000px" v-model="dialogVisible" center>
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem"></el-button>
<el-card class="hl-card">
<!-- 列表 -->
<el-table v-loading="loading" :data="list" :stripe="true" class="hl-table">
<el-table-column fixed label="序号" type="index" width="60" />
<el-table-column fixed label="员工姓名" align="center" prop="name" min-width="120">
<template #default="scope">
<el-input v-model="scope.row.name" placeholder="员工姓名" />
</template>
</el-table-column>
<el-table-column label="工资类型" align="center" prop="salaryType" min-width="120">
<template #default="scope">
<!-- {{ getDictLabel(DICT_TYPE.BIZ_SALARY_TYPE, scope.row.salaryType) }} -->
<el-select v-model="scope.row.salaryType" placeholder="工资类型" >
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.BIZ_SALARY_TYPE)"
:key="dict.value"
@change="onchangetype(val)"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</template>
</el-table-column>
<el-table-column label="工价" align="center" prop="name" min-width="120">
<template #default="scope">
<el-input v-model="scope.row.type" placeholder="工价" />
</template>
</el-table-column>
<el-table-column label="工时" align="center" prop="name" min-width="120">
<template #default="scope">
<el-input v-model="scope.row.type" placeholder="工时" />
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" prop="name" min-width="120">
<template #default="scope">
<el-button link type="danger" @click="handleEdit(scope.$index)"> </el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<template #footer>
<el-button @click="dialogVisible = false" size="large"> </el-button>
<el-button @click="submitForm" type="primary" size="large"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getDictLabel, getIntDictOptions,getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter, dateFormatter2, formatDate } from '@/utils/formatTime'
import { List } from '@element-plus/icons-vue/dist/types'
import { ref } from 'vue'
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const loading = ref(false) //
const list = ref([]) //
const total = ref(0) //
const formRules = reactive({
code: [{ required: true, message: '编码,唯一不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
// const data = await
// list.value = data.list
// total.value = data.total
} finally {
loading.value = false
}
}
const emit = defineEmits(['success']) // success
/** 提交表单 */
const submitForm = () => {
dialogVisible.value = false
emit('success')
}
const onAddItem = () => {
const newData = {
//
name: '',
salaryType: ''
}
list.value.push(newData)
}
const handleEdit = (index) => {
list.value.splice(index, 1)
}
/** 打开弹窗 */
const open = async () => {
dialogTitle.value = t('设置员工')
dialogVisible.value = true
getList()
}
defineExpose({ open }) // open
</script>

@ -0,0 +1,127 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="108px"
v-loading="formLoading"
>
<el-form-item label="参数编码" prop="code">
<el-input v-model="formData.code" placeholder="参数编码" class="!w-250px" />
</el-form-item>
<el-form-item label="参数名称" prop="name">
<el-input v-model="formData.name" placeholder="参数名称" class="!w-250px" />
</el-form-item>
<el-form-item label="值范围" prop="scope">
<el-input v-model="formData.scope" placeholder="值范围" class="!w-250px" />
</el-form-item>
<el-form-item label="当前值" prop="currentValue">
<el-input v-model="formData.currentValue" placeholder="当前值" class="!w-250px" />
</el-form-item>
<el-form-item label="备注" prop="description">
<el-input
type="textarea"
v-model="formData.description"
height="150px"
show-word-limit
maxlength="200"
/>
</el-form-item>
<!-- <el-form-item label="启用状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item> -->
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as SystemparametersApi from '@/api/biz/systemparameters'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
code: undefined,
name: undefined,
scope: undefined,
currentValue: undefined,
description: undefined
})
const formRules = reactive({
code: [{ required: true, message: '参数编码不能为空', trigger: 'blur' }],
name: [{ required: true, message: '参数名称不能为空', trigger: 'blur' }],
currentValue: [{ required: true, message: '当前值不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
formLoading.value = true
try {
if (id) {
formData.value = await SystemparametersApi.getSystemParameters(id)
}
} finally {
formLoading.value = false
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as SystemparametersApi.SystemParametersVO
if (formType.value === 'create') {
console.log(formType.value)
await SystemparametersApi.createSystemParameters(data)
message.success(t('common.createSuccess'))
} else {
await SystemparametersApi.updateSystemParameters(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
name: undefined,
scope: undefined,
currentValue: undefined,
description: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,131 @@
<template>
<el-card class="hl-card" v-loading="fullscreenLoading">
<template #header>
<span>系统参数</span>
</template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="108px"
>
<el-form-item label="参数编码" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入参数编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="参数名称" prop="brief">
<el-input
v-model="queryParams.name"
placeholder="请输入参数名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery" type="primary"
><Icon icon="ep:search" class="mr-5px" /> 查询</el-button
>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button @click="openForm('create')" plain type="primary">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading="loading"
:data="list"
:stripe="true"
:show-overflow-tooltip="true"
class="hl-table"
>
<el-table-column type="index" min-width="60" fixed label="序号" align="center" />
<el-table-column label="参数编码" min-width="120" fixed align="center" prop="code" />
<el-table-column label="参数名称" align="center" min-width="200" prop="name" />
<el-table-column label="值范围" align="center" min-width="120" prop="scope" />
<el-table-column label="当前值" align="center" min-width="140" prop="currentValue" />
<el-table-column label="备注" align="center" min-width="180" prop="description" />
<el-table-column label="操作" min-width="140" fixed="right" align="center">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row.id)">
编辑
</el-button>
<!-- <el-button link type="primary" @click="openForm('detail', scope.row.id)">
查看详情
</el-button> -->
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</el-card>
<!-- 表单弹窗添加/修改 -->
<ParamenterForm ref="ParamenterformRef" @success="getList" />
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
import ParamenterForm from './ParamenterForm.vue'
import * as SystemparametersApi from '@/api/biz/systemparameters'
// src\api\biz\systemparameters\index.ts
const message = useMessage() //
const { t } = useI18n() //
const list = ref([]) //
const total = ref(0) //
const loading = ref(true) //
const queryFormRef = ref() //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
code: undefined,
name: undefined
})
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const ParamenterformRef = ref()
const openForm = (type: string, id?: number) => {
ParamenterformRef.value.open(type, id)
}
const getList = async () => {
loading.value = true
try {
const data = await SystemparametersApi.getSystemParametersPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
onMounted(() => {
getList()
})
</script>
<style scoped lang="scss"></style>

@ -374,12 +374,12 @@ onMounted(async () => {
var projectInit = await ProjectOrderApi.getProjectOrder(formData.value.projectId)
customerInit.value = await CustomerApi.getCustomer(projectInit.customerId)
var businessManInit = await UserApi.getUser(projectInit.businessMan)
// var businessManInit = await UserApi.getUser(projectInit.businessMan)
formData.value.projectCode = projectInit.code
formData.value.projectStatus = projectInit.orderStatus
formData.value.customerName = customerInit?.value.name
formData.value.projectName = projectInit.projectName
formData.value.businessMan = businessManInit?.nickname
// formData.value.businessMan = businessManInit?.nickname
formData.value.projectStartTime = projectInit.projectStartTime
formData.value.projectEndTime = projectInit.projectEndTime
formData.value.businessLine = projectInit.businessLine

@ -0,0 +1,260 @@
<template>
<el-card class="hl-card">
<template #header>
<span>工艺路线</span>
</template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="115px"
>
<el-form-item label="工艺路线编码">
<el-input
v-model="queryParams.code"
class="!w-240px"
clearable
placeholder="工艺路线编码"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="工艺路线名称">
<el-input
v-model="queryParams.name"
class="!w-240px"
clearable
placeholder="工艺路线编码"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item style="margin-left: 20px">
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" /> 查询
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
<el-button @click="openDetail('create')" plain type="primary">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading="loading"
:data="list"
:stripe="true"
:show-overflow-tooltip="true"
class="hl-table"
>
<el-table-column fixed label="序号" type="index" width="60" align="center" />
<el-table-column fixed label="工艺路线编码" align="center" prop="code" min-width="160">
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.code }}
</el-button>
</template>
</el-table-column>
<el-table-column label="工艺路线名称" align="center" prop="name" min-width="120" />
<el-table-column
fixed="right"
label="创建人"
align="center"
prop="ownerName"
min-width="120"
/>
<el-table-column
label="创建时间"
align="center"
prop="submitTime"
:formatter="dateFormatter2"
min-width="140"
/>
<el-table-column
fixed="right"
label="修改人"
align="center"
prop="updataName"
min-width="120"
/>
<el-table-column
label="修改时间"
align="center"
prop="updataTime"
:formatter="dateFormatter2"
min-width="140"
/>
<el-table-column label="启用状态" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.BIZ_COMMON_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" min-width="140">
<template #header>
<span style="margin-right: 30%">操作</span>
</template>
<template #default="scope">
<el-button link type="primary" @click="openDetail('update', scope.row.id)">
编辑
</el-button>
<!-- <el-dropdown>
<span class="el-dropdown-link"
>更多
<el-icon class="el-icon--right">
<arrow-down />
</el-icon>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="handleDelete(scope.row.id)"></el-dropdown-item>
<el-dropdown-item @click="openDetail('detail', scope.row.id)"
>查看详情</el-dropdown-item
>
</el-dropdown-menu>
</template>
</el-dropdown> -->
<!-- <el-button link type="danger" @click="handleDelete(scope.row.id)">
删除
</el-button>-->
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
查看详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</el-card>
</template>
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE, getDictLabel, getIntDictOptions } from '@/utils/dict'
import { dateFormatter, dateFormatter2, formatDate } from '@/utils/formatTime'
import download from '@/utils/download'
import * as EquipMaintenanceRecordApi from '@/api/biz/equipmaintenancerecord'
import { useCommonStateWithOut } from '@/store/modules/common'
import { useUserStore } from '@/store/modules/user'
import WorkshopSelect from '@/views/biz/hlvuestyle/workshopSelect.vue'
import EquipmentSelect from '@/views/biz/hlvuestyle/equipmentSelect.vue'
defineOptions({ name: 'ProcessDesign3D' })
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const commonStore = useCommonStateWithOut()
const userStore = useUserStore()
const username = userStore.getUser.nickname
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
code: undefined,
name: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await EquipMaintenanceRecordApi.getEquipMaintenanceRecordPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 添加/修改操作 */
const openDetail = (type: string, id?: number) => {
commonStore.setStore('active', type)
commonStore.setStore('id', id)
router.push({
name: 'productcraftpathdetail',
query: {
active: type,
id: id
}
})
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
// await EquipMaintenanceRecordApi.deleteEquipMaintenanceRecord(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ProcessDesignApi.exportProcessDesign(queryParams)
download.excel(data, '工艺设计.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
<style scoped>
.el-dropdown-link {
cursor: pointer;
margin: 6px;
color: var(--el-color-primary);
display: flex;
align-items: center;
}
</style>

@ -0,0 +1,198 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="80%">
<ContentWrap class="borderxx">
<el-form class="-mb-15px" :model="queryReqVo" :inline="true" label-width="108px">
<el-form-item label=" 物料编码:">
<el-input v-model="queryReqVo.code" placeholder="物料名称/编码" class="!w-240px" :disabled="!chkboxEnable" @keyup="handleQuery"/>
</el-form-item>
<el-form-item label=" 物料名称:">
<el-input v-model="queryReqVo.name" placeholder="物料名称/编码" class="!w-240px" :disabled="!chkboxEnable" @keyup="handleQuery"/>
</el-form-item>
<el-form-item label="规格/型号" @keyup="handleQuery">
<el-input v-model="queryReqVo.spec" placeholder="规格/型号" class="!w-240px" :disabled="!chkboxEnable" />
</el-form-item>
<el-form-item style="margin-left:20px">
<el-button @click="handleQuery" type="primary" :disabled="!chkboxEnable">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button><el-button @click="resetQuery" :disabled="!chkboxEnable">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<el-card class="hl-table">
<el-table ref="multipleTable" :data="list" v-loading="formLoading" class="hl-table" @selection-change="handleSelectionChange" :row-key="getRowKeys" min-width="1800" @row-click="clickRow" :style="{ height: list && list.length > 9 ? '520px' : ''}">
<el-table-column type="selection" width="55" :reserve-selection="true" :selectable="row=>chkboxEnable" />
<el-table-column label="序号" type="index" min-width="70" fixed align="center" />
<el-table-column prop="code" label="物料编码" min-width="120" fixed align="center" />
<el-table-column prop="name" label="物料名称" min-width="260" align="center" />
<el-table-column label="物料类型" align="center" prop="materialType" min-width="140">
<template #default="scope">
<dict-tag :type="DICT_TYPE.BIZ_MATERIAL_TYPE" :value="scope.row.materialType" />
</template>
</el-table-column>
<el-table-column prop="shortName" label="物料简称" min-width="160" align="center" />
<el-table-column prop="spec" label="规格/型号" min-width="120" align="center" />
<el-table-column prop="brand" label="品牌" min-width="120" align="center" />
<el-table-column prop="stockQuantity" label="库存数量" min-width="120" align="center" />
<el-table-column prop="unit" label="单位" min-width="120" align="center">
<template #default="scope">
<dict-tag :type="DICT_TYPE.BIZ_MATERIAL_UNIT" :value="scope.row.unit" />
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryReqVo.pageNo" v-model:limit="queryReqVo.pageSize" @pagination="getList()" />
</el-card>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import * as MaterialApi from '@/api/biz/material'
import { ElTable } from 'element-plus'
//:selectable="row=>row.disabled || chkboxEnable"
const chkboxEnable = ref(true)
const queryEnable = ref(true)
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const list = ref([]) //
const total = ref(0) //
const multipleTable = ref<InstanceType<typeof ElTable>>()
const multipleSelection = ref([])
const handleSelectionChange = (val: []) => {
multipleSelection.value = val
}
const clickRow = (row: any) => {
if (chkboxEnable.value) {
if (row) {
multipleTable.value!.toggleRowSelection(row, undefined)
} else {
multipleTable.value!.clearSelection()
}
}
}
//key,
const getRowKeys = (row) => {
return row.matId
}
const queryReqVo: any = reactive({
pageNo: 1,
pageSize: 10,
code: undefined,
name: undefined,
brand: undefined,
spec: undefined,
sizeInfo: undefined,
traceType: undefined,
dftStoreWh: undefined,
dftStoreRg: undefined,
dftStorePn: undefined,
dftRoute: undefined,
description: undefined,
createTime: [],
status: 1,
shortName: undefined,
materialType: undefined,
compositionId: undefined,
outputInputTaxRate: undefined,
mainSupplierId: undefined,
mainFrom: undefined,
unit: undefined,
invSafe: undefined,
invUpperLimit: undefined,
invLowerLimit: undefined,
barcode: undefined,
virtualPart: 'N',
logo: undefined,
returnStock:true
})
/** 搜索按钮操作 */
const handleQuery = async () => {
queryReqVo.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryReqVo.matCode = ''
queryReqVo.matSpec = ''
handleQuery()
}
const getList = async () => {
formLoading.value = true
var data
try {
data = await MaterialApi.getMaterialPage(queryReqVo)
data.list.forEach((mat) => {
mat.storageOkQty = mat.matRest
mat.requireAmount = mat.matRest
})
list.value = data.list
total.value = data.total
} finally {
formLoading.value = false
}
}
const formType = ref()
/** 打开弹窗 */
const open = async (whId: number, type: string) => {
multipleSelection.value = []
dialogVisible.value = true
dialogTitle.value = '物料列表'
formType.value = type
//
queryReqVo.whId = whId
queryReqVo.matCode = ''
queryReqVo.matSpec = ''
getList()
chkboxEnable.value = true
list.value.forEach((row) => {
setTimeout(() => {
multipleTable.value.toggleRowSelection(row, !chkboxEnable.value) //
}, 0)
})
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
formLoading.value = true
try {
dialogVisible.value = false
multipleSelection.value.forEach((item) => {
item.matId = item.id
// item.matRest = item.storageOkQty
item.storageOkQty = ''
item.whId = item.whId ?? ''
item.rgId = item.rgId ?? ''
item.pnId = item.pnId ?? ''
item.projectSubCode = item.code ?? ''
item.projectSubName= item.name ?? ''
})
//
emit('success', multipleSelection.value)
} finally {
formLoading.value = false
}
}
</script>

@ -0,0 +1,439 @@
<template>
<el-card class="hl-card">
<template #header>
<span><span v-html="dialogTitle"></span></span>
</template>
<el-form
ref="formRef"
:rules="formRules"
label-width="120px"
:model="formData"
v-loading="formLoading"
>
<!-- 基础信息-->
<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 :span="8">
<el-form-item label="工艺路线编码" prop="">
<el-input
class="!w-260px"
disabled
v-model="formData.code"
placeholder="工艺路线编码"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工艺路线名称" prop="name">
<el-input
class="!w-260px"
disabled
v-model="formData.name"
placeholder="工艺路线名称"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="启用状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_COMMON_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
</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-col>
<el-button class="hl-addbutton" type="primary" size="large" @click="AddMatForm"
>新增</el-button
>
</el-col>
<el-form
ref="subFormRef"
:model="formData.subList"
:rules="subFormRules"
v-loading="subFormLoading"
label-width="0"
>
<el-table :data="formData.subList" class="hl-table">
<el-table-column type="index" label="序号" align="center" min-width="60" fixed />
<el-table-column prop="matId" label="工序名称" min-width="120" align="center">
<template #default="scope">
<el-form-item :prop="`${scope.$index}.matId`" class="mb-0px!">
<ProcedureSelect
v-model="scope.row.matId"
@update:newValue="handleSelectProcedure(scope.$index, $event)"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column prop="matCode" label="工序编码" min-width="120" align="center" />
<el-table-column
label="是否需要报工"
align="center"
prop="isReport"
min-width="120"
>
<template #default="scope">
<dict-tag
:type="DICT_TYPE.BIZ_COMMON_IS_OR_NOT"
:value="scope.row.isReport"
/>
</template>
</el-table-column>
<el-table-column
label="默认工资类型"
align="center"
prop="salaryType"
min-width="120"
>
<template #default="scope">
{{ getDictLabel(DICT_TYPE.BIZ_SALARY_TYPE, scope.row.salaryType) }}
</template>
</el-table-column>
<el-table-column label="所属车间" align="center" prop="wname" min-width="120" />
<el-table-column prop="" width="120" label="顺序号">
<template #default="scope">
<el-input v-model="scope.row.proportionNum" />
</template>
</el-table-column>
<el-table-column label="生产设备" min-width="180" align="center">
<template #default="{ row, $index }">
<!-- :rules="subFormRules.deviceModel" -->
<el-form-item :prop="`${$index}.deviceModel`" class="mb-0px!">
<EquipmentSelect
v-model="row.deviceModel"
@update:newValue="handleSelectedequip($index, $event)"
:disabled="detailDisabled"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="120" fixed="right">
<template #default="scope">
<el-button
link
type="danger"
size="small"
@click.prevent="handleDeleteMat(scope.$index)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</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-col>
<el-button class="hl-addbutton" type="primary" size="large" @click="openMatForm"
>新增</el-button
>
</el-col>
<el-form
ref="subBoomFormRef"
:model="formData.matItemDOList"
:rules="matItemFormRules"
v-loading="matItemFormLoading"
label-width="0"
>
<el-table :data="formData.matItemDOList" class="hl-table">
<el-table-column type="index" label="序号" align="center" min-width="60" fixed />
<el-table-column prop="code" label="物料编码" min-width="120" align="center" />
<el-table-column prop="name" label="物料名称" min-width="120" align="center" />
<el-table-column prop="materialType" label="物料类型" min-width="125" align="center">
<template #default="scope">
<dict-tag
:type="DICT_TYPE.BIZ_MATERIAL_TYPE"
:value="scope.row.materialType"
v-if="scope.row.materialType ? true : false"
/>
</template>
</el-table-column>
<el-table-column
prop="spec"
label="规格/型号"
min-width="120"
align="center"
/>
<el-table-column prop="unit" label="系统单位" min-width="100" align="center">
<template #default="scope">
<dict-tag
:type="DICT_TYPE.BIZ_MATERIAL_UNIT"
:value="scope.row.unit"
v-if="scope.row.unit ? true : false"
/>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="120" fixed="right">
<template #default="scope">
<el-button
link
type="danger"
size="small"
@click.prevent="handleDeleteMat(scope.$index)"
v-bind:disabled="formData.status == 2 || formData.status == 3"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
<!-- 系统信息 -->
<el-card class="hl-card-info" v-if="active != 'create'">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">系统信息</span>
</template>
<el-row>
<el-col :span="4" />
<el-col :span="8">
<el-form-item label="创建人" prop="creatorName">
<el-input class="!w-260px" v-model="formData.creatorName" placeholder="" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
class="!w-260px"
v-model="formData.createTime"
type="datetime"
value-format="x"
placeholder=""
disabled
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="4" />
<el-col :span="8">
<el-form-item label="修改人" prop="updaterName">
<el-input class="!w-260px" v-model="formData.updaterName" placeholder="" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="修改时间" prop="updateTime">
<el-date-picker
class="!w-260px"
v-model="formData.updateTime"
type="datetime"
value-format="x"
placeholder=""
disabled
/>
</el-form-item>
</el-col>
</el-row>
</el-card>
<div class="text-center hl-footer">
<el-button @click="goback" size="large"> </el-button>
<el-button
v-if="active != 'detail'"
@click="submitForm()"
type="primary"
:disabled="formLoading"
size="large"
> </el-button
>
</div>
</el-form>
</el-card>
<Materials ref="matOpenFormRef" @success="getList" />
</template>
<script setup lang="ts">
import { DICT_TYPE, getStrDictOptions, getIntDictOptions, getDictLabel } from '@/utils/dict'
import { useUserStore } from '@/store/modules/user'
import UserSelect from '@/views/biz/hlvuestyle/userSelect.vue'
import ProcedureSelect from '@/views/biz/hlvuestyle/procedureSelect.vue'
import EquipmentSelect from '@/views/biz/hlvuestyle/equipmentSelect.vue'
import * as EquipMaintenanceRecordApi from '@/api/biz/equipmaintenancerecord'
import { useCommonStore } from '@/store/modules/common'
import Materials from './materials.vue'
const { t } = useI18n() //
const message = useMessage() //
// const { query } = useRoute()
// const active = toRef(query, 'active')
// const activeId = toRef(query, 'id')
const router = useRouter()
const reload: any = inject('reload')
const commonStore = useCommonStore()
const active = toRef(commonStore.getStore('active'))
const activeId = toRef(commonStore.getStore('id'))
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
code: undefined,
name: undefined,
status: 1,
subList: [],
matItemDOList: [],
creatorName: undefined,
createTime: undefined,
updaterName: undefined,
updateTime: undefined
})
const formRules = reactive({
code: [{ required: true, message: '编码,唯一不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态,1表示正常2表示禁用不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
//
const AddMatForm = () => {
const newData = {
//
matId: '',
matCode: '',
deviceModel: '',
wname: ''
}
formData.value.subList.push(newData)
}
//
const matOpenFormRef =ref()
const openMatForm = () => {
matOpenFormRef.value.open()
}
const getList = async (arrMat) => {
arrMat.forEach((row) => {
formData.value.matItemDOList.push(row)
})
}
//
const handleDeleteMat = (index) => {
formData.value.subList.splice(index, 1)
}
onMounted(() => {
console.log('active', active.value, activeId.value)
initData()
})
const detailDisabled = ref(false)
const updateDisabled = ref(false)
const initData = async () => {
resetForm()
if ('detail' == active.value) {
detailDisabled.value = true
}
if ('update' == active.value) {
updateDisabled.value = true
}
await queryData(active.value, activeId.value)
}
const queryData = async (type: string, id?: number) => {
dialogTitle.value = t('action.' + type)
if (type == 'create') {
formData.value.submitTime = new Date().getTime()
}
if (type == 'update' || type == 'detail') {
// const res = await EquipMaintenanceRecordApi.getEquipMaintenanceRecord(id)
// formData.value = res
}
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as EquipMaintenanceRecordApi.EquipMaintenanceRecordVO
if (active.value === 'create') {
const dataid = await EquipMaintenanceRecordApi.createEquipMaintenanceRecord(data)
message.success(t('common.createSuccess'))
commonStore.setStore('active', 'update')
commonStore.setStore('id', dataid)
reload()
} else {
await EquipMaintenanceRecordApi.updateEquipMaintenanceRecord(data)
message.success(t('保存成功'))
}
dialogVisible.value = false
//
emit('success')
// goback()
} finally {
formLoading.value = false
}
}
const goback = () => {
router.back()
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
name: undefined,
status: 1,
subList: [],
matItemDOList: [],
creatorName: undefined,
createTime: undefined,
updaterName: undefined,
updateTime: undefined
}
}
const handleSelectedequip = (index, newValue: any) => {
formData.value.subList[index].deviceModel = newValue?.id
}
const handleSelectProcedure = (index, newValue: any) => {
console.log(newValue)
formData.value.subList[index].matId = newValue?.id
formData.value.subList[index].matCode = newValue?.code
formData.value.subList[index].isReport = newValue?.isReport
formData.value.subList[index].salaryType = newValue?.salaryType
formData.value.subList[index].wid = newValue?.wid
}
</script>
<style scoped lang="scss"></style>

@ -5,8 +5,8 @@
<span v-text="dialogTitle"></span>
</template>
<div class="abstatus">
<img src="/src/assets/imgs/status/status2.png" v-if="formData.status == 2" alt="" />
<img src="/src/assets/imgs/status/statuszf.png" v-else-if="formData.status == 3" alt="" />
<img src="/src/assets/imgs/status/status16.png" v-if="formData.status == 4" alt="" />
<img src="/src/assets/imgs/status/status3.png" v-else-if="formData.status == 3" alt="" />
<span v-else></span>
</div>
<el-form
@ -39,7 +39,9 @@
clearable
style="width: 100%"
@change="handleStockType"
v-bind:disabled="ctrView || ctrSave || enableHeadNo || activetypetype !== 'create'"
v-bind:disabled="
ctrView || ctrSave || enableHeadNo || activetypetype !== 'create'
"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_STORAGE_OUT_TYPE)"
@ -558,17 +560,18 @@
</el-row>
<el-row justify="center">
<el-col :span="8">
<el-form-item prop="outbound" label="出库人">
<el-form-item prop="outbound" label="送审人">
{{ userList.find((user) => user.id == formData.outbound)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="outboundTime" label="出库时间">
<el-form-item prop="outboundTime" label="送审时间">
{{ formatDate(formData.outboundTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
<el-row justify="center">
<el-row justify="center" v-if="formData.status == 3">
<el-col :span="8">
<el-form-item prop="cancel" label="作废人">
{{ userList.find((user) => user.id == formData.cancel)?.nickname }}
@ -580,26 +583,57 @@
</el-form-item>
</el-col>
</el-row>
<el-row justify="center" v-else>
<el-col :span="8">
<el-form-item prop="cancel" label="审核人">
{{ userList.find((user) => user.id == formData.cancel)?.nickname }}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item prop="cancelTime" label="审核时间">
{{ formatDate(formData.cancelTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<div class="text-center hl-footer">
<el-button @click="() => router.go(-1)" size="large"> </el-button>
<el-button @click="saveFormData('SAVE', 1, 'suc')" type="success" v-if="btnSave" size="large"
<el-button
@click="saveFormData('SAVE', 1, 'suc')"
type="primary"
v-if="btnSave && activetype !== 'audit' && formData.status !== 4"
size="large"
> </el-button
>
<el-button
@click="saveFormData('SUBMIT', 2, 'suc')"
type="success"
v-if="btnSave && activetype !== 'create' && formData.status !== 4 && activetype !== 'audit'"
size="large"
> </el-button
>
<el-button
@click="deleteFormData()"
type="danger"
v-if="btnSave && activetype !== 'create' && formData.status !== 4 && activetype !== 'audit'"
size="large"
> </el-button
>
<el-button
@click="saveFormDataSUBMIT('SUBMIT', 2)"
@click="saveFormDataSUBMIT('AUDIT', 4)"
type="primary"
v-if="btnSave && activetype !== 'create'"
v-if="formData.status === 2 && activetype == 'audit'"
size="large"
> </el-button
></el-button
>
<el-button
@click="saveFormData('CANCEL', 3, 'suc')"
@click="saveFormData('INVALID', 3, 'suc')"
type="danger"
v-if="btnCancel"
v-if="formData.status === 2 && activetype == 'audit'"
size="large"
> </el-button
></el-button
>
</div>
</el-card>
@ -637,6 +671,7 @@ import materials2 from './materials2.vue'
import projects from './subproject.vue'
import taskdispatchselect from './taskdispatchselect.vue'
import { useCommonStore } from '@/store/modules/common'
import { id } from 'node_modules/element-plus/es/locale'
const reload: any = inject('reload')
const commonStore = useCommonStore()
@ -859,10 +894,22 @@ const downloadAttachment = async (name, url) => {
var commonResult = ''
//
const deleteFormData = async () => {
await StorageApi.deleteStorage(activeId.value)
router.go(-1)
}
/** 提交表单 */
const emit = defineEmits(['success']) // success
const saveFormData = async (active, status, type) => {
if(active === 'SUBMIT'){
//
if (formData.value.matItemDOList.length === 0) {
message.alertWarning('请添加物料信息!')
return
}
}
await formRef.value.validate()
formData.value.active = active
formData.value.status = status
@ -877,8 +924,15 @@ const saveFormData = async (active, status, type) => {
commonStore.setStore('active', 'update')
commonStore.setStore('id', formData.value.id)
reload()
} else if (formData.value.active === 'SUBMIT' && formData.value.status == 2) {
data.outbound = useUserStore().getUser.id
data.outboundTime = new Date()
await StorageApi.updateStorage(data)
} else if (formData.value.active === 'INVALID') {
data.cancel = useUserStore().getUser.id
data.cancelTime = new Date()
await StorageApi.updateStorage(data)
} else {
await StorageApi.updateStorage(data)
}
var repeatItem = []
@ -920,23 +974,18 @@ const saveFormData = async (active, status, type) => {
}
const saveFormDataSUBMIT = (active, status) => {
//
saveFormData('SAVE', 1, 'war')
//
if (formData.value.matItemDOList.length === 0) {
message.alertWarning('请添加物料信息!')
return
}
setTimeout(async () => {
//
formData.value.active = active
formData.value.status = status
const data = formData.value as unknown as StorageApi.StorageVO
data.cancel = useUserStore().getUser.id
data.cancelTime = new Date()
await StorageApi.updateStorage(data)
await initStatus(formData.value.status)
commonResult = '提交成功'
commonResult = '审核成功'
message.success(t(commonResult))
reload()
}, 1000)
}
//

@ -172,7 +172,7 @@
</el-table-column>
<el-table-column label="操作" align="center" width="180" fixed="right">
<template #default="scope">
<el-button link type="primary" @click="openDetail('update', scope.row.id)" v-if="scope.row.status != 3">
<el-button link type="primary" @click="openDetail('update', scope.row.id)" v-if="scope.row.status != 3&&scope.row.status != 2">
编辑
</el-button>
<el-button link type="primary" @click="openDetail('review', scope.row.id)">

@ -0,0 +1,300 @@
<template>
<el-card class="hl-card">
<template #header>
<span>出库审核</span>
</template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="108px"
>
<el-form-item label="出库单号" prop="stockNo">
<el-input
v-model="queryParams.stockNo"
placeholder="出库单号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="上游单号" prop="headerNo">
<el-input
v-model="queryParams.headerNo"
placeholder="上游单号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="物料编码" prop="matNo">
<el-input
v-model="queryParams.matNo"
placeholder="物料编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="物料名称" prop="matName">
<el-input
v-model="queryParams.matName"
placeholder="物料名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="出库类型" prop="stockInType">
<el-select
v-model="queryParams.stockInType"
placeholder="下拉选择"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_STORAGE_OUT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="出库仓库" prop="whId">
<el-select v-model="queryParams.whId" placeholder="下拉选择" clearable class="!w-240px">
<el-option
v-for="dict in warehouseList"
:key="dict.id"
:label="dict.whName"
:value="dict.id"
/>
</el-select>
</el-form-item>
<!-- <el-form-item label="单据状态" prop="status">
<el-select v-model="queryParams.status" placeholder="下拉选择" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_STORAGE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item> -->
<el-form-item style="margin-left:15px">
<el-button @click="handleQuery" type="primary"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<!-- <el-button type="primary" plain @click="openDetail('create')">
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button> -->
<!-- <el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['biz:storage:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button> -->
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<!-- <el-table-column label="主键id" align="center" prop="id" /> -->
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="出库单号" align="center" prop="stockNo" fixed min-width="220" >
<template #default="scope">
<el-button text type="primary" @click="openDetail('review',scope.row.id)">
{{scope.row.stockNo}}
</el-button>
</template>
</el-table-column>
<el-table-column label="出库类型" align="center" prop="stockInType" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.BIZ_STORAGE_OUT_TYPE" :value="scope.row.stockInType" />
</template>
</el-table-column>
<el-table-column label="上游单号" align="center" prop="headerNo" min-width="180" />
<el-table-column label="出库仓库" align="center" prop="whId" min-width="140">
<template #default="scope">
{{ warehouseList.find((tag) => tag.id === scope.row.whId)?.whName }}
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="description" min-width="120"/>
<el-table-column label="创建人" align="center" prop="creator" min-width="120">
<template #default="scope">
{{ userList.find((user) => user.id === scope.row.creator)?.nickname }}
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
min-width="240"
/>
<el-table-column label="提交人" align="center" prop="keeper" min-width="120">
<template #default="scope">
{{ userList.find((user) => user.id == scope.row.outbound)?.nickname }}
</template>
</el-table-column>
<el-table-column
label="提交时间"
align="center"
prop="outboundTime"
:formatter="dateFormatter"
min-width="240"
/>
<el-table-column label="作废人" align="center" prop="cancel" min-width="120">
<template #default="scope">
{{ userList.find((user) => user.id == scope.row.cancel)?.nickname }}
</template>
</el-table-column>
<el-table-column
label="作废时间"
align="center"
prop="cancelTime"
:formatter="dateFormatter"
min-width="240"
/>
<el-table-column label="单据状态" align="center" prop="status" min-width="120" fixed="right">
<template #default="scope">
<dict-tag :type="DICT_TYPE.BIZ_STORAGE_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="180" fixed="right">
<template #default="scope">
<el-button link type="primary" @click="openDetail('audit', scope.row.id)" v-if="scope.row.status != 3">
审核
</el-button>
<el-button link type="primary" @click="openDetail('review', scope.row.id)">
查看详情
</el-button>
<!-- <el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
</el-button> -->
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</el-card>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import * as StorageApi from '@/api/biz/storage'
import * as WarehouseApi from '@/api/biz/warehouse'
import * as UserApi from '@/api/system/user'
defineOptions({ name: 'Storage' })
import { useCommonStateWithOut } from '@/store/modules/common'
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter() //
const commonStore = useCommonStateWithOut()
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
stockType: 2,
stockInType: undefined,
stockOutType: undefined,
stockNo: undefined,
headerNo: undefined,
description: undefined,
status: 2,
whId: undefined,
creator: undefined,
createTime: [],
updater: undefined,
updateTime: [],
keeper: undefined,
keeperTime: [],
outbound: undefined,
outboundTime: [],
cancel: undefined,
cancelTime: [],
matNo: undefined,
matName: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
const warehouseList = ref([])
const userList = ref<UserApi.UserVO[]>([]) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await StorageApi.getStoragePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 详情操作 新增/查看 */
const openDetail = (active: string, id?: number) => {
commonStore.setStore('active', active)
commonStore.setStore('id', id)
router.push({ path: '/inventory/storageoutdetail', query: { type: active, id: id } })
}
/** 初始化 **/
onMounted(async () => {
const queryParamsWarehouse = reactive({
pageNo: 1,
pageSize: 99
})
warehouseList.value = await WarehouseApi.getWarehouseSimpList()
userList.value = await UserApi.getSimpleUserList()
await getList()
})
onActivated(() => {
getList()
})
</script>

@ -99,6 +99,12 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="规格型号" prop="spec">
<el-input class="!w-260px" v-model="formData.spec" placeholder="规格型号" disabled/>
</el-form-item>
</el-col>
</el-row>
</el-card>
@ -253,7 +259,7 @@ import UserSelect from '@/views/biz/hlvuestyle/userSelect.vue'
import EquipSelect from '@/views/biz/hlvuestyle/equipSelect.vue'
import EquipmentSelect from '@/views/biz/hlvuestyle/equipmentSelect.vue'
import ProductProcessPrint from './ProductProcessPrint.vue'
import * as MaterialApi from '@/api/biz/material'
defineOptions({ name: 'TaskDispatchDetail' })
const reload = inject('reload')
@ -287,7 +293,8 @@ const formData = ref({
taskDispatchDetails: [],
operateLogs: [],
active: undefined,
activeOpinion: ''
activeOpinion: '',
spec:undefined
})
const formRef = ref() // Ref
@ -333,7 +340,8 @@ const resetForm = () => {
taskDispatchDetails: [],
operateLogs: [],
active: undefined,
activeOpinion: ''
activeOpinion: '',
spec:undefined
}
formRef.value?.resetFields()
}
@ -348,14 +356,17 @@ const subFormRules = reactive({
})
const queryData = async (id?: number) => {
console.log(dispatchType)
// console.log(dispatchType)
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await TaskDispatchApi.getTaskDispatch(id)
// console.log(formData.value.projectSubId);
// formData.value.spec=await MaterialApi.getMaterial(formData.value.projectSubId)
formData.value.taskDispatchDetails =
await TaskDispatchApi.getTaskDispatchDetailListByDispatchId(id)
// formData.value.bomCode = 'BOM-' + formData.value.projectSubCode

@ -42,7 +42,14 @@
<!-- 新增生产计划单号 -->
<el-table-column fixed label="生产计划单号" align="center" prop="planCode" width="220" />
<!-- 派工单号修改为生产派工单号 -->
<el-table-column label="生产派工单号" align="center" prop="dispatchCode" width="180" />
<el-table-column label="生产派工单号" align="center" prop="dispatchCode" width="200" >
<template #default="scope">
<span v-if="scope.row.type=='ASSEMBLE'">{{ scope.row.assembleCode }}</span>
<span v-else>{{ scope.row.dispatchCode }}</span>
<!-- {{ scope.row.type }}
{{ scope.row.dispatchCode }} -->
</template>
</el-table-column>
<!-- 新增产品编码 -->
<el-table-column fixed label="产品编码" align="center" prop="projectSubCode" width="180" />
<!-- 项目名称修改为产品名称 -->

@ -173,3 +173,54 @@ ALTER TABLE `project_sale_order` ADD COLUMN `warehouse_id` BIGINT ( 20 ) DEFAULT
ALTER TABLE base_material ADD COLUMN inventory_property INT ( 11 ) DEFAULT '0' COMMENT '物料属性' AFTER `description`;
drop table if exists `base_system_parameters`;
CREATE TABLE `base_system_parameters` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`creator` varchar(64) COLLATE DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) COLLATE 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 '租户编号',
`code` varchar(255) COLLATE DEFAULT NULL COMMENT '参数编码',
`name` varchar(255) COLLATE DEFAULT NULL COMMENT '参数名称',
`scope` varchar(255) COLLATE DEFAULT NULL COMMENT '值范围',
`current_value` varchar(255) COLLATE DEFAULT NULL COMMENT '当前值',
`description` varchar(255) COLLATE DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='系统参数设置表';
drop table if exists `base_process`;
CREATE TABLE `base_process` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`code` varchar(64) COLLATE DEFAULT NULL COMMENT '工艺路线编号',
`name` varchar(64) COLLATE NOT NULL COMMENT '工艺路线名称,唯一',
`status` tinyint(1) NOT NULL COMMENT '状态,1表示正常2表示禁用',
`creator` varchar(64) COLLATE DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) COLLATE 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`)
) ENGINE=InnoDB COMMENT='工艺路线表';
drop table if exists `base_process_detail`;
CREATE TABLE `base_process_detail` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`procedure_id` bigint(20) DEFAULT NULL COMMENT '工序id',
`procedure_sort` int(11) DEFAULT NULL COMMENT '工序顺序号',
`procedure_equip_id` bigint(20) DEFAULT NULL COMMENT '生产设备id',
`type` int(11) DEFAULT NULL COMMENT '明细类型1为工序2为产品',
`material_id` bigint(20) DEFAULT NULL COMMENT '产品id物料',
`creator` varchar(64) COLLATE DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) COLLATE 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`)
) ENGINE=InnoDB COMMENT='工艺路线明细表';

Loading…
Cancel
Save