| | |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; |
| | | |
| | | @Schema(description = "管çåå° - ERP éè´ç³è¯·å页 Request VO") |
| | | @Data |
| | |
| | | private Integer status; |
| | | |
| | | @Schema(description = "ç³è¯·æ¶é´") |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) |
| | | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| | | private LocalDateTime[] requestTime; |
| | | |
| | | @Schema(description = "产åç¼å·", example = "1") |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordImportExcelVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordImportReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordRespVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRecordDO; |
| | |
| | | HrmEmployeeDO employee = employeeMap.get(respVO.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | respVO.setPhone(employee.getPhone()); |
| | | } |
| | | // é¨é¨åç§° |
| | | DeptRespDTO dept = deptMap.get(respVO.getDeptId()); |
| | |
| | | HrmEmployeeDO employee = employeeService.getEmployee(attendanceRecord.getUserId()); |
| | | if (employee != null) { |
| | | respVO.setUserName(employee.getName()); |
| | | respVO.setPhone(employee.getPhone()); |
| | | } |
| | | } |
| | | if (attendanceRecord.getDeptId() != null) { |
| | |
| | | return success(respVO); |
| | | } |
| | | |
| | | @GetMapping("/get-import-template") |
| | | @Operation(summary = "ä¸è½½èå¤è®°å½å¯¼å
¥æ¨¡æ¿") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance-record:import')") |
| | | public void importTemplate(HttpServletResponse response) throws IOException { |
| | | List<HrmAttendanceRecordImportExcelVO> list = Collections.singletonList( |
| | | HrmAttendanceRecordImportExcelVO.builder() |
| | | .userName("å¼ ä¸") |
| | | .phone("13800138000") |
| | | .date(java.time.LocalDate.of(2026, 1, 15)) |
| | | .clockInTime(java.time.LocalDateTime.of(2026, 1, 15, 8, 30)) |
| | | .clockOutTime(java.time.LocalDateTime.of(2026, 1, 15, 17, 30)) |
| | | .clockInType(1) |
| | | .clockOutType(1) |
| | | .location("åå
¬åº") |
| | | .remark("ç¤ºä¾æ°æ®") |
| | | .build() |
| | | ); |
| | | ExcelUtils.write(response, "èå¤å¯¼å
¥æ¨¡æ¿.xls", "èå¤è®°å½", HrmAttendanceRecordImportExcelVO.class, list); |
| | | } |
| | | |
| | | @PostMapping("/import") |
| | | @Operation(summary = "导å
¥èå¤è®°å½") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance-record:import')") |
| | | public CommonResult<String> importExcel(@Valid HrmAttendanceRecordImportReqVO importReqVO) throws IOException { |
| | | List<HrmAttendanceRecordImportExcelVO> list = ExcelUtils.read(importReqVO.getFile(), HrmAttendanceRecordImportExcelVO.class); |
| | | if (CollUtil.isEmpty(list)) { |
| | | return success("没æå¯å¯¼å
¥çæ°æ®"); |
| | | } |
| | | int successCount = 0; |
| | | Set<String> missingNames = new LinkedHashSet<>(); |
| | | Set<String> duplicateNames = new LinkedHashSet<>(); |
| | | Set<String> invalidRows = new LinkedHashSet<>(); |
| | | for (HrmAttendanceRecordImportExcelVO item : list) { |
| | | if (item.getDate() == null) { |
| | | invalidRows.add((item.getUserName() == null || item.getUserName().isBlank()) ? "æªå¡«å§åçè¡" : "è夿¥æä¸ºç©º(" + item.getUserName().trim() + ")"); |
| | | continue; |
| | | } |
| | | if (item.getUserName() == null || item.getUserName().isBlank()) { |
| | | invalidRows.add("è夿¥æä¸º " + item.getDate() + " 使ªå¡«åå·¥å§å"); |
| | | continue; |
| | | } |
| | | List<HrmEmployeeDO> employees = employeeService.getEmployeeListByName(item.getUserName().trim()); |
| | | if (employees.isEmpty()) { |
| | | missingNames.add(item.getUserName().trim()); |
| | | continue; |
| | | } |
| | | HrmEmployeeDO employee = employees.get(0); |
| | | // åå¨å¤ä¸ªåååå·¥æ¶ï¼ç¨ææºå·åºå |
| | | if (employees.size() > 1) { |
| | | String phone = item.getPhone() != null ? item.getPhone().trim() : null; |
| | | List<HrmEmployeeDO> matchedByPhone = new ArrayList<>(); |
| | | if (phone != null && !phone.isEmpty()) { |
| | | for (HrmEmployeeDO emp : employees) { |
| | | if (phone.equals(emp.getPhone())) { |
| | | matchedByPhone.add(emp); |
| | | } |
| | | } |
| | | } |
| | | if (matchedByPhone.size() == 1) { |
| | | employee = matchedByPhone.get(0); |
| | | } else { |
| | | duplicateNames.add(item.getUserName().trim()); |
| | | continue; |
| | | } |
| | | } |
| | | HrmAttendanceRecordDO record = attendanceRecordService.getAttendanceRecordByUserIdAndDate(employee.getId(), item.getDate()); |
| | | if (record == null) { |
| | | record = HrmAttendanceRecordDO.builder() |
| | | .userId(employee.getId()).deptId(employee.getDeptId()).date(item.getDate()) |
| | | .clockInTime(item.getClockInTime()).clockOutTime(item.getClockOutTime()) |
| | | .clockInType(item.getClockInType()).clockOutType(item.getClockOutType()) |
| | | .location(item.getLocation()).remark(item.getRemark()) |
| | | .dataSource(2).build(); |
| | | attendanceRecordService.createImportedRecord(record); |
| | | } else if (Boolean.TRUE.equals(importReqVO.getUpdateSupport())) { |
| | | record.setClockInTime(item.getClockInTime()); |
| | | record.setClockOutTime(item.getClockOutTime()); |
| | | record.setClockInType(item.getClockInType()); |
| | | record.setClockOutType(item.getClockOutType()); |
| | | record.setLocation(item.getLocation()); |
| | | record.setRemark(item.getRemark()); |
| | | attendanceRecordService.updateImportedRecord(record); |
| | | } |
| | | successCount++; |
| | | } |
| | | StringBuilder msg = new StringBuilder("æå导å
¥ " + successCount + " æ¡"); |
| | | if (!missingNames.isEmpty()) { |
| | | msg.append("ï¼ä»¥ä¸åå·¥ä¸åå¨ï¼æªè½å¯¼å
¥ï¼").append(String.join("ã", missingNames)); |
| | | } |
| | | if (!duplicateNames.isEmpty()) { |
| | | msg.append("ï¼ä»¥ä¸åå·¥åå¨å¤ååååå·¥ï¼éè¡¥å
ææºå·åºåï¼æªè½å¯¼å
¥ï¼").append(String.join("ã", duplicateNames)); |
| | | } |
| | | if (!invalidRows.isEmpty()) { |
| | | msg.append("ï¼ä»¥ä¸è®°å½æ°æ®ä¸å®æ´ï¼æªè½å¯¼å
¥ï¼").append(String.join("ã", invalidRows)); |
| | | } |
| | | return success(msg.toString()); |
| | | } |
| | | |
| | | @GetMapping("/export-excel") |
| | | @Operation(summary = "导åºèå¤è®°å½ Excel") |
| | | @PreAuthorize("@ss.hasPermission('hrm:attendance:export')") |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * èå¤è®°å½ Excel 导å
¥æ¨¡æ¿ VO |
| | | */ |
| | | @Data |
| | | @Builder |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | public class HrmAttendanceRecordImportExcelVO { |
| | | |
| | | @ExcelProperty("åå·¥å§å") |
| | | private String userName; |
| | | |
| | | @ExcelProperty("ææºå·") |
| | | private String phone; |
| | | |
| | | @ExcelProperty("è夿¥æ") |
| | | private LocalDate date; |
| | | |
| | | @ExcelProperty("ä¸çæå¡æ¶é´") |
| | | private LocalDateTime clockInTime; |
| | | |
| | | @ExcelProperty("ä¸çæå¡æ¶é´") |
| | | private LocalDateTime clockOutTime; |
| | | |
| | | @ExcelProperty(value = "ä¸çæå¡ç±»å", converter = DictConvert.class) |
| | | @DictFormat("hrm_clock_type") |
| | | private Integer clockInType; |
| | | |
| | | @ExcelProperty(value = "ä¸çæå¡ç±»å", converter = DictConvert.class) |
| | | @DictFormat("hrm_clock_type") |
| | | private Integer clockOutType; |
| | | |
| | | @ExcelProperty("æå¡å°ç¹") |
| | | private String location; |
| | | |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import lombok.Data; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | @Schema(description = "管çåå° - èå¤è®°å½å¯¼å
¥ Request VO") |
| | | @Data |
| | | public class HrmAttendanceRecordImportReqVO { |
| | | |
| | | @Schema(description = "Excel æä»¶", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | @NotNull(message = "Excel æä»¶ä¸è½ä¸ºç©º") |
| | | private MultipartFile file; |
| | | |
| | | @Schema(description = "æ¯å¦è¦çå·²åå¨çæ°æ®") |
| | | private Boolean updateSupport = false; |
| | | } |
| | |
| | | @ExcelProperty("é¨é¨åç§°") |
| | | private String deptName; |
| | | |
| | | @Schema(description = "ææºå·") |
| | | @ExcelProperty("ææºå·") |
| | | private String phone; |
| | | |
| | | @Schema(description = "è夿¥æ") |
| | | @ExcelProperty("è夿¥æ") |
| | | private LocalDate date; |
| | |
| | | return selectOne(HrmEmployeeDO::getPhone, phone); |
| | | } |
| | | |
| | | default HrmEmployeeDO selectByName(String name) { |
| | | return selectOne(HrmEmployeeDO::getName, name); |
| | | } |
| | | |
| | | default List<HrmEmployeeDO> selectListByName(String name) { |
| | | return selectList(HrmEmployeeDO::getName, name); |
| | | } |
| | | |
| | | default HrmEmployeeDO selectByEmployeeNo(String employeeNo) { |
| | | return selectOne(HrmEmployeeDO::getEmployeeNo, employeeNo); |
| | | } |
| | |
| | | */ |
| | | HrmAttendanceRecordDO getAttendanceRecordByUserIdAndDate(Long userId, LocalDate date); |
| | | |
| | | /** å建导å
¥çèå¤è®°å½ */ |
| | | void createImportedRecord(HrmAttendanceRecordDO record); |
| | | |
| | | /** æ´æ°å¯¼å
¥çèå¤è®°å½ */ |
| | | void updateImportedRecord(HrmAttendanceRecordDO record); |
| | | |
| | | /** |
| | | * æå¡ï¼ä¸çæå¡ï¼ |
| | | * |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void createImportedRecord(HrmAttendanceRecordDO record) { |
| | | // æèå¤è§åéç®æå¡ç±»å䏿¶é¿ï¼ä¸ä¿¡ä»» Excel å¡«åçå¼ |
| | | fillClockTypes(record); |
| | | fillCalculatedHours(record); |
| | | attendanceRecordMapper.insert(record); |
| | | } |
| | | |
| | | @Override |
| | | public void updateImportedRecord(HrmAttendanceRecordDO record) { |
| | | fillClockTypes(record); |
| | | fillCalculatedHours(record); |
| | | attendanceRecordMapper.updateById(record); |
| | | } |
| | | |
| | | /** |
| | | * æèå¤è§åéç®ä¸ä¸çæå¡ç±»åï¼æ£å¸¸/è¿å°/æ©éï¼ï¼ä¸æå¡é»è¾ä¿æä¸è´ |
| | | */ |
| | | private void fillClockTypes(HrmAttendanceRecordDO record) { |
| | | if (record.getDeptId() == null) { |
| | | return; |
| | | } |
| | | HrmAttendanceRuleDO rule = attendanceRuleService.getAttendanceRuleByDeptId(record.getDeptId()); |
| | | if (rule == null) { |
| | | return; |
| | | } |
| | | // ä¸çæå¡ç±»åï¼æäº ä¸çæ¶é´+è¿å°å
许 记为è¿å° |
| | | if (record.getClockInTime() != null && rule.getWorkStartTime() != null) { |
| | | int lateAllowMinutes = rule.getLateAllowMinutes() != null ? rule.getLateAllowMinutes() : 0; |
| | | LocalTime lateThreshold = rule.getWorkStartTime().plusMinutes(lateAllowMinutes); |
| | | LocalTime clockInOnly = record.getClockInTime().toLocalTime(); |
| | | record.setClockInType(clockInOnly.isAfter(lateThreshold) |
| | | ? HrmAttendanceClockTypeEnum.LATE.getType() |
| | | : HrmAttendanceClockTypeEnum.NORMAL.getType()); |
| | | } |
| | | // ä¸çæå¡ç±»åï¼æ©äº ä¸çæ¶é´-æ©éå
许 记为æ©é |
| | | if (record.getClockOutTime() != null && rule.getWorkEndTime() != null) { |
| | | int earlyAllowMinutes = rule.getEarlyAllowMinutes() != null ? rule.getEarlyAllowMinutes() : 0; |
| | | LocalTime earlyThreshold = rule.getWorkEndTime().minusMinutes(earlyAllowMinutes); |
| | | LocalTime clockOutOnly = record.getClockOutTime().toLocalTime(); |
| | | record.setClockOutType(clockOutOnly.isBefore(earlyThreshold) |
| | | ? HrmAttendanceClockTypeEnum.EARLY.getType() |
| | | : HrmAttendanceClockTypeEnum.NORMAL.getType()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ä¸ä¸çæå¡æ¶é´åèå¤è§åï¼è®¡ç®å·¥ä½æ¶é¿ä¸å çæ¶é¿ |
| | | */ |
| | | private void fillCalculatedHours(HrmAttendanceRecordDO record) { |
| | | // 工使¶é¿ = ä¸çæå¡æ¶é´ - ä¸çæå¡æ¶é´ï¼ä¸æå¡é»è¾ä¸è´ï¼ |
| | | if (record.getClockInTime() != null && record.getClockOutTime() != null) { |
| | | Duration duration = Duration.between(record.getClockInTime(), record.getClockOutTime()); |
| | | BigDecimal workHours = BigDecimal.valueOf(duration.toMinutes()) |
| | | .divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP); |
| | | record.setWorkHours(workHours); |
| | | } |
| | | // å çæ¶é¿ï¼æèå¤è§åçæ åä¸çæ¶é´è®¡ç®è¶
é¢é¨å |
| | | if (record.getClockOutTime() != null && record.getDeptId() != null) { |
| | | HrmAttendanceRuleDO rule = attendanceRuleService.getAttendanceRuleByDeptId(record.getDeptId()); |
| | | if (rule != null && rule.getWorkEndTime() != null) { |
| | | LocalTime workEnd = rule.getWorkEndTime(); |
| | | LocalDate outDate = record.getClockOutTime().toLocalDate(); |
| | | LocalDateTime workEndDateTime = LocalDateTime.of(outDate, workEnd); |
| | | if (record.getClockOutTime().isAfter(workEndDateTime)) { |
| | | Duration overtimeDuration = Duration.between(workEndDateTime, record.getClockOutTime()); |
| | | BigDecimal overtimeThreshold = rule.getOvertimeThreshold() != null |
| | | ? rule.getOvertimeThreshold() : BigDecimal.ZERO; |
| | | BigDecimal overtimeHours = BigDecimal.valueOf(overtimeDuration.toMinutes()) |
| | | .divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP); |
| | | record.setOvertimeHours(overtimeHours.compareTo(overtimeThreshold) > 0 ? overtimeHours : BigDecimal.ZERO); |
| | | } else { |
| | | record.setOvertimeHours(BigDecimal.ZERO); |
| | | } |
| | | } else { |
| | | record.setOvertimeHours(BigDecimal.ZERO); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public HrmAttendanceRecordDO clockIn(Long userId, LocalDateTime clockTime, String location) { |
| | | LocalDate clockDate = clockTime.toLocalDate(); |
| | |
| | | */ |
| | | HrmEmployeeDO getEmployeeByUserId(Long userId); |
| | | |
| | | /** æ ¹æ®åå·¥å§åè·ååå·¥ */ |
| | | HrmEmployeeDO getEmployeeByName(String name); |
| | | |
| | | /** æ ¹æ®åå·¥å§åè·åææåååå·¥ */ |
| | | List<HrmEmployeeDO> getEmployeeListByName(String name); |
| | | |
| | | /** |
| | | * 导å
¥åå·¥å表 |
| | | * |
| | |
| | | } |
| | | |
| | | @Override |
| | | public HrmEmployeeDO getEmployeeByName(String name) { |
| | | return employeeMapper.selectByName(name); |
| | | } |
| | | |
| | | @Override |
| | | public List<HrmEmployeeDO> getEmployeeListByName(String name) { |
| | | return employeeMapper.selectListByName(name); |
| | | } |
| | | |
| | | @Override |
| | | public HrmEmployeeImportRespVO importEmployeeList(List<HrmEmployeeImportExcelVO> importEmployees, |
| | | HrmEmployeeImportReqVO importReqVO) { |
| | | // 1. æ ¡éªé空 |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; |
| | |
| | | import cn.iocoder.yudao.module.mes.api.wm.warehouse.dto.MesWmWarehouseRespDTO; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.Parameters; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | @GetMapping("/get-import-template") |
| | | @Operation(summary = "è·å¾å¯¼å
¥ç©ææ¨¡æ¿") |
| | | public void importTemplate(HttpServletResponse response) throws IOException { |
| | | List<MdmItemImportExcelVO> list = Arrays.asList( |
| | | MdmItemImportExcelVO.builder().code("ITEM001").name("示ä¾ç©æ").specification("è§æ ¼").status(0).isBatchManaged(false).build() |
| | | ); |
| | | ExcelUtils.write(response, "ç©æå¯¼å
¥æ¨¡æ¿.xls", "ç©æ", MdmItemImportExcelVO.class, list); |
| | | } |
| | | |
| | | @PostMapping("/import") |
| | | @Operation(summary = "导å
¥ç©æ") |
| | | @Parameters({ |
| | | @Parameter(name = "file", description = "Excel æä»¶", required = true), |
| | | @Parameter(name = "updateSupport", description = "æ¯å¦æ¯ææ´æ°ï¼é»è®¤ä¸º false", example = "true") |
| | | }) |
| | | @PreAuthorize("@ss.hasPermission('mdm:item:import')") |
| | | public CommonResult<MdmItemImportRespVO> importExcel(@RequestParam("file") MultipartFile file, |
| | | @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { |
| | | List<MdmItemImportExcelVO> list = ExcelUtils.read(file, MdmItemImportExcelVO.class); |
| | | return success(itemService.importItemList(list, updateSupport)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.item.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * MDM ç©æå¯¼å
¥ Excel VO |
| | | */ |
| | | @Data |
| | | @Builder |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | public class MdmItemImportExcelVO { |
| | | |
| | | @ExcelProperty("ç©æç¼ç ") |
| | | private String code; |
| | | |
| | | @ExcelProperty("ç©æåç§°") |
| | | private String name; |
| | | |
| | | @ExcelProperty("æ¡ç ") |
| | | private String barCode; |
| | | |
| | | @ExcelProperty("è§æ ¼åå·") |
| | | private String specification; |
| | | |
| | | @ExcelProperty("ç©æåç±»ç¼ç ") |
| | | private String categoryCode; |
| | | |
| | | @ExcelProperty("计éåä½ç¼ç ") |
| | | private String unitMeasureCode; |
| | | |
| | | @ExcelProperty("è¾
åä½1ç¼ç ") |
| | | private String unitMeasureCode2; |
| | | |
| | | @ExcelProperty("è¾
åä½1æ¢ç®æ¯ç") |
| | | private BigDecimal unitMeasureRate1; |
| | | |
| | | @ExcelProperty("è¾
åä½2ç¼ç ") |
| | | private String unitMeasureCode3; |
| | | |
| | | @ExcelProperty("è¾
åä½2æ¢ç®æ¯ç") |
| | | private BigDecimal unitMeasureRate2; |
| | | |
| | | @ExcelProperty("é»è®¤ä»åºç¼ç ") |
| | | private String warehouseCode; |
| | | |
| | | @ExcelProperty("éè´ä»·") |
| | | private BigDecimal purchasePrice; |
| | | |
| | | @ExcelProperty("éå®ä»·") |
| | | private BigDecimal salesPrice; |
| | | |
| | | @ExcelProperty("ææ¬ä»·") |
| | | private BigDecimal costPrice; |
| | | |
| | | @ExcelProperty("å®å
¨åºå") |
| | | private BigDecimal safetyStock; |
| | | |
| | | @ExcelProperty("æä½åºå") |
| | | private BigDecimal minStock; |
| | | |
| | | @ExcelProperty("æé«åºå") |
| | | private BigDecimal maxStock; |
| | | |
| | | @ExcelProperty("æ¯å¦æ¹æ¬¡ç®¡ç") |
| | | private Boolean isBatchManaged; |
| | | |
| | | @ExcelProperty("ä¿è´¨æ(天)") |
| | | private Integer expiryDay; |
| | | |
| | | @ExcelProperty("ç¶æ") |
| | | private Integer status; |
| | | |
| | | @ExcelProperty("æ¯å¦åæ¥å°MES") |
| | | private Boolean syncMes; |
| | | |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.item.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Schema(description = "管çåå° - MDM ç©æå¯¼å
¥ Response VO") |
| | | @Data |
| | | @Builder |
| | | public class MdmItemImportRespVO { |
| | | |
| | | @Schema(description = "å建æåçç©ææ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private List<String> createList; |
| | | |
| | | @Schema(description = "æ´æ°æåçç©ææ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private List<String> updateList; |
| | | |
| | | @Schema(description = "导å
¥å¤±è´¥çç©æéå key ä¸ºç©æåï¼value 为失败åå ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private Map<String, String> failureList; |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportExcelVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.Parameters; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | |
| | | return success(unitMeasureService.getUnitMeasureList(ids)); |
| | | } |
| | | |
| | | @GetMapping("/get-import-template") |
| | | @Operation(summary = "è·å¾å¯¼å
¥è®¡éå使¨¡æ¿") |
| | | public void importTemplate(HttpServletResponse response) throws IOException { |
| | | List<MdmUnitMeasureImportExcelVO> list = Arrays.asList( |
| | | MdmUnitMeasureImportExcelVO.builder().code("PC").name("ç").primaryFlag(true).changeRate(new java.math.BigDecimal("1")).status(0).remark("示ä¾ï¼ä¸»åä½").build(), |
| | | MdmUnitMeasureImportExcelVO.builder().code("XIA").name("ç®±").primaryFlag(false).primaryCode("PC").changeRate(new java.math.BigDecimal("100")).status(0).remark("示ä¾ï¼1ç®±=100ç").build() |
| | | ); |
| | | ExcelUtils.write(response, "计éåä½å¯¼å
¥æ¨¡æ¿.xls", "计éåä½", MdmUnitMeasureImportExcelVO.class, list); |
| | | } |
| | | |
| | | @PostMapping("/import") |
| | | @Operation(summary = "导å
¥è®¡éåä½") |
| | | @Parameters({ |
| | | @Parameter(name = "file", description = "Excel æä»¶", required = true), |
| | | @Parameter(name = "updateSupport", description = "æ¯å¦æ¯ææ´æ°ï¼é»è®¤ä¸º false", example = "true") |
| | | }) |
| | | @PreAuthorize("@ss.hasPermission('mdm:unit-measure:import')") |
| | | public CommonResult<MdmUnitMeasureImportRespVO> importExcel(@RequestParam("file") MultipartFile file, |
| | | @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { |
| | | List<MdmUnitMeasureImportExcelVO> list = ExcelUtils.read(file, MdmUnitMeasureImportExcelVO.class); |
| | | return success(unitMeasureService.importUnitMeasureList(list, updateSupport)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.unit.vo; |
| | | |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; |
| | | import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; |
| | | import cn.iocoder.yudao.module.system.enums.DictTypeConstants; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * MDM 计éåä½å¯¼å
¥ Excel VO |
| | | */ |
| | | @Data |
| | | @Builder |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | public class MdmUnitMeasureImportExcelVO { |
| | | |
| | | @ExcelProperty("åä½ç¼ç ") |
| | | private String code; |
| | | |
| | | @ExcelProperty("åä½åç§°") |
| | | private String name; |
| | | |
| | | @ExcelProperty("æ¯å¦ä¸»åä½") |
| | | private Boolean primaryFlag; |
| | | |
| | | @ExcelProperty("主åä½ç¼ç ") |
| | | private String primaryCode; |
| | | |
| | | @ExcelProperty("ä¸ä¸»å使¢ç®æ¯ä¾") |
| | | private BigDecimal changeRate; |
| | | |
| | | @ExcelProperty(value = "ç¶æ", converter = DictConvert.class) |
| | | @DictFormat(DictTypeConstants.COMMON_STATUS) |
| | | private Integer status; |
| | | |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mdm.controller.admin.unit.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Schema(description = "管çåå° - MDM 计éåä½å¯¼å
¥ Response VO") |
| | | @Data |
| | | @Builder |
| | | public class MdmUnitMeasureImportRespVO { |
| | | |
| | | @Schema(description = "å建æåçå使°ç»", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private List<String> createList; |
| | | |
| | | @Schema(description = "æ´æ°æåçå使°ç»", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private List<String> updateList; |
| | | |
| | | @Schema(description = "导å
¥å¤±è´¥çåä½éå key 为åä½åï¼value 为失败åå ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private Map<String, String> failureList; |
| | | |
| | | } |
| | |
| | | ErrorCode MDM_ITEM_SKU_IS_DISABLE = new ErrorCode(1_050_005, "ç©æSKUå·²ç¦ç¨"); |
| | | ErrorCode MDM_ITEM_SKU_CODE_DUPLICATE = new ErrorCode(1_050_006, "SKUç¼ç å·²åå¨"); |
| | | ErrorCode MDM_ITEM_EXISTS_REFERENCE = new ErrorCode(1_050_007, "ç©æå·²è¢«ä¸å¡å¼ç¨ï¼æ æ³å é¤"); |
| | | ErrorCode MDM_ITEM_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_050_008, "导å
¥çç©ææ°æ®ä¸è½ä¸ºç©º"); |
| | | |
| | | // ========== ç©æåç±»ç¸å
³ 1-050-051 ~ 1-050-100 ========== |
| | | ErrorCode MDM_ITEM_CATEGORY_NOT_EXISTS = new ErrorCode(1_050_051, "ç©æåç±»ä¸åå¨"); |
| | |
| | | ErrorCode MDM_UNIT_MEASURE_CODE_DUPLICATE = new ErrorCode(1_050_102, "计éåä½ç¼ç å·²åå¨"); |
| | | ErrorCode MDM_UNIT_MEASURE_NAME_DUPLICATE = new ErrorCode(1_050_103, "计éåä½åç§°å·²åå¨"); |
| | | ErrorCode MDM_UNIT_MEASURE_EXISTS_ITEM = new ErrorCode(1_050_104, "计éåä½è¢«ç©æä½¿ç¨ï¼æ æ³å é¤"); |
| | | ErrorCode MDM_UNIT_MEASURE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_050_105, "导å
¥ç计éå使°æ®ä¸è½ä¸ºç©º"); |
| | | |
| | | // ========== åçç¸å
³ 1-050-151 ~ 1-050-200 ========== |
| | | ErrorCode MDM_BRAND_NOT_EXISTS = new ErrorCode(1_050_151, "åçä¸åå¨"); |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.item; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | |
| | | */ |
| | | List<MdmItemDO> getItemSimpleList(); |
| | | |
| | | /** |
| | | * 导å
¥ç©æ |
| | | * |
| | | * @param importList 导å
¥å表 |
| | | * @param isUpdateSupport æ¯å¦æ¯ææ´æ° |
| | | * @return 导å
¥ç»æ |
| | | */ |
| | | MdmItemImportRespVO importItemList(List<MdmItemImportExcelVO> importList, Boolean isUpdateSupport); |
| | | |
| | | } |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportExcelVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemImportRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemPageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.item.vo.MdmItemSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.category.MdmItemCategoryDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemBatchConfigDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.item.MdmItemDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.category.MdmItemCategoryMapper; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemBatchConfigMapper; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.item.MdmItemMapper; |
| | | import cn.iocoder.yudao.module.mdm.dal.mysql.unit.MdmUnitMeasureMapper; |
| | | import cn.iocoder.yudao.module.mdm.service.brand.MdmBrandService; |
| | | import cn.iocoder.yudao.module.mdm.service.category.MdmItemCategoryService; |
| | | import cn.iocoder.yudao.module.mdm.service.unit.MdmUnitMeasureService; |
| | |
| | | private MesMdItemApi mesMdItemApi; |
| | | @Resource |
| | | private MdmItemBatchConfigMapper itemBatchConfigMapper; |
| | | |
| | | @Resource |
| | | private MdmItemCategoryMapper itemCategoryMapper; |
| | | |
| | | @Resource |
| | | private MdmUnitMeasureMapper unitMeasureMapper; |
| | | |
| | | @Resource |
| | | private MesMdItemTypeApi mesMdItemTypeApi; |
| | |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public MdmItemImportRespVO importItemList(List<MdmItemImportExcelVO> importList, Boolean isUpdateSupport) { |
| | | if (CollUtil.isEmpty(importList)) { |
| | | throw exception(MDM_ITEM_IMPORT_LIST_IS_EMPTY); |
| | | } |
| | | MdmItemImportRespVO respVO = MdmItemImportRespVO.builder() |
| | | .createList(new ArrayList<>()).updateList(new ArrayList<>()) |
| | | .failureList(new LinkedHashMap<>()).build(); |
| | | |
| | | // 1. é¢çï¼åç±»ç¼ç -> IDãåä½ç¼ç -> ID |
| | | Map<String, Long> categoryCodeIdMap = new HashMap<>(); |
| | | for (MdmItemCategoryDO category : itemCategoryMapper.selectList()) { |
| | | if (category.getCode() != null) { |
| | | categoryCodeIdMap.put(category.getCode(), category.getId()); |
| | | } |
| | | } |
| | | Map<String, Long> unitCodeIdMap = new HashMap<>(); |
| | | for (MdmUnitMeasureDO unit : unitMeasureMapper.selectList()) { |
| | | unitCodeIdMap.put(unit.getCode(), unit.getId()); |
| | | } |
| | | |
| | | // 2. éå导å
¥ |
| | | for (MdmItemImportExcelVO importVO : importList) { |
| | | // 2.1 åºç¡æ ¡éª |
| | | if (StrUtil.isBlank(importVO.getCode()) || StrUtil.isBlank(importVO.getName())) { |
| | | respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "ç©æç¼ç åç©æåç§°ä¸è½ä¸ºç©º"); |
| | | continue; |
| | | } |
| | | // 2.2 è§£æåç±» |
| | | Long categoryId = null; |
| | | if (StrUtil.isNotBlank(importVO.getCategoryCode())) { |
| | | categoryId = categoryCodeIdMap.get(importVO.getCategoryCode()); |
| | | if (categoryId == null) { |
| | | respVO.getFailureList().put(importVO.getName(), "ç©æåç±»ç¼ç ä¸åå¨ï¼" + importVO.getCategoryCode()); |
| | | continue; |
| | | } |
| | | } |
| | | // 2.3 è§£æä¸»åä½ |
| | | Long unitMeasureId = null; |
| | | if (StrUtil.isNotBlank(importVO.getUnitMeasureCode())) { |
| | | unitMeasureId = unitCodeIdMap.get(importVO.getUnitMeasureCode()); |
| | | if (unitMeasureId == null) { |
| | | respVO.getFailureList().put(importVO.getName(), "计éåä½ç¼ç ä¸åå¨ï¼" + importVO.getUnitMeasureCode()); |
| | | continue; |
| | | } |
| | | } |
| | | // 2.4 è§£æè¾
åä½1 |
| | | Long unitMeasureId2 = null; |
| | | if (StrUtil.isNotBlank(importVO.getUnitMeasureCode2())) { |
| | | unitMeasureId2 = unitCodeIdMap.get(importVO.getUnitMeasureCode2()); |
| | | if (unitMeasureId2 == null) { |
| | | respVO.getFailureList().put(importVO.getName(), "è¾
åä½1ç¼ç ä¸åå¨ï¼" + importVO.getUnitMeasureCode2()); |
| | | continue; |
| | | } |
| | | } |
| | | // 2.5 è§£æè¾
åä½2 |
| | | Long unitMeasureId3 = null; |
| | | if (StrUtil.isNotBlank(importVO.getUnitMeasureCode3())) { |
| | | unitMeasureId3 = unitCodeIdMap.get(importVO.getUnitMeasureCode3()); |
| | | if (unitMeasureId3 == null) { |
| | | respVO.getFailureList().put(importVO.getName(), "è¾
åä½2ç¼ç ä¸åå¨ï¼" + importVO.getUnitMeasureCode3()); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | // 2.6 ç»è£
SaveReqVOï¼å¤ç¨ create/update é»è¾ï¼ |
| | | MdmItemSaveReqVO saveReqVO = new MdmItemSaveReqVO(); |
| | | saveReqVO.setCode(importVO.getCode()); |
| | | saveReqVO.setName(importVO.getName()); |
| | | saveReqVO.setBarCode(importVO.getBarCode()); |
| | | saveReqVO.setSpecification(importVO.getSpecification()); |
| | | saveReqVO.setCategoryId(categoryId); |
| | | saveReqVO.setUnitMeasureId(unitMeasureId); |
| | | saveReqVO.setUnitMeasureId2(unitMeasureId2); |
| | | saveReqVO.setUnitMeasureRate1(importVO.getUnitMeasureRate1()); |
| | | saveReqVO.setUnitMeasureId3(unitMeasureId3); |
| | | saveReqVO.setUnitMeasureRate2(importVO.getUnitMeasureRate2()); |
| | | saveReqVO.setPurchasePrice(importVO.getPurchasePrice()); |
| | | saveReqVO.setSalesPrice(importVO.getSalesPrice()); |
| | | saveReqVO.setCostPrice(importVO.getCostPrice()); |
| | | saveReqVO.setSafetyStock(importVO.getSafetyStock()); |
| | | saveReqVO.setMinStock(importVO.getMinStock()); |
| | | saveReqVO.setMaxStock(importVO.getMaxStock()); |
| | | saveReqVO.setIsBatchManaged(importVO.getIsBatchManaged()); |
| | | saveReqVO.setExpiryDay(importVO.getExpiryDay()); |
| | | saveReqVO.setStatus(importVO.getStatus() != null ? importVO.getStatus() : cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.ENABLE.getStatus()); |
| | | saveReqVO.setSyncMes(importVO.getSyncMes() != null ? importVO.getSyncMes() : false); |
| | | saveReqVO.setRemark(importVO.getRemark()); |
| | | saveReqVO.setItemType(1); // é»è®¤ç©æç±»åï¼ç©æ |
| | | |
| | | // 2.7 å·²åå¨ï¼æç¼ç å¤æï¼ |
| | | MdmItemDO existByCode = itemMapper.selectByCode(importVO.getCode()); |
| | | try { |
| | | if (existByCode != null) { |
| | | if (!Boolean.TRUE.equals(isUpdateSupport)) { |
| | | respVO.getFailureList().put(importVO.getName(), "ç©æç¼ç å·²åå¨"); |
| | | continue; |
| | | } |
| | | saveReqVO.setId(existByCode.getId()); |
| | | updateItem(saveReqVO); |
| | | respVO.getUpdateList().add(importVO.getName()); |
| | | } else { |
| | | createItem(saveReqVO); |
| | | respVO.getCreateList().add(importVO.getName()); |
| | | } |
| | | } catch (Exception ex) { |
| | | // åæ¡å¤±è´¥ï¼è®°å½å¹¶ç»§ç» |
| | | String reason = ex instanceof cn.iocoder.yudao.framework.common.exception.ServiceException |
| | | ? ((cn.iocoder.yudao.framework.common.exception.ServiceException) ex).getMessage() |
| | | : ex.getMessage(); |
| | | respVO.getFailureList().put(importVO.getName(), reason == null ? "导å
¥å¤±è´¥" : reason); |
| | | } |
| | | } |
| | | return respVO; |
| | | } |
| | | |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.mdm.service.unit; |
| | | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportExcelVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | |
| | | */ |
| | | MdmUnitMeasureDO getUnitMeasureByCode(String code); |
| | | |
| | | /** |
| | | * 导å
¥è®¡éåä½ |
| | | * |
| | | * @param importList 导å
¥å表 |
| | | * @param isUpdateSupport æ¯å¦æ¯ææ´æ° |
| | | * @return 导å
¥ç»æ |
| | | */ |
| | | MdmUnitMeasureImportRespVO importUnitMeasureList(List<MdmUnitMeasureImportExcelVO> importList, Boolean isUpdateSupport); |
| | | |
| | | } |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportExcelVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureImportRespVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasurePageReqVO; |
| | | import cn.iocoder.yudao.module.mdm.controller.admin.unit.vo.MdmUnitMeasureSaveReqVO; |
| | | import cn.iocoder.yudao.module.mdm.dal.dataobject.unit.MdmUnitMeasureDO; |
| | |
| | | return unitMeasureMapper.selectByCode(code); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public MdmUnitMeasureImportRespVO importUnitMeasureList(List<MdmUnitMeasureImportExcelVO> importList, Boolean isUpdateSupport) { |
| | | if (CollUtil.isEmpty(importList)) { |
| | | throw exception(MDM_UNIT_MEASURE_IMPORT_LIST_IS_EMPTY); |
| | | } |
| | | MdmUnitMeasureImportRespVO respVO = MdmUnitMeasureImportRespVO.builder() |
| | | .createList(new ArrayList<>()).updateList(new ArrayList<>()) |
| | | .failureList(new LinkedHashMap<>()).build(); |
| | | |
| | | // 1. 建ç«ç¼ç -> ID æ å°ï¼å
å è½½ç°æåä½ï¼åå å æ¬æ¬¡æ°å»ºçåä½ï¼ï¼ç¨äºè§£æ"主åä½ç¼ç "å |
| | | Map<String, Long> codeIdMap = new HashMap<>(); |
| | | for (MdmUnitMeasureDO unit : unitMeasureMapper.selectList()) { |
| | | codeIdMap.put(unit.getCode(), unit.getId()); |
| | | } |
| | | // è®°å½æ¬æ¬¡å¯¼å
¥å·²å¤çè¿çç¼ç ï¼é¿å
å䏿件å
åç»è¡æ¾ä¸å°å导å
¥ç主åä½ |
| | | Map<String, Long> importedCodeIdMap = new HashMap<>(); |
| | | |
| | | // 2. éå导å
¥ |
| | | for (MdmUnitMeasureImportExcelVO importVO : importList) { |
| | | // 2.1 åºç¡æ ¡éª |
| | | if (StrUtil.isBlank(importVO.getCode()) || StrUtil.isBlank(importVO.getName())) { |
| | | respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "åä½ç¼ç ååä½åç§°ä¸è½ä¸ºç©º"); |
| | | continue; |
| | | } |
| | | // 2.2 è§£æä¸»åä½ IDï¼é主å使¶å¿
填主åä½ç¼ç ï¼ |
| | | Long primaryId = null; |
| | | if (StrUtil.isNotBlank(importVO.getPrimaryCode())) { |
| | | primaryId = importedCodeIdMap.get(importVO.getPrimaryCode()) != null |
| | | ? importedCodeIdMap.get(importVO.getPrimaryCode()) |
| | | : codeIdMap.get(importVO.getPrimaryCode()); |
| | | if (primaryId == null) { |
| | | respVO.getFailureList().put(importVO.getName(), "主åä½ç¼ç ä¸åå¨ï¼" + importVO.getPrimaryCode()); |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | // 2.3 å·²åå¨ï¼æç¼ç å¤æï¼ |
| | | MdmUnitMeasureDO existByCode = unitMeasureMapper.selectByCode(importVO.getCode()); |
| | | if (existByCode != null) { |
| | | if (!Boolean.TRUE.equals(isUpdateSupport)) { |
| | | respVO.getFailureList().put(importVO.getName(), "åä½ç¼ç å·²åå¨"); |
| | | continue; |
| | | } |
| | | // æ¯ææ´æ°ï¼ä»¥ç¼ç ä¸ºåæ´æ° |
| | | MdmUnitMeasureDO updateObj = BeanUtils.toBean(importVO, MdmUnitMeasureDO.class); |
| | | updateObj.setId(existByCode.getId()); |
| | | updateObj.setPrimaryId(primaryId); |
| | | unitMeasureMapper.updateById(updateObj); |
| | | respVO.getUpdateList().add(importVO.getName()); |
| | | } else { |
| | | // 2.4 æ ¡éªåç§°å¯ä¸ï¼æ°å¢åºæ¯ï¼ |
| | | MdmUnitMeasureDO existByName = unitMeasureMapper.selectByName(importVO.getName()); |
| | | if (existByName != null) { |
| | | respVO.getFailureList().put(importVO.getName(), "åä½åç§°å·²åå¨"); |
| | | continue; |
| | | } |
| | | // 2.5 æ°å¢ |
| | | MdmUnitMeasureDO newObj = BeanUtils.toBean(importVO, MdmUnitMeasureDO.class); |
| | | newObj.setPrimaryId(primaryId); |
| | | unitMeasureMapper.insert(newObj); |
| | | respVO.getCreateList().add(importVO.getName()); |
| | | // è®°å½æ¬æ¬¡æ°å»ºçç¼ç ï¼ä¾åæä»¶åç»è¡å¼ç¨ |
| | | importedCodeIdMap.put(importVO.getCode(), newObj.getId()); |
| | | } |
| | | } |
| | | return respVO; |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportExcelVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeSaveReqVO; |
| | |
| | | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; |
| | | import io.swagger.v3.oas.annotations.Operation; |
| | | import io.swagger.v3.oas.annotations.Parameter; |
| | | import io.swagger.v3.oas.annotations.Parameters; |
| | | import io.swagger.v3.oas.annotations.tags.Tag; |
| | | import jakarta.annotation.Resource; |
| | | import jakarta.servlet.http.HttpServletResponse; |
| | | import jakarta.validation.Valid; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | |
| | | .setItemOrProduct(itemType.getItemOrProduct()))); |
| | | } |
| | | |
| | | @GetMapping("/get-import-template") |
| | | @Operation(summary = "è·å¾å¯¼å
¥ç©æäº§åå类模æ¿") |
| | | public void importTemplate(HttpServletResponse response) throws IOException { |
| | | List<MesMdItemTypeImportExcelVO> list = Arrays.asList( |
| | | MesMdItemTypeImportExcelVO.builder().code("RAW").name("åææ").itemOrProduct("ITEM").sort(1).status(0).remark("示ä¾ï¼é¡¶çº§åç±»").build(), |
| | | MesMdItemTypeImportExcelVO.builder().code("METAL").name("é屿æ").parentCode("RAW").itemOrProduct("ITEM").sort(1).status(0).remark("示ä¾ï¼ç¶åç±»ç¼ç 为 RAW").build() |
| | | ); |
| | | ExcelUtils.write(response, "ç©æå类导å
¥æ¨¡æ¿.xls", "ç©æåç±»", MesMdItemTypeImportExcelVO.class, list); |
| | | } |
| | | |
| | | @PostMapping("/import") |
| | | @Operation(summary = "导å
¥ç©æäº§ååç±»") |
| | | @Parameters({ |
| | | @Parameter(name = "file", description = "Excel æä»¶", required = true), |
| | | @Parameter(name = "updateSupport", description = "æ¯å¦æ¯ææ´æ°ï¼é»è®¤ä¸º false", example = "true") |
| | | }) |
| | | @PreAuthorize("@ss.hasPermission('mes:md-item-type:import')") |
| | | public CommonResult<MesMdItemTypeImportRespVO> importExcel(@RequestParam("file") MultipartFile file, |
| | | @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { |
| | | List<MesMdItemTypeImportExcelVO> list = ExcelUtils.read(file, MesMdItemTypeImportExcelVO.class); |
| | | return success(itemTypeService.importItemTypeList(list, updateSupport)); |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type; |
| | | |
| | | import cn.idev.excel.annotation.ExcelProperty; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | |
| | | /** |
| | | * MES ç©æäº§åå类导å
¥ Excel VO |
| | | */ |
| | | @Data |
| | | @Builder |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | public class MesMdItemTypeImportExcelVO { |
| | | |
| | | @ExcelProperty("åç±»ç¼ç ") |
| | | private String code; |
| | | |
| | | @ExcelProperty("åç±»åç§°") |
| | | private String name; |
| | | |
| | | @ExcelProperty("ç¶åç±»ç¼ç ") |
| | | private String parentCode; |
| | | |
| | | @ExcelProperty("ç©æ/äº§åæ è¯") |
| | | private String itemOrProduct; |
| | | |
| | | @ExcelProperty("æ¾ç¤ºæåº") |
| | | private Integer sort; |
| | | |
| | | @ExcelProperty("ç¶æ") |
| | | private Integer status; |
| | | |
| | | @ExcelProperty("夿³¨") |
| | | private String remark; |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | @Schema(description = "管çåå° - MES ç©æäº§åå类导å
¥ Response VO") |
| | | @Data |
| | | @Builder |
| | | public class MesMdItemTypeImportRespVO { |
| | | |
| | | @Schema(description = "å建æåçåç±»æ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private List<String> createList; |
| | | |
| | | @Schema(description = "æ´æ°æåçåç±»æ°ç»", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private List<String> updateList; |
| | | |
| | | @Schema(description = "导å
¥å¤±è´¥çåç±»éå key 为åç±»åï¼value 为失败åå ", requiredMode = Schema.RequiredMode.REQUIRED) |
| | | private Map<String, String> failureList; |
| | | |
| | | } |
| | |
| | | return success(returnVendorService.checkReturnVendorQuantity(id)); |
| | | } |
| | | |
| | | @PostMapping("/import-purchase-order-items") |
| | | @Operation(summary = "æ ¹æ®å
³èéè´è®¢å带å
¥ç©ææç»") |
| | | @Parameter(name = "id", description = "ç¼å·", required = true) |
| | | @PreAuthorize("@ss.hasPermission('mes:wm-return-vendor:update')") |
| | | public CommonResult<Integer> importPurchaseOrderItems(@RequestParam("id") Long id) { |
| | | return success(returnVendorService.importPurchaseOrderItems(id)); |
| | | } |
| | | |
| | | // ==================== æ¼æ¥ VO ==================== |
| | | |
| | | private List<MesWmReturnVendorRespVO> buildRespVOList(List<MesWmReturnVendorDO> list) { |
| | |
| | | .collect(java.util.stream.Collectors.toMap(SrmSupplierRespDTO::getId, s -> s)); |
| | | // 2. æå»ºç»æ |
| | | return BeanUtils.toBean(list, MesWmReturnVendorRespVO.class, vo -> |
| | | MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor -> |
| | | vo.setVendorName(vendor.getName()))); |
| | | MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor -> { |
| | | vo.setVendorName(vendor.getName()); |
| | | vo.setVendorCode(vendor.getCode()); |
| | | })); |
| | | } |
| | | |
| | | } |
| | |
| | | @Schema(description = "éè´§ååç§°", requiredMode = Schema.RequiredMode.REQUIRED, example = "ä¾åºåéè´§") |
| | | private String name; |
| | | |
| | | @Schema(description = "éè´è®¢åç¼å·", example = "1") |
| | | private Long purchaseOrderId; |
| | | |
| | | @Schema(description = "éè´è®¢åç¼å·", example = "PO20250226001") |
| | | private String purchaseOrderCode; |
| | | |
| | |
| | | @NotBlank(message = "éè´§ååç§°ä¸è½ä¸ºç©º") |
| | | private String name; |
| | | |
| | | @Schema(description = "éè´è®¢åç¼å·", example = "1") |
| | | private Long purchaseOrderId; |
| | | |
| | | @Schema(description = "éè´è®¢åç¼å·", example = "PO20250226001") |
| | | private String purchaseOrderCode; |
| | | |
| | |
| | | private String name; |
| | | /** |
| | | * éè´è®¢åç¼å· |
| | | * |
| | | * å
³è ERP éè´è®¢å {@link cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO#getId()} |
| | | */ |
| | | private Long purchaseOrderId; |
| | | /** |
| | | * éè´è®¢åç¼ç ï¼åä½å段ï¼ç¨äºæ¾ç¤ºï¼ |
| | | */ |
| | | private String purchaseOrderCode; |
| | | /** |
| | |
| | | ErrorCode MD_ITEM_TYPE_CODE_DUPLICATE = new ErrorCode(1_040_100_005, "åä¸ç¶åç±»ä¸å·²åå¨è¯¥ç¼ç çåç±»"); |
| | | ErrorCode MD_ITEM_TYPE_PARENT_IS_CHILD = new ErrorCode(1_040_100_006, "ä¸è½è®¾ç½®èªå·±çåå类为ç¶åç±»"); |
| | | ErrorCode MD_ITEM_TYPE_EXITS_ITEM = new ErrorCode(1_040_100_007, "该åç±»ä¸åå¨ç©æï¼æ æ³å é¤"); |
| | | ErrorCode MD_ITEM_TYPE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_100_008, "导å
¥çç©æåç±»æ°æ®ä¸è½ä¸ºç©º"); |
| | | |
| | | // ========== MES åºç¡æ°æ®-计éåä½ï¼1-040-101-000ï¼ ========== |
| | | ErrorCode MD_UNIT_MEASURE_NOT_EXISTS = new ErrorCode(1_040_101_000, "计éåä½ä¸åå¨"); |
| | |
| | | ErrorCode WM_RETURN_VENDOR_DETAIL_NOT_EXISTS = new ErrorCode(1_040_711_200, "ä¾åºåéè´§åæç»ä¸åå¨"); |
| | | ErrorCode WM_RETURN_VENDOR_DETAIL_QUANTITY_INVALID = new ErrorCode(1_040_711_201, "éè´§æç»æ°éå¿
é¡»å¤§äº 0"); |
| | | ErrorCode WM_RETURN_VENDOR_DETAIL_LINE_NOT_MATCH = new ErrorCode(1_040_711_202, "æ£è´§æç»ä¸å±äºæå®çä¾åºåéè´§å"); |
| | | ErrorCode WM_RETURN_VENDOR_PURCHASE_ORDER_REQUIRED = new ErrorCode(1_040_711_008, "请å
éæ©éè´è®¢å"); |
| | | ErrorCode WM_RETURN_VENDOR_PURCHASE_ORDER_NO_ITEM = new ErrorCode(1_040_711_009, "éè´è®¢åæ æç»æ°æ®ï¼æ æ³å¸¦å
¥ç©æ"); |
| | | |
| | | // ========== MES ä»åºç®¡ç-äº§åæ¶è´§åï¼1-040-712-000ï¼ ========== |
| | | ErrorCode WM_PRODUCT_RECPT_NOT_EXISTS = new ErrorCode(1_040_712_000, "äº§åæ¶è´§åä¸åå¨"); |
| | |
| | | package cn.iocoder.yudao.module.mes.service.md.item; |
| | | |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportExcelVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; |
| | |
| | | */ |
| | | List<MesMdItemTypeDO> getItemTypeChildrenList(Long parentId); |
| | | |
| | | /** |
| | | * 导å
¥ç©æäº§ååç±» |
| | | * |
| | | * @param importList 导å
¥å表 |
| | | * @param isUpdateSupport æ¯å¦æ¯ææ´æ° |
| | | * @return 导å
¥ç»æ |
| | | */ |
| | | MesMdItemTypeImportRespVO importItemTypeList(List<MesMdItemTypeImportExcelVO> importList, Boolean isUpdateSupport); |
| | | |
| | | } |
| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mdm.api.category.MdmItemCategoryApi; |
| | | import cn.iocoder.yudao.module.mdm.api.category.dto.MdmItemCategoryRespDTO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportExcelVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeImportRespVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeListReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.type.MesMdItemTypeSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; |
| | |
| | | return mesDO; |
| | | } |
| | | |
| | | @Override |
| | | @org.springframework.transaction.annotation.Transactional(rollbackFor = Exception.class) |
| | | public MesMdItemTypeImportRespVO importItemTypeList(List<MesMdItemTypeImportExcelVO> importList, Boolean isUpdateSupport) { |
| | | if (CollUtil.isEmpty(importList)) { |
| | | throw exception(MD_ITEM_TYPE_IMPORT_LIST_IS_EMPTY); |
| | | } |
| | | MesMdItemTypeImportRespVO respVO = MesMdItemTypeImportRespVO.builder() |
| | | .createList(new ArrayList<>()).updateList(new ArrayList<>()) |
| | | .failureList(new LinkedHashMap<>()).build(); |
| | | |
| | | // 1. 建ç«ç¼ç -> ID æ å°ï¼ç°æåç±» + æ¬æ¬¡æ°å»ºåç±»ï¼ï¼ç¨äºè§£æ"ç¶åç±»ç¼ç "å |
| | | Map<String, Long> codeIdMap = new HashMap<>(); |
| | | for (MesMdItemTypeDO itemType : itemTypeMapper.selectList()) { |
| | | codeIdMap.put(itemType.getCode(), itemType.getId()); |
| | | } |
| | | Map<String, Long> importedCodeIdMap = new HashMap<>(); |
| | | |
| | | // 2. éå导å
¥ |
| | | for (MesMdItemTypeImportExcelVO importVO : importList) { |
| | | // 2.1 åºç¡æ ¡éª |
| | | if (StrUtil.isBlank(importVO.getCode()) || StrUtil.isBlank(importVO.getName())) { |
| | | respVO.getFailureList().put(StrUtil.blankToDefault(importVO.getName(), importVO.getCode()), "åç±»ç¼ç ååç±»åç§°ä¸è½ä¸ºç©º"); |
| | | continue; |
| | | } |
| | | // 2.2 è§£æç¶åç±» ID |
| | | Long parentId = MesMdItemTypeDO.PARENT_ID_ROOT; |
| | | if (StrUtil.isNotBlank(importVO.getParentCode())) { |
| | | Long pid = importedCodeIdMap.get(importVO.getParentCode()) != null |
| | | ? importedCodeIdMap.get(importVO.getParentCode()) |
| | | : codeIdMap.get(importVO.getParentCode()); |
| | | if (pid == null) { |
| | | respVO.getFailureList().put(importVO.getName(), "ç¶åç±»ç¼ç ä¸åå¨ï¼" + importVO.getParentCode()); |
| | | continue; |
| | | } |
| | | parentId = pid; |
| | | } |
| | | |
| | | // 2.3 å·²åå¨ï¼æç¼ç å¤æï¼ |
| | | MesMdItemTypeDO existByCode = itemTypeMapper.selectByCode(importVO.getCode()); |
| | | if (existByCode != null) { |
| | | if (!Boolean.TRUE.equals(isUpdateSupport)) { |
| | | respVO.getFailureList().put(importVO.getName(), "åç±»ç¼ç å·²åå¨"); |
| | | continue; |
| | | } |
| | | MesMdItemTypeDO updateObj = BeanUtils.toBean(importVO, MesMdItemTypeDO.class); |
| | | updateObj.setId(existByCode.getId()); |
| | | updateObj.setParentId(parentId); |
| | | itemTypeMapper.updateById(updateObj); |
| | | respVO.getUpdateList().add(importVO.getName()); |
| | | } else { |
| | | // 2.4 æ ¡éªåä¸ç¶åç±»ä¸åç§°å¯ä¸ |
| | | MesMdItemTypeDO existByName = itemTypeMapper.selectByParentIdAndName(parentId, importVO.getName()); |
| | | if (existByName != null) { |
| | | respVO.getFailureList().put(importVO.getName(), "åä¸ç¶åç±»ä¸å·²åå¨è¯¥åç§°çåç±»"); |
| | | continue; |
| | | } |
| | | // 2.5 æ ¡éªåä¸ç¶åç±»ä¸ç¼ç å¯ä¸ |
| | | MesMdItemTypeDO existByParentCode = itemTypeMapper.selectByParentIdAndCode(parentId, importVO.getCode()); |
| | | if (existByParentCode != null) { |
| | | respVO.getFailureList().put(importVO.getName(), "åä¸ç¶åç±»ä¸å·²åå¨è¯¥ç¼ç çåç±»"); |
| | | continue; |
| | | } |
| | | // 2.6 æ°å¢ |
| | | MesMdItemTypeDO newObj = BeanUtils.toBean(importVO, MesMdItemTypeDO.class); |
| | | newObj.setParentId(parentId); |
| | | itemTypeMapper.insert(newObj); |
| | | respVO.getCreateList().add(importVO.getName()); |
| | | importedCodeIdMap.put(importVO.getCode(), newObj.getId()); |
| | | } |
| | | } |
| | | return respVO; |
| | | } |
| | | |
| | | } |
| | |
| | | Long getReturnVendorCountByVendorId(Long vendorId); |
| | | |
| | | /** |
| | | * æ ¹æ®å
³èçéè´è®¢åï¼å¸¦å
¥ç©ææç»å°éè´§åè¡ |
| | | * |
| | | * @param id éè´§åç¼å· |
| | | * @return 带å
¥çç©æè¡æ° |
| | | */ |
| | | int importPurchaseOrderItems(Long id); |
| | | |
| | | /** |
| | | * æ ¡éªä¾åºåéè´§ååå¨ä¸ä¸ºèç¨¿ç¶æ |
| | | * |
| | | * @param id ç¼å· |
| | |
| | | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorPageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.MesWmReturnVendorSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO; |
| | | import cn.iocoder.yudao.module.srm.api.supplier.SrmSupplierApi; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| | |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | |
| | | private SrmSupplierApi srmSupplierApi; |
| | | @Resource |
| | | private MesWmTransactionService wmTransactionService; |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createReturnVendor(MesWmReturnVendorSaveReqVO createReqVO) { |
| | | // 1. æ ¡éªæ°æ® |
| | | validateReturnVendorSaveData(createReqVO); |
| | | // 1.1. è¥éè´è®¢åå·ä¸ºç©ºä½å
³èäºéè´è®¢åï¼åä» ERP éè´è®¢åè¡¥é½è®¢åå· |
| | | fillPurchaseOrderCode(createReqVO); |
| | | |
| | | // 2. æå
¥ä¸»è¡¨ |
| | | MesWmReturnVendorDO returnVendor = BeanUtils.toBean(createReqVO, MesWmReturnVendorDO.class); |
| | |
| | | public void updateReturnVendor(MesWmReturnVendorSaveReqVO updateReqVO) { |
| | | // 1. æ ¡éªæ°æ® |
| | | validateReturnVendorSaveData(updateReqVO); |
| | | // 1.1. è¥éè´è®¢åå·ä¸ºç©ºä½å
³èäºéè´è®¢åï¼åä» ERP éè´è®¢åè¡¥é½è®¢åå· |
| | | fillPurchaseOrderCode(updateReqVO); |
| | | |
| | | // 2. æ´æ°ä¸»è¡¨ |
| | | MesWmReturnVendorDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnVendorDO.class); |
| | | returnVendorMapper.updateById(updateObj); |
| | | } |
| | | |
| | | /** |
| | | * å½éè´è®¢åå·ä¸ºç©ºãä½å
³èäºéè´è®¢åæ¶ï¼ä» ERP éè´è®¢åè¡¥é½éè´è®¢åå· |
| | | */ |
| | | private void fillPurchaseOrderCode(MesWmReturnVendorSaveReqVO reqVO) { |
| | | if (reqVO == null || reqVO.getPurchaseOrderId() == null) { |
| | | return; |
| | | } |
| | | if (cn.hutool.core.util.StrUtil.isNotBlank(reqVO.getPurchaseOrderCode())) { |
| | | return; |
| | | } |
| | | ErpPurchaseOrderRespDTO purchaseOrder = |
| | | purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData(); |
| | | if (purchaseOrder != null) { |
| | | reqVO.setPurchaseOrderCode(purchaseOrder.getNo()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | return returnVendorMapper.selectCountByVendorId(vendorId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int importPurchaseOrderItems(Long id) { |
| | | // 1. æ ¡éªéè´§ååå¨ä¸ä¸ºèç¨¿ç¶æ |
| | | MesWmReturnVendorDO returnVendor = validateReturnVendorExistsAndPrepare(id); |
| | | if (returnVendor.getPurchaseOrderId() == null) { |
| | | throw exception(WM_RETURN_VENDOR_PURCHASE_ORDER_REQUIRED); |
| | | } |
| | | |
| | | // 2. è·åéè´è®¢ååæç» |
| | | ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(returnVendor.getPurchaseOrderId()).getCheckedData(); |
| | | if (purchaseOrder == null) { |
| | | throw exception(WM_PURCHASE_ORDER_NOT_EXISTS); |
| | | } |
| | | List<ErpPurchaseOrderItemRespDTO> items = purchaseOrderApi.getPurchaseOrderItemList(returnVendor.getPurchaseOrderId()).getCheckedData(); |
| | | if (CollUtil.isEmpty(items)) { |
| | | throw exception(WM_RETURN_VENDOR_PURCHASE_ORDER_NO_ITEM); |
| | | } |
| | | |
| | | // 3. å·²åå¨çè¡ç©æéåï¼æç©æå»éï¼é¿å
éå¤å¸¦å
¥ï¼ |
| | | Set<Long> existsItemIds = new HashSet<>(); |
| | | List<MesWmReturnVendorLineDO> existingLines = returnVendorLineService.getReturnVendorLineListByReturnId(id); |
| | | if (CollUtil.isNotEmpty(existingLines)) { |
| | | existsItemIds.addAll(convertList(existingLines, MesWmReturnVendorLineDO::getItemId)); |
| | | } |
| | | |
| | | // 4. éåéè´è®¢åæç»ï¼çæéè´§è¡ï¼å¯éæ°é = å·²å
¥åº - å·²éè´§ï¼ |
| | | int importedCount = 0; |
| | | for (ErpPurchaseOrderItemRespDTO item : items) { |
| | | if (item.getProductId() == null || existsItemIds.contains(item.getProductId())) { |
| | | continue; |
| | | } |
| | | BigDecimal inCount = item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO; |
| | | BigDecimal returnCount = item.getReturnCount() != null ? item.getReturnCount() : BigDecimal.ZERO; |
| | | BigDecimal quantity = inCount.subtract(returnCount); |
| | | if (quantity.compareTo(BigDecimal.ZERO) <= 0) { |
| | | continue; |
| | | } |
| | | MesWmReturnVendorLineSaveReqVO lineReqVO = new MesWmReturnVendorLineSaveReqVO(); |
| | | lineReqVO.setReturnId(id); |
| | | lineReqVO.setItemId(item.getProductId()); |
| | | lineReqVO.setQuantity(quantity); |
| | | lineReqVO.setRemark(item.getRemark()); |
| | | returnVendorLineService.createReturnVendorLine(lineReqVO); |
| | | importedCount++; |
| | | } |
| | | return importedCount; |
| | | } |
| | | |
| | | } |
| | |
| | | @ToString(callSuper = true) |
| | | public class SrmSupplierCertificatePageReqVO extends PageParam { |
| | | |
| | | @Schema(description = "èµè´¨è¯ä¹¦åç§°", example = "è¥ä¸æ§ç
§") |
| | | private String certificateName; |
| | | |
| | | @Schema(description = "ä¾åºåID", example = "1") |
| | | private Long supplierId; |
| | | |
| | |
| | | |
| | | default PageResult<SrmSupplierCertificateDO> selectPage(SrmSupplierCertificatePageReqVO reqVO) { |
| | | return selectPage(reqVO, new LambdaQueryWrapperX<SrmSupplierCertificateDO>() |
| | | .likeIfPresent(SrmSupplierCertificateDO::getCertificateName, reqVO.getCertificateName()) |
| | | .eqIfPresent(SrmSupplierCertificateDO::getSupplierId, reqVO.getSupplierId()) |
| | | .eqIfPresent(SrmSupplierCertificateDO::getCertificateType, reqVO.getCertificateType()) |
| | | .orderByDesc(SrmSupplierCertificateDO::getId)); |