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("计划收货数不能为空!!");