| package com.vincent.rsf.server.manager.service.impl; | 
|   | 
| import cn.afterturn.easypoi.excel.ExcelImportUtil; | 
| import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | 
| import com.baomidou.mybatisplus.core.metadata.IPage; | 
| import com.vincent.rsf.framework.common.Cools; | 
| import com.vincent.rsf.framework.common.R; | 
| import com.vincent.rsf.framework.exception.CoolException; | 
| import com.vincent.rsf.server.manager.entity.WkOrder; | 
| import com.vincent.rsf.server.manager.entity.WkOrderItem; | 
| import com.vincent.rsf.server.manager.enums.OrderType; | 
| import com.vincent.rsf.server.manager.enums.OrderWorkType; | 
| import com.vincent.rsf.server.common.domain.BaseParam; | 
| import com.vincent.rsf.server.common.domain.PageParam; | 
| import com.vincent.rsf.server.common.utils.ExcelUtil; | 
| import com.vincent.rsf.server.common.utils.FieldsUtils; | 
| import com.vincent.rsf.server.manager.entity.Companys; | 
| import com.vincent.rsf.server.manager.entity.Matnr; | 
| import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate; | 
| import com.vincent.rsf.server.manager.enums.CompanysType; | 
| import com.vincent.rsf.server.manager.enums.QlyIsptResult; | 
| import com.vincent.rsf.server.manager.mapper.AsnOrderItemMapper; | 
| import com.vincent.rsf.server.manager.service.AsnOrderItemService; | 
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
| import com.vincent.rsf.server.manager.service.AsnOrderService; | 
| import com.vincent.rsf.server.manager.service.CompanysService; | 
| import com.vincent.rsf.server.manager.service.MatnrService; | 
| import com.vincent.rsf.server.system.constant.SerialRuleCode; | 
| import com.vincent.rsf.server.system.entity.Fields; | 
| import com.vincent.rsf.server.system.service.DictDataService; | 
| import com.vincent.rsf.server.system.service.FieldsItemService; | 
| import com.vincent.rsf.server.system.service.FieldsService; | 
| 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.text.SimpleDateFormat; | 
| import java.util.*; | 
| import java.util.stream.Collectors; | 
|   | 
| @Service("asnOrderItemService") | 
| public class AsnOrderItemServiceImpl extends ServiceImpl<AsnOrderItemMapper, WkOrderItem> implements AsnOrderItemService { | 
|   | 
|     @Autowired | 
|     private AsnOrderService asnOrderMapper; | 
|   | 
|     @Autowired | 
|     private FieldsService fieldsService; | 
|   | 
|     @Autowired | 
|     private FieldsItemService fieldsItemService; | 
|     @Autowired | 
|     private MatnrService matnrService; | 
|   | 
|     @Autowired | 
|     private AsnOrderItemService asnOrderItemService; | 
|   | 
|     @Autowired | 
|     private CompanysService companysService; | 
|   | 
|     @Autowired | 
|     private DictDataService dictDataService; | 
|   | 
|     @Override | 
|     public R generateBarcode(List<Long> orders) { | 
|         if (Objects.isNull(orders) || orders.isEmpty()) { | 
|             throw new CoolException("参数不能为空!!"); | 
|         } | 
|         List<WkOrderItem> items = this.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getId, orders)); | 
|         if (items.isEmpty()) { | 
|             throw new CoolException("单据明细不存在!!"); | 
|         } | 
|         items.forEach(item -> { | 
|             String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, item); | 
|             if (Objects.isNull(ruleCode) || StringUtils.isBlank(ruleCode)) { | 
|                 throw new CoolException("系统错误,请检查「SYS_LABEL_CODE」标签规则是否存在"); | 
|             } | 
|             item.setTrackCode(ruleCode); | 
|         }); | 
|         if (!this.saveOrUpdateBatch(items)) { | 
|             throw new CoolException("生成条码失败!!"); | 
|         } | 
|   | 
|         return R.ok(); | 
|     } | 
|   | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public synchronized R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId) throws Exception { | 
|         ExcelImportResult result = ExcelImportUtil.importExcelMore(file.getInputStream(), AsnOrderTemplate.class, ExcelUtil.getDefaultImportParams()); | 
|         if (result.getList().isEmpty()) { | 
|             throw new CoolException("表格内容不能为空!!"); | 
|         } | 
|         List<AsnOrderTemplate> resultList = result.getList(); | 
|         Map<String, List<AsnOrderTemplate>> listMap = resultList.stream().collect(Collectors.groupingBy(AsnOrderTemplate::getCode)); | 
|         StringBuffer sbFaild = new StringBuffer(); | 
|         for (String key : listMap.keySet()) { | 
|             if (StringUtils.isBlank(key)) { | 
|                 throw new CoolException("单号不能为空!!"); | 
|             } | 
|             AsnOrderTemplate template = listMap.get(key).stream().findFirst().get(); | 
|             WkOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getCode, key)); | 
|             if (!Objects.isNull(order)) { | 
|                 sbFaild.append(template.getCode()).append(",已添加!!"); | 
|                 throw new CoolException(sbFaild.toString()); | 
|             } | 
|             order = new WkOrder(); | 
|             SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); | 
|             Date date = dateFormat.parse(template.getArrTime()); | 
|             if (Objects.isNull(date)) { | 
|                 throw new CoolException("时间格式错误!!"); | 
|             } | 
|             if (Objects.isNull((OrderType.getTypeVal(template.getType())))) { | 
|                 sbFaild.append(template.getCode()).append(",单据状态不存在!!"); | 
|                 throw new CoolException(sbFaild.toString()); | 
|             } | 
|             if (Objects.isNull((OrderWorkType.getWorkType(template.getWkType())))) { | 
|                 sbFaild.append(template.getCode()).append(",业务状态不存在!!"); | 
|                 throw new CoolException(sbFaild.toString()); | 
|             } | 
|   | 
|             order.setCode(template.getCode()) | 
|                     .setPoCode(template.getPoCode()) | 
|                     .setMemo(template.getMemo()) | 
|                     .setArrTime(date) | 
|                     .setUpdateBy(loginUserId) | 
|                     .setLogisNo(template.getLogicNo()) | 
|                     .setCreateBy(loginUserId) | 
|                     .setType(OrderType.getTypeVal(template.getType())) | 
|                     .setWkType(OrderWorkType.getWorkType(template.getWkType())); | 
|             if (!asnOrderMapper.save(order)) { | 
|                 throw new CoolException("单据保存失败!!"); | 
|             } | 
|             List<WkOrderItem> items = new ArrayList<>(); | 
|             for (AsnOrderTemplate orderTemplate : listMap.get(key)) { | 
|                 WkOrderItem orderItem = new WkOrderItem(); | 
|                 if (StringUtils.isBlank(orderTemplate.getMatnrCode())) { | 
|                     throw new CoolException(orderTemplate.getCode() + ":物料编码不能为空!!"); | 
|                 } | 
|                 if (StringUtils.isBlank(orderTemplate.getAnfme())) { | 
|                     throw new CoolException(orderTemplate.getCode() + ":数量不能为空!!"); | 
|                 } | 
|                 if (StringUtils.isBlank(orderTemplate.getType())) { | 
|                     throw new CoolException(orderTemplate.getCode() + ":单据类型不能为空!!"); | 
|                 } | 
|                 if (StringUtils.isBlank(orderTemplate.getWkType())) { | 
|                     throw new CoolException(orderTemplate.getCode() + ":业务类型不能为空!!"); | 
|                 } | 
|   | 
|                 Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>() | 
|                         .eq(Matnr::getCode, orderTemplate.getMatnrCode())); | 
|                 if (Objects.isNull(matnr)) { | 
|                     sbFaild.append(orderTemplate.getMatnrCode()).append("物料不存在"); | 
|                     throw new CoolException(sbFaild.toString()); | 
|                 } | 
|                 String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, matnr); | 
|                 orderItem.setOrderId(order.getId()) | 
|                         .setOrderCode(order.getCode()) | 
|                         .setSplrBatch(orderTemplate.getSplrBatch()) | 
|                         .setPlatItemId(orderTemplate.getPlatItemId()) | 
|                         .setAnfme(Double.parseDouble(orderTemplate.getAnfme())) | 
|                         .setIsptResult(QlyIsptResult.getDescVal(orderTemplate.getIsptResult())) | 
| //                        .setTrackCode(trackCode) | 
|                         .setBarcode(trackCode) | 
|                         .setPlatOrderCode(orderTemplate.getPlatOrderCode()) | 
|                         .setPlatWorkCode(orderTemplate.getPlatWorkCode()) | 
|                         .setProjectCode(orderTemplate.getProjectCode()) | 
|                         .setPoCode(orderTemplate.getPoCode()) | 
|                         .setPurUnit(matnr.getUnit()) | 
|                         .setCreateBy(loginUserId) | 
|                         .setUpdateBy(loginUserId) | 
|                         .setSpec(matnr.getSpec()) | 
|                         .setModel(matnr.getModel()) | 
|                         .setMaktx(matnr.getName()) | 
|                         .setMatnrCode(matnr.getCode()) | 
|                         .setMatnrId(matnr.getId()) | 
|                         .setStockUnit(matnr.getUnit()); | 
|                 if (!Objects.isNull(orderTemplate.getSplrCode())) { | 
|                     Companys companys = companysService.getOne(new LambdaQueryWrapper<Companys>() | 
|                                     .eq(Companys::getType, CompanysType.COMPANYS_TYPE_SUPPLIER.val) | 
|                             .eq(Companys::getCode, orderTemplate.getSplrCode())); | 
|                     if (!Objects.isNull(companys)) { | 
|                         orderItem.setSplrCode(companys.getCode()).setSplrName(companys.getName()); | 
|                     } else { | 
|                         sbFaild.append("供应商:" + orderTemplate.getSplrCode()).append("不存在"); | 
|                         throw new CoolException(sbFaild.toString()); | 
|                     } | 
|                 } else { | 
|                     continue; | 
|                 } | 
|                 items.add(orderItem); | 
|   | 
|                 if (!asnOrderItemService.save(orderItem)) { | 
|                     throw new CoolException("单据明细保存失败!!"); | 
|                 } | 
|             } | 
|             if (!items.isEmpty()) { | 
| //                double qty = items.stream().mapToDouble(AsnOrderItem::getQty).sum(); | 
|                 double anfme = items.stream().mapToDouble(WkOrderItem::getAnfme).sum(); | 
|                 if (!asnOrderMapper.update(new LambdaUpdateWrapper<WkOrder>() | 
| //                        .set(AsnOrder::getQty, qty) | 
|                         .set(WkOrder::getAnfme, anfme) | 
|                         .eq(WkOrder::getId, order.getId()))) { | 
|                     throw new CoolException("单据数量修改失败!!"); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         return R.ok("导入成功," + sbFaild.toString()); | 
|     } | 
|   | 
|     /** | 
|      * @param | 
|      * @param loginUserId | 
|      * @return | 
|      * @author Ryan | 
|      * @description ASN明细单据保存,及扩展字段保存 | 
|      * @time 2025/4/7 09:59 | 
|      */ | 
|     @Override | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public boolean fieldsSave(Map<String, Object> params, Long loginUserId) { | 
|         WkOrderItem wkOrderItem = JSONObject.parseObject(JSONObject.toJSONString(params), WkOrderItem.class); | 
|         if (StringUtils.isNoneBlank(wkOrderItem.getSplrCode())) { | 
|             Companys companys = companysService.getOne(new LambdaQueryWrapper<Companys>() | 
|                     .eq(Companys::getId, wkOrderItem.getSplrCode()) | 
|                     .eq(Companys::getType, CompanysType.COMPANYS_TYPE_SUPPLIER.val)); | 
|             if (!Objects.isNull(companys)) { | 
|                 wkOrderItem.setSplrCode(companys.getCode()).setSplrName(companys.getName()); | 
|             } | 
|         } | 
|         if (Objects.isNull(wkOrderItem.getAnfme()) || Double.compare(wkOrderItem.getAnfme(), 0.0) <= 0) { | 
|             throw new CoolException("计划数不能为空!!"); | 
|         } | 
|   | 
|         Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, wkOrderItem.getMatnrCode())); | 
|         if (Objects.isNull(matnr)) { | 
|             throw new CoolException("数据错误:物料" + wkOrderItem.getMatnrCode() + "不存在!!"); | 
|         } | 
|         wkOrderItem.setMatnrCode(matnr.getCode()).setMatnrId(matnr.getId()); | 
|   | 
|         //保存扩展字段 | 
|         try { | 
|             StringBuffer sb = new StringBuffer(); | 
|             if (Objects.isNull(wkOrderItem.getFieldsIndex()) || StringUtils.isBlank(wkOrderItem.getFieldsIndex())) { | 
|                 List<Fields> fields = FieldsUtils.getFieldsSta(); | 
|                 for (Fields field : fields) { | 
|                     if (Objects.isNull(params.get(field.getFields()))) { | 
|                         continue; | 
|                     } | 
|                     //字段拼接 | 
|                     sb.append(params.get(field.getFields())); | 
|                 } | 
|                 sb.append(wkOrderItem.getMatnrId() + wkOrderItem.getSplrBatch()); | 
|                 //获取16位uuid | 
|                 String uuid16 = Cools.md5Chinese(sb.toString()); | 
|                 wkOrderItem.setFieldsIndex(uuid16); | 
|                 params.put("index", uuid16); | 
|             } | 
|             //保存或更新动态字段值 | 
|             FieldsUtils.updateFieldsValue(params); | 
|         } catch (Exception e) { | 
|             throw new RuntimeException(e); | 
|         } | 
|         wkOrderItem.setUpdateBy(loginUserId).setCreateBy(loginUserId); | 
|         if (!this.saveOrUpdate(wkOrderItem)) { | 
|             throw new CoolException("收货通知单明细保存失败!!"); | 
|         } | 
|         return true; | 
|     } | 
|   | 
|     @Override | 
|     public IPage<Map<String, Object>> listByAsnId(PageParam<WkOrderItem, BaseParam> pageParam, QueryWrapper<WkOrderItem> buildWrapper) { | 
|         IPage<Map<String, Object>> hsahMap = this.baseMapper.resultForMap(pageParam, buildWrapper); | 
|         if (hsahMap.getRecords().isEmpty()) { | 
|             return hsahMap.setRecords(new ArrayList<>()); | 
|         } | 
|         hsahMap.setRecords(FieldsUtils.getExtendFields(hsahMap.getRecords())); | 
|         return hsahMap; | 
|     } | 
|   | 
| } |