skyouc
2025-04-18 1d71e8d6e37f7e992c9db9a77b9be86cb240afa1
#修改
1. 收货通知单导入报错问题修复
8个文件已修改
215 ■■■■ 已修改文件
rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderWorkType.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/AsnOrderTemplate.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java 107 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx
@@ -45,7 +45,6 @@
import PageDrawer from "../../components/PageDrawer";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE } from '@/config/setting';
import AsnOrderItemEdit from "./AsnOrderItemEdit";
import QrCodeIcon from "@mui/icons-material/QrCode";
import ImportButton from "../../components/ImportButton";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
@@ -65,7 +64,6 @@
const filters = [
  <SearchInput source="condition" alwaysOn />,
  <NumberInput source="asnId" label="table.field.asnOrderItem.asnId" />,
  <TextInput source="asnCode" label="table.field.asnOrderItem.asnCode" />,
  <TextInput source="poDetlId" label="table.field.asnOrderItem.poDetlId" />,
@@ -82,7 +80,6 @@
  <TextInput source="qrcode" label="table.field.asnOrderItem.qrcode" />,
  <TextInput source="trackCode" label="table.field.asnOrderItem.barcode" />,
  <TextInput source="packName" label="table.field.asnOrderItem.packName" />,
  <TextInput label="common.field.memo" source="memo" />,
  <SelectInput
    label="common.field.status"
@@ -127,7 +124,7 @@
              <FilterButton />
              <MyCreateButton onClick={() => { setCreateDialog(true) }} />
              <SelectColumnsButton preferenceKey='asnOrderItem' />
              <ImportButton value={'asnOrder'} parmas={{ asnId: asnId }} />
              <ImportButton value={'asnOrderItem'} parmas={{ asnId: asnId }} />
              <MyExportButton />
            </TopToolbar>
          )}
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderType.java
@@ -25,4 +25,19 @@
    public String type;
    public String desc;
    public static String getTypeVal(String desc) {
        if (desc.equals(OrderType.ORDER_IN.desc)) {
            return OrderType.ORDER_IN.type;
        } else if (desc.equals(OrderType.ORDER_OUT.desc)) {
            return OrderType.ORDER_OUT.type;
        } else if (desc.equals(OrderType.ORDER_PLAT_IN.desc)) {
            return OrderType.ORDER_PLAT_IN.type;
        } else if (desc.equals(OrderType.ORDER_RECEIPT.desc)) {
            return OrderType.ORDER_RECEIPT.type;
        } else if (desc.equals(OrderType.ORDER_PURCHASE_IN.desc)) {
            return OrderType.ORDER_PURCHASE_IN.type;
        }
        return null;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/OrderWorkType.java
@@ -9,13 +9,13 @@
 */
public enum OrderWorkType {
    //订单类型
    ORDER_PURCHASE_IN("purchase", "采购单"),
    ORDER_PROD_IN("prod", "生产领料单"),
    ORDER_DONE_IN("done", "完工入料单"),
    ORDER_SALE_IN("sale", "销售订单"),
    ORDER_PROD_BACK_IN("prod back", "生产退料单"),
    ORDER_SPLR_BACK_OUT("supplier back", "供应商出货单"),
    ORDER_SALE_BACK_IN("sale back", "销售退货单")
    ORDER_WORK_TYPE_DONE_IN("1", "完工入库单"),
    ORDER_WORK_TYPE_PROD("2", "生产领料单"),
    ORDER_WORK_TYPE_PURCHASE("3", "外购收货"),
    ORDER_WORK_TYPE_SALE("4", "销售订单"),
    ORDER_WORK_TYPE_RETURN("5", "生产退料单"),
    ORDER_WORK_TYPE_SUPPLIER("6", "退货供应商出货单"),
    ORDER_WORK_TYPE_RETURN_ORDER("7", "销售退货入库单")
    ;
    OrderWorkType(String type, String desc) {
@@ -26,4 +26,24 @@
    public String type;
    public String desc;
    public static String getWorkType(String desc) {
            if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_DONE_IN.desc)) {
                return OrderWorkType.ORDER_WORK_TYPE_DONE_IN.type;
            } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_PROD.desc)) {
                return OrderWorkType.ORDER_WORK_TYPE_PROD.type;
            } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_PURCHASE.desc)) {
                return OrderWorkType.ORDER_WORK_TYPE_PURCHASE.type;
            } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SALE.desc)) {
                return OrderWorkType.ORDER_WORK_TYPE_SALE.type;
            } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_RETURN.desc)) {
                return OrderWorkType.ORDER_WORK_TYPE_RETURN.type;
            } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SUPPLIER.desc)) {
                return OrderWorkType.ORDER_WORK_TYPE_SUPPLIER.type;
            }else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_RETURN_ORDER.desc)) {
                return OrderWorkType.ORDER_WORK_TYPE_RETURN_ORDER.type;
            }
            return null;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -355,7 +355,7 @@
     */
    @Override
    public List<AsnOrder> getAllAsnOrders() {
        List<AsnOrder> asnOrders = asnOrderMapper.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getWkType, OrderWorkType.ORDER_PURCHASE_IN.type));
        List<AsnOrder> asnOrders = asnOrderMapper.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getWkType, OrderWorkType.ORDER_WORK_TYPE_PURCHASE.type));
        return asnOrders;
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
@@ -176,12 +176,23 @@
            R.error("文件不能为空!!");
        }
        HashMap<String, Object> hashMap = new HashMap<>();
        if (!Objects.isNull(asnId)) {
            hashMap.put("asnId", asnId);
        }
        return asnOrderItemService.excelImport(file, hashMap);
        return asnOrderItemService.excelImport(file, hashMap, getLoginUserId());
    }
    /**
     * @author Ryan
     * @description 下载模板
     * @param
     * @return
     * @time 2025/4/18 08:17
     */
    @PostMapping("/asnOrderItem/template/download")
    @ApiOperation("下载收货单模板")
    @PreAuthorize("hasAuthority('manager:asnOrderItem:update')")
    public void downloadTemplate(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
        AsnOrderTemplate template = ExcelUtil.mockData(AsnOrderTemplate.class);
        List<AsnOrderTemplate> list = Arrays.asList(template);
        ExcelUtil.build(ExcelUtil.create(list, AsnOrderTemplate.class, true), response);
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/AsnOrderTemplate.java
@@ -45,7 +45,7 @@
    @Excel(name = "PO单据标识")
    @ApiModelProperty(value= "PO单据标识")
    @ExcelComment(value = "poId", example = "123456698")
    private Long poId;
    private String poId;
    /**
     * 单据类型
@@ -59,30 +59,35 @@
     * 业务类型
     */
    @Excel(name = "业务类型")
    @ApiModelProperty("业务类型")
    @ApiModelProperty(value= "业务类型")
    @ExcelComment(value = "wkType", example = "生产入库")
    private String wkType;
    @Excel(name = "执行状态")
    @ApiModelProperty("执行状态")
    @ExcelComment(value = "exceStatus", example = "未执行")
    private Short exceStatus;
    @ApiModelProperty(value= "执行状态")
    @ExcelComment(value = "exceStatus", example = "1")
    private String exceStatus;
    @Excel(name = "行号")
    @ExcelComment(value = "platItemId", example = "1357564255478")
    @ApiModelProperty("行号")
    @ExcelComment(value = "platItemId", example = "1357564255478")
    private String platItemId;
    @Excel(name = "物料名称")
    @ApiModelProperty("物料名称")
    @ExcelComment(value = "matnk",example = "物料名称")
    private String matnk;
    @ExcelComment(value = "maktx",example = "物料名称")
    private String maktx;
    @Excel(name = "物料编码")
    @ApiModelProperty("物料编码")
    @ExcelComment(value = "matnrCode",example = "物料编码")
    private String matnrCode;
    @Excel(name = "数量")
    @ApiModelProperty("数量")
    @ExcelComment(value = "anfme",example = "25")
    private Double anfme;
    private String anfme;
    @Excel(name = "库存单位")
    @ApiModelProperty("库存单位")
@@ -92,7 +97,7 @@
    @Excel(name = "采购数量")
    @ApiModelProperty("采购数量")
    @ExcelComment(value = "purQty",example = "25")
    private Double purQty;
    private String purQty;
    @Excel(name = "采购单位")
    @ApiModelProperty("采购单位")
@@ -102,7 +107,7 @@
    @Excel(name = "已完成数量")
    @ApiModelProperty("已完成数量")
    @ExcelComment(value = "qty",example = "25")
    private Double qty;
    private String qty;
    @Excel(name = "供应商编码")
    @ApiModelProperty("供应商编码")
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java
@@ -6,8 +6,6 @@
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.common.domain.BaseParam;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.controller.params.BatchUpdateParam;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.manager.entity.AsnOrderItem;
import org.springframework.web.multipart.MultipartFile;
@@ -18,7 +16,7 @@
public interface AsnOrderItemService extends IService<AsnOrderItem> {
    R excelImport(MultipartFile file, HashMap<String, Object> hashMap) throws Exception;
    R excelImport(MultipartFile file, HashMap<String, Object> hashMap, Long loginUserId) throws Exception;
    boolean fieldsSave(Map<String, Object> params);
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
@@ -9,30 +9,27 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.api.entity.dto.PoItemsDto;
import com.vincent.rsf.server.api.service.ReportMsgService;
import com.vincent.rsf.server.api.entity.enums.OrderType;
import com.vincent.rsf.server.api.entity.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.CommonUtil;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.common.utils.FieldsUtils;
import com.vincent.rsf.server.manager.controller.params.BatchUpdateParam;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.manager.entity.Matnr;
import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
import com.vincent.rsf.server.manager.mapper.AsnOrderItemMapper;
import com.vincent.rsf.server.manager.entity.AsnOrderItem;
import com.vincent.rsf.server.manager.mapper.AsnOrderMapper;
import com.vincent.rsf.server.manager.mapper.PurchaseMapper;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.server.manager.service.PurchaseService;
import com.vincent.rsf.server.manager.service.AsnOrderService;
import com.vincent.rsf.server.manager.service.MatnrService;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.service.FieldsItemService;
import com.vincent.rsf.server.system.service.FieldsService;
import com.vincent.rsf.server.system.utils.ExtendFieldsUtils;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -45,14 +42,19 @@
@Service("asnOrderItemService")
public class AsnOrderItemServiceImpl extends ServiceImpl<AsnOrderItemMapper, AsnOrderItem> implements AsnOrderItemService {
    @Resource
    private AsnOrderMapper asnOrderMapper;
    @Autowired
    private AsnOrderService asnOrderMapper;
    @Autowired
    private FieldsService fieldsService;
    @Autowired
    private FieldsItemService fieldsItemService;
    @Autowired
    private MatnrService matnrService;
    @Autowired
    private AsnOrderItemService asnOrderItemService;
    @Override
    public R generateBarcode(List<Long> orders) {
@@ -79,46 +81,89 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R excelImport(MultipartFile file, HashMap<String, Object> hashMap) throws Exception {
    public 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("物料导入失败!!");
        }
        if (!Objects.isNull(hashMap.get("asnId"))) {
            throw new CoolException("主单ID为空,无法操作!!");
        if (result.getList().isEmpty()) {
            throw new CoolException("表格内容不能为空!!");
        }
        AsnOrder order = asnOrderMapper.selectOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, hashMap.get("asnId")));
        if (Objects.isNull(order)) {
            throw new CoolException("ASN单据不存在!!");
        List<AsnOrderTemplate> resultList = result.getList();
        Map<String, List<AsnOrderTemplate>> listMap = resultList.stream().collect(Collectors.groupingBy(AsnOrderTemplate::getCode));
        for (String key : listMap.keySet()) {
            AsnOrderTemplate template = listMap.get(key).stream().findFirst().get();
            AsnOrder asnOrder = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, template.getCode()));
            if (Objects.isNull(asnOrder)) {
                continue;
            }
            AsnOrder order = new AsnOrder();
            order.setCode(template.getCode())
                    .setPoCode(template.getPoCode())
                    .setMemo(template.getMemo())
                    .setUpdateBy(loginUserId)
                    .setCreateBy(loginUserId)
                    .setPoId(Long.parseLong(template.getPoId()))
                    .setType(OrderType.getTypeVal(template.getType()))
                    .setWkType(OrderWorkType.getWorkType(template.getWkType()));
            if (!asnOrderMapper.save(order)) {
                throw new CoolException("单据保存失败!!");
            }
            List<AsnOrderItem> items = new ArrayList<>();
            for (AsnOrderTemplate orderTemplate : listMap.get(key)) {
                AsnOrderItem orderItem = new AsnOrderItem();
                Matnr matnr = null;
                if (!Objects.isNull(orderTemplate.getMatnrCode()) || StringUtils.isNotBlank(orderTemplate.getMatnrCode())) {
                    matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>()
                            .eq(Matnr::getCode, orderTemplate.getMatnrCode()));
                }
                orderItem.setAsnId(order.getId())
                        .setAsnCode(order.getCode())
                        .setSplrBatch(orderTemplate.getSplrBatch())
                        .setAnfme(Double.parseDouble(orderTemplate.getAnfme()))
                        .setQty(Double.parseDouble(orderTemplate.getQty()))
                        .setSplrName(orderTemplate.getSplrName())
                        .setSplrCode(orderTemplate.getSplrCode())
                        .setPoCode(orderTemplate.getPoCode())
                        .setMaktx(orderTemplate.getMaktx())
                        .setMatnrCode(orderTemplate.getMatnrCode())
                        .setPurUnit(orderTemplate.getPurUnit())
                        .setPurQty(Double.parseDouble(orderTemplate.getPurQty()));
                if (!Objects.isNull(matnr)) {
                    orderItem.setMaktx(matnr.getName()).setMatnrCode(matnr.getCode()).setMatnrId(matnr.getId());
                }
                items.add(orderItem);
                if (!asnOrderItemService.saveBatch(items)) {
                    throw new CoolException("单据明细保存失败!!");
                }
            }
            if (!items.isEmpty()) {
                double qty = items.stream().mapToDouble(AsnOrderItem::getQty).sum();
                double purQty = items.stream().mapToDouble(AsnOrderItem::getPurQty).sum();
                if (!asnOrderMapper.update(new LambdaUpdateWrapper<AsnOrder>().set(AsnOrder::getQty, qty).set(AsnOrder::getAnfme, purQty).eq(AsnOrder::getId, order.getId()))) {
                    throw new CoolException("单据数量修改失败!!");
                }
            }
        }
        List<AsnOrderItem> itemList = new ArrayList<>();
        result.getList().forEach(template -> {
            AsnOrderItem orderItem = new AsnOrderItem();
            BeanUtils.copyProperties(template, orderItem);
            orderItem.setAsnId(order.getId())
                    .setAsnCode(order.getCode());
            itemList.add(orderItem);
        });
        if (!this.saveBatch(itemList)) {
            throw new CoolException("保存失败!!");
        }
        return R.ok("操作成功!!");
    }
    /**
     * @author Ryan
     * @description ASN明细单据保存,及扩展字段保存
     * @param
     * @return
     * @author Ryan
     * @description ASN明细单据保存,及扩展字段保存
     * @time 2025/4/7 09:59
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean fieldsSave(Map<String, Object> params){
    public boolean fieldsSave(Map<String, Object> params) {
        AsnOrderItem asnOrderItem = JSONObject.parseObject(JSONObject.toJSONString(params), AsnOrderItem.class);
        if (StringUtils.isBlank(asnOrderItem.getTrackCode())) {
            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, asnOrderItem);
            asnOrderItem.setTrackCode(ruleCode).setBarcode(ruleCode);;
            asnOrderItem.setTrackCode(ruleCode).setBarcode(ruleCode);
            ;
        }
        if (Objects.isNull(asnOrderItem.getAnfme()) || Double.compare(asnOrderItem.getAnfme(), 0.0) <= 0) {
            throw new CoolException("计划收货数不能为空!!");