diff --git a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java index 90383360d3..0f86a152b3 100644 --- a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java +++ b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java @@ -168,4 +168,10 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 // ========== ERP 模具 1_111_000 ========== ErrorCode MOLD_BRAND_NOT_EXISTS = new ErrorCode(1_111_001, "模具型号不存在"); ErrorCode MOLD_NOT_EXISTS = new ErrorCode(1_111_002, "模具不存在"); + + ErrorCode AUTOCODE_RECORD_NOT_EXISTS = new ErrorCode(1_111_003, "编码生成记录不存在"); + + ErrorCode AUTOCODE_RULE_NOT_EXISTS = new ErrorCode(1_111_004, "编码规则不存在"); + ErrorCode AUTOCODE_PART_NOT_EXISTS = new ErrorCode(1_111_005, "编码规则组成不存在"); + ErrorCode AUTOCODE_GEN_NOT_UNIQUE = new ErrorCode(1_111_006, "编码已存在"); } diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/AutocodePartController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/AutocodePartController.java new file mode 100644 index 0000000000..9fb7faeee3 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/AutocodePartController.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode; + +import org.springframework.web.bind.annotation.*; +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 java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.module.erp.service.autocode.AutocodePartService; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +@Tag(name = "管理后台 - 编码规则组成") +@RestController +@RequestMapping("/erp/autocode-part") +@Validated +public class AutocodePartController { + + @Resource + private AutocodePartService autocodePartService; + + @PostMapping("/create") + @Operation(summary = "创建编码规则组成") + @PreAuthorize("@ss.hasPermission('erp:autocode-part:create')") + public CommonResult createAutocodePart(@Valid @RequestBody AutocodePartSaveReqVO createReqVO) { + return success(autocodePartService.createAutocodePart(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新编码规则组成") + @PreAuthorize("@ss.hasPermission('erp:autocode-part:update')") + public CommonResult updateAutocodePart(@Valid @RequestBody AutocodePartSaveReqVO updateReqVO) { + autocodePartService.updateAutocodePart(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除编码规则组成") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('erp:autocode-part:delete')") + public CommonResult deleteAutocodePart(@RequestParam("id") Long id) { + autocodePartService.deleteAutocodePart(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得编码规则组成") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('erp:autocode-part:query')") + public CommonResult getAutocodePart(@RequestParam("id") Long id) { + AutocodePartDO autocodePart = autocodePartService.getAutocodePart(id); + return success(BeanUtils.toBean(autocodePart, AutocodePartRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得编码规则组成分页") + @PreAuthorize("@ss.hasPermission('erp:autocode-part:query')") + public CommonResult> getAutocodePartPage(@Valid AutocodePartPageReqVO pageReqVO) { + PageResult pageResult = autocodePartService.getAutocodePartPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AutocodePartRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出编码规则组成 Excel") + @PreAuthorize("@ss.hasPermission('erp:autocode-part:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportAutocodePartExcel(@Valid AutocodePartPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = autocodePartService.getAutocodePartPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "编码规则组成.xls", "数据", AutocodePartRespVO.class, + BeanUtils.toBean(list, AutocodePartRespVO.class)); + } + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/AutocodeRecordController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/AutocodeRecordController.java new file mode 100644 index 0000000000..6975e4a423 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/AutocodeRecordController.java @@ -0,0 +1,121 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode; + +import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil; +import io.swagger.v3.oas.annotations.Parameters; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +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 java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRecordDO; +import cn.iocoder.yudao.module.erp.service.autocode.AutocodeRecordService; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +@Tag(name = "管理后台 - 编码生成记录") +@RestController +@RequestMapping("/erp/autocode-record") +@Validated +public class AutocodeRecordController { + + @Resource + private AutocodeRecordService autocodeRecordService; + + @PostMapping("/create") + @Operation(summary = "创建编码生成记录") + @PreAuthorize("@ss.hasPermission('erp:autocode-record:create')") + public CommonResult createAutocodeRecord(@Valid @RequestBody AutocodeRecordSaveReqVO createReqVO) { + return success(autocodeRecordService.createAutocodeRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新编码生成记录") + @PreAuthorize("@ss.hasPermission('erp:autocode-record:update')") + public CommonResult updateAutocodeRecord(@Valid @RequestBody AutocodeRecordSaveReqVO updateReqVO) { + autocodeRecordService.updateAutocodeRecord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除编码生成记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('erp:autocode-record:delete')") + public CommonResult deleteAutocodeRecord(@RequestParam("id") Long id) { + autocodeRecordService.deleteAutocodeRecord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得编码生成记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('erp:autocode-record:query')") + public CommonResult getAutocodeRecord(@RequestParam("id") Long id) { + AutocodeRecordDO autocodeRecord = autocodeRecordService.getAutocodeRecord(id); + return success(BeanUtils.toBean(autocodeRecord, AutocodeRecordRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得编码生成记录分页") + @PreAuthorize("@ss.hasPermission('erp:autocode-record:query')") + public CommonResult> getAutocodeRecordPage(@Valid AutocodeRecordPageReqVO pageReqVO) { + PageResult pageResult = autocodeRecordService.getAutocodeRecordPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AutocodeRecordRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出编码生成记录 Excel") + @PreAuthorize("@ss.hasPermission('erp:autocode-record:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportAutocodeRecordExcel(@Valid AutocodeRecordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = autocodeRecordService.getAutocodeRecordPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "编码生成记录.xls", "数据", AutocodeRecordRespVO.class, + BeanUtils.toBean(list, AutocodeRecordRespVO.class)); + } + + @Autowired + private AutoCodeUtil autoCodeUtil; + + @Operation(summary = "获取一个自动生成的编码") + @Parameters({ + @Parameter(name = "ruleCode", description = "规则编码", required = true), + @Parameter(name = "inputCharacter", description = "输入字符", required = false) + }) + @GetMapping(value = "/getAutoCode") + public CommonResult getAutoCode(@RequestParam("ruleCode") String ruleCode, String inputCharacter){ + String code = autoCodeUtil.genSerialCode(ruleCode,inputCharacter); + return CommonResult.success(code); + } + @Operation(summary = "测试自动生成的编码") + @Parameters({ + @Parameter(name = "ruleCode", description = "规则编码", required = true), + @Parameter(name = "inputCharacter", description = "输入字符", required = false) + }) + @GetMapping(value = "/getTest") + public CommonResult getAutoCodeTest(@RequestParam("ruleCode") String ruleCode,String inputCharacter){ + String code = autoCodeUtil.genSerialCodeTest(ruleCode,inputCharacter); + return CommonResult.success(code); + } +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/AutocodeRuleController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/AutocodeRuleController.java new file mode 100644 index 0000000000..e277fbedce --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/AutocodeRuleController.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode; + +import org.springframework.web.bind.annotation.*; +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 java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRuleDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.module.erp.service.autocode.AutocodeRuleService; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +@Tag(name = "管理后台 - 编码规则") +@RestController +@RequestMapping("/erp/autocode-rule") +@Validated +public class AutocodeRuleController { + + @Resource + private AutocodeRuleService autocodeRuleService; + + @PostMapping("/create") + @Operation(summary = "创建编码规则") + @PreAuthorize("@ss.hasPermission('erp:autocode-rule:create')") + public CommonResult createAutocodeRule(@Valid @RequestBody AutocodeRuleSaveReqVO createReqVO) { + return success(autocodeRuleService.createAutocodeRule(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新编码规则") + @PreAuthorize("@ss.hasPermission('erp:autocode-rule:update')") + public CommonResult updateAutocodeRule(@Valid @RequestBody AutocodeRuleSaveReqVO updateReqVO) { + autocodeRuleService.updateAutocodeRule(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除编码规则") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('erp:autocode-rule:delete')") + public CommonResult deleteAutocodeRule(@RequestParam("id") Long id) { + autocodeRuleService.deleteAutocodeRule(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得编码规则") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('erp:autocode-rule:query')") + public CommonResult getAutocodeRule(@RequestParam("id") Long id) { + AutocodeRuleDO autocodeRule = autocodeRuleService.getAutocodeRule(id); + return success(BeanUtils.toBean(autocodeRule, AutocodeRuleRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得编码规则分页") + @PreAuthorize("@ss.hasPermission('erp:autocode-rule:query')") + public CommonResult> getAutocodeRulePage(@Valid AutocodeRulePageReqVO pageReqVO) { + PageResult pageResult = autocodeRuleService.getAutocodeRulePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, AutocodeRuleRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出编码规则 Excel") + @PreAuthorize("@ss.hasPermission('erp:autocode-rule:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportAutocodeRuleExcel(@Valid AutocodeRulePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = autocodeRuleService.getAutocodeRulePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "编码规则.xls", "数据", AutocodeRuleRespVO.class, + BeanUtils.toBean(list, AutocodeRuleRespVO.class)); + } + + // ==================== 子表(编码规则组成) ==================== + + @GetMapping("/autocode-part/list-by-rule-id") + @Operation(summary = "获得编码规则组成列表") + @Parameter(name = "ruleId", description = "规则ID") + @PreAuthorize("@ss.hasPermission('erp:autocode-rule:query')") + public CommonResult> getAutocodePartListByRuleId(@RequestParam("ruleId") Long ruleId) { + return success(autocodeRuleService.getAutocodePartListByRuleId(ruleId)); + } + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/AutoCodeUtil.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/AutoCodeUtil.java new file mode 100644 index 0000000000..e06a83c495 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/AutoCodeUtil.java @@ -0,0 +1,186 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.util; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.Assert; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.AutocodeRecordSaveReqVO; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRecordDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRuleDO; +import cn.iocoder.yudao.module.erp.dal.mysql.autocode.AutocodeRecordMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.autocode.AutocodeRuleMapper; +import cn.iocoder.yudao.module.erp.service.autocode.AutocodePartService; +import cn.iocoder.yudao.module.erp.service.autocode.AutocodeRecordService; +import cn.iocoder.yudao.module.erp.service.autocode.AutocodeRuleService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.AUTOCODE_GEN_NOT_UNIQUE; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.AUTOCODE_RULE_NOT_EXISTS; + + +@Service +public class AutoCodeUtil { + public static ThreadLocal threadLocal = new ThreadLocal<>(); + @Autowired + private AutocodeRuleService iAutoCodeRuleService; + @Autowired + private AutocodePartService iAutoCodePartService; + @Autowired + private AutocodeRecordService iAutoCodeResultService; + @Resource + private AutocodeRecordMapper autocodeRecordMapper; + @Autowired + private PartTypeHandler partTypeHandler; + private String lastSerialNo; + + //@Log(title = "生成业务编号",businessType = BusinessType.INSERT) + synchronized + public String genSerialCode(String ruleCode,String inputCharacter){ + + //查找编码规则 + AutocodeRuleDO rule = iAutoCodeRuleService.getAutocodeRuleByRuleCode(ruleCode); + if (rule==null) + throw exception(AUTOCODE_RULE_NOT_EXISTS); + //Assert.notNull(rule,"未获取到指定类型:[{}]的业务编码生成规则",ruleCode); + //查找规则组成 + List parts = iAutoCodeRuleService.getAutocodePartListByRuleId(rule.getId()); + List collect = parts.stream().filter(part->PartTypeEnum.PART_TYPE_SERIALNO.getCode().equals(part.getPartType())).collect(Collectors.toList()); + + if(collect.size()>1) + throw exception(AUTOCODE_GEN_NOT_UNIQUE); + //Assert.isTrue(collect.size()<2,"编码规则[{}]流水号方式的组成只能存在一个",ruleCode); + + StringBuilder buff = new StringBuilder(); + parts.forEach(codePart ->{ + codePart.setInputCharacter(inputCharacter); + //根据当前组成部分,获取当前组成部分的结果 + String partStr = partTypeHandler.choiceExecute(codePart); + + //如果是流水号部分,则进行记录 + if(StringUtils.equals(codePart.getPartType(),PartTypeEnum.PART_TYPE_SERIALNO.getCode())){ + lastSerialNo = partStr; + } + //将获取到的部分组装进整体编码中 + buff.append(partStr); + }); + + // Assert.notBlank(buff.toString(),"规则:[{}]生成的编码为空!",ruleCode); + String autoCode = "NO"+DateUtil.format(new Date(),"yyyyMMddHHmmssSSS"); + if(StringUtils.isNotBlank(buff.toString())) + autoCode = paddingStr(rule,buff); + + //将生成结果保存到数据库 + saveAutoCodeResult(rule,autoCode,inputCharacter); + return autoCode; + } + + /** + * 根据编码规则的配置进行补齐操作 + * @param rule + * @param sb + * @return + */ + private String paddingStr(AutocodeRuleDO rule,StringBuilder sb){ + String isPadding = rule.getIsPadded(); + if("Y".equals(isPadding)){ + int maxLength = rule.getMaxLength(); + String paddingChar = rule.getPaddedChar(); + StringBuilder resultStr = new StringBuilder(); + long length = maxLength - sb.length(); + Assert.isTrue(maxLength>sb.length(),"生成的编码[{}]已经超出规则中配置的最大长度:[{}]",sb.toString(),maxLength); + + if("L".equals(rule.getPaddedMethod())){ + //左补齐 + //使用指定字符补齐左侧后,再将生成的编码添加到右侧 + for(;length>0;length --){ + resultStr.append(paddingChar); + } + resultStr.append(sb); + }else{ + //右补齐 + //将生成的编码添加到左侧后,再使用指定字符补齐右侧 + resultStr.append(sb); + for(;length>0;length --){ + resultStr.append(paddingChar); + } + } + return resultStr.toString(); + } + return sb.toString(); //如果不需要补齐,则直接返回 + } + + private void saveAutoCodeResult(AutocodeRuleDO rule,String autoCode,String inputChar){ + Boolean flag = threadLocal.get(); //针对当前线程的判断 flag = true则数据库中没有当前规则的生成记录 + if(flag !=null && flag){ + AutocodeRecordSaveReqVO rs = new AutocodeRecordSaveReqVO(); + rs.setRuleId(rule.getId()); + rs.setGenDate(DateUtil.format(LocalDateTime.now(),"yyyyMMddHHmmss")); + rs.setLastResult(autoCode); + rs.setGenIndex(1); + rs.setLastSerialNo(Integer.parseInt(lastSerialNo)); + rs.setLastInputChar(inputChar); + iAutoCodeResultService.createAutocodeRecord(rs); + }else{ + //直接更新对应的记录(我们默认非流水号模式下一个RULE_CODE只有一种方式) + List results = iAutoCodeResultService.selectListByRuleId(rule.getId()); + Assert.notEmpty(results,"未查询到规则{[]}对应的结果记录",rule.getRuleCode()); + + AutocodeRecordDO rs = results.get(0); + rs.setLastResult(autoCode); + rs.setGenDate(DateUtil.format(LocalDateTime.now(),"yyyyMMddHHmmss")); + rs.setGenIndex(rs.getGenIndex()+1); + rs.setLastSerialNo(Integer.parseInt(lastSerialNo)); + rs.setLastInputChar(inputChar); + + autocodeRecordMapper.updateById(rs); + } + + } + + public String genSerialCodeTest(String ruleCode,String inputCharacter){ + + + //查找编码规则 + AutocodeRuleDO rule = iAutoCodeRuleService.getAutocodeRuleByRuleCode(ruleCode); + if (rule==null) + throw exception(AUTOCODE_RULE_NOT_EXISTS); + //Assert.notNull(rule,"未获取到指定类型:[{}]的业务编码生成规则",ruleCode); + //查找规则组成 + + List parts = iAutoCodeRuleService.getAutocodePartListByRuleId(rule.getId()); + List collect = parts.stream().filter(part->PartTypeEnum.PART_TYPE_SERIALNO.getCode().equals(part.getPartType())).collect(Collectors.toList()); + + if(collect.size()>1) + throw exception(AUTOCODE_GEN_NOT_UNIQUE); + //Assert.isTrue(collect.size()<2,"编码规则[{}]流水号方式的组成只能存在一个",ruleCode); + + StringBuilder buff = new StringBuilder(); + parts.forEach(codePart ->{ + codePart.setInputCharacter(inputCharacter); + //根据当前组成部分,获取当前组成部分的结果 + String partStr = partTypeHandler.choiceExecute(codePart); + + //如果是流水号部分,则进行记录 + if(StringUtils.equals(codePart.getPartType(),PartTypeEnum.PART_TYPE_SERIALNO.getCode())){ + lastSerialNo = partStr; + } + //将获取到的部分组装进整体编码中 + buff.append(partStr); + }); + + // Assert.notBlank(buff.toString(),"规则:[{}]生成的编码为空!",ruleCode); + String autoCode = "NO"+DateUtil.format(new Date(),"yyyyMMddHHmmssSSS"); + if(StringUtils.isNotBlank(buff.toString())) + autoCode = paddingStr(rule,buff); + + return autoCode; + } +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/CycleMethodMnum.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/CycleMethodMnum.java new file mode 100644 index 0000000000..048df86458 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/CycleMethodMnum.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.util; + +public enum CycleMethodMnum { + + CYCLE_METHOD_YEAR("YEAR","按年"), + CYCLE_METHOD_MONTH("MONTH","按月"), + CYCLE_METHOD_DAY("DAY","按日"), + CYCLE_METHOD_HOUR("HOUR","按小时"), + CYCLE_METHOD_MINUTE("MINUTE","按分钟"), + CYCLE_METHOD_OTHER("OTHER","其他"); + + private String code; + private String name; + + CycleMethodMnum(String code,String name){ + this.code=code; + this.name=name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static CycleMethodMnum getByCode(String code){ + for(CycleMethodMnum value : CycleMethodMnum.values()){ + if(value.getCode().equals(code)){ + return value; + } + } + return CYCLE_METHOD_OTHER; + } +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeEnum.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeEnum.java new file mode 100644 index 0000000000..6283e6cbe4 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeEnum.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.util; + +public enum PartTypeEnum { + + PART_TYPE_INPUTCHAR("INPUTCHAR","传入字符",0), + PART_TYPE_NOWDATE("NOWDATE","当前日期",1), + PART_TYPE_FIXCHAR("FIXCHAR","固定字符",2), + PART_TYPE_SERIALNO("SERIALNO","流水号",3), + PART_TYPE_OTHER("OTHER","其他",99); + + private final String code; + private final String name; + private final Integer beanIndex; + + PartTypeEnum(String code,String name,Integer beanIndex){ + this.code = code; + this.name = name; + this.beanIndex = beanIndex; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public Integer getBeanIndex() { + return beanIndex; + } + + public static PartTypeEnum getByCode(String code){ + for(PartTypeEnum value: PartTypeEnum.values()){ + if(value.getCode().equals(code)){ + return value; + } + } + return PART_TYPE_OTHER; + } + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeFixCharHandler.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeFixCharHandler.java new file mode 100644 index 0000000000..f2934db428 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeFixCharHandler.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.util; + +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(2) +public class PartTypeFixCharHandler implements PartTypeTemplate { + @Override + public String partHandle(AutocodePartDO sysAutoCodePart) { + return sysAutoCodePart.getFixCharacter(); + } +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeHandler.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeHandler.java new file mode 100644 index 0000000000..7d75ae8336 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeHandler.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.util; + +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class PartTypeHandler { + + @Autowired + List partTypeTemplates; + + public String choiceExecute(AutocodePartDO sysAutoCodePart){ + String partType = sysAutoCodePart.getPartType(); + return partTypeTemplates.get(PartTypeEnum.getByCode(partType).getBeanIndex()).partHandle(sysAutoCodePart); + } + +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeInputCharHandler.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeInputCharHandler.java new file mode 100644 index 0000000000..acbcd39eeb --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeInputCharHandler.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.util; + +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +@Component +@Order(0) +public class PartTypeInputCharHandler implements PartTypeTemplate { + + + @Override + public String partHandle(AutocodePartDO sysAutoCodePart) { + String inputCharacter = sysAutoCodePart.getInputCharacter(); + Assert.notNull(inputCharacter,"编码规则传入字符不能为空!"); + Assert.isTrue(inputCharacter.length() == sysAutoCodePart.getPartLength(),"传入字符的长度错误!"); + return inputCharacter; + } +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeNowDateHandler.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeNowDateHandler.java new file mode 100644 index 0000000000..b30ec704a1 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeNowDateHandler.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.util; + +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Component +@Order(1) +public class PartTypeNowDateHandler implements PartTypeTemplate { + + @Override + public String partHandle(AutocodePartDO sysAutoCodePart) { + String formatDate = sysAutoCodePart.getDatetimeFormat(); + return DateTimeFormatter.ofPattern(formatDate).format(LocalDateTime.now()); + } +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeSerialNoHandler.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeSerialNoHandler.java new file mode 100644 index 0000000000..9bc030f2d7 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeSerialNoHandler.java @@ -0,0 +1,101 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRecordDO; +import cn.iocoder.yudao.module.erp.service.autocode.AutocodeRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +@Component +@Order(3) +public class PartTypeSerialNoHandler implements PartTypeTemplate { + + @Autowired + private AutocodeRecordService iAutoCodeResultService; + + @Override + public String partHandle(AutocodePartDO sysAutoCodePart) { + + if("Y".equals(sysAutoCodePart.getCycleFlag())){ + return cycleY(sysAutoCodePart); + }else{ + return cycleN(sysAutoCodePart); + } + } + + //循环方式(要传入当前的循环规则参数) + private String cycleY(AutocodePartDO sysAutoCodePart){ + String method = sysAutoCodePart.getCycleMethod(); + String param =""; + if(CycleMethodMnum.CYCLE_METHOD_OTHER.getCode().equals(method)){ + param = sysAutoCodePart.getInputCharacter(); + }else{ + switch (CycleMethodMnum.getByCode(method)){ + case CYCLE_METHOD_YEAR: + param = cn.hutool.core.date.DateUtil.format(LocalDateTime.now(),"yyyy"); + break; + case CYCLE_METHOD_MONTH: + param = cn.hutool.core.date.DateUtil.format(LocalDateTime.now(),"yyyyMM"); + break; + case CYCLE_METHOD_DAY: + param = cn.hutool.core.date.DateUtil.format(LocalDateTime.now(),"yyyyMMdd"); + break; + case CYCLE_METHOD_HOUR: + param = cn.hutool.core.date.DateUtil.format(LocalDateTime.now(),"yyyyMMddHH"); + break; + case CYCLE_METHOD_MINUTE: + param = cn.hutool.core.date.DateUtil.format(LocalDateTime.now(),"yyyyMMddHHmm"); + break; + default: + break; + } + } + + List rs = getAutoCodeResult(sysAutoCodePart.getRuleId(),param,method); + if(CollectionUtil.isNotEmpty(rs)){ + //如果在编码记录表中有记录,则在最后一个流水号上加上步长,返回新的流水号 + AutoCodeUtil.threadLocal.set(false); + Integer lastSerialNo = rs.get(0).getLastSerialNo(); + return String.format("%0"+sysAutoCodePart.getPartLength()+"d",lastSerialNo+sysAutoCodePart.getSeriaStep()); + }else { + //如果在编码记录表中不存在,则直接返回起始流水号 + AutoCodeUtil.threadLocal.set(true); + return String.format("%0"+sysAutoCodePart.getPartLength()+"d",sysAutoCodePart.getSeriaStartNo()); + } + } + + //不循环方式 + private String cycleN(AutocodePartDO sysAutoCodePart){ + List rs = getAutoCodeResult(sysAutoCodePart.getRuleId(),"",""); + if(CollectionUtil.isNotEmpty(rs)){ + //存在记录则在当前记录加上步长 + Integer lastSerialNo = rs.get(0).getLastSerialNo(); + return String.format("%0"+sysAutoCodePart.getPartLength()+"d",lastSerialNo+sysAutoCodePart.getSeriaStep()); + }else{ + //不存在记录则从头开始 + AutoCodeUtil.threadLocal.set(true); + return String.format("%0"+sysAutoCodePart.getPartLength()+"d",sysAutoCodePart.getSeriaStartNo()); + } + + } + + //从编码结果记录表中查找当前指定循环规则的流水号记录 + private List getAutoCodeResult(Long ruleId,String param,String cycleMethod){ + AutocodeRecordDO queryParam = new AutocodeRecordDO(); + queryParam.setRuleId(ruleId);//ruleId要一致 + + if(CycleMethodMnum.CYCLE_METHOD_OTHER.getCode().equals(cycleMethod)){ + //如果循环方式是手工输入指定的字符 + queryParam.setLastInputChar(param); + }else{ + //如果循环方式是按格式化的日期 + queryParam.setGenDate(param);//这里的param将按照 gen_date like #{param}+'%' 的方式进行模糊查询,数据库中记录的永远都是yyyMMddHHmmss格式的 + } + return iAutoCodeResultService.list(queryParam); + } +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeTemplate.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeTemplate.java new file mode 100644 index 0000000000..c61c5b0bbc --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/util/PartTypeTemplate.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.util; + + +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; + +public interface PartTypeTemplate { + /** + * 分段的处理规则 + * @param autocodePartDO + * @return + */ + String partHandle(AutocodePartDO autocodePartDO); +} diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodePartPageReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodePartPageReqVO.java new file mode 100644 index 0000000000..5b583d1df9 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodePartPageReqVO.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.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 AutocodePartPageReqVO extends PageParam { + + @Schema(description = "规则ID", example = "11153") + private Long ruleId; + + @Schema(description = "分段序号") + private Integer partIndex; + + @Schema(description = "分段类型", example = "1") + private String partType; + + @Schema(description = "分段编号") + private String partCode; + + @Schema(description = "分段名称", example = "芋艿") + private String partName; + + @Schema(description = "分段长度") + private Integer partLength; + + @Schema(description = "日期时间格式") + private String datetimeFormat; + + @Schema(description = "输入字符") + private String inputCharacter; + + @Schema(description = "固定字符") + private String fixCharacter; + + @Schema(description = "流水号起始值") + private Integer seriaStartNo; + + @Schema(description = "流水号步长") + private Integer seriaStep; + + @Schema(description = "流水号当前值") + private Integer seriaNowNo; + + @Schema(description = "流水号是否循环") + private String cycleFlag; + + @Schema(description = "循环方式") + private String cycleMethod; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodePartRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodePartRespVO.java new file mode 100644 index 0000000000..4551068027 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodePartRespVO.java @@ -0,0 +1,92 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.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 cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 编码规则组成 Response VO") +@Data +@ExcelIgnoreUnannotated +public class AutocodePartRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19165") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "规则ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11153") + @ExcelProperty("规则ID") + private Long ruleId; + + @Schema(description = "分段序号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("分段序号") + private Integer partIndex; + + @Schema(description = "分段类型", example = "1") + @ExcelProperty("分段类型") + private String partType; + + @Schema(description = "分段编号") + @ExcelProperty("分段编号") + private String partCode; + + @Schema(description = "分段名称", example = "芋艿") + @ExcelProperty("分段名称") + private String partName; + + @Schema(description = "分段长度", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("分段长度") + private Integer partLength; + + @Schema(description = "日期时间格式") + @ExcelProperty("日期时间格式") + private String datetimeFormat; + + @Schema(description = "输入字符") + @ExcelProperty("输入字符") + private String inputCharacter; + + @Schema(description = "固定字符") + @ExcelProperty("固定字符") + private String fixCharacter; + + @Schema(description = "流水号起始值") + @ExcelProperty("流水号起始值") + private Integer seriaStartNo; + + @Schema(description = "流水号步长") + @ExcelProperty("流水号步长") + private Integer seriaStep; + + @Schema(description = "流水号当前值") + @ExcelProperty("流水号当前值") + private Integer seriaNowNo; + + @Schema(description = "流水号是否循环") + @ExcelProperty("流水号是否循环") + private String cycleFlag; + + @Schema(description = "循环方式") + @ExcelProperty(value = "循环方式", converter = DictConvert.class) + @DictFormat("erp__autocode_cyclemethod") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private String cycleMethod; + + @Schema(description = "备注", example = "你说的对") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "是否启用", converter = DictConvert.class) + @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Boolean isEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodePartSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodePartSaveReqVO.java new file mode 100644 index 0000000000..6e0ca8e56f --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodePartSaveReqVO.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 编码规则组成新增/修改 Request VO") +@Data +public class AutocodePartSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19165") + private Long id; + + @Schema(description = "规则ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11153") + @NotNull(message = "规则ID不能为空") + private Long ruleId; + + @Schema(description = "分段序号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "分段序号不能为空") + private Integer partIndex; + + @Schema(description = "分段类型", example = "1") + private String partType; + + @Schema(description = "分段编号") + private String partCode; + + @Schema(description = "分段名称", example = "芋艿") + private String partName; + + @Schema(description = "分段长度", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "分段长度不能为空") + private Integer partLength; + + @Schema(description = "日期时间格式") + private String datetimeFormat; + + @Schema(description = "输入字符") + private String inputCharacter; + + @Schema(description = "固定字符") + private String fixCharacter; + + @Schema(description = "流水号起始值") + private Integer seriaStartNo; + + @Schema(description = "流水号步长") + private Integer seriaStep; + + @Schema(description = "流水号当前值") + private Integer seriaNowNo; + + @Schema(description = "流水号是否循环") + private String cycleFlag; + + @Schema(description = "循环方式") + private String cycleMethod; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否启用不能为空") + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRecordPageReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRecordPageReqVO.java new file mode 100644 index 0000000000..b813e121e7 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRecordPageReqVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.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 AutocodeRecordPageReqVO extends PageParam { + + @Schema(description = "规则ID", example = "10883") + private Long ruleId; + + @Schema(description = "生成日期时间") + private String genDate; + + @Schema(description = "最后产生的序号") + private Integer genIndex; + + @Schema(description = "最后产生的值") + private String lastResult; + + @Schema(description = "最后产生的流水号") + private Integer lastSerialNo; + + @Schema(description = "最后传入的参数") + private String lastInputChar; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRecordRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRecordRespVO.java new file mode 100644 index 0000000000..165a50e5f9 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRecordRespVO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.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 cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 编码生成记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class AutocodeRecordRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16081") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "规则ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10883") + @ExcelProperty("规则ID") + private Long ruleId; + + @Schema(description = "生成日期时间") + @ExcelProperty("生成日期时间") + private String genDate; + + @Schema(description = "最后产生的序号") + @ExcelProperty("最后产生的序号") + private Integer genIndex; + + @Schema(description = "最后产生的值") + @ExcelProperty("最后产生的值") + private String lastResult; + + @Schema(description = "最后产生的流水号") + @ExcelProperty("最后产生的流水号") + private Integer lastSerialNo; + + @Schema(description = "最后传入的参数") + @ExcelProperty("最后传入的参数") + private String lastInputChar; + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "是否启用") + @ExcelProperty(value = "是否启用", converter = DictConvert.class) + @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Boolean isEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRecordSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRecordSaveReqVO.java new file mode 100644 index 0000000000..c499b67756 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRecordSaveReqVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 编码生成记录新增/修改 Request VO") +@Data +public class AutocodeRecordSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16081") + private Long id; + + @Schema(description = "规则ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10883") + @NotNull(message = "规则ID不能为空") + private Long ruleId; + + @Schema(description = "生成日期时间") + private String genDate; + + @Schema(description = "最后产生的序号") + private Integer genIndex; + + @Schema(description = "最后产生的值") + private String lastResult; + + @Schema(description = "最后产生的流水号") + private Integer lastSerialNo; + + @Schema(description = "最后传入的参数") + private String lastInputChar; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "是否启用") + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRulePageReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRulePageReqVO.java new file mode 100644 index 0000000000..c10ca9b230 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRulePageReqVO.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.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 AutocodeRulePageReqVO extends PageParam { + + @Schema(description = "规则编码") + private String ruleCode; + + @Schema(description = "规则名称", example = "张三") + private String ruleName; + + @Schema(description = "描述") + private String ruleDesc; + + @Schema(description = "最大长度") + private Integer maxLength; + + @Schema(description = "是否补齐") + private String isPadded; + + @Schema(description = "补齐字符") + private String paddedChar; + + @Schema(description = "补齐方式") + private String paddedMethod; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "是否启用") + private Boolean isEnable; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRuleRespVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRuleRespVO.java new file mode 100644 index 0000000000..7b6d8e99c8 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRuleRespVO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.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 cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; + +@Schema(description = "管理后台 - 编码规则 Response VO") +@Data +@ExcelIgnoreUnannotated +public class AutocodeRuleRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1078") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "规则编码") + @ExcelProperty("规则编码") + private String ruleCode; + + @Schema(description = "规则名称", example = "张三") + @ExcelProperty("规则名称") + private String ruleName; + + @Schema(description = "描述") + @ExcelProperty("描述") + private String ruleDesc; + + @Schema(description = "最大长度") + @ExcelProperty("最大长度") + private Integer maxLength; + + @Schema(description = "是否补齐") + @ExcelProperty(value = "是否补齐", converter = DictConvert.class) + @DictFormat("erp_autocode_is_padding") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private String isPadded; + + @Schema(description = "补齐字符") + @ExcelProperty("补齐字符") + private String paddedChar; + + @Schema(description = "补齐方式") + @ExcelProperty(value = "补齐方式", converter = DictConvert.class) + @DictFormat("erp_autocode_padding_type") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private String paddedMethod; + + @Schema(description = "备注", example = "你说的对") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty(value = "是否启用", converter = DictConvert.class) + @DictFormat("infra_boolean_string") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 + private Boolean isEnable; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRuleSaveReqVO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRuleSaveReqVO.java new file mode 100644 index 0000000000..b004db45fd --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/autocode/vo/AutocodeRuleSaveReqVO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.erp.controller.admin.autocode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; + +import javax.validation.constraints.NotNull; + +@Schema(description = "管理后台 - 编码规则新增/修改 Request VO") +@Data +public class AutocodeRuleSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1078") + private Long id; + + @Schema(description = "规则编码") + private String ruleCode; + + @Schema(description = "规则名称", example = "张三") + private String ruleName; + + @Schema(description = "描述") + private String ruleDesc; + + @Schema(description = "最大长度") + private Integer maxLength; + + @Schema(description = "是否补齐") + private String isPadded; + + @Schema(description = "补齐字符") + private String paddedChar; + + @Schema(description = "补齐方式") + private String paddedMethod; + + @Schema(description = "备注", example = "你说的对") + private String remark; + + @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "是否启用不能为空") + private Boolean isEnable; + + @Schema(description = "编码规则组成列表") + private List autocodeParts; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/autocode/AutocodePartDO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/autocode/AutocodePartDO.java new file mode 100644 index 0000000000..672dade347 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/autocode/AutocodePartDO.java @@ -0,0 +1,99 @@ +package cn.iocoder.yudao.module.erp.dal.dataobject.autocode; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 编码规则组成 DO + * + * @author 内蒙必硕 + */ +@TableName("erp_autocode_part") +@KeySequence("erp_autocode_part_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AutocodePartDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 规则ID + */ + private Long ruleId; + /** + * 分段序号 + */ + private Integer partIndex; + /** + * 分段类型 + */ + private String partType; + /** + * 分段编号 + */ + private String partCode; + /** + * 分段名称 + */ + private String partName; + /** + * 分段长度 + */ + private Integer partLength; + /** + * 日期时间格式 + */ + private String datetimeFormat; + /** + * 输入字符 + */ + private String inputCharacter; + /** + * 固定字符 + */ + private String fixCharacter; + /** + * 流水号起始值 + */ + private Integer seriaStartNo; + /** + * 流水号步长 + */ + private Integer seriaStep; + /** + * 流水号当前值 + */ + private Integer seriaNowNo; + /** + * 流水号是否循环 + */ + private String cycleFlag; + /** + * 循环方式 + * + * 枚举 {@link TODO erp__autocode_cyclemethod 对应的类} + */ + private String cycleMethod; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + * + * 枚举 {@link TODO infra_boolean_string 对应的类} + */ + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/autocode/AutocodeRecordDO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/autocode/AutocodeRecordDO.java new file mode 100644 index 0000000000..7a370c13c7 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/autocode/AutocodeRecordDO.java @@ -0,0 +1,65 @@ +package cn.iocoder.yudao.module.erp.dal.dataobject.autocode; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 编码生成记录 DO + * + * @author 内蒙必硕 + */ +@TableName("erp_autocode_record") +@KeySequence("erp_autocode_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AutocodeRecordDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 规则ID + */ + private Long ruleId; + /** + * 生成日期时间 + */ + private String genDate; + /** + * 最后产生的序号 + */ + private Integer genIndex; + /** + * 最后产生的值 + */ + private String lastResult; + /** + * 最后产生的流水号 + */ + private Integer lastSerialNo; + /** + * 最后传入的参数 + */ + private String lastInputChar; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + * + * 枚举 {@link TODO infra_boolean_string 对应的类} + */ + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/autocode/AutocodeRuleDO.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/autocode/AutocodeRuleDO.java new file mode 100644 index 0000000000..fe6646fbc6 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/dataobject/autocode/AutocodeRuleDO.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.module.erp.dal.dataobject.autocode; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 编码规则 DO + * + * @author 内蒙必硕 + */ +@TableName("erp_autocode_rule") +@KeySequence("erp_autocode_rule_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AutocodeRuleDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 规则编码 + */ + private String ruleCode; + /** + * 规则名称 + */ + private String ruleName; + /** + * 描述 + */ + private String ruleDesc; + /** + * 最大长度 + */ + private Integer maxLength; + /** + * 是否补齐 + * + * 枚举 {@link TODO erp_autocode_is_padding 对应的类} + */ + private String isPadded; + /** + * 补齐字符 + */ + private String paddedChar; + /** + * 补齐方式 + * + * 枚举 {@link TODO erp_autocode_padding_type 对应的类} + */ + private String paddedMethod; + /** + * 备注 + */ + private String remark; + /** + * 是否启用 + * + * 枚举 {@link TODO infra_boolean_string 对应的类} + */ + private Boolean isEnable; + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/autocode/AutocodePartMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/autocode/AutocodePartMapper.java new file mode 100644 index 0000000000..4653d3140c --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/autocode/AutocodePartMapper.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.erp.dal.mysql.autocode; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.mold.MoldDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 编码规则组成 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface AutocodePartMapper extends BaseMapperX { + + default PageResult selectPage(PageParam reqVO, Long ruleId) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eq(AutocodePartDO::getRuleId, ruleId) + .orderByDesc(AutocodePartDO::getId)); + } + default List selectListByRuleId(Long ruleId) { + return selectList(AutocodePartDO::getRuleId, ruleId); + } + + default int deleteByRuleId(Long ruleId) { + return delete(AutocodePartDO::getRuleId, ruleId); + } + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/autocode/AutocodeRecordMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/autocode/AutocodeRecordMapper.java new file mode 100644 index 0000000000..4fc3269882 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/autocode/AutocodeRecordMapper.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.erp.dal.mysql.autocode; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRecordDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; + +/** + * 编码生成记录 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface AutocodeRecordMapper extends BaseMapperX { + + default PageResult selectPage(AutocodeRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AutocodeRecordDO::getRuleId, reqVO.getRuleId()) + .eqIfPresent(AutocodeRecordDO::getGenDate, reqVO.getGenDate()) + .eqIfPresent(AutocodeRecordDO::getGenIndex, reqVO.getGenIndex()) + .eqIfPresent(AutocodeRecordDO::getLastResult, reqVO.getLastResult()) + .eqIfPresent(AutocodeRecordDO::getLastSerialNo, reqVO.getLastSerialNo()) + .eqIfPresent(AutocodeRecordDO::getLastInputChar, reqVO.getLastInputChar()) + .eqIfPresent(AutocodeRecordDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(AutocodeRecordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(AutocodeRecordDO::getId)); + } + default List selectListByRuleId(Long ruleId) { + return selectList(AutocodeRecordDO::getRuleId, ruleId); + } + default public List selectRecordList(AutocodeRecordDO reqVO){ + return selectList(new LambdaQueryWrapperX() + .eqIfPresent(AutocodeRecordDO::getRuleId, reqVO.getRuleId()) + .eqIfPresent(AutocodeRecordDO::getLastInputChar, reqVO.getLastInputChar()) + .likeRight(reqVO.getGenDate() !=null,AutocodeRecordDO::getGenDate, reqVO.getGenDate()) + .orderByDesc(AutocodeRecordDO::getGenDate)); + } +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/autocode/AutocodeRuleMapper.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/autocode/AutocodeRuleMapper.java new file mode 100644 index 0000000000..f638a9d4db --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/autocode/AutocodeRuleMapper.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.erp.dal.mysql.autocode; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRuleDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; + +/** + * 编码规则 Mapper + * + * @author 内蒙必硕 + */ +@Mapper +public interface AutocodeRuleMapper extends BaseMapperX { + + default PageResult selectPage(AutocodeRulePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(AutocodeRuleDO::getRuleCode, reqVO.getRuleCode()) + .likeIfPresent(AutocodeRuleDO::getRuleName, reqVO.getRuleName()) + .eqIfPresent(AutocodeRuleDO::getRuleDesc, reqVO.getRuleDesc()) + .eqIfPresent(AutocodeRuleDO::getMaxLength, reqVO.getMaxLength()) + .eqIfPresent(AutocodeRuleDO::getIsPadded, reqVO.getIsPadded()) + .eqIfPresent(AutocodeRuleDO::getPaddedChar, reqVO.getPaddedChar()) + .eqIfPresent(AutocodeRuleDO::getPaddedMethod, reqVO.getPaddedMethod()) + .eqIfPresent(AutocodeRuleDO::getRemark, reqVO.getRemark()) + .eqIfPresent(AutocodeRuleDO::getIsEnable, reqVO.getIsEnable()) + .betweenIfPresent(AutocodeRuleDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(AutocodeRuleDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodePartService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodePartService.java new file mode 100644 index 0000000000..338700433d --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodePartService.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.erp.service.autocode; + +import java.util.*; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +import javax.validation.Valid; + +/** + * 编码规则组成 Service 接口 + * + * @author 内蒙必硕 + */ +public interface AutocodePartService { + + /** + * 创建编码规则组成 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createAutocodePart(@Valid AutocodePartSaveReqVO createReqVO); + + /** + * 更新编码规则组成 + * + * @param updateReqVO 更新信息 + */ + void updateAutocodePart(@Valid AutocodePartSaveReqVO updateReqVO); + + /** + * 删除编码规则组成 + * + * @param id 编号 + */ + void deleteAutocodePart(Long id); + + /** + * 获得编码规则组成 + * + * @param id 编号 + * @return 编码规则组成 + */ + AutocodePartDO getAutocodePart(Long id); + + /** + * 获得编码规则组成分页 + * + * @param pageReqVO 分页查询 + * @return 编码规则组成分页 + */ + PageResult getAutocodePartPage(AutocodePartPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodePartServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodePartServiceImpl.java new file mode 100644 index 0000000000..cfa41ef339 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodePartServiceImpl.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.module.erp.service.autocode; + +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.erp.dal.mysql.autocode.AutocodePartMapper; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; + +/** + * 编码规则组成 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class AutocodePartServiceImpl implements AutocodePartService { + + @Resource + private AutocodePartMapper autocodePartMapper; + + @Override + public Long createAutocodePart(AutocodePartSaveReqVO createReqVO) { + // 插入 + AutocodePartDO autocodePart = BeanUtils.toBean(createReqVO, AutocodePartDO.class); + autocodePartMapper.insert(autocodePart); + // 返回 + return autocodePart.getId(); + } + + @Override + public void updateAutocodePart(AutocodePartSaveReqVO updateReqVO) { + // 校验存在 + validateAutocodePartExists(updateReqVO.getId()); + // 更新 + AutocodePartDO updateObj = BeanUtils.toBean(updateReqVO, AutocodePartDO.class); + autocodePartMapper.updateById(updateObj); + } + + @Override + public void deleteAutocodePart(Long id) { + // 校验存在 + validateAutocodePartExists(id); + // 删除 + autocodePartMapper.deleteById(id); + } + + private void validateAutocodePartExists(Long id) { + if (autocodePartMapper.selectById(id) == null) { + throw exception(AUTOCODE_PART_NOT_EXISTS); + } + } + + @Override + public AutocodePartDO getAutocodePart(Long id) { + return autocodePartMapper.selectById(id); + } + + @Override + public PageResult getAutocodePartPage(AutocodePartPageReqVO pageReqVO) { + return autocodePartMapper.selectPage(pageReqVO,pageReqVO.getRuleId()); + } + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRecordService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRecordService.java new file mode 100644 index 0000000000..a7adec12b2 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRecordService.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.erp.service.autocode; + +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRecordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +import javax.validation.Valid; +import java.util.List; + +/** + * 编码生成记录 Service 接口 + * + * @author 内蒙必硕 + */ +public interface AutocodeRecordService { + + /** + * 创建编码生成记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createAutocodeRecord(@Valid AutocodeRecordSaveReqVO createReqVO); + + /** + * 更新编码生成记录 + * + * @param updateReqVO 更新信息 + */ + void updateAutocodeRecord(@Valid AutocodeRecordSaveReqVO updateReqVO); + + /** + * 删除编码生成记录 + * + * @param id 编号 + */ + void deleteAutocodeRecord(Long id); + + /** + * 获得编码生成记录 + * + * @param id 编号 + * @return 编码生成记录 + */ + AutocodeRecordDO getAutocodeRecord(Long id); + + /** + * 获得编码生成记录分页 + * + * @param pageReqVO 分页查询 + * @return 编码生成记录分页 + */ + PageResult getAutocodeRecordPage(AutocodeRecordPageReqVO pageReqVO); + List selectListByRuleId(Long ruleId); + + + List list(AutocodeRecordDO sysAutoCodeResult); +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRecordServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRecordServiceImpl.java new file mode 100644 index 0000000000..75e6d830b8 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRecordServiceImpl.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.module.erp.service.autocode; + +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRecordDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.erp.dal.mysql.autocode.AutocodeRecordMapper; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; + +/** + * 编码生成记录 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class AutocodeRecordServiceImpl implements AutocodeRecordService { + + @Resource + private AutocodeRecordMapper autocodeRecordMapper; + + @Override + public Long createAutocodeRecord(AutocodeRecordSaveReqVO createReqVO) { + // 插入 + AutocodeRecordDO autocodeRecord = BeanUtils.toBean(createReqVO, AutocodeRecordDO.class); + autocodeRecordMapper.insert(autocodeRecord); + // 返回 + return autocodeRecord.getId(); + } + + @Override + public void updateAutocodeRecord(AutocodeRecordSaveReqVO updateReqVO) { + // 校验存在 + validateAutocodeRecordExists(updateReqVO.getId()); + // 更新 + AutocodeRecordDO updateObj = BeanUtils.toBean(updateReqVO, AutocodeRecordDO.class); + autocodeRecordMapper.updateById(updateObj); + } + + @Override + public void deleteAutocodeRecord(Long id) { + // 校验存在 + validateAutocodeRecordExists(id); + // 删除 + autocodeRecordMapper.deleteById(id); + } + + private void validateAutocodeRecordExists(Long id) { + if (autocodeRecordMapper.selectById(id) == null) { + throw exception(AUTOCODE_RECORD_NOT_EXISTS); + } + } + + @Override + public AutocodeRecordDO getAutocodeRecord(Long id) { + return autocodeRecordMapper.selectById(id); + } + + @Override + public PageResult getAutocodeRecordPage(AutocodeRecordPageReqVO pageReqVO) { + return autocodeRecordMapper.selectPage(pageReqVO); + } + + @Override + public List selectListByRuleId(Long ruleId) { + return autocodeRecordMapper.selectListByRuleId(ruleId); + } + + @Override + public List list(AutocodeRecordDO sysAutoCodeResult) { + return autocodeRecordMapper.selectRecordList(sysAutoCodeResult); + } + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRuleService.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRuleService.java new file mode 100644 index 0000000000..fda7f1e9fc --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRuleService.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.erp.service.autocode; + +import java.util.*; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRuleDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; + +import javax.validation.Valid; + +/** + * 编码规则 Service 接口 + * + * @author 内蒙必硕 + */ +public interface AutocodeRuleService { + + /** + * 创建编码规则 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createAutocodeRule(@Valid AutocodeRuleSaveReqVO createReqVO); + + /** + * 更新编码规则 + * + * @param updateReqVO 更新信息 + */ + void updateAutocodeRule(@Valid AutocodeRuleSaveReqVO updateReqVO); + + /** + * 删除编码规则 + * + * @param id 编号 + */ + void deleteAutocodeRule(Long id); + + /** + * 获得编码规则 + * + * @param id 编号 + * @return 编码规则 + */ + AutocodeRuleDO getAutocodeRule(Long id); + + AutocodeRuleDO getAutocodeRuleByRuleCode(String ruleCode); + + /** + * 获得编码规则分页 + * + * @param pageReqVO 分页查询 + * @return 编码规则分页 + */ + PageResult getAutocodeRulePage(AutocodeRulePageReqVO pageReqVO); + + // ==================== 子表(编码规则组成) ==================== + + /** + * 获得编码规则组成列表 + * + * @param ruleId 规则ID + * @return 编码规则组成列表 + */ + List getAutocodePartListByRuleId(Long ruleId); + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRuleServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRuleServiceImpl.java new file mode 100644 index 0000000000..b2bccc2c56 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRuleServiceImpl.java @@ -0,0 +1,115 @@ +package cn.iocoder.yudao.module.erp.service.autocode; + +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRuleDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.erp.dal.mysql.autocode.AutocodeRuleMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.autocode.AutocodePartMapper; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; + +/** + * 编码规则 Service 实现类 + * + * @author 内蒙必硕 + */ +@Service +@Validated +public class AutocodeRuleServiceImpl implements AutocodeRuleService { + + @Resource + private AutocodeRuleMapper autocodeRuleMapper; + @Resource + private AutocodePartMapper autocodePartMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createAutocodeRule(AutocodeRuleSaveReqVO createReqVO) { + // 插入 + AutocodeRuleDO autocodeRule = BeanUtils.toBean(createReqVO, AutocodeRuleDO.class); + autocodeRuleMapper.insert(autocodeRule); + + // 插入子表 + createAutocodePartList(autocodeRule.getId(), createReqVO.getAutocodeParts()); + // 返回 + return autocodeRule.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateAutocodeRule(AutocodeRuleSaveReqVO updateReqVO) { + // 校验存在 + validateAutocodeRuleExists(updateReqVO.getId()); + // 更新 + AutocodeRuleDO updateObj = BeanUtils.toBean(updateReqVO, AutocodeRuleDO.class); + autocodeRuleMapper.updateById(updateObj); + + // 更新子表 + updateAutocodePartList(updateReqVO.getId(), updateReqVO.getAutocodeParts()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAutocodeRule(Long id) { + // 校验存在 + validateAutocodeRuleExists(id); + // 删除 + autocodeRuleMapper.deleteById(id); + + // 删除子表 + deleteAutocodePartByRuleId(id); + } + + private void validateAutocodeRuleExists(Long id) { + if (autocodeRuleMapper.selectById(id) == null) { + throw exception(AUTOCODE_RULE_NOT_EXISTS); + } + } + + @Override + public AutocodeRuleDO getAutocodeRule(Long id) { + return autocodeRuleMapper.selectById(id); + } + @Override + public AutocodeRuleDO getAutocodeRuleByRuleCode(String ruleCode) { + return autocodeRuleMapper.selectOne(AutocodeRuleDO::getRuleCode, ruleCode); + } + @Override + public PageResult getAutocodeRulePage(AutocodeRulePageReqVO pageReqVO) { + return autocodeRuleMapper.selectPage(pageReqVO); + } + + // ==================== 子表(编码规则组成) ==================== + + @Override + public List getAutocodePartListByRuleId(Long ruleId) { + return autocodePartMapper.selectListByRuleId(ruleId); + } + + private void createAutocodePartList(Long ruleId, List list) { + list.forEach(o -> o.setRuleId(ruleId)); + autocodePartMapper.insertBatch(list); + } + + private void updateAutocodePartList(Long ruleId, List list) { + deleteAutocodePartByRuleId(ruleId); + list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新 + createAutocodePartList(ruleId, list); + } + + private void deleteAutocodePartByRuleId(Long ruleId) { + autocodePartMapper.deleteByRuleId(ruleId); + } + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/AutocodePartMapper.xml b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/AutocodePartMapper.xml new file mode 100644 index 0000000000..ca75efef1b --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/AutocodePartMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/AutocodeRecordMapper.xml b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/AutocodeRecordMapper.xml new file mode 100644 index 0000000000..9f6dfad3e3 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/AutocodeRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/AutocodeRuleMapper.xml b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/AutocodeRuleMapper.xml new file mode 100644 index 0000000000..3257aca942 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/resources/mapper/autocode/AutocodeRuleMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodePartServiceImplTest.java b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodePartServiceImplTest.java new file mode 100644 index 0000000000..4f4f830935 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodePartServiceImplTest.java @@ -0,0 +1,189 @@ +package cn.iocoder.yudao.module.erp.service.autocode; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodePartDO; +import cn.iocoder.yudao.module.erp.dal.mysql.autocode.AutocodePartMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; + +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link AutocodePartServiceImpl} 的单元测试类 + * + * @author 内蒙必硕 + */ +@Import(AutocodePartServiceImpl.class) +public class AutocodePartServiceImplTest extends BaseDbUnitTest { + + @Resource + private AutocodePartServiceImpl autocodePartService; + + @Resource + private AutocodePartMapper autocodePartMapper; + + @Test + public void testCreateAutocodePart_success() { + // 准备参数 + AutocodePartSaveReqVO createReqVO = randomPojo(AutocodePartSaveReqVO.class).setId(null); + + // 调用 + Long autocodePartId = autocodePartService.createAutocodePart(createReqVO); + // 断言 + assertNotNull(autocodePartId); + // 校验记录的属性是否正确 + AutocodePartDO autocodePart = autocodePartMapper.selectById(autocodePartId); + assertPojoEquals(createReqVO, autocodePart, "id"); + } + + @Test + public void testUpdateAutocodePart_success() { + // mock 数据 + AutocodePartDO dbAutocodePart = randomPojo(AutocodePartDO.class); + autocodePartMapper.insert(dbAutocodePart);// @Sql: 先插入出一条存在的数据 + // 准备参数 + AutocodePartSaveReqVO updateReqVO = randomPojo(AutocodePartSaveReqVO.class, o -> { + o.setId(dbAutocodePart.getId()); // 设置更新的 ID + }); + + // 调用 + autocodePartService.updateAutocodePart(updateReqVO); + // 校验是否更新正确 + AutocodePartDO autocodePart = autocodePartMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, autocodePart); + } + + @Test + public void testUpdateAutocodePart_notExists() { + // 准备参数 + AutocodePartSaveReqVO updateReqVO = randomPojo(AutocodePartSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> autocodePartService.updateAutocodePart(updateReqVO), AUTOCODE_PART_NOT_EXISTS); + } + + @Test + public void testDeleteAutocodePart_success() { + // mock 数据 + AutocodePartDO dbAutocodePart = randomPojo(AutocodePartDO.class); + autocodePartMapper.insert(dbAutocodePart);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbAutocodePart.getId(); + + // 调用 + autocodePartService.deleteAutocodePart(id); + // 校验数据不存在了 + assertNull(autocodePartMapper.selectById(id)); + } + + @Test + public void testDeleteAutocodePart_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> autocodePartService.deleteAutocodePart(id), AUTOCODE_PART_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetAutocodePartPage() { + // mock 数据 + AutocodePartDO dbAutocodePart = randomPojo(AutocodePartDO.class, o -> { // 等会查询到 + o.setRuleId(null); + o.setPartIndex(null); + o.setPartType(null); + o.setPartCode(null); + o.setPartName(null); + o.setPartLength(null); + o.setDatetimeFormat(null); + o.setInputCharacter(null); + o.setFixCharacter(null); + o.setSeriaStartNo(null); + o.setSeriaStep(null); + o.setSeriaNowNo(null); + o.setCycleFlag(null); + o.setCycleMethod(null); + o.setRemark(null); + o.setIsEnable(null); + o.setCreateTime(null); + }); + autocodePartMapper.insert(dbAutocodePart); + // 测试 ruleId 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setRuleId(null))); + // 测试 partIndex 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setPartIndex(null))); + // 测试 partType 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setPartType(null))); + // 测试 partCode 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setPartCode(null))); + // 测试 partName 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setPartName(null))); + // 测试 partLength 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setPartLength(null))); + // 测试 datetimeFormat 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setDatetimeFormat(null))); + // 测试 inputCharacter 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setInputCharacter(null))); + // 测试 fixCharacter 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setFixCharacter(null))); + // 测试 seriaStartNo 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setSeriaStartNo(null))); + // 测试 seriaStep 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setSeriaStep(null))); + // 测试 seriaNowNo 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setSeriaNowNo(null))); + // 测试 cycleFlag 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setCycleFlag(null))); + // 测试 cycleMethod 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setCycleMethod(null))); + // 测试 remark 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setRemark(null))); + // 测试 isEnable 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setIsEnable(null))); + // 测试 createTime 不匹配 + autocodePartMapper.insert(cloneIgnoreId(dbAutocodePart, o -> o.setCreateTime(null))); + // 准备参数 + AutocodePartPageReqVO reqVO = new AutocodePartPageReqVO(); + reqVO.setRuleId(null); + reqVO.setPartIndex(null); + reqVO.setPartType(null); + reqVO.setPartCode(null); + reqVO.setPartName(null); + reqVO.setPartLength(null); + reqVO.setDatetimeFormat(null); + reqVO.setInputCharacter(null); + reqVO.setFixCharacter(null); + reqVO.setSeriaStartNo(null); + reqVO.setSeriaStep(null); + reqVO.setSeriaNowNo(null); + reqVO.setCycleFlag(null); + reqVO.setCycleMethod(null); + reqVO.setRemark(null); + reqVO.setIsEnable(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = autocodePartService.getAutocodePartPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbAutocodePart, pageResult.getList().get(0)); + } + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRecordServiceImplTest.java b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRecordServiceImplTest.java new file mode 100644 index 0000000000..efa9246aac --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRecordServiceImplTest.java @@ -0,0 +1,158 @@ +package cn.iocoder.yudao.module.erp.service.autocode; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.mock.mockito.MockBean; + + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRecordDO; +import cn.iocoder.yudao.module.erp.dal.mysql.autocode.AutocodeRecordMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import java.util.*; +import java.time.LocalDateTime; + +import static cn.hutool.core.util.RandomUtil.*; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link AutocodeRecordServiceImpl} 的单元测试类 + * + * @author 内蒙必硕 + */ +@Import(AutocodeRecordServiceImpl.class) +public class AutocodeRecordServiceImplTest extends BaseDbUnitTest { + + @Resource + private AutocodeRecordServiceImpl autocodeRecordService; + + @Resource + private AutocodeRecordMapper autocodeRecordMapper; + + @Test + public void testCreateAutocodeRecord_success() { + // 准备参数 + AutocodeRecordSaveReqVO createReqVO = randomPojo(AutocodeRecordSaveReqVO.class).setId(null); + + // 调用 + Long autocodeRecordId = autocodeRecordService.createAutocodeRecord(createReqVO); + // 断言 + assertNotNull(autocodeRecordId); + // 校验记录的属性是否正确 + AutocodeRecordDO autocodeRecord = autocodeRecordMapper.selectById(autocodeRecordId); + assertPojoEquals(createReqVO, autocodeRecord, "id"); + } + + @Test + public void testUpdateAutocodeRecord_success() { + // mock 数据 + AutocodeRecordDO dbAutocodeRecord = randomPojo(AutocodeRecordDO.class); + autocodeRecordMapper.insert(dbAutocodeRecord);// @Sql: 先插入出一条存在的数据 + // 准备参数 + AutocodeRecordSaveReqVO updateReqVO = randomPojo(AutocodeRecordSaveReqVO.class, o -> { + o.setId(dbAutocodeRecord.getId()); // 设置更新的 ID + }); + + // 调用 + autocodeRecordService.updateAutocodeRecord(updateReqVO); + // 校验是否更新正确 + AutocodeRecordDO autocodeRecord = autocodeRecordMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, autocodeRecord); + } + + @Test + public void testUpdateAutocodeRecord_notExists() { + // 准备参数 + AutocodeRecordSaveReqVO updateReqVO = randomPojo(AutocodeRecordSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> autocodeRecordService.updateAutocodeRecord(updateReqVO), AUTOCODE_RECORD_NOT_EXISTS); + } + + @Test + public void testDeleteAutocodeRecord_success() { + // mock 数据 + AutocodeRecordDO dbAutocodeRecord = randomPojo(AutocodeRecordDO.class); + autocodeRecordMapper.insert(dbAutocodeRecord);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbAutocodeRecord.getId(); + + // 调用 + autocodeRecordService.deleteAutocodeRecord(id); + // 校验数据不存在了 + assertNull(autocodeRecordMapper.selectById(id)); + } + + @Test + public void testDeleteAutocodeRecord_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> autocodeRecordService.deleteAutocodeRecord(id), AUTOCODE_RECORD_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetAutocodeRecordPage() { + // mock 数据 + AutocodeRecordDO dbAutocodeRecord = randomPojo(AutocodeRecordDO.class, o -> { // 等会查询到 + o.setRuleId(null); + o.setGenDate(null); + o.setGenIndex(null); + o.setLastResult(null); + o.setLastSerialNo(null); + o.setLastInputChar(null); + o.setRemark(null); + o.setCreateTime(null); + }); + autocodeRecordMapper.insert(dbAutocodeRecord); + // 测试 ruleId 不匹配 + autocodeRecordMapper.insert(cloneIgnoreId(dbAutocodeRecord, o -> o.setRuleId(null))); + // 测试 genDate 不匹配 + autocodeRecordMapper.insert(cloneIgnoreId(dbAutocodeRecord, o -> o.setGenDate(null))); + // 测试 genIndex 不匹配 + autocodeRecordMapper.insert(cloneIgnoreId(dbAutocodeRecord, o -> o.setGenIndex(null))); + // 测试 lastResult 不匹配 + autocodeRecordMapper.insert(cloneIgnoreId(dbAutocodeRecord, o -> o.setLastResult(null))); + // 测试 lastSerialNo 不匹配 + autocodeRecordMapper.insert(cloneIgnoreId(dbAutocodeRecord, o -> o.setLastSerialNo(null))); + // 测试 lastInputChar 不匹配 + autocodeRecordMapper.insert(cloneIgnoreId(dbAutocodeRecord, o -> o.setLastInputChar(null))); + // 测试 remark 不匹配 + autocodeRecordMapper.insert(cloneIgnoreId(dbAutocodeRecord, o -> o.setRemark(null))); + // 测试 createTime 不匹配 + autocodeRecordMapper.insert(cloneIgnoreId(dbAutocodeRecord, o -> o.setCreateTime(null))); + // 准备参数 + AutocodeRecordPageReqVO reqVO = new AutocodeRecordPageReqVO(); + reqVO.setRuleId(null); + reqVO.setGenDate(null); + reqVO.setGenIndex(null); + reqVO.setLastResult(null); + reqVO.setLastSerialNo(null); + reqVO.setLastInputChar(null); + reqVO.setRemark(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = autocodeRecordService.getAutocodeRecordPage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbAutocodeRecord, pageResult.getList().get(0)); + } + +} \ No newline at end of file diff --git a/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRuleServiceImplTest.java b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRuleServiceImplTest.java new file mode 100644 index 0000000000..2d0c5c83e3 --- /dev/null +++ b/yudao-module-erp/yudao-module-erp-biz/src/test/java/cn/iocoder/yudao/module/erp/service/autocode/AutocodeRuleServiceImplTest.java @@ -0,0 +1,160 @@ +package cn.iocoder.yudao.module.erp.service.autocode; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; + +import cn.iocoder.yudao.module.erp.controller.admin.autocode.vo.*; +import cn.iocoder.yudao.module.erp.dal.dataobject.autocode.AutocodeRuleDO; +import cn.iocoder.yudao.module.erp.dal.mysql.autocode.AutocodeRuleMapper; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +import org.springframework.context.annotation.Import; + +import javax.annotation.Resource; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.*; +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*; +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.*; +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * {@link AutocodeRuleServiceImpl} 的单元测试类 + * + * @author 内蒙必硕 + */ +@Import(AutocodeRuleServiceImpl.class) +public class AutocodeRuleServiceImplTest extends BaseDbUnitTest { + + @Resource + private AutocodeRuleServiceImpl autocodeRuleService; + + @Resource + private AutocodeRuleMapper autocodeRuleMapper; + + @Test + public void testCreateAutocodeRule_success() { + // 准备参数 + AutocodeRuleSaveReqVO createReqVO = randomPojo(AutocodeRuleSaveReqVO.class).setId(null); + + // 调用 + Long autocodeRuleId = autocodeRuleService.createAutocodeRule(createReqVO); + // 断言 + assertNotNull(autocodeRuleId); + // 校验记录的属性是否正确 + AutocodeRuleDO autocodeRule = autocodeRuleMapper.selectById(autocodeRuleId); + assertPojoEquals(createReqVO, autocodeRule, "id"); + } + + @Test + public void testUpdateAutocodeRule_success() { + // mock 数据 + AutocodeRuleDO dbAutocodeRule = randomPojo(AutocodeRuleDO.class); + autocodeRuleMapper.insert(dbAutocodeRule);// @Sql: 先插入出一条存在的数据 + // 准备参数 + AutocodeRuleSaveReqVO updateReqVO = randomPojo(AutocodeRuleSaveReqVO.class, o -> { + o.setId(dbAutocodeRule.getId()); // 设置更新的 ID + }); + + // 调用 + autocodeRuleService.updateAutocodeRule(updateReqVO); + // 校验是否更新正确 + AutocodeRuleDO autocodeRule = autocodeRuleMapper.selectById(updateReqVO.getId()); // 获取最新的 + assertPojoEquals(updateReqVO, autocodeRule); + } + + @Test + public void testUpdateAutocodeRule_notExists() { + // 准备参数 + AutocodeRuleSaveReqVO updateReqVO = randomPojo(AutocodeRuleSaveReqVO.class); + + // 调用, 并断言异常 + assertServiceException(() -> autocodeRuleService.updateAutocodeRule(updateReqVO), AUTOCODE_RULE_NOT_EXISTS); + } + + @Test + public void testDeleteAutocodeRule_success() { + // mock 数据 + AutocodeRuleDO dbAutocodeRule = randomPojo(AutocodeRuleDO.class); + autocodeRuleMapper.insert(dbAutocodeRule);// @Sql: 先插入出一条存在的数据 + // 准备参数 + Long id = dbAutocodeRule.getId(); + + // 调用 + autocodeRuleService.deleteAutocodeRule(id); + // 校验数据不存在了 + assertNull(autocodeRuleMapper.selectById(id)); + } + + @Test + public void testDeleteAutocodeRule_notExists() { + // 准备参数 + Long id = randomLongId(); + + // 调用, 并断言异常 + assertServiceException(() -> autocodeRuleService.deleteAutocodeRule(id), AUTOCODE_RULE_NOT_EXISTS); + } + + @Test + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 + public void testGetAutocodeRulePage() { + // mock 数据 + AutocodeRuleDO dbAutocodeRule = randomPojo(AutocodeRuleDO.class, o -> { // 等会查询到 + o.setRuleCode(null); + o.setRuleName(null); + o.setRuleDesc(null); + o.setMaxLength(null); + o.setIsPadded(null); + o.setPaddedChar(null); + o.setPaddedMethod(null); + o.setRemark(null); + o.setIsEnable(null); + o.setCreateTime(null); + }); + autocodeRuleMapper.insert(dbAutocodeRule); + // 测试 ruleCode 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setRuleCode(null))); + // 测试 ruleName 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setRuleName(null))); + // 测试 ruleDesc 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setRuleDesc(null))); + // 测试 maxLength 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setMaxLength(null))); + // 测试 isPadded 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setIsPadded(null))); + // 测试 paddedChar 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setPaddedChar(null))); + // 测试 paddedMethod 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setPaddedMethod(null))); + // 测试 remark 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setRemark(null))); + // 测试 isEnable 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setIsEnable(null))); + // 测试 createTime 不匹配 + autocodeRuleMapper.insert(cloneIgnoreId(dbAutocodeRule, o -> o.setCreateTime(null))); + // 准备参数 + AutocodeRulePageReqVO reqVO = new AutocodeRulePageReqVO(); + reqVO.setRuleCode(null); + reqVO.setRuleName(null); + reqVO.setRuleDesc(null); + reqVO.setMaxLength(null); + reqVO.setIsPadded(null); + reqVO.setPaddedChar(null); + reqVO.setPaddedMethod(null); + reqVO.setRemark(null); + reqVO.setIsEnable(null); + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); + + // 调用 + PageResult pageResult = autocodeRuleService.getAutocodeRulePage(reqVO); + // 断言 + assertEquals(1, pageResult.getTotal()); + assertEquals(1, pageResult.getList().size()); + assertPojoEquals(dbAutocodeRule, pageResult.getList().get(0)); + } + +} \ No newline at end of file