package com.vincent.rsf.server.manager.service.impl; import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.common.utils.ExcelUtil; import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams; import com.vincent.rsf.server.manager.entity.AsnOrder; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import com.vincent.rsf.server.manager.entity.Matnr; import com.vincent.rsf.server.manager.entity.excel.CheckOrderTemplate; import com.vincent.rsf.server.manager.enums.AsnExceStatus; import com.vincent.rsf.server.manager.enums.CheckExceStatus; import com.vincent.rsf.server.manager.enums.OrderType; import com.vincent.rsf.server.manager.enums.OrderWorkType; import com.vincent.rsf.server.manager.mapper.CheckOrderMapper; import com.vincent.rsf.server.manager.service.AsnOrderItemService; import com.vincent.rsf.server.manager.service.CheckOrderItemService; import com.vincent.rsf.server.manager.service.CheckOrderService; import com.vincent.rsf.server.manager.service.MatnrService; import com.vincent.rsf.server.system.constant.SerialRuleCode; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.util.*; import java.util.stream.Collectors; @Service("checkOrderService") public class CheckOrderServiceImpl extends ServiceImpl implements CheckOrderService { @Autowired private MatnrService matnrService; @Autowired private CheckOrderItemService checkOrderItemService; @Autowired private AsnOrderItemService asnOrderItemService; /** * @author Ryan * @date 2025/7/14 * @description: 盘点单导入 * @version 1.0 */ @Override @Transactional(rollbackFor = Exception.class) public R excelImport(MultipartFile file, HashMap hashMap, Long loginUserId) { ExcelImportResult result = null; try { result = ExcelImportUtil.importExcelMore(file.getInputStream(), CheckOrderTemplate.class, ExcelUtil.getDefaultImportParams()); } catch (Exception e) { throw new RuntimeException(e); } if (result.getList().isEmpty()) { throw new CoolException("表格内容不能为空!!"); } List resultList = result.getList(); Map> listMap = resultList.stream().collect(Collectors.groupingBy(CheckOrderTemplate::getCode)); for (String key : listMap.keySet()) { CheckOrderTemplate template = listMap.get(key).stream().findFirst().get(); AsnOrder asnOrder = this.getOne(new LambdaQueryWrapper().eq(AsnOrder::getCode, template.getCode())); if (!Objects.isNull(asnOrder)) { continue; } AsnOrder order = new AsnOrder(); order.setCode(template.getCode()) .setMemo(template.getMemo()) .setUpdateBy(loginUserId) .setCreateBy(loginUserId) .setType(OrderType.getTypeVal(template.getType())) .setWkType(OrderWorkType.getWorkType(template.getWkType())); if (!this.save(order)) { throw new CoolException("单据保存失败!!"); } List items = new ArrayList<>(); for (CheckOrderTemplate orderTemplate : listMap.get(key)) { AsnOrderItem orderItem = new AsnOrderItem(); Matnr matnr = null; if (StringUtils.isNotBlank(orderTemplate.getMatnrCode())) { matnr = matnrService.getOne(new LambdaQueryWrapper() .eq(Matnr::getCode, orderTemplate.getMatnrCode())); } orderItem.setAsnId(order.getId()) .setAsnCode(order.getCode()) .setSplrBatch(orderTemplate.getSplrBatch()) .setAnfme(Double.parseDouble(orderTemplate.getAnfme())) .setSplrName(orderTemplate.getSplrName()) .setSplrCode(orderTemplate.getSplrCode()) .setMaktx(orderTemplate.getMaktx()) .setMatnrCode(orderTemplate.getMatnrCode()); if (!Objects.isNull(matnr)) { orderItem.setMaktx(matnr.getName()).setMatnrCode(matnr.getCode()).setMatnrId(matnr.getId()); } items.add(orderItem); if (!checkOrderItemService.saveBatch(items)) { throw new CoolException("单据明细保存失败!!"); } } if (!items.isEmpty()) { double purQty = items.stream().mapToDouble(AsnOrderItem::getAnfme).sum(); if (!this.update(new LambdaUpdateWrapper() .set(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) .set(AsnOrder::getAnfme, purQty).eq(AsnOrder::getId, order.getId()))) { throw new CoolException("单据数量修改失败!!"); } } } return R.ok("操作成功!!"); } /** * @param * @return * @author Ryan * @description 保存出库主单及明细 * @time 2025/4/29 13:47 */ @Override @Transactional(rollbackFor = Exception.class) public R saveCheckOrder(AsnOrderAndItemsParams params, Long loginUserId) { if (Objects.isNull(params.getOrders())) { throw new CoolException("主单信息不能为空"); } AsnOrder orders = params.getOrders(); if (StringUtils.isBlank(orders.getWkType())) { throw new CoolException("业务类型不能为空!!"); } String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_CHECK_RULE_CODE, orders); if (StringUtils.isBlank(ruleCode)) { throw new CoolException("编码规则错误:请检查「SYS_CHECK_RULE_CODE」是否设置正确!!"); } orders.setCode(ruleCode) .setType(OrderType.ORDER_CHECK.type) .setExceStatus(CheckExceStatus.CHECK_ORDER_STATUS_UN_EXCE.val) .setUpdateBy(loginUserId) .setCreateBy(loginUserId); if (!this.save(orders)) { throw new CoolException("主单保存失败!!"); } if (params.getItems().isEmpty()) { throw new CoolException("盘点单明细不能为空!!"); } params.setOrders(orders); try { svaeOrUpdateOrderItem(params, loginUserId); } catch (Exception e) { throw new CoolException(e.getMessage()); } return R.ok(); } /** * @param * @return * @author Ryan * @description 更新或保存明细 * @time 2025/4/7 13:28 */ @Transactional(rollbackFor = Exception.class) public void svaeOrUpdateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception { AsnOrder orders = params.getOrders(); params.getItems().forEach(item -> { item.put("asnId", orders.getId()); item.put("asnCode", orders.getCode()); item.put("poCode", orders.getPoCode()); item.put("createBy", loginUserId); item.put("updateBy", loginUserId); if (!asnOrderItemService.fieldsSave(item, loginUserId)) { throw new CoolException("明细保存失败!!"); } }); List orderItems = checkOrderItemService.list(new LambdaQueryWrapper() .eq(AsnOrderItem::getAsnId, params.getOrders().getId())); Double sum = orderItems.stream().mapToDouble(AsnOrderItem::getAnfme).sum(); orders.setAnfme(sum); if (!this.updateById(orders)) { throw new CoolException("计划收货数量修改失败!!"); } } }