skyouc
7 天以前 b67bf724fc788cb3b86641c7eb7a35cdbc4c7a93
PO单导入功能优化
11个文件已修改
164 ■■■■ 已修改文件
rsf-admin/src/App.jsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/ImportModal.jsx 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/purchase/PurchaseItemList.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/purchase/PurchaseList.jsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CompanysController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/App.jsx
@@ -44,9 +44,12 @@
  [
    { locale: "en", name: "English" },
    { locale: "zh", name: "简体中文" },
    // { locale: "zh", name: "简体中文" },
    // { locale: "zh", name: "简体中文" },
    // { locale: "zh", name: "简体中文" },
    { locale: "jp", name: "日本語" },
    { locale: "kr", name: "한국인" },
    { locale: "ru", name: "Russian" },
    { locale: "lk", name: "Русский" },
    { locale: "es", name: "Española" },
  ],
  {
    // msg in console
rsf-admin/src/page/components/ImportModal.jsx
@@ -62,7 +62,9 @@
            notify(msg);
            refresh()
        } else {
            handleClose()
            notify(msg);
            refresh()
        }
    };
rsf-admin/src/page/orders/purchase/PurchaseItemList.jsx
@@ -117,7 +117,7 @@
              setSelect(record)
              setEditDialog(true)
            }}
            omit={['id', 'createTime', 'purchaseId', 'platItemId', 'createBy', 'memo']}
            omit={['id', 'createTime', 'purchaseId', 'platItemId','asnQty', 'printQty',  'createBy', 'memo']}
          >
            <NumberField source="id" />
            <NumberField source="purchaseId" label="table.field.purchaseItem.purchaseId" />
rsf-admin/src/page/orders/purchase/PurchaseList.jsx
@@ -106,7 +106,7 @@
          marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
        }}
        title={"menu.purchase"}
        empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
        empty={false}
        filters={filters}
        sort={{ field: "create_time", order: "desc" }}
        actions={(
@@ -122,11 +122,11 @@
      >
        <StyledDatagrid
          preferenceKey='purchase'
          bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
          bulkActionButtons={() => <BulkDeleteButton mutationMode="pessimistic"/>}
          rowClick={'edit'}
          expand={false}
          expandSingle={true}
          omit={['id', 'createTime', 'createBy', 'memo', 'preArr', 'channel','startTime','workQty', 'endTime']}
          omit={['id', 'createTime', 'createBy','channel', 'platCode', 'memo', 'preArr', 'channel','startTime','workQty', 'endTime']}
        >
          <NumberField source="id" />
          <TextField source="code" label="table.field.purchase.code" />
@@ -136,7 +136,7 @@
          <DateField source="preArr" label="table.field.purchase.preArr" showTime />
          <NumberField source="anfme" label="table.field.purchase.anfme" />
          <NumberField source="qty" label="table.field.purchase.qty" />
          <NumberField source="workQty" label="table.field.purchase.workQty" />
          {/* <NumberField source="workQty" label="table.field.purchase.workQty" /> */}
          <TextField source="channel" label="table.field.purchase.channel" />
          <TextField source="platCode" label="table.field.purchase.platCode" />
          <DateField source="startTime" label="table.field.purchase.startTime" showTime />
@@ -150,7 +150,7 @@
          <TextField source="memo" label="common.field.memo" sortable={false} />
          <WrapperField cellClassName="opt" label="common.field.opt">
            <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode="pessimistic"/>
          </WrapperField>
        </StyledDatagrid>
      </List>
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CompanysController.java
@@ -13,8 +13,11 @@
import com.vincent.rsf.server.manager.entity.Companys;
import com.vincent.rsf.server.manager.entity.Warehouse;
import com.vincent.rsf.server.manager.service.CompanysService;
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 org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@@ -85,6 +88,13 @@
        companys.setCreateBy(getLoginUserId());
        companys.setUpdateBy(getLoginUserId());
        if (StringUtils.isNotBlank(companys.getCode())) {
            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_COMPANYS_CODE, companys);
            if (StringUtils.isBlank(ruleCode)) {
                throw new CoolException("编码规则错误:请检查「SYS_COMPANYS_CODE」是否设置完成!!");
            }
            companys.setCode(ruleCode);
        }
        if (!companysService.save(companys)) {
            return R.error("Save Fail");
        }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/PurchaseController.java
@@ -11,7 +11,9 @@
import com.vincent.rsf.server.common.domain.PageParam;
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.manager.service.AsnOrderItemService;
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.system.controller.BaseController;
@@ -33,6 +35,9 @@
    @Autowired
    private AsnOrderItemService asnOrderItemService;
    @Autowired
    private PurchaseItemService purchaseItemService;
    @PreAuthorize("hasAuthority('manager:purchase:list')")
    @PostMapping("/purchase/page")
@@ -102,9 +107,12 @@
            return R.error("单据有已生成的收货单明细,不可执行删除操作!!");
        }
        if (!purchaseService.removeByIds(Arrays.asList(ids))) {
            return R.error("Delete Fail");
            return R.error("主单删除失败!!");
        }
        return R.ok("Delete Success").add(ids);
        if (!purchaseItemService.remove(new LambdaQueryWrapper<PurchaseItem>().in(PurchaseItem::getPurchaseId, Arrays.asList(ids)))) {
            return R.error("明细删除失败!!");
        }
        return R.ok("删除成功!!").add(ids);
    }
    @PreAuthorize("hasAuthority('manager:purchase:list')")
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/PurchaseItem.java
@@ -90,7 +90,7 @@
     * 标准包装
     */
    @ApiModelProperty(value= "标准包装")
    private Double nromQty;
    private Integer nromQty;
    /**
     * ASN单据数量
@@ -176,7 +176,7 @@
    public PurchaseItem() {}
    public PurchaseItem(Long purchaseId,String erpItemId,String matnrCode,String matnrName,String unit,Double anfme,Double qty,Double nromQty,Double asnQty,Double printQty,String splrName,String splrCode,String splrBatch,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
    public PurchaseItem(Long purchaseId,String erpItemId,String matnrCode,String matnrName,String unit,Double anfme,Double qty,Integer nromQty,Double asnQty,Double printQty,String splrName,String splrCode,String splrBatch,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
        this.purchaseId = purchaseId;
        this.platItemId = erpItemId;
        this.matnrCode = matnrCode;
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/PurchaseTemplate.java
@@ -35,7 +35,7 @@
    @Excel(name = "业务类型")
    @ApiModelProperty(value= "业务类型")
    @ExcelComment(value = "wkType", example = "ERP")
    @ExcelComment(value = "wkType", example = "外购收货")
    private String wkType;
@@ -85,8 +85,8 @@
    /**
     * 已收数量
     */
    @Excel(name = "已收数量")
    @ApiModelProperty(value= "已收数量")
    @Excel(name = "已完成量")
    @ApiModelProperty(value= "已完成量")
    @ExcelComment(value = "qty", example = "0")
    private Double qty;
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
@@ -102,7 +102,7 @@
            AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, key));
            if (!Objects.isNull(order)) {
                sbFaild.append(template.getCode()).append(",已添加!!");
                continue;
                throw new CoolException(sbFaild.toString());
            }
            order = new AsnOrder();
            order.setCode(template.getCode())
@@ -120,13 +120,13 @@
            for (AsnOrderTemplate orderTemplate : listMap.get(key)) {
                AsnOrderItem orderItem = new AsnOrderItem();
                if (StringUtils.isBlank(orderTemplate.getMatnrCode())) {
                    continue;
                    throw new CoolException(orderTemplate.getPoCode() + ":物料编码不能为空!!");
                }
                Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>()
                        .eq(Matnr::getCode, orderTemplate.getMatnrCode()));
                if (Objects.isNull(matnr)) {
                    sbFaild.append(orderTemplate.getMatnrCode()).append("物料不存在");
                    continue;
                    throw new CoolException(sbFaild.toString());
                }
                String trackCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, matnr);
                orderItem.setAsnId(order.getId())
@@ -156,7 +156,7 @@
                        orderItem.setSplrCode(companys.getCode()).setSplrName(companys.getName());
                    } else {
                        sbFaild.append("供应商:" + orderTemplate.getSplrCode()).append("不存在");
                        continue;
                        throw new CoolException(sbFaild.toString());
                    }
                } else {
                    continue;
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/PurchaseItemServiceImpl.java
@@ -5,32 +5,46 @@
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.api.entity.enums.OrderType;
import com.vincent.rsf.server.api.entity.enums.OrderWorkType;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.manager.entity.Companys;
import com.vincent.rsf.server.manager.entity.Matnr;
import com.vincent.rsf.server.manager.entity.Purchase;
import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
import com.vincent.rsf.server.manager.entity.excel.PurchaseTemplate;
import com.vincent.rsf.server.manager.enums.CompanysType;
import com.vincent.rsf.server.manager.mapper.PurchaseItemMapper;
import com.vincent.rsf.server.manager.entity.PurchaseItem;
import com.vincent.rsf.server.manager.service.CompanysService;
import com.vincent.rsf.server.manager.service.MatnrService;
import com.vincent.rsf.server.manager.service.PurchaseItemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vincent.rsf.server.manager.service.PurchaseService;
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.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 java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
@Service("purchaseItemService")
public class PurchaseItemServiceImpl extends ServiceImpl<PurchaseItemMapper, PurchaseItem> implements PurchaseItemService {
    private final PurchaseServiceImpl purchaseService;
    @Autowired
    private PurchaseService purchaseService;
    public PurchaseItemServiceImpl(PurchaseServiceImpl purchaseService) {
        this.purchaseService = purchaseService;
    }
    @Autowired
    private MatnrService matnrService;
    @Autowired
    private CompanysService companysService;
    /**
     * @author Ryan
@@ -39,6 +53,7 @@
     * @version 1.0
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R excelImport(MultipartFile file, Long loginUserId) throws Exception {
        ExcelImportResult result = ExcelImportUtil.importExcelMore(file.getInputStream(), PurchaseTemplate.class, ExcelUtil.getDefaultImportParams());
        if (result.getList().isEmpty()) {
@@ -53,14 +68,73 @@
            List<PurchaseTemplate> list = listMap.get(key);
            Purchase serviceOne = purchaseService.getOne(new LambdaQueryWrapper<Purchase>().eq(Purchase::getCode, key));
            if (!Objects.isNull(serviceOne)) {
                continue;
//                return R.error(serviceOne.getCode() +  "单据已存在!!");
                throw new CoolException(serviceOne.getCode() +  "单据已存在!!");
            }
            PurchaseTemplate template = list.stream().findFirst().get();
            Purchase purchase = new Purchase();
            purchase.setCode(template.getPoCode()).set;
            BeanUtils.copyProperties(template, purchase);
            purchase.setCode(template.getPoCode());
            if (StringUtils.isBlank(template.getPoCode())) {
                String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ORDER_PO_CODE, purchase);
                purchase.setCode(ruleCode);
            }
            purchase.setType(OrderType.getTypeVal(template.getType()))
                    .setWkType(OrderWorkType.getWorkType(template.getWkType()))
                    .setSource(template.getSource())
                    .setCreateBy(loginUserId)
                    .setUpdateBy(loginUserId);
            if (!purchaseService.save(purchase)) {
                throw new CoolException("主单保存失败!!");
            }
            List<PurchaseItem> items = new ArrayList<>();
            for (PurchaseTemplate purchaseTemplate : list) {
                PurchaseItem item = new PurchaseItem();
                if (StringUtils.isBlank(purchaseTemplate.getMatnrCode())) {
                    throw new CoolException(purchaseTemplate.getPoCode() + ":物料编码不能为空!!");
                }
                Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, template.getMatnrCode()));
                if (Objects.isNull(matnr)) {
                    throw new CoolException(template.getMatnrCode() + "物料不存在!!");
                }
                item.setMatnrName(matnr.getName())
                        .setMatnrCode(matnr.getCode())
                        .setPlatItemId(template.getPlatItemId())
                        .setAnfme(template.getAnfme())
                        .setQty(template.getQty())
                        .setPurchaseId(purchase.getId())
                        .setNromQty(matnr.getNromNum())
                        .setSplrBatch(template.getSplrBatch())
                        .setCreateBy(loginUserId)
                        .setUpdateBy(loginUserId)
                        .setUnit(template.getUnit());
                if (StringUtils.isNotBlank(purchaseTemplate.getSplrCode())) {
                    Companys companys = companysService.getOne(new LambdaQueryWrapper<Companys>()
                            .eq(Companys::getType, CompanysType.COMPANYS_TYPE_SUPPLIER.val)
                            .eq(Companys::getCode, template.getSplrCode()));
                    if (!Objects.isNull(companys)) {
                        item.setSplrCode(companys.getCode()).setSplrName(companys.getName());
                    } else {
                        throw new CoolException("供应商:" + template.getSplrName() + "不存在!!");
                    }
                } else {
                    throw new CoolException("供应商不能为空!!");
                }
                if (!this.save(item)) {
                    throw new CoolException("单据明细保存失败!!");
                }
                items.add(item);
            }
            double anfmes = items.stream().mapToDouble(PurchaseItem::getAnfme).sum();
            double qty = items.stream().mapToDouble(PurchaseItem::getQty).sum();
            purchase.setAnfme(anfmes).setQty(qty);
           if (!purchaseService.updateById(purchase)) {
               throw new CoolException("主单数量修改失败!!");
           }
        }
        return null;
        return R.ok("导入成功!!");
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/system/constant/SerialRuleCode.java
@@ -77,4 +77,9 @@
    /**PO单编码*/
    public final static String SYS_ORDER_PO_CODE = "sys_order_po_code";
    /**企业编码*/
    public final static String SYS_COMPANYS_CODE = "sys_companys_code";
}