feat(aftersales): 售后退货单同步MES批次信息并优化工单处理流程
- 实现售后退货单批准后同步MES解析的批次信息回写到售后明细
- 新增MesWmReturnSalesLineRespDTO用于跨模块查询退货单行批次信息
- 优化售后工单创建逻辑,填处理人时自动设置为处理中状态
- 增加对已指派工单修改时的状态转换处理
- 添加handlerUserId字段到工单保存请求对象
- 修复考勤记录中员工关联验证错误提示
- 优化考勤状态查询接口返回未关联员工时的友好提示
- 修复YEAR_MONTH字段映射MySQL保留字问题
- 增加薪酬结构删除前引用检查防止误删
- 强化转正申请中申请人和员工关联验证
- 优化条码服务启用状态检查避免停用条码被使用
- 完善销售出库和退货批次自动生成功能
- 添加HRM菜单组件路径修复SQL脚本
- 添加条码配置初始化SQL脚本
| | |
| | | !sql/mysql/xgdl_aftersales_return_link_repair_20261024.sql |
| | | !sql/mysql/xgdl_aftersales_refund_confirm_20261024.sql |
| | | !sql/mysql/hrm_attendance_location_20261024.sql |
| | | !sql/mysql/hrm_menu_component_fix_20261024.sql |
| | | !sql/mysql/xgdl_enablement_menu_fix_20261024.sql |
| | | !sql/mysql/xgdl_barcode_config_seed_20261025.sql |
| | | *.md |
| | | !docs/xgdl-business-flow-alignment-20261024.md |
| | | *.xlsx |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ä¿®æ£ HRM èåç»ä»¶è·¯å¾ãä»
å¤çè¿ä¸ä¸ªå·²ç¡®è®¤çèåï¼ä¸æ¹å¨å
¶ä»ç§æ·å®å¶èåã |
| | | UPDATE system_menu |
| | | SET component = 'hrm/regularize/index' |
| | | WHERE id = 6007 AND path = 'regularize' |
| | | AND (component IS NULL OR component <> 'hrm/regularize/index'); |
| | | |
| | | UPDATE system_menu |
| | | SET component = 'hrm/salary/structure/index' |
| | | WHERE id = 1065710 AND path = 'salary-structure' |
| | | AND (component IS NULL OR component <> 'hrm/salary/structure/index'); |
| | | |
| | | UPDATE system_menu |
| | | SET component = 'hrm/salary/employee-salary/index' |
| | | WHERE id = 1065720 AND path = 'employee-salary' |
| | | AND (component IS NULL OR component <> 'hrm/salary/employee-salary/index'); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- æ°é«çµåæ¡ç é
ç½®ï¼ä»
è¡¥å½ååå
¸ä¸åå¨ãä¸å°æªé
ç½®çä¸å¡ç±»åã |
| | | -- 模æ¿åªä½¿ç¨æ¡ç çæå¨æ¯æç {BUSINESSCODE} å ä½ç¬¦ï¼ç»ä¸éç¨äºç»´ç ã |
| | | -- é夿§è¡ä¸ä¼è¦çå·²æææé
ç½®ï¼ä¹ä¸ä¼æ¢å¤é»è¾å é¤çæ§é
ç½®ã |
| | | |
| | | INSERT INTO mes_wm_barcode_config |
| | | (format, biz_type, content_format, content_example, auto_generate_flag, |
| | | status, remark, creator, updater, deleted) |
| | | SELECT 1, seed.biz_type, |
| | | CONCAT(seed.prefix, '-{BUSINESSCODE}'), |
| | | CONCAT(seed.prefix, '-DEMO001'), |
| | | b'1', 0, 'æ°é«çµåä¸å¡ç±»åé»è®¤æ¡ç é
ç½®', '1', '1', b'0' |
| | | FROM ( |
| | | SELECT 102 AS biz_type, 'WH' AS prefix UNION ALL |
| | | SELECT 103, 'LOC' UNION ALL |
| | | SELECT 104, 'AREA' UNION ALL |
| | | SELECT 105, 'PKG' UNION ALL |
| | | SELECT 106, 'STOCK' UNION ALL |
| | | SELECT 107, 'BATCH' UNION ALL |
| | | SELECT 109, 'SN' UNION ALL |
| | | SELECT 300, 'CARD' UNION ALL |
| | | SELECT 301, 'WO' UNION ALL |
| | | SELECT 302, 'TRANS' UNION ALL |
| | | SELECT 400, 'EQUIP' UNION ALL |
| | | SELECT 500, 'TOOL' UNION ALL |
| | | SELECT 600, 'ITEM' UNION ALL |
| | | SELECT 601, 'VENDOR' UNION ALL |
| | | SELECT 602, 'WS' UNION ALL |
| | | SELECT 603, 'WORKSHOP' UNION ALL |
| | | SELECT 604, 'USER' UNION ALL |
| | | SELECT 605, 'CLIENT' |
| | | ) seed |
| | | WHERE EXISTS ( |
| | | SELECT 1 FROM system_dict_data dict |
| | | WHERE dict.dict_type = 'mes_wm_barcode_biz_type' |
| | | AND CAST(dict.value AS UNSIGNED) = seed.biz_type |
| | | AND dict.status = 0 AND dict.deleted = b'0' |
| | | ) |
| | | AND NOT EXISTS ( |
| | | SELECT 1 FROM mes_wm_barcode_config config |
| | | WHERE config.biz_type = seed.biz_type AND config.deleted = b'0' |
| | | ); |
| | | |
| | | -- ä¸åæ§æ¨¡æ¿ä½¿ç¨æªå®ç°çå ä½ç¬¦ï¼ä¼è¢«æ¸²æä¸ºç©ºä¸²ï¼å¯¼è´åç»æ¡ç å
容éå¤ã |
| | | -- ä»
对å®å
¨å¹é
çé误模æ¿ä¿®æ£ï¼ä¿çç¨æ·èªè¡ç»´æ¤çå
¶å®æ¨¡æ¿ã |
| | | UPDATE mes_wm_barcode_config |
| | | SET content_format = 'WH-{BUSINESSCODE}', content_example = 'WH-WH001' |
| | | WHERE biz_type = 102 AND content_format = 'SN-{serialNo}' AND deleted = b'0'; |
| | | |
| | | UPDATE mes_wm_barcode_config |
| | | SET content_format = 'BATCH-{BUSINESSCODE}' |
| | | WHERE biz_type = 107 AND content_format = 'BATCH-{batchCode}' AND deleted = b'0'; |
| | | |
| | | UPDATE mes_wm_barcode_config |
| | | SET content_format = 'SN-{BUSINESSCODE}' |
| | | WHERE biz_type = 109 AND content_format = 'SN-{serialNo}' AND deleted = b'0'; |
| | | |
| | | UPDATE mes_wm_barcode_config |
| | | SET content_format = 'ITEM-{BUSINESSCODE}' |
| | | WHERE biz_type = 600 AND content_format = 'ITEM-{code}' AND deleted = b'0'; |
| | |
| | | @Schema(description = "严éç¨åº¦: 0-轻微 1-ä¸è¬ 2-严é 3-è´å½", example = "1") |
| | | private Integer severityLevel; |
| | | |
| | | @Schema(description = "å¤çäººç¨æ·ç¼å·", example = "1") |
| | | private Long handlerUserId; |
| | | |
| | | @Schema(description = "夿³¨", example = "客æ·è¦æ±å°½å¿«å¤ç") |
| | | private String remark; |
| | | |
| | |
| | | import cn.iocoder.yudao.module.aftersales.service.permission.bo.AfterSalePermissionCreateReqBO; |
| | | import cn.iocoder.yudao.module.mes.api.returnsales.MesWmReturnSalesApi; |
| | | import cn.iocoder.yudao.module.mes.api.returnsales.dto.MesWmReturnSalesCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.returnsales.dto.MesWmReturnSalesLineRespDTO; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | }).toList()); |
| | | Long mesReturnId = mesWmReturnSalesApi.createReturnSales(mesReqDTO); |
| | | |
| | | // 4. æ´æ°éè´§ç³è¯·ç¶æ |
| | | // 4. åå MES è§£æåçæ¹æ¬¡ï¼ååæªè®°å½æ¹æ¬¡çååç± MES èªå¨çæéè´§æ¹æ¬¡ï¼ |
| | | syncReturnItemBatch(id, mesReturnId); |
| | | |
| | | // 5. æ´æ°éè´§ç³è¯·ç¶æ |
| | | returnMapper.updateById(new AfterSaleReturnDO().setId(id) |
| | | .setStatus(AfterSaleReturnStatusEnum.APPROVED.getStatus()) |
| | | .setMesReturnId(mesReturnId) |
| | |
| | | .setAuditTime(LocalDateTime.now())); |
| | | } |
| | | |
| | | /** |
| | | * å° MES éè´§åè¡ä¸çæ¹æ¬¡ååå°å®åæç»ï¼ä¾¿äºé¡µé¢å±ç¤ºä¸è¿½æº¯ |
| | | */ |
| | | private void syncReturnItemBatch(Long returnId, Long mesReturnId) { |
| | | List<MesWmReturnSalesLineRespDTO> mesLines = mesWmReturnSalesApi.getReturnSalesLineList(mesReturnId); |
| | | if (CollUtil.isEmpty(mesLines)) { |
| | | return; |
| | | } |
| | | Map<Long, MesWmReturnSalesLineRespDTO> lineMap = mesLines.stream() |
| | | .filter(line -> line.getBatchId() != null) |
| | | .collect(Collectors.toMap(MesWmReturnSalesLineRespDTO::getItemId, line -> line, (a, b) -> a)); |
| | | if (lineMap.isEmpty()) { |
| | | return; |
| | | } |
| | | for (AfterSaleReturnItemDO item : returnItemMapper.selectListByReturnId(returnId)) { |
| | | MesWmReturnSalesLineRespDTO line = lineMap.get(item.getItemId()); |
| | | if (line == null || item.getBatchId() != null) { |
| | | continue; |
| | | } |
| | | returnItemMapper.updateById(new AfterSaleReturnItemDO().setId(item.getId()) |
| | | .setBatchId(line.getBatchId()).setBatchCode(line.getBatchCode())); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void cancelReturn(Long id) { |
| | |
| | | throw exception(TICKET_NO_EXISTS); |
| | | } |
| | | |
| | | // 2. æå
¥å·¥å |
| | | // 2. æå
¥å·¥åï¼å¡«äºå¤ç人å³è§ä¸ºå·²ææ´¾ï¼ç´æ¥è¿å
¥å¤çä¸ï¼ |
| | | AfterSaleTicketDO ticket = BeanUtils.toBean(createReqVO, AfterSaleTicketDO.class) |
| | | .setNo(no) |
| | | .setStatus(AfterSaleTicketStatusEnum.DRAFT.getStatus()) |
| | | .setStatus(createReqVO.getHandlerUserId() != null |
| | | ? AfterSaleTicketStatusEnum.PROCESSING.getStatus() |
| | | : AfterSaleTicketStatusEnum.DRAFT.getStatus()) |
| | | .setOwnerUserId(userId); |
| | | ticketMapper.insert(ticket); |
| | | |
| | |
| | | AfterSaleTicketDO ticket = validateTicketExists(updateReqVO.getId()); |
| | | validateTicketStatus(ticket, AfterSaleTicketStatusEnum.DRAFT); |
| | | |
| | | // 2. æ´æ°å·¥å |
| | | // 2. æ´æ°å·¥åï¼è稿åå¡«äºå¤ç人å³è§ä¸ºææ´¾ï¼è¿å
¥å¤çä¸ï¼ |
| | | AfterSaleTicketDO updateObj = BeanUtils.toBean(updateReqVO, AfterSaleTicketDO.class); |
| | | if (AfterSaleTicketStatusEnum.DRAFT.getStatus().equals(ticket.getStatus()) |
| | | && updateReqVO.getHandlerUserId() != null) { |
| | | updateObj.setStatus(AfterSaleTicketStatusEnum.PROCESSING.getStatus()); |
| | | } |
| | | ticketMapper.updateById(updateObj); |
| | | |
| | | // 3. æ´æ°æç»è¡ï¼å
å åå¢ï¼ |
| | |
| | | ErrorCode ATTENDANCE_LOCATION_ACCURACY_INVALID = new ErrorCode(1_030_004_053, "å®ä½ç²¾åº¦é¡»å¤§äº 0 ä¸ä¸è¶
è¿ 100 ç±³ï¼è¯·å°å¼éä½ç½®éè¯"); |
| | | ErrorCode ATTENDANCE_LOCATION_SYSTEM_INVALID = new ErrorCode(1_030_004_054, "æå¡åæ ç³»å¿
须为 WGS84"); |
| | | ErrorCode ATTENDANCE_LOCATION_OUT_OF_RANGE = new ErrorCode(1_030_004_055, "å½åä½ç½®è·â{}â{}ç±³ï¼è¶
è¿å
许èå´{}ç±³"); |
| | | ErrorCode ATTENDANCE_EMPLOYEE_LINK_REQUIRED = new ErrorCode(1_030_004_056, "å½åè´¦å·æªå
³èå工档æ¡ï¼è¯·è系管çåå¨å工管çä¸å®æå
³è"); |
| | | |
| | | // ========== 绩æèæ ¸ 1-030-008-000 ========== |
| | | ErrorCode PERFORMANCE_APPRAISE_NOT_EXISTS = new ErrorCode(1_030_008_000, "绩æèæ ¸æ¹æ¡ä¸åå¨"); |
| | |
| | | ErrorCode LEAVE_TYPE_CONFIG_EXISTS = new ErrorCode(1_030_005_032, "å·²åå¨è¯·åç±»åæ£æ¬¾é
ç½®ã{}ãï¼ä¸æªå¼å¯è¦çï¼"); |
| | | ErrorCode TAX_RATE_CONFIG_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_030_005_033, "导å
¥ä¸ªç¨ç¨çé
ç½®æ°æ®ä¸è½ä¸ºç©º"); |
| | | ErrorCode TAX_RATE_CONFIG_EXISTS = new ErrorCode(1_030_005_034, "å·²åå¨ä¸ªç¨ç¨çé
ç½®ã{}ãï¼ä¸æªå¼å¯è¦çï¼"); |
| | | ErrorCode SALARY_STRUCTURE_IN_USE = new ErrorCode(1_030_005_035, "该èªé
¬ç»æå·²æåå·¥èªé
¬æ¡£æ¡å¼ç¨ï¼ä¸è½å é¤"); |
| | | |
| | | // ========== 转æ£ç³è¯· 1-030-006-000 ========== |
| | | ErrorCode REGULARIZE_APPLICATION_NOT_EXISTS = new ErrorCode(1_030_006_000, "转æ£ç³è¯·ä¸åå¨"); |
| | |
| | | ErrorCode REGULARIZE_APPLICATION_EXISTS = new ErrorCode(1_030_006_005, "该å工已åå¨è½¬æ£ç³è¯·ï¼è¯·å¿éå¤æäº¤"); |
| | | ErrorCode REGULARIZE_APPLICATION_AUDIT_FAIL_NOT_PROCESS = new ErrorCode(1_030_006_006, "åªæå®¡æ¹ä¸ç¶æç转æ£ç³è¯·æè½å®¡æ ¸"); |
| | | ErrorCode REGULARIZE_APPLICATION_AUDIT_REJECT_REASON_REQUIRED = new ErrorCode(1_030_006_007, "å®¡æ ¸ä¸éè¿æ¶å¿
须填åä¸éè¿åå "); |
| | | ErrorCode REGULARIZE_APPLICANT_NOT_EXISTS = new ErrorCode(1_030_006_008, "转æ£ç³è¯·äººä¸åå¨ï¼è¯·éæ©ææçç³»ç»ç¨æ·"); |
| | | ErrorCode REGULARIZE_EMPLOYEE_LINK_REQUIRED = new ErrorCode(1_030_006_009, "ç³è¯·äººæªå
³èå工档æ¡ï¼è¯·å
å¨å工管çä¸å®æå
³è"); |
| | | |
| | | // ========== å¹è®ç®¡ç 1-030-009-000 ========== |
| | | ErrorCode TRAINING_NOT_EXISTS = new ErrorCode(1_030_009_000, "å¹è®æ´»å¨ä¸åå¨"); |
| | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| | | import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_NOT_EXISTS; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.ATTENDANCE_EMPLOYEE_LINK_REQUIRED; |
| | | |
| | | @Tag(name = "管çåå° - HRM èå¤è®°å½") |
| | | @RestController |
| | |
| | | Long loginUserId = getLoginUserId(); |
| | | HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId); |
| | | if (employee == null) { |
| | | throw exception(EMPLOYEE_NOT_EXISTS, |
| | | "å½åç»å½è´¦å·æªå
³èå工档æ¡ï¼æ æ³æå¡ã请è系管çåå¨ãå工管çãä¸å°è¯¥ç»å½è´¦å·ç»å®å°åå·¥ã"); |
| | | throw exception(ATTENDANCE_EMPLOYEE_LINK_REQUIRED); |
| | | } |
| | | HrmAttendanceClockResult result = attendanceRecordService.clockIn(employee.getId(), LocalDateTime.now(), reqVO, legacyLocation); |
| | | return success(buildClockResultVO(result, employee)); |
| | |
| | | Long loginUserId = getLoginUserId(); |
| | | HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId); |
| | | if (employee == null) { |
| | | throw exception(EMPLOYEE_NOT_EXISTS, |
| | | "å½åç»å½è´¦å·æªå
³èå工档æ¡ï¼æ æ³æå¡ã请è系管çåå¨ãå工管çãä¸å°è¯¥ç»å½è´¦å·ç»å®å°åå·¥ã"); |
| | | throw exception(ATTENDANCE_EMPLOYEE_LINK_REQUIRED); |
| | | } |
| | | HrmAttendanceClockResult result = attendanceRecordService.clockOut(employee.getId(), LocalDateTime.now(), reqVO, legacyLocation); |
| | | return success(buildClockResultVO(result, employee)); |
| | |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import jakarta.validation.constraints.DecimalMin; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | |
| | | private Long userId; |
| | | |
| | | @Schema(description = "èªé
ȾID", example = "1") |
| | | @NotNull(message = "èªé
¬ç»æä¸è½ä¸ºç©º") |
| | | private Long salaryStructureId; |
| | | |
| | | @Schema(description = "åºæ¬å·¥èµ", example = "8000.00") |
| | | @NotNull(message = "åºæ¬å·¥èµä¸è½ä¸ºç©º") |
| | | @DecimalMin(value = "0", message = "åºæ¬å·¥èµä¸è½ä¸ºè´æ°") |
| | | private BigDecimal baseSalary; |
| | | |
| | | @Schema(description = "绩æå·¥èµ", example = "2000.00") |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| | | } |
| | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import jakarta.validation.constraints.NotEmpty; |
| | | import jakarta.validation.constraints.NotNull; |
| | | import jakarta.validation.constraints.DecimalMin; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | |
| | | private String name; |
| | | |
| | | @Schema(description = "åºæ¬å·¥èµ", example = "8000.00") |
| | | @NotNull(message = "åºæ¬å·¥èµä¸è½ä¸ºç©º") |
| | | @DecimalMin(value = "0", message = "åºæ¬å·¥èµä¸è½ä¸ºè´æ°") |
| | | private BigDecimal baseSalary; |
| | | |
| | | @Schema(description = "绩æå·¥èµå æ¯ï¼%ï¼", example = "20") |
| | |
| | | @Schema(description = "夿³¨", example = "夿³¨ä¿¡æ¯") |
| | | private String remark; |
| | | |
| | | } |
| | | } |
| | |
| | | |
| | | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| | | import com.baomidou.mybatisplus.annotation.KeySequence; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.*; |
| | |
| | | |
| | | /** |
| | | * å¹´æï¼æ ¼å¼ï¼yyyy-MM |
| | | * |
| | | * YEAR_MONTH æ¯ MySQL ä¿çåï¼å¿
é¡»å åå¼å· |
| | | */ |
| | | @TableField("`year_month`") |
| | | private String yearMonth; |
| | | |
| | | /** |
| | |
| | | @Mapper |
| | | public interface HrmEmployeeSalaryMapper extends BaseMapperX<HrmEmployeeSalaryDO> { |
| | | |
| | | default long selectCountByStructureId(Long structureId) { |
| | | return selectCount(new LambdaQueryWrapperX<HrmEmployeeSalaryDO>() |
| | | .eq(HrmEmployeeSalaryDO::getSalaryStructureId, structureId)); |
| | | } |
| | | |
| | | default HrmEmployeeSalaryDO selectByUserIdAndEffectiveDate(Long userId, LocalDate effectiveDate) { |
| | | return selectOne(new LambdaQueryWrapperX<HrmEmployeeSalaryDO>() |
| | | .eq(HrmEmployeeSalaryDO::getUserId, userId) |
| | |
| | | .orderByDesc(HrmEmployeeSalaryDO::getId)); |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | if (userId == null) { |
| | | userId = getCurrentUserId(); |
| | | } |
| | | AdminUserRespDTO user = validateApplicant(userId); |
| | | HrmRegularizeApplicationDO existing = regularizeApplicationMapper.selectByUserIdAndStatusNot(userId, |
| | | HrmAuditStatusEnum.CANCEL.getStatus()); |
| | | if (existing != null) { |
| | | throw exception(REGULARIZE_APPLICATION_EXISTS); |
| | | } |
| | | String no = generateUniqueNo(); |
| | | AdminUserRespDTO user = adminUserApi.getUser(userId); |
| | | if (user == null) { |
| | | userId = getCurrentUserId(); |
| | | user = adminUserApi.getUser(userId); |
| | | } |
| | | HrmRegularizeApplicationDO application = BeanUtils.toBean(createReqVO, HrmRegularizeApplicationDO.class); |
| | | application.setNo(no); |
| | | application.setUserId(userId); |
| | |
| | | |
| | | private Long getCurrentUserId() { |
| | | return SecurityFrameworkUtils.getLoginUserId(); |
| | | } |
| | | |
| | | private AdminUserRespDTO validateApplicant(Long userId) { |
| | | AdminUserRespDTO user = userId == null ? null : adminUserApi.getUser(userId); |
| | | if (user == null) { |
| | | throw exception(REGULARIZE_APPLICANT_NOT_EXISTS); |
| | | } |
| | | if (employeeMapper.selectByUserId(userId) == null) { |
| | | throw exception(REGULARIZE_EMPLOYEE_LINK_REQUIRED); |
| | | } |
| | | return user; |
| | | } |
| | | |
| | | private String generateUniqueNo() { |
| | |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus()) |
| | | && !Objects.equals(application.getStatus(), HrmAuditStatusEnum.REJECT.getStatus())) { |
| | | throw exception(REGULARIZE_APPLICATION_UPDATE_FAIL_NOT_DRAFT); |
| | | } |
| | | if (updateReqVO.getUserId() != null) { |
| | | validateApplicant(updateReqVO.getUserId()); |
| | | } |
| | | HrmRegularizeApplicationDO updateObj = BeanUtils.toBean(updateReqVO, HrmRegularizeApplicationDO.class); |
| | | regularizeApplicationMapper.updateById(updateObj); |
| | |
| | | && !Objects.equals(application.getStatus(), HrmAuditStatusEnum.REJECT.getStatus())) { |
| | | throw exception(REGULARIZE_APPLICATION_SUBMIT_FAIL_NOT_EDITABLE); |
| | | } |
| | | validateApplicant(application.getUserId()); |
| | | |
| | | // 2. æ ¡éªå®¡æ¹é
置已å¯ç¨ä¸é
ç½®äºææå®¡æ¹äººï¼æªé
ç½®æ¶æåºå¸¦æç¡®æç¤ºçä¸å¡å¼å¸¸ï¼ |
| | | approvalConfigApi.validateApprovalEnabledAndGetApprovers(REGULARIZE_APPROVE_BIZ_TYPE); |
| | |
| | | private void writeBackEmployee(HrmRegularizeApplicationDO application) { |
| | | HrmEmployeeDO employee = employeeMapper.selectByUserId(application.getUserId()); |
| | | if (employee == null) { |
| | | log.warn("[writeBackEmployee] 转æ£ç³è¯·({}) ç¨æ·({}) æªæ¾å°å工档æ¡ï¼è·³è¿åå", application.getId(), application.getUserId()); |
| | | return; |
| | | throw exception(REGULARIZE_EMPLOYEE_LINK_REQUIRED); |
| | | } |
| | | LocalDate regularDate = application.getExpectedDate() != null ? application.getExpectedDate() : LocalDate.now(); |
| | | employeeMapper.updateById(HrmEmployeeDO.builder() |
| | |
| | | return user == null ? null : user.getNickname(); |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | @Override |
| | | public HrmAttendanceMyStatusRespVO getMyStatus(Long loginUserId, LocalDate date) { |
| | | LocalDate queryDate = date != null ? date : LocalDate.now(); |
| | | HrmAttendanceMyStatusRespVO respVO = new HrmAttendanceMyStatusRespVO(); |
| | | respVO.setUserId(loginUserId); |
| | | respVO.setDate(queryDate); |
| | | respVO.setServerTime(LocalDateTime.now()); |
| | | // 1. ç»å½ç¨æ· -> åå·¥æ¡£æ¡ |
| | | HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId); |
| | | if (employee == null) { |
| | | throw exception(EMPLOYEE_NOT_EXISTS, |
| | | "å½åç»å½è´¦å·æªå
³èå工档æ¡ï¼æ æ³æå¡ã请è系管çåå¨ãå工管çãä¸å°è¯¥ç»å½è´¦å·ç»å®å°åå·¥ã"); |
| | | HrmAttendanceMyStatusRespVO.Clockable clockable = new HrmAttendanceMyStatusRespVO.Clockable(); |
| | | clockable.setClockIn(false); |
| | | clockable.setClockOut(false); |
| | | clockable.setNextAction("none"); |
| | | clockable.setMessage("å½åè´¦å·æªå
³èå工档æ¡ï¼è¯·è系管çåå¨å工管çä¸å®æå
³è"); |
| | | respVO.setClockable(clockable); |
| | | return respVO; |
| | | } |
| | | HrmAttendanceMyStatusRespVO respVO = new HrmAttendanceMyStatusRespVO(); |
| | | respVO.setUserId(loginUserId); |
| | | respVO.setEmployeeId(employee.getId()); |
| | | respVO.setEmployeeName(employee.getName()); |
| | | respVO.setDeptId(employee.getDeptId()); |
| | |
| | | respVO.setDeptName(dept.getName()); |
| | | } |
| | | } |
| | | respVO.setDate(queryDate); |
| | | respVO.setServerTime(LocalDateTime.now()); |
| | | |
| | | // 2. æ¯å¦å·¥ä½æ¥ + 伿¯åå |
| | | boolean workDay = attendanceHolidayService.isWorkDay(queryDate); |
| | |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmEmployeeSalaryPageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmEmployeeSalaryDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmEmployeeSalaryMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmSalaryStructureMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_SALARY_NOT_EXISTS; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_SALARY_EXISTS; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.HRM_EMPLOYEE_NOT_EXISTS; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.SALARY_STRUCTURE_NOT_EXISTS; |
| | | |
| | | /** |
| | | * åå·¥èªé
¬æ¡£æ¡ Service å®ç°ç±» |
| | |
| | | |
| | | @Resource |
| | | private HrmEmployeeSalaryMapper employeeSalaryMapper; |
| | | @Resource |
| | | private HrmSalaryStructureMapper structureMapper; |
| | | @Resource |
| | | private HrmEmployeeMapper employeeMapper; |
| | | |
| | | @Override |
| | | public Long createEmployeeSalary(HrmEmployeeSalaryDO salary) { |
| | | validateReferences(salary); |
| | | validateUniqueDate(salary); |
| | | employeeSalaryMapper.insert(salary); |
| | | return salary.getId(); |
| | | } |
| | |
| | | @Override |
| | | public void updateEmployeeSalary(HrmEmployeeSalaryDO salary) { |
| | | validateEmployeeSalaryExists(salary.getId()); |
| | | validateReferences(salary); |
| | | validateUniqueDate(salary); |
| | | employeeSalaryMapper.updateById(salary); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | } |
| | | private void validateReferences(HrmEmployeeSalaryDO salary) { |
| | | if (salary.getUserId() == null || employeeMapper.selectById(salary.getUserId()) == null) { |
| | | throw exception(HRM_EMPLOYEE_NOT_EXISTS); |
| | | } |
| | | if (salary.getSalaryStructureId() == null |
| | | || structureMapper.selectById(salary.getSalaryStructureId()) == null) { |
| | | throw exception(SALARY_STRUCTURE_NOT_EXISTS); |
| | | } |
| | | } |
| | | |
| | | private void validateUniqueDate(HrmEmployeeSalaryDO salary) { |
| | | HrmEmployeeSalaryDO existing = employeeSalaryMapper.selectByUserIdAndEffectiveDate( |
| | | salary.getUserId(), salary.getEffectiveDate()); |
| | | if (existing != null && !existing.getId().equals(salary.getId())) { |
| | | throw exception(EMPLOYEE_SALARY_EXISTS); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.salary.vo.HrmSalaryStructurePageReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.salary.HrmSalaryStructureDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmSalaryStructureMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.salary.HrmEmployeeSalaryMapper; |
| | | import jakarta.annotation.Resource; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.validation.annotation.Validated; |
| | |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.SALARY_STRUCTURE_NOT_EXISTS; |
| | | import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.SALARY_STRUCTURE_IN_USE; |
| | | |
| | | /** |
| | | * èªé
¬ç»æ Service å®ç°ç±» |
| | |
| | | |
| | | @Resource |
| | | private HrmSalaryStructureMapper structureMapper; |
| | | @Resource |
| | | private HrmEmployeeSalaryMapper employeeSalaryMapper; |
| | | |
| | | @Override |
| | | public Long createStructure(HrmSalaryStructureDO structure) { |
| | |
| | | @Override |
| | | public void deleteStructure(Long id) { |
| | | validateStructureExists(id); |
| | | if (employeeSalaryMapper.selectCountByStructureId(id) > 0) { |
| | | throw exception(SALARY_STRUCTURE_IN_USE); |
| | | } |
| | | structureMapper.deleteById(id); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | package cn.iocoder.yudao.module.mes.api.returnsales; |
| | | |
| | | import cn.iocoder.yudao.module.mes.api.returnsales.dto.MesWmReturnSalesCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.returnsales.dto.MesWmReturnSalesLineRespDTO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * MES éå®éè´§å API æ¥å£ |
| | |
| | | /** åæ¶å°æªå®æå
¥åºçéå®éè´§åã */ |
| | | void cancelReturnSales(Long id); |
| | | |
| | | /** |
| | | * æ¥è¯¢éå®éè´§åè¡ï¼ç¨äºè·å MES è§£æååå¡«çæ¹æ¬¡ï¼ |
| | | * |
| | | * @param returnSalesId éå®éè´§åç¼å· |
| | | * @return éè´§åè¡å表 |
| | | */ |
| | | List<MesWmReturnSalesLineRespDTO> getReturnSalesLineList(Long returnSalesId); |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package cn.iocoder.yudao.module.mes.api.returnsales.dto; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * MES éå®éè´§åè¡ Response DTOï¼è·¨æ¨¡åæ¥è¯¢æ¹æ¬¡çåæ®µï¼ |
| | | * |
| | | * @author è¶
级管çå |
| | | */ |
| | | @Data |
| | | public class MesWmReturnSalesLineRespDTO { |
| | | |
| | | /** |
| | | * è¡ç¼å· |
| | | */ |
| | | private Long id; |
| | | |
| | | /** |
| | | * ç©æç¼å· |
| | | */ |
| | | private Long itemId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡ç¼å· |
| | | */ |
| | | private Long batchId; |
| | | |
| | | /** |
| | | * æ¹æ¬¡å· |
| | | */ |
| | | private String batchCode; |
| | | |
| | | } |
| | |
| | | |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.api.returnsales.dto.MesWmReturnSalesCreateReqDTO; |
| | | import cn.iocoder.yudao.module.mes.api.returnsales.dto.MesWmReturnSalesLineRespDTO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService; |
| | |
| | | returnSalesService.cancelReturnSales(id); |
| | | } |
| | | |
| | | @Override |
| | | public List<MesWmReturnSalesLineRespDTO> getReturnSalesLineList(Long returnSalesId) { |
| | | return BeanUtils.toBean(returnSalesLineService.getReturnSalesLineListByReturnId(returnSalesId), |
| | | MesWmReturnSalesLineRespDTO.class); |
| | | } |
| | | |
| | | } |
| | |
| | | ErrorCode BARCODE_CONFIG_NOT_EXISTS = new ErrorCode(1_040_731_005, "æ¡ç é
ç½®ä¸åå¨"); |
| | | ErrorCode BARCODE_FORMAT_INVALID = new ErrorCode(1_040_731_006, "æ¡ç æ ¼å¼ä¸æ¯ææ¸²æ"); |
| | | ErrorCode BARCODE_CONTENT_EMPTY = new ErrorCode(1_040_731_007, "æ¡ç å
容ä¸è½ä¸ºç©º"); |
| | | ErrorCode WM_BARCODE_DISABLED = new ErrorCode(1_040_731_008, "æ¡ç å·²åç¨ï¼æ æ³ç»§ç»æ«ç 使ç¨"); |
| | | |
| | | // ========== MES ä»åºç®¡ç-SN ç ï¼1-040-732-000ï¼ ========== |
| | | ErrorCode WM_SN_NOT_EXISTS = new ErrorCode(1_040_732_000, "SN ç ä¸åå¨"); |
| | |
| | | |
| | | // 3. ä¿åæ¡ç è®°å½ |
| | | MesWmBarcodeDO barcode = BeanUtils.toBean(createReqVO, MesWmBarcodeDO.class).setContent(content) |
| | | .setConfigId(config.getId()).setFormat(config.getFormat()); |
| | | .setConfigId(config.getId()).setFormat(config.getFormat()) |
| | | .setStatus(ObjUtil.defaultIfNull(createReqVO.getStatus(), CommonStatusEnum.ENABLE.getStatus())); |
| | | barcodeMapper.insert(barcode); |
| | | return barcode.getId(); |
| | | } |
| | |
| | | if (barcode == null) { |
| | | return; |
| | | } |
| | | if (ObjUtil.notEqual(barcode, id)) { |
| | | if (ObjUtil.notEqual(barcode.getId(), id)) { |
| | | throw exception(WM_BARCODE_ALREADY_EXISTS); |
| | | } |
| | | } |
| | |
| | | // 1. ä¼å
ææ¡ç å
容精确å½ä¸å·²ææ¡ç è®°å½ |
| | | MesWmBarcodeDO barcode = barcodeMapper.selectByContent(content); |
| | | if (barcode != null) { |
| | | // åç¨åªå½±ååç»ä½¿ç¨ï¼ä¸å é¤åå²è®°å½åè¿½æº¯æ°æ® |
| | | if (!CommonStatusEnum.isEnable(barcode.getStatus())) { |
| | | throw exception(WM_BARCODE_DISABLED); |
| | | } |
| | | Map<String, Object> result = new LinkedHashMap<>(); |
| | | result.put("matched", true); |
| | | result.put("barcodeId", barcode.getId()); |
| | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLinePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLineSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper; |
| | |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ® batchCode è§£æ batchId |
| | | * è§£æå¹¶å¡«å
æ¹æ¬¡ |
| | | * |
| | | * <p>å¯ç¨æ¹æ¬¡ç®¡ççç©æåºåºæ¶å¿
é¡»è½æ¹æ¬¡ï¼æªè®°å½æ¹æ¬¡æ¶æç©æ + å®¢æ· + éå®è®¢åèªå¨çæï¼ |
| | | * ä¾åç»éè´§çä¸å¡è¿½æº¯ã |
| | | */ |
| | | private void fillBatchId(MesWmProductSalesLineSaveReqVO reqVO) { |
| | | if (StrUtil.isBlank(reqVO.getBatchCode())) { |
| | | private void fillBatchId(MesWmProductSalesDO sales, MesMdmItemDO item, |
| | | MesWmProductSalesLineSaveReqVO reqVO) { |
| | | if (StrUtil.isNotBlank(reqVO.getBatchCode())) { |
| | | MesWmBatchDO batch = batchService.getBatchByCode(reqVO.getBatchCode()); |
| | | if (batch != null) { |
| | | reqVO.setBatchId(batch.getId()); |
| | | return; |
| | | } |
| | | if (!Boolean.TRUE.equals(item.getIsBatchManaged())) { |
| | | reqVO.setBatchId(null); |
| | | return; |
| | | } |
| | | // æå®äºæ¹æ¬¡å·ä½ç³»ç»ä¸ä¸åå¨ï¼æè¯¥æ¹æ¬¡å·å»ºæ¡£ |
| | | MesWmBatchDO created = batchService.getOrGenerateBatchCode(buildBatchGenerateReq(sales, reqVO)); |
| | | reqVO.setBatchId(created != null ? created.getId() : null); |
| | | return; |
| | | } |
| | | if (!Boolean.TRUE.equals(item.getIsBatchManaged())) { |
| | | reqVO.setBatchId(null); |
| | | return; |
| | | } |
| | | MesWmBatchDO batch = batchService.getBatchByCode(reqVO.getBatchCode()); |
| | | reqVO.setBatchId(batch != null ? batch.getId() : null); |
| | | // æªè®°å½æ¹æ¬¡ï¼èªå¨çæ |
| | | MesWmBatchDO batch = batchService.getOrGenerateBatchCode(buildBatchGenerateReq(sales, reqVO)); |
| | | reqVO.setBatchId(batch != null ? batch.getId() : null) |
| | | .setBatchCode(batch != null ? batch.getCode() : null); |
| | | } |
| | | |
| | | private MesWmBatchGenerateReqVO buildBatchGenerateReq(MesWmProductSalesDO sales, |
| | | MesWmProductSalesLineSaveReqVO reqVO) { |
| | | return new MesWmBatchGenerateReqVO() |
| | | .setItemId(reqVO.getItemId()) |
| | | .setBatchCode(reqVO.getBatchCode()) |
| | | .setClientId(sales.getClientId()) |
| | | .setSalesOrderCode(sales.getSalesOrderCode()); |
| | | } |
| | | |
| | | /** |
| | |
| | | // æ ¡éªä¸»ååå¨ä¸ä¸ºèç¨¿ç¶æ |
| | | MesWmProductSalesDO sales = productSalesService.validateProductSalesExistsAndDraft(reqVO.getSalesId()); |
| | | // æ ¡éªç©æåå¨ |
| | | mdmItemService.validateItemExistsAndEnable(reqVO.getItemId()); |
| | | MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(reqVO.getItemId()); |
| | | // æ ¡éªå
³èåè´§éç¥åè¡ï¼å卿§ + å½å± + åæ®µä¸è´æ§ï¼ |
| | | validateSalesNoticeLine(sales, reqVO); |
| | | // æ ¹æ® batchCode è§£æ batchId |
| | | fillBatchId(reqVO); |
| | | // è§£ææ¹æ¬¡ |
| | | fillBatchId(sales, item, reqVO); |
| | | } |
| | | |
| | | /** |
| | |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLinePageReqVO; |
| | | import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO; |
| | | import cn.iocoder.yudao.module.mes.api.event.MesReturnSalesProgressEvent; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper; |
| | |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_BATCH_REQUIRED; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_BATCH_CLIENT_MISMATCH; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_LINE_NOT_EXISTS; |
| | | import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_RQC_SOURCE_INVALID; |
| | | |
| | |
| | | */ |
| | | private void validateLineSaveData(MesWmReturnSalesLineSaveReqVO reqVO) { |
| | | // æ ¡éªéè´§ååå¨ + èç¨¿ç¶æ |
| | | returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId()); |
| | | // æ ¡éªç©æåå¨ + æ¹æ¬¡ç®¡ç |
| | | validateItemBatchManagement(reqVO.getReturnId(), reqVO.getItemId(), reqVO.getBatchId()); |
| | | MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId()); |
| | | // æ ¡éªç©æåå¨ + è§£ææ¹æ¬¡ |
| | | resolveAndValidateBatch(returnSales, reqVO); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | |
| | | /** |
| | | * æ ¡éªç©ææ¹æ¬¡ç®¡ç |
| | | * è§£æå¹¶æ ¡éªç©ææ¹æ¬¡ |
| | | * |
| | | * @param returnId éè´§åID |
| | | * @param itemId ç©æID |
| | | * @param batchId æ¹æ¬¡ID |
| | | * <p>éè´§ååå¨éå®åºåºæ¶å¯è½æªè®°å½æ¹æ¬¡ï¼æ¤æ¶æç©æ + å®¢æ· + éå®è®¢åèªå¨çæéè´§æ¹æ¬¡ï¼ |
| | | * ä¿è¯éè´§åä»å¯è¿½æº¯å°å
·ä½æ¹æ¬¡ï¼å·²ææ¹æ¬¡åæ ¡éªç©æå½å±ï¼æ¹æ¬¡æªæå®å®¢æ·æ¶è§ä¸ºéç¨æ¹æ¬¡ã |
| | | */ |
| | | private void validateItemBatchManagement(Long returnId, Long itemId, Long batchId) { |
| | | MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(itemId); |
| | | // å¦æç©æå¯ç¨äºæ¹æ¬¡ç®¡çï¼åå¿
é¡»éæ©æ¹æ¬¡ |
| | | if (Boolean.TRUE.equals(item.getIsBatchManaged()) && batchId == null) { |
| | | private void resolveAndValidateBatch(MesWmReturnSalesDO returnSales, MesWmReturnSalesLineSaveReqVO reqVO) { |
| | | MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(reqVO.getItemId()); |
| | | if (reqVO.getBatchId() != null) { |
| | | MesWmBatchDO batch = batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId()); |
| | | if (batch.getClientId() != null && ObjUtil.notEqual(batch.getClientId(), returnSales.getClientId())) { |
| | | throw exception(WM_BATCH_CLIENT_MISMATCH); |
| | | } |
| | | reqVO.setBatchCode(batch.getCode()); |
| | | return; |
| | | } |
| | | if (!Boolean.TRUE.equals(item.getIsBatchManaged())) { |
| | | return; |
| | | } |
| | | MesWmBatchGenerateReqVO batchReqVO = new MesWmBatchGenerateReqVO() |
| | | .setItemId(reqVO.getItemId()) |
| | | .setClientId(returnSales.getClientId()) |
| | | .setSalesOrderCode(returnSales.getSalesOrderCode()); |
| | | MesWmBatchDO batch = batchService.getOrGenerateBatchCode(batchReqVO); |
| | | if (batch == null) { |
| | | throw exception(MD_ITEM_BATCH_REQUIRED); |
| | | } |
| | | // æ ¡éªæ¹æ¬¡åå¨ä¸å±äºå½åç©æåå®¢æ· |
| | | if (batchId != null) { |
| | | // ä»ç¶åè·å客æ·IDï¼æ ¡éªæ¹æ¬¡å½å± |
| | | MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(returnId); |
| | | batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null); |
| | | } |
| | | reqVO.setBatchId(batch.getId()).setBatchCode(batch.getCode()); |
| | | } |
| | | |
| | | @Override |