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"; }