skyouc
9 天以前 ee608e161f17082b9fd6e1ed236214a0ac5c2f0e
Asn订单功优化
10个文件已修改
117 ■■■■ 已修改文件
rsf-admin/src/i18n/core/chineseMessages.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/ImportButton.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/ImportModal.jsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/core/chineseMessages.js
@@ -85,7 +85,7 @@
      auth_error:
        "An error occurred while validating the authentication token.",
      bulk_delete_content:
        "Are you sure you want to delete this %{name}? |||| Are you sure you want to delete these %{smart_count} items?",
        "确定要删除这个 %{name}? |||| 确认要删除这些 %{smart_count} 明细?",
      bulk_delete_title: "删除 %{name} |||| 删除 %{smart_count} %{name}",
      bulk_update_content:
        "Are you sure you want to update this %{name}? |||| Are you sure you want to update these %{smart_count} items?",
rsf-admin/src/i18n/en.js
@@ -576,6 +576,8 @@
                poDetlCode: "poDetlCode",
                matnrId: "matnrId",
                maktx: "maktx",
                spec: "Spec",
                model: "Model",
                anfme: "anfme",
                stockUnit: "stockUnit",
                purQty: "purQty",
@@ -1033,7 +1035,8 @@
    },
    request: {
        error: {
            stock: "Insufficient inventory to deliver !!"
            stock: "Insufficient inventory to deliver !!",
            select_error_order: "Please Select Asn Orders",
        }
    }
rsf-admin/src/i18n/zh.js
@@ -565,6 +565,8 @@
                poDetlCode: "PO单",
                matnrId: "物料标识",
                maktx: "物料名称",
                spec: "规格",
                model: "型号",
                matnrCode: "物料编码",
                anfme: "计划收货数",
                stockUnit: "库存单位",
@@ -611,7 +613,7 @@
                poId: "PO标识",
                type: "单据类型",
                wkType: "业务类型",
                anfme: "数量",
                anfme: "计划数量",
                qty: "已完成数量",
                logisNo: "物流单号",
                arrTime: "预计到达时间",
@@ -1048,7 +1050,8 @@
    },
    request: {
        error: {
            stock: "库存不足,无法提交!!"
            stock: "库存不足,无法提交!!",
            select_error_order: "请选择通知单",
        }
    }
rsf-admin/src/page/components/ImportButton.jsx
@@ -4,7 +4,7 @@
import ImportModal from './ImportModal';
const ImportButton = (props) => {
    const [modalOpen, setModalOpen] = useState(false);
    const [modalOpen, setModalOpen, refresh, notify] = useState(false);
    const handleOpenModal = () => {
        setModalOpen(true);
rsf-admin/src/page/components/ImportModal.jsx
@@ -22,7 +22,7 @@
import MatnrList from '../basicInfo/matnr/MatnrList';
import request from '@/utils/request'
const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10, value, parmas = {} }) => {
const ImportModal = ({ open, onClose, importTemp, useCodeImport, onceBatch = 10, value, parmas = {}}) => {
    const refresh = useRefresh();
    const translate = useTranslate();
@@ -57,17 +57,15 @@
        }
        form.append('file', file);
        const { data: { code, data, msg } } = await request.post(`/${value}/import`, form)
        if (code === 200) {
            handleClose()
            notify(msg);
            refresh()
        } else {
            notify(msg);
        }
    };
    const handleClose = () => {
        reset();
rsf-admin/src/page/orders/asnOrder/AsnOrderItemList.jsx
@@ -115,7 +115,7 @@
            marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
          }}
          title={"menu.asnOrderItem"}
          empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
          empty={false}
          filter={{ asnId: asnId, deleted: 0 }}
          filters={filters}
          sort={{ field: "create_time", order: "desc" }}
@@ -136,7 +136,7 @@
              setSelect(record)
              setEditDialog(true)
            }}
             omit={['id', 'createTime', 'purQty','purUnit', 'createBy', 'memo', 'poDetlId', 'matnrId', 'asnId']}
             omit={['id', 'createTime', 'purQty','purUnit','poDetlCode', 'createBy', 'memo', 'packName','poDetlId', 'matnrId', 'asnId']}
          >
            <NumberField source="id" />
            <NumberField source="asnId" label="table.field.asnOrderItem.asnId" />
@@ -146,6 +146,8 @@
            <TextField source="matnrId" label="table.field.asnOrderItem.matnrId" />
            <TextField source="matnrCode" label="table.field.asnOrderItem.matnrCode" />
            <TextField source="maktx" label="table.field.asnOrderItem.maktx" />
            <TextField source="spec" label="table.field.asnOrderItem.spec" />
            <TextField source="model" label="table.field.asnOrderItem.spec" />
            <NumberField source="anfme" label="table.field.asnOrderItem.anfme" />
            <TextField source="stockUnit" label="table.field.asnOrderItem.stockUnit" />
            <NumberField source="purQty" label="table.field.asnOrderItem.purQty" />
rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
@@ -114,6 +114,8 @@
  const [modalType, setmodalType] = useState(0);
  const [select, setSelect] = useState(0);
  const billReload = useRef();
  const notify = useNotify();
  const refresh = useRefresh();
  const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type')) || [];
  return (
    <Box display="flex">
@@ -128,7 +130,7 @@
          marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
        }}
        title={"menu.asnOrder"}
        empty={<EmptyData onClick={() => { setCreateDialog(true); setmodalType(0) }} />}
        empty={false}
        filters={filters}
        filter={{deleted: 0}}
        sort={{ field: "create_time", order: "desc" }}
@@ -137,7 +139,7 @@
            <FilterButton />
            <MyCreateButton onClick={() => { setCreateDialog(true); setmodalType(0) }} />
            <SelectColumnsButton preferenceKey='asnOrder' />
            <ImportButton value={'asnOrderItem'}  />
            <ImportButton value={'asnOrderItem'} />
            <MyExportButton />
          </TopToolbar>
        )}
@@ -254,10 +256,11 @@
  const { selectedIds, onUnselectItems, data } = useListContext();
  const notify = useNotify();
  const refresh = useRefresh();
  const translate = useTranslate();
  const inspection = (btn) => {
    btn.stopPropagation();
    if (selectedIds.length === 0) {
      notify('请选择通知单');
      notify(translate("request.error.select_error_order"));
      return;
    } else {
      const rows = data.filter((item) => selectedIds.includes(item.id))
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderController.java
@@ -31,6 +31,7 @@
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -111,10 +112,19 @@
    @PreAuthorize("hasAuthority('manager:asnOrder:remove')")
    @OperationLog("Delete ASN单据")
    @PostMapping("/asnOrder/remove/{ids}")
    @Transactional(rollbackFor = Exception.class)
    public R remove(@PathVariable Long[] ids) {
        if (!asnOrderService.removeByIds(Arrays.asList(ids))) {
            return R.error("Delete Fail");
        }
        for (Long id : ids) {
            List<AsnOrderItem> list = asnOrderItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, id));
            if (!list.isEmpty()) {
                if (!asnOrderItemService.remove(new LambdaQueryWrapper<AsnOrderItem>().in(AsnOrderItem::getAsnId, ids))) {
                    throw new CoolException("Details Delete Fail");
                }
            }
        }
        return R.ok("Delete Success").add(ids);
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrderItem.java
@@ -102,6 +102,12 @@
    @ApiModelProperty(value= "物料名称")
    private String maktx;
    @ApiModelProperty("规格")
    private String spec;
    @ApiModelProperty("型号")
    private String model;
    /**
     * 送货数量
     */
@@ -183,13 +189,13 @@
    private Integer ntyStatus;
    /**
     * 状态 1: 正常  0: 冻结
     * 状态 1: 正常  0: 冻结
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 冻结  ")
    private Integer status;
    /**
     * 是否删除 1: 是  0: 否
     * 是否删除 1: 是  0: 否
     */
    @ApiModelProperty(value= "是否删除 1: 是  0: 否  ")
    private Integer deleted;
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
@@ -17,6 +17,7 @@
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.common.utils.FieldsUtils;
import com.vincent.rsf.server.manager.entity.AsnOrder;
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.mapper.AsnOrderItemMapper;
@@ -24,6 +25,7 @@
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.service.FieldsItemService;
@@ -54,6 +56,9 @@
    @Autowired
    private AsnOrderItemService asnOrderItemService;
    @Autowired
    private CompanysService companysService;
    @Override
    public R generateBarcode(List<Long> orders) {
@@ -90,13 +95,15 @@
        }
        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()) {
            AsnOrderTemplate template = listMap.get(key).stream().findFirst().get();
            AsnOrder asnOrder = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, template.getCode()));
            if (!Objects.isNull(asnOrder)) {
            AsnOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getCode, key));
            if (!Objects.isNull(order)) {
                sbFaild.append(template.getCode()).append(",已添加!!");
                continue;
            }
            AsnOrder order = new AsnOrder();
            order = new AsnOrder();
            order.setCode(template.getCode())
                    .setPoCode(template.getPoCode())
                    .setMemo(template.getMemo())
@@ -111,28 +118,42 @@
            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()));
                if (StringUtils.isBlank(orderTemplate.getMatnrCode())) {
                    continue;
                }
                Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>()
                        .eq(Matnr::getCode, orderTemplate.getMatnrCode()));
                if (Objects.isNull(matnr)) {
                    sbFaild.append(orderTemplate.getMatnrCode()).append("物料不存在");
                    continue;
                }
                orderItem.setAsnId(order.getId())
                        .setAsnCode(order.getCode())
                        .setSplrBatch(orderTemplate.getSplrBatch())
                        .setAnfme(Double.parseDouble(orderTemplate.getAnfme()))
                        .setQty(Double.parseDouble(orderTemplate.getQty()))
                        .setSplrName(orderTemplate.getSplrName())
                        .setBarcode(orderTemplate.getBarcode())
                        .setTrackCode(orderTemplate.getTrackCode())
                        .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());
                        .setCreateBy(loginUserId)
                        .setUpdateBy(loginUserId)
                        .setSpec(matnr.getSpec())
                        .setModel(matnr.getModel())
                        .setPurQty(Double.parseDouble(orderTemplate.getPurQty()))
                        .setMaktx(matnr.getName())
                        .setMatnrCode(matnr.getCode())
                        .setMatnrId(matnr.getId())
                        .setStockUnit(matnr.getUnit());
                if (!Objects.nonNull(orderTemplate.getSplrCode())) {
                    Companys companys = companysService.getOne(new LambdaQueryWrapper<Companys>().eq(Companys::getCode, orderTemplate.getSplrCode()));
                    if (!Objects.isNull(companys)) {
                        orderItem.setSplrCode(companys.getCode()).setSplrName(companys.getName());
                    } else {
                        orderItem.setSplrCode(orderTemplate.getSplrCode()).setSplrName(companys.getName() + "(供应商不存在!!)");
                    }
                }
                items.add(orderItem);
                if (!asnOrderItemService.saveBatch(items)) {
                    throw new CoolException("单据明细保存失败!!");
@@ -140,14 +161,17 @@
            }
            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()))) {
                double anfme = items.stream().mapToDouble(AsnOrderItem::getAnfme).sum();
                if (!asnOrderMapper.update(new LambdaUpdateWrapper<AsnOrder>()
                        .set(AsnOrder::getQty, qty)
                        .set(AsnOrder::getAnfme, anfme)
                        .eq(AsnOrder::getId, order.getId()))) {
                    throw new CoolException("单据数量修改失败!!");
                }
            }
        }
        return R.ok("操作成功!!");
        return R.ok("操作成功," + sbFaild.toString());
    }
    /**