skyouc
2025-03-13 cbb0dfaec496d441bbf4287ca8ae85c2776e50ed
#修改
1. 收货通知单明细模板修改
2. 收货通知单添加动态扩展字段
11个文件已修改
4个文件已添加
1个文件已删除
3 文件已重命名
469 ■■■■ 已修改文件
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ErpApiController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ReceiveMsgController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ReportMsgController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OrderParams.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReportMsgService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReportMsgServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/AsnOrderTemplate.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ErpApiController.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ReceiveMsgController.java
New file
@@ -0,0 +1,76 @@
package com.vincent.rsf.server.api.controller;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.api.controller.params.OrderParams;
import com.vincent.rsf.server.api.service.ReceiveMsgService;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author Ryan
 * @version 1.0
 * @title ErpApiController
 * @description
 * @create 2025/3/4 13:19
 */
@RestController
@RequestMapping("/erp")
@Api(tags = "ERP接口对接")
public class ReceiveMsgController extends BaseController {
    @Autowired
    private ReceiveMsgService receiveMsgService;
    /**
     * @author Ryan
     * @description 接收ERP推送的PO单据
     * @throws
     * @return
     * @time 2025/3/4 13:57
     */
    @ApiOperation(value = "接收同步ERP采购单")
    @PostMapping("/sync/purchase")
    public R syncPurchases(@RequestBody List<OrderParams> orders) {
        if (orders.isEmpty()) {
            return R.error("推送订单不能为空,请检查校验后再操作!!");
        }
        if (!receiveMsgService.syncPurchasee(orders)) {
            return R.error("保存失败");
        } else {
            return R.ok("保存成功!!");
        }
    }
    /**
     * @author Ryan
     * @description 同步质检结果信息
     * @param
     * @return
     * @time 2025/3/12 16:56
     */
    @ApiOperation("质检结果同步")
    @PostMapping("/sync/inspect")
    public void syncQlyInspect(HttpServletRequest request, HttpServletResponse response) {
        AsnOrderTemplate template = ExcelUtil.mockData(AsnOrderTemplate.class);
        List<AsnOrderTemplate> list = new ArrayList<>();
        list.add(template);
         ExcelUtil.build(ExcelUtil.create(list, AsnOrderTemplate.class), response);
        System.out.println(template);
//        return R.ok();
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/ReportMsgController.java
New file
@@ -0,0 +1,20 @@
package com.vincent.rsf.server.api.controller;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author Ryan
 * @version 1.0
 * @title ReportMsgController
 * @description
 * @create 2025/3/12 17:00
 */
@RestController
@RequestMapping("/report")
@Api(tags = "上报信息接口管理器")
public class ReportMsgController extends BaseController {
}
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/OrderParams.java
File was renamed from rsf-server/src/main/java/com/vincent/rsf/server/api/controller/params/Order.java
@@ -21,7 +21,7 @@
@Data
@Accessors(chain = true)
@ApiModel(value = "PurchaseOrder", description = "入库单据")
public class Order implements Serializable {
public class OrderParams implements Serializable {
    @ApiModelProperty(value = "单据编码")
    private String code;
rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
File was renamed from rsf-server/src/main/java/com/vincent/rsf/server/api/service/ErpApiService.java
@@ -1,7 +1,7 @@
package com.vincent.rsf.server.api.service;
import com.vincent.rsf.server.api.controller.params.Order;
import com.vincent.rsf.server.api.controller.params.OrderParams;
import com.vincent.rsf.server.api.entity.dto.PoItemsDto;
import java.util.List;
@@ -13,14 +13,14 @@
 * @description
 * @create 2025/3/4 16:23
 */
public interface ErpApiService {
public interface ReceiveMsgService {
    /**
     * 采购单同步
     * @param orders
     * @return
     */
    boolean syncPurchasee(List<Order> orders);
    boolean syncPurchasee(List<OrderParams> orders);
    /**
     * 一键报检
rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReportMsgService.java
New file
@@ -0,0 +1,12 @@
package com.vincent.rsf.server.api.service;
/**
 * @author Ryan
 * @version 1.0
 * @title ReportMsgService
 * @description
 * @create 2025/3/12 17:07
 */
public interface ReportMsgService {
}
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -20,6 +20,7 @@
import com.vincent.rsf.server.manager.service.WarehouseAreasItemService;
import com.vincent.rsf.server.manager.service.WarehouseAreasService;
import com.vincent.rsf.server.system.constant.CodeRes;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.controller.param.LoginParam;
import com.vincent.rsf.server.system.controller.result.LoginResult;
import com.vincent.rsf.server.system.entity.*;
@@ -174,7 +175,7 @@
                    .setAreaName(areasItem.getName())
                    .setAreaId(areasItem.getId())
                    .setStockUnit(dto.getStockUnit())
                    .setBatch(SerialRuleUtils.generateRuleCode("sys_receipt_batch", dto))
                    .setBatch(SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_RECEIPT_BATCH, dto))
                    .setAnfme(dto.getReceiptQty())
                    .setSplrBtch(dto.getSplrBatch())
                    .setMatnrCode(matnr.getCode())
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
File was renamed from rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ErpApiServiceImpl.java
@@ -19,9 +19,12 @@
import com.vincent.rsf.server.manager.service.PurchaseItemService;
import com.vincent.rsf.server.manager.service.PurchaseService;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.api.controller.params.Order;
import com.vincent.rsf.server.api.controller.params.OrderParams;
import com.vincent.rsf.server.system.entity.Fields;
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 com.vincent.rsf.server.api.service.ErpApiService;
import com.vincent.rsf.server.api.service.ReceiveMsgService;
import com.vincent.rsf.server.manager.entity.Purchase;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
@@ -48,16 +51,14 @@
 */
@Slf4j
@Service("erpApiService")
public class ErpApiServiceImpl implements ErpApiService {
public class ReceiveMsgServiceImpl implements ReceiveMsgService {
    @Autowired
    private PurchaseService purchaseService;
    @Autowired
    private PurchaseItemService purchaseItemService;
    @Autowired
    private AsnOrderService asnOrderService;
    @Autowired
    private AsnOrderItemService asnOrderItemService;
    @Autowired
@@ -66,10 +67,14 @@
    private RemotesInfoProperties remotesInfoProperties;
    @Autowired
    private RemotesInfoProperties.ApiInfo apiInfo;
    @Autowired
    private FieldsService fieldsService;
    @Autowired
    private FieldsItemService fieldsItemService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean syncPurchasee(List<Order> orders) {
    public boolean syncPurchasee(List<OrderParams> orders) {
        if (orders.isEmpty()) {
            throw new CoolException("单据内容不能为空!!");
        }
@@ -82,12 +87,22 @@
            if (!purchaseService.save(purchase)) {
                throw new CoolException("采购单据保存失败");
            }
            //查询扩展字段是否存在
            List<Fields> fields = fieldsService.list(new LambdaQueryWrapper<Fields>().eq(Fields::getStatus, 1).eq(Fields::getFlagEnable, 1));
            //判断子列表不为空
            if (!ors.getChildren().isEmpty()) {
                ArrayList<PurchaseItem> list = new ArrayList<>();
                ors.getChildren().forEach(orderItem -> {
                    PurchaseItem item = new PurchaseItem();
                    BeanUtils.copyProperties(orderItem, item);
//                    if (!fields.isEmpty()) {
//                        List<String> fieldValue = fields.stream().map(Fields::getFields).collect(Collectors.toList());
//                        fieldValue.forEach(value -> {
//
//                        });
//                    }
                    item.setPurchaseId(purchase.getId());
                    list.add(item);
                });
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReportMsgServiceImpl.java
New file
@@ -0,0 +1,16 @@
package com.vincent.rsf.server.api.service.impl;
import com.vincent.rsf.server.api.service.ReportMsgService;
import org.springframework.stereotype.Service;
/**
 * @author Ryan
 * @version 1.0
 * @title ReportMsgServiceImpl
 * @description
 * @create 2025/3/12 17:08
 */
@Service
public class ReportMsgServiceImpl implements ReportMsgService {
}
rsf-server/src/main/java/com/vincent/rsf/server/common/utils/ExcelUtil.java
@@ -1,8 +1,12 @@
package com.vincent.rsf.server.common.utils;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelComment;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
@@ -20,6 +24,7 @@
/**
 * Created by vincent on 2/17/2024
 */
@Slf4j
public class ExcelUtil {
    public static void build(Workbook workbook, HttpServletResponse response) {
@@ -33,6 +38,10 @@
    }
    public static <T> Workbook create(List<T> list, Class<T> clz) {
        return  create(list, clz, false);
    }
    public static <T> Workbook create(List<T> list, Class<T> clz, boolean flagTemplate) {
        HSSFWorkbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet(clz.getSimpleName());
@@ -46,6 +55,15 @@
                continue;
            }
            String memo = "Undefined";
            if (flagTemplate) {
                if (field.isAnnotationPresent(ExcelComment.class)) {
                    memo = field.getAnnotation(ExcelComment.class).value();
                }
            } else {
                if (field.isAnnotationPresent(Excel.class)) {
                    memo = field.getAnnotation(Excel.class).name();
                }
            }
            if (field.isAnnotationPresent(ApiModelProperty.class)) {
                memo = field.getAnnotation(ApiModelProperty.class).value();
            }
@@ -102,4 +120,81 @@
        return params;
    }
    /**
     * 根据 {@code tClass} 相关成员变量的 {@link ExcelComment#example()} 字段创建模拟数据,暂不支持 复杂类型
     * @param tClass
     * @return
     */
    public static <T> T mockData(Class<T> tClass) {
        if (tClass == null) {
            return null;
        }
        T instance = null;
        try {
            instance = tClass.newInstance();
            Field[] declaredFields = tClass.getDeclaredFields();
            for (Field declaredField : declaredFields) {
                ExcelComment comment = declaredField.getAnnotation(ExcelComment.class);
                if (comment == null) {
                    continue;
                }
                declaredField.setAccessible(true);
                Class<?> fieldType = declaredField.getType();
                String exampleValue = comment.example();
                Object value = null;
                if (fieldType == int.class || fieldType == Integer.class) {
                    value = StringUtils.isBlank(exampleValue) ? 0 : Integer.parseInt(exampleValue);
                } else if (fieldType == short.class || fieldType == Short.class) {
                    value = StringUtils.isBlank(exampleValue) ? 0 : Short.parseShort(exampleValue);
                } else if (fieldType == long.class || fieldType == Long.class) {
                    value = StringUtils.isBlank(exampleValue) ? 0 : Long.parseLong(exampleValue);
                } else if (fieldType == double.class || fieldType == Double.class) {
                    value = StringUtils.isBlank(exampleValue) ? 0 : Double.parseDouble(exampleValue);
                } else if (fieldType == boolean.class || fieldType == Boolean.class) {
                    value = StringUtils.isNotBlank(exampleValue) && Boolean.parseBoolean(exampleValue);
                } else if (fieldType == String.class) {
                    value = exampleValue;
                } else if (fieldType == Date.class) {
                    value = DateUtils.parse(exampleValue);
                }
                if (value == null && !isBaseType(fieldType)) {
                    declaredField.set(instance, null);
                } else {
                    declaredField.set(instance, value);
                }
            }
        } catch (Exception e) {
            log.error("数据构造失败,请查询详细信息", e);
            return instance;
        }
        return instance;
    }
    /**
     * 是否是基础数据类型
     *
     * @param className
     * @return
     */
    private static boolean isBaseType(Class<?> className) {
        if (className.equals(java.lang.Integer.class) ||
                className.equals(java.lang.Byte.class) ||
                className.equals(java.lang.Long.class) ||
                className.equals(java.lang.Double.class) ||
                className.equals(java.lang.Float.class) ||
                className.equals(java.lang.Character.class) ||
                className.equals(java.lang.Short.class) ||
                className.equals(java.lang.Boolean.class)) {
            return true;
        }
        return false;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
@@ -12,7 +12,9 @@
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.manager.service.AsnOrderService;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.controller.BaseController;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -64,6 +66,10 @@
    public R save(@RequestBody AsnOrder asnOrder) {
        asnOrder.setCreateBy(getLoginUserId());
        asnOrder.setUpdateBy(getLoginUserId());
        String code = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, asnOrder);
        if (!Objects.isNull(code)) {
            asnOrder.setCode(code);
        }
        if (!asnOrderService.save(asnOrder)) {
            return R.error("Save Fail");
        }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderItemController.java
@@ -1,10 +1,13 @@
package com.vincent.rsf.server.manager.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.common.utils.CommonUtil;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.common.annotation.OperationLog;
import com.vincent.rsf.server.common.domain.BaseParam;
@@ -12,9 +15,15 @@
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.controller.params.AsnOrderItemParams;
import com.vincent.rsf.server.manager.entity.AsnOrderItem;
import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.vincent.rsf.server.system.controller.BaseController;
import com.vincent.rsf.server.system.entity.Fields;
import com.vincent.rsf.server.system.entity.FieldsItem;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -24,7 +33,9 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
@Api(tags = "ASN单明细")
@RestController
public class AsnOrderItemController extends BaseController {
@@ -60,17 +71,21 @@
    @PreAuthorize("hasAuthority('manager:asnOrderItem:save')")
    @OperationLog("Create ASN单据")
    @PostMapping("/asnOrderItem/save")
    public R save(@RequestBody AsnOrderItem asnOrderItem) {
        asnOrderItem.setCreateBy(getLoginUserId());
        asnOrderItem.setUpdateBy(getLoginUserId());
        String code = SerialRuleUtils.generateRuleCode("sys_ans_order", asnOrderItem);
        if (!Objects.isNull(code)) {
            asnOrderItem.setAsnCode(code);
    public R save(@RequestBody Map<String, Object> params) {
        if (Objects.isNull(params)) {
            throw new CoolException("信息不能为空!!");
        }
        if (!asnOrderItemService.save(asnOrderItem)) {
        params.put("createBy", getLoginUserId());
        params.put("updateBy", getLoginUser());
        if (!asnOrderItemService.fieldsSave(params)) {
            return R.error("Save Fail");
        }
        return R.ok("Save Success").add(asnOrderItem);
        return R.ok("Save Success");
    }
    @PreAuthorize("hasAuthority('manager:asnOrderItem:update')")
@@ -111,8 +126,12 @@
    @PreAuthorize("hasAuthority('manager:asnOrderItem:list')")
    @PostMapping("/asnOrderItem/export")
    @ApiOperation("收货通知单明细")
    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
        ExcelUtil.build(ExcelUtil.create(asnOrderItemService.list(), AsnOrderItem.class), response);
        AsnOrderTemplate template = ExcelUtil.mockData(AsnOrderTemplate.class);
        List<AsnOrderTemplate> list = new ArrayList<>();
        list.add(template);
        ExcelUtil.build(ExcelUtil.create(list, AsnOrderTemplate.class, true), response);
    }
    /**
@@ -123,13 +142,13 @@
    @PostMapping("/asnOrder/import")
    @ApiOperation("ASN导入接口")
    @PreAuthorize("hasAuthority('manager:asnOrder:update')")
    public R importExcel(@RequestParam(value = "file") MultipartFile file, HttpServletRequest request) throws Exception {
    public R importExcel(@RequestParam(value = "file") MultipartFile file, @RequestParam String asnId) throws Exception {
        if (Objects.isNull(file)) {
            throw new CoolException("文件不能为空!!");
        }
        HashMap<String, Object> hashMap = new HashMap<>();
        if (!Objects.isNull(request.getParameter("asnId"))) {
            hashMap.put("asnId", request.getParameter("asnId"));
        if (!Objects.isNull(asnId)) {
            hashMap.put("asnId", asnId);
        }
        return asnOrderItemService.excelImport(file, hashMap);
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
@@ -1,15 +1,13 @@
package com.vincent.rsf.server.manager.entity;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.vincent.rsf.framework.common.Cools;
@@ -17,6 +15,7 @@
import com.vincent.rsf.server.system.service.UserService;
import com.vincent.rsf.server.system.entity.User;
import java.io.Serializable;
import java.util.Map;
@Data
@Accessors(chain = true)
@@ -45,6 +44,13 @@
    private String platItemId;
    /**
     * 扩展字段
     */
    @ApiModelProperty("扩展字段")
    @TableField(exist = false)
    private Map<String, String> extendFields;
    /**
     * 字段索引
     */
    @ApiModelProperty("字段索引")
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/AsnOrderTemplate.java
@@ -5,6 +5,8 @@
import cn.afterturn.easypoi.handler.inter.IExcelModel;
import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelAutoColumnSize;
import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelComment;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -27,61 +29,60 @@
public class AsnOrderTemplate implements IExcelModel, IExcelDataModel, Serializable {
    @Excel(name = "行号")
    @ExcelComment(example = "1357564255478")
    @ExcelComment(value = "platItemId", example = "1357564255478")
    private String platItemId;
    @Excel(name = "物料名称")
    @ExcelComment(example = "物料名称")
    @ExcelComment(value = "matnk",example = "物料名称")
    private String matnk;
    @Excel(name = "数量")
    @ExcelComment(example = "25")
    @ExcelComment(value = "anfme",example = "25")
    private Double anfme;
    @Excel(name = "库存单位")
    @ExcelComment(example = "个")
    @ExcelComment(value = "stockUnit",example = "个")
    private String stockUnit;
    @Excel(name = "采购数量")
    @ExcelComment(example = "25")
    @ExcelComment(value = "purQty",example = "25")
    private Double purQty;
    @Excel(name = "采购单位")
    @ExcelComment(example = "个")
    @ExcelComment(value = "purUnit",example = "个")
    private String purUnit;
    @Excel(name = "已完成数量")
    @ExcelComment(example = "25")
    @ExcelComment(value = "qty",example = "25")
    private Double qty;
    @Excel(name = "供应商编码")
    @ExcelComment(example = "3654821")
    @ExcelComment(value = "splrCode",example = "3654821")
    private String splrCode;
    @Excel(name = "供应商名称")
    @ExcelComment(example = "浙江中扬技术公司")
    @ExcelComment(value = "splrName",example = "浙江中扬技术公司")
    private String splrName;
    @Excel(name = "供应商批次")
    @ExcelComment(example = "25251212")
    @ExcelComment(value = "splrBatch",example = "25251212")
    private String splrBatch;
    @Excel(name = "二维码")
    @ExcelComment(example = "")
    @ExcelComment(value = "qrcode",example = "")
    private String qrcode;
    @Excel(name = "条形码")
    @ExcelComment(example = "2354788")
    @ExcelComment(value = "barcode",example = "2354788")
    private String barcode;
    @Excel(name = "包装名称")
    @ExcelComment(example = "箱")
    @ExcelComment(value = "packName",example = "箱")
    private String packName;
    @Excel(name = "备注")
    @ExcelComment(example = "注:易碎品,轻拿放")
    @ExcelComment(value = "memo",example = "注:易碎品,轻拿放")
    private String memo;
    private Integer rowNum;
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderItemService.java
@@ -8,8 +8,11 @@
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public interface AsnOrderItemService extends IService<AsnOrderItem> {
    R excelImport(MultipartFile file, HashMap<String, Object> hashMap) throws Exception;
    boolean fieldsSave(Map<String, Object> params);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
@@ -2,9 +2,11 @@
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.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.common.utils.CommonUtil;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
@@ -14,17 +16,19 @@
import com.vincent.rsf.server.manager.mapper.AsnOrderMapper;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.server.system.entity.Fields;
import com.vincent.rsf.server.system.entity.FieldsItem;
import com.vincent.rsf.server.system.service.FieldsItemService;
import com.vincent.rsf.server.system.service.FieldsService;
import org.springframework.beans.BeanUtils;
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 javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.*;
@Service("asnOrderItemService")
public class AsnOrderItemServiceImpl extends ServiceImpl<AsnOrderItemMapper, AsnOrderItem> implements AsnOrderItemService {
@@ -32,10 +36,14 @@
    @Resource
    private AsnOrderMapper asnOrderMapper;
    @Autowired
    private FieldsService fieldsService;
    @Autowired
    private FieldsItemService fieldsItemService;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R excelImport(MultipartFile file, HashMap<String, Object> hashMap) throws Exception {
        ExcelImportResult<AsnOrderTemplate> result = ExcelImportUtil.importExcelMore(file.getInputStream(), MatnrsTemplate.class, ExcelUtil.getDefaultImportParams());
        if (result.getList().isEmpty()) {
            throw new CoolException("物料导入失败!!");
@@ -43,7 +51,6 @@
        if (!Objects.isNull(hashMap.get("asnId"))) {
            throw new CoolException("主单ID为空,无法操作!!");
        }
        AsnOrder order = asnOrderMapper.selectOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, hashMap.get("asnId")));
        if (Objects.isNull(order)) {
            throw new CoolException("ASN单据不存在!!");
@@ -61,4 +68,31 @@
        }
        return R.ok("操作成功!!");
    }
    @Override
    public boolean fieldsSave(Map<String, Object> params) {
        List<Fields> fields = fieldsService.list(new LambdaQueryWrapper<Fields>().eq(Fields::getStatus, 1).eq(Fields::getFlagEnable, 1));
        List<FieldsItem> fieldsItems = new ArrayList<>();
        if (!fields.isEmpty()) {
            String uuid16 = CommonUtil.randomUUID16();
            for (Fields obj : fields) {
                if (!Objects.isNull(params.get(obj.getFields()))) {
                    FieldsItem item = new FieldsItem();
                    item.setUuid(uuid16)
                            .setValue(params.get(obj.getFields()).toString())
                            .setMatnrId(Long.parseLong(params.get("matnrId").toString()))
                            .setFieldsId(obj.getId());
                    fieldsItems.add(item);
                }
            }
            if (!fieldsItemService.saveBatch(fieldsItems)) {
                throw new CoolException("单据明细扩展字段保存失败!!");
            }
        }
        AsnOrderItem asnOrderItem = JSONObject.parseObject(JSONObject.toJSONString(params), AsnOrderItem.class);
        if (!this.save(asnOrderItem)) {
            throw new CoolException("收货通知单明细保存失败!!");
        }
        return true;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
@@ -1,12 +1,8 @@
package com.vincent.rsf.server.manager.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.api.entity.dto.PoItemsDto;
import com.vincent.rsf.server.api.service.ErpApiService;
import com.vincent.rsf.server.manager.entity.AsnOrderItem;
import com.vincent.rsf.server.manager.entity.Purchase;
import com.vincent.rsf.server.manager.entity.PurchaseItem;
import com.vincent.rsf.server.api.service.ReceiveMsgService;
import com.vincent.rsf.server.manager.mapper.AsnOrderItemMapper;
import com.vincent.rsf.server.manager.mapper.AsnOrderMapper;
import com.vincent.rsf.server.manager.entity.AsnOrder;
@@ -32,7 +28,7 @@
public class AsnOrderServiceImpl extends ServiceImpl<AsnOrderMapper, AsnOrder> implements AsnOrderService {
    @Autowired
    private ErpApiService erpApiService;
    private ReceiveMsgService receiveMsgService;
    @Resource
    private PurchaseMapper purchaseMapper;
@@ -49,7 +45,7 @@
            throw new CoolException("ASN单据不能为空!!");
        }
        List<PoItemsDto> items = purchaseMapper.poList(asnIds);
        if (erpApiService.reportInspectNotify(items)) {
        if (receiveMsgService.reportInspectNotify(items)) {
            return true;
        } else {
            return false;
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
@@ -18,4 +18,9 @@
     * ASN通知单生成编码规则
     */
    public final static String SYS_ASN_ORDER = "sys_ans_order";
    /**
     * 收货批次规则
     */
    public final static String SYS_RECEIPT_BATCH = "sys_receipt_batch";
}
rsf-server/src/main/resources/application-dev.yml
@@ -76,7 +76,7 @@
    #端口号
    port: 8080
    #接品链接前缀
    prePath: rsf-server
    pre-path: rsf-server
    #接口明细
    api:
      #质检上报接口