Commit 266040c5 by 杨浩

采购订单发货;

jimu报表;
质检附件
parent b6e17bf3
package cn.iocoder.foodnexus.module.customerpermission.core.db;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.foodnexus.framework.common.exception.ServiceException;
import cn.iocoder.foodnexus.module.customerpermission.core.rule.CustomerPermissionRule;
import cn.iocoder.foodnexus.module.customerpermission.core.rule.CustomerPermissionRuleFactory;
import cn.iocoder.foodnexus.framework.mybatis.core.util.MyBatisUtils;
......@@ -12,8 +13,10 @@ import net.sf.jsqlparser.schema.Table;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import static cn.iocoder.foodnexus.framework.security.core.util.SecurityFrameworkUtils.skipPermissionCheck;
import static cn.iocoder.foodnexus.module.customerpermission.core.rule.customer.CustomerVisiblePermissionRule.NULL_PERMISSION_ERROR;
/**
* 基于 {@link CustomerPermissionRule} 的数据权限处理器
......
......@@ -3,6 +3,7 @@ package cn.iocoder.foodnexus.module.customerpermission.core.rule.customer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum;
import cn.iocoder.foodnexus.framework.common.exception.ServiceException;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.collection.CollectionUtils;
import cn.iocoder.foodnexus.framework.common.util.json.JsonUtils;
......@@ -17,9 +18,11 @@ import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
import net.sf.jsqlparser.schema.Column;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......@@ -47,6 +50,8 @@ public class CustomerVisiblePermissionRule implements CustomerPermissionRule {
public static final String PRODUCT_ID_COLUMN = "id";
public static final Integer NULL_PERMISSION_ERROR = 100010;
/**
* 根据表名和别名,生成对应的 WHERE / OR 过滤条件
*
......@@ -74,8 +79,9 @@ public class CustomerVisiblePermissionRule implements CustomerPermissionRule {
CustomerVisibleProductRespDTO customerVisibleDto = inquireCustomerApi.queryCustomerIdByCustomerId(customerId);
if (customerVisibleDto == null || CommonUtil.isEmpty(customerVisibleDto.getItems())) {
log.error("[getExpression][LoginUser({}) 获取数据权限为 null]", JsonUtils.toJsonString(loginUser));
throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限",
loginUser.getId(), tableName, tableAlias.getName()));
/*throw new ServiceException(NULL_PERMISSION_ERROR, String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限",
loginUser.getId(), tableName, tableAlias.getName()));*/
return this.buildNoDataExpression();
}
/* // 添加到上下文中,避免重复计算
loginUser.setContext(CONTEXT_KEY, customerVisibleDto);
......@@ -98,4 +104,17 @@ public class CustomerVisiblePermissionRule implements CustomerPermissionRule {
// Parenthesis 的目的,是提供 (1,2,3) 的 () 左右括号
new ParenthesedExpressionList(new ExpressionList<LongValue>(CollectionUtils.convertList(productIds, LongValue::new))));
}
/**
* 构建返回空结果的表达式(恒不成立条件)
*/
private Expression buildNoDataExpression() {
// 方式1:通用版 - 构造 "1 = 0"(推荐,不依赖任何表字段)
EqualsTo equalsTo = new EqualsTo();
// 左值:1(LongValue适配JSqlParser 5.1的数值类型)
equalsTo.setLeftExpression(new LongValue(1));
// 右值:0
equalsTo.setRightExpression(new LongValue(0));
return equalsTo;
}
}
......@@ -20,6 +20,7 @@ import cn.iocoder.foodnexus.module.erp.api.vo.warehouse.WarehouseInfo;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderExportVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier.SupplierPurchaseOrderDeliveryReqVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpSupplierDO;
......@@ -108,7 +109,7 @@ public class ErpPurchaseOrderController {
@Operation(summary = "到货")
@Parameter(name = "ids", description = "编号", required = true)
public CommonResult<Boolean> arrival(@RequestParam("ids") List<Long> ids) {
purchaseOrderService.delivery(ids, null,
purchaseOrderService.delivery(SupplierPurchaseOrderDeliveryReqVO.transform(ids), null,
ErpDeliveryStatus.ALREADY, ErpDeliveryStatus.ARRIVAL, CustomerOrderStatus.SUPPLIER_ARRIVE);
return success(Boolean.TRUE);
}
......@@ -187,7 +188,7 @@ public class ErpPurchaseOrderController {
@Parameter(name = "ids", description = "编号", required = true)
@AppSystemAuth(UserSystemEnum.SUPPLIER)
public CommonResult<Boolean> supplierAcceptingOrders(@RequestParam("ids") List<Long> ids) {
purchaseOrderService.delivery(ids, supplierApi.querySupplierIdByUserId(SecurityFrameworkUtils.getLoginUserId()),
purchaseOrderService.delivery(SupplierPurchaseOrderDeliveryReqVO.transform(ids), supplierApi.querySupplierIdByUserId(SecurityFrameworkUtils.getLoginUserId()),
ErpDeliveryStatus.MATCHED, ErpDeliveryStatus.NOT_YET, CustomerOrderStatus.SUPPLIER_ACCEPT_ORDER);
return success(Boolean.TRUE);
}
......@@ -196,8 +197,8 @@ public class ErpPurchaseOrderController {
@Operation(summary = "供应商 - 发货")
@Parameter(name = "ids", description = "编号", required = true)
@AppSystemAuth(UserSystemEnum.SUPPLIER)
public CommonResult<Boolean> supplierPurchaseOrderDelivery(@RequestParam("ids") List<Long> ids) {
purchaseOrderService.delivery(ids, supplierApi.querySupplierIdByUserId(SecurityFrameworkUtils.getLoginUserId()),
public CommonResult<Boolean> supplierPurchaseOrderDelivery(@RequestBody @Valid SupplierPurchaseOrderDeliveryReqVO reqVO) {
purchaseOrderService.delivery(reqVO, supplierApi.querySupplierIdByUserId(SecurityFrameworkUtils.getLoginUserId()),
ErpDeliveryStatus.NOT_YET, ErpDeliveryStatus.ALREADY, CustomerOrderStatus.SUPPLIER_SHIP);
return success(Boolean.TRUE);
}
......
package cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
/**
* @author : yanghao
* create at: 2026/1/5 15:12
* @description:
*/
@Data
@Schema(description = "供应商后台发货")
public class SupplierPurchaseOrderDeliveryReqVO {
@Schema(description = "items", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "items不能为空")
private List<Item> items;
@Data
public static class Item {
@Schema(description = "id" , requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "id不能为空")
private Long id;
@Schema(description = "文件附件url")
private String file;
}
public static SupplierPurchaseOrderDeliveryReqVO transform(List<Long> ids) {
SupplierPurchaseOrderDeliveryReqVO data = new SupplierPurchaseOrderDeliveryReqVO();
List<Item> items = new ArrayList<>(ids.size());
for (Long id : ids) {
Item item = new Item();
item.setId(id);
items.add(item);
}
data.setItems(items);
return data;
}
}
......@@ -4,6 +4,7 @@ import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.module.erp.api.enums.ErpDeliveryStatus;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier.SupplierPurchaseOrderDeliveryReqVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.SupplierMonthOrderPageReqVO;
......@@ -116,7 +117,7 @@ public interface ErpPurchaseOrderService {
* @param ids
* @param supplierId
*/
void delivery(List<Long> ids, Long supplierId, ErpDeliveryStatus oriStatus, ErpDeliveryStatus updateStatus, CustomerOrderStatus updateOrderStatus);
void delivery(SupplierPurchaseOrderDeliveryReqVO reqVO, Long supplierId, ErpDeliveryStatus oriStatus, ErpDeliveryStatus updateStatus, CustomerOrderStatus updateOrderStatus);
Map<String, Long> queryCountByDeliveryStatus(ErpPurchaseOrderPageReqVO pageReqVO);
......
......@@ -13,6 +13,7 @@ import cn.iocoder.foodnexus.module.erp.api.enums.ErpDeliveryStatus;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInSaveReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order.ErpPurchaseOrderSaveReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier.SupplierPurchaseOrderDeliveryReqVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
import cn.iocoder.foodnexus.module.erp.dal.mysql.purchase.ErpPurchaseOrderItemMapper;
......@@ -41,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
import java.time.LocalDateTime;
......@@ -325,12 +327,13 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
/**
* 发货/接单
*
* @param ids
* @param supplierId
*/
@Override
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void delivery(List<Long> ids, Long supplierId, ErpDeliveryStatus oriStatus, ErpDeliveryStatus updateStatus, CustomerOrderStatus updateOrderStatus) {
public void delivery(SupplierPurchaseOrderDeliveryReqVO reqVO, Long supplierId, ErpDeliveryStatus oriStatus, ErpDeliveryStatus updateStatus, CustomerOrderStatus updateOrderStatus) {
Map<Long, String> idMap = CommonUtil.listConvertMap(reqVO.getItems(), SupplierPurchaseOrderDeliveryReqVO.Item::getId, SupplierPurchaseOrderDeliveryReqVO.Item::getFile);
Set<Long> ids = CommonUtil.listConvertSet(reqVO.getItems(), SupplierPurchaseOrderDeliveryReqVO.Item::getId);
List<ErpPurchaseOrderDO> orderList = purchaseOrderMapper.selectList(Wrappers.<ErpPurchaseOrderDO>lambdaQuery()
.in(ErpPurchaseOrderDO::getId, ids)
.eq(CommonUtil.isNotEmpty(supplierId) ,ErpPurchaseOrderDO::getSupplierId, supplierId));
......@@ -365,11 +368,17 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
orderRecordApi.recordEvent(event);
customerOrderSet.add(item.getCustomerOrderId());
}
String fileUrl = idMap.get(item.getId());
if (CommonUtil.isNotBlank(fileUrl)) {
item.setFileUrl(fileUrl);
}
purchaseOrderMapper.update(Wrappers.<ErpPurchaseOrderDO>lambdaUpdate()
.set(ErpPurchaseOrderDO::getDeliveryStatus, updateStatus)
.set(CommonUtil.isNotBlank(fileUrl), ErpPurchaseOrderDO::getFileUrl, fileUrl)
.eq(ErpPurchaseOrderDO::getId, item.getId()));
}
purchaseOrderMapper.update(Wrappers.<ErpPurchaseOrderDO>lambdaUpdate()
.set(ErpPurchaseOrderDO::getDeliveryStatus, updateStatus)
.in(ErpPurchaseOrderDO::getId, ids));
if (updateStatus.equals(ErpDeliveryStatus.ARRIVAL)) {
orderList.forEach(purchaseOrder -> {
......@@ -529,7 +538,7 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
throw new RuntimeException(e);
}
// 通过代理对象调用,事务生效
proxyService.delivery(CommonUtil.asList(purchaseOrderId), supplierId,
proxyService.delivery(SupplierPurchaseOrderDeliveryReqVO.transform(CommonUtil.asList(purchaseOrderId)), supplierId,
ErpDeliveryStatus.MATCHED, ErpDeliveryStatus.NOT_YET, CustomerOrderStatus.SUPPLIER_ACCEPT_ORDER);
}
}
......
......@@ -24,6 +24,8 @@ import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import cn.iocoder.foodnexus.module.operations.controller.admin.inquirecustomerpush.vo.*;
import cn.iocoder.foodnexus.module.operations.dal.dataobject.inquirecustomerpush.InquireCustomerPushDO;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
......@@ -176,7 +178,13 @@ public class InquireCustomerPushServiceImpl implements InquireCustomerPushServic
if (list.size() == 1) {
currentItemList.add(list.get(0));
} else if (list.size() > 1) {
currentItemList.add(list.stream().max(Comparator.comparing(InquirePriceItemDO::getCreateTime)).get());
List<InquirePriceItemDO> collect = list.stream().filter(itemPrice ->
supplierPushMapper.exists(Wrappers.<InquireSupplierPushDO>lambdaQuery()
.eq(InquireSupplierPushDO::getInquirePriceItemId, itemPrice.getId())
.eq(InquireSupplierPushDO::getConfirm, Boolean.TRUE))).toList();
if (CommonUtil.isNotEmpty(collect)) {
currentItemList.add(collect.stream().max(Comparator.comparing(InquirePriceItemDO::getCreateTime)).get());
}
}
});
......
......@@ -96,6 +96,9 @@ public class InquirePriceServiceImpl implements InquirePriceService {
// 插入
InquirePriceDO inquirePrice = BeanUtils.toBean(createReqVO, InquirePriceDO.class);
inquirePrice.setIsPush(Boolean.FALSE);
if (CommonUtil.isNotEmpty(createReqVO.getInquiryYearMonth())) {
createReqVO.setInquiryYearMonth(createReqVO.getInquiryYearMonth().length() >= 7 ? createReqVO.getInquiryYearMonth().substring(0, 7) : createReqVO.getInquiryYearMonth());
}
inquirePriceMapper.insert(inquirePrice);
inquirePriceItemService.addOrUpdateBatch(inquirePrice.getId(), createReqVO.getItems(), Boolean.FALSE);
......@@ -112,6 +115,9 @@ public class InquirePriceServiceImpl implements InquirePriceService {
if (inquirePriceDO.getIsPush()) {
throw exception("询价已推送,无法修改");
}
if (CommonUtil.isNotEmpty(updateReqVO.getInquiryYearMonth())) {
updateReqVO.setInquiryYearMonth(updateReqVO.getInquiryYearMonth().length() >= 7 ? updateReqVO.getInquiryYearMonth().substring(0, 7) : updateReqVO.getInquiryYearMonth());
}
// 更新
InquirePriceDO updateObj = BeanUtils.toBean(updateReqVO, InquirePriceDO.class);
inquirePriceMapper.updateById(updateObj);
......
......@@ -222,6 +222,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
Long customerId = customerApi.queryCustomerIdByUserId(loginUser.getId());
List<CustomerWarehouseDO> customerWarehouse = customerWarehouseService.getCustomerWarehouseByCustomerId(customerId);
if (CommonUtil.isEmpty(customerWarehouse) || CommonUtil.isEmpty(customerWarehouse.get(0))) {
log.error("客户订单下单失败,1_019_100_004, \"仓库不存在\", req:{}", createReqVO);
throw exception(CUSTOMER_ORDER_ADDRESS_NOEXISTS);
} else {
// TODO 理论上客户只对应一个库区
......
......@@ -80,10 +80,10 @@ public class ProductSpuController {
}
@PutMapping("/pass-all")
@Operation(summary = "审核通过所有产品")
@Operation(summary = "上架所有产品")
@PreAuthorize("@ss.hasPermission('product:spu:update')")
public CommonResult<Boolean> passAll(@RequestBody ProductSpuUpdateStatusBatchReqVO updateReqVO) {
productSpuService.passAll(updateReqVO);
public CommonResult<Boolean> passAll() {
productSpuService.passAll();
return success(Boolean.TRUE);
}
......
package cn.iocoder.foodnexus.module.product.controller.admin.spu.vo;
import cn.iocoder.foodnexus.framework.common.validation.InEnum;
import cn.iocoder.foodnexus.module.product.enums.spu.ProductSpuStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - 商品 SPU Status 更新 Request VO")
@Data
public class ProductSpuUpdateStatusBatchReqVO {
@Schema(description = "商品id集合(不传默认所有数据)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private List<Long> ids;
@Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "商品状态不能为空")
@InEnum(ProductSpuStatusEnum.class)
private Integer status;
}
......@@ -6,7 +6,6 @@ import cn.iocoder.foodnexus.framework.common.util.collection.CollectionUtils;
import cn.iocoder.foodnexus.module.customerpermission.core.annotation.CustomerVisible;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuPageReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusBatchReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuStatusRespVO;
......@@ -156,7 +155,7 @@ public interface ProductSpuService {
void audit(AuditCommonReqVO auditReqVO);
void passAll(ProductSpuUpdateStatusBatchReqVO updateReqVO);
void passAll();
default Map<Long, ProductSpuDO> getProductVOMap(Set<Long> longs) {
return this.getSpuMap(longs);
......
......@@ -13,7 +13,6 @@ import cn.iocoder.foodnexus.module.erp.api.enums.ErpAuditStatus;
import cn.iocoder.foodnexus.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuPageReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusBatchReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuStatusRespVO;
......@@ -146,20 +145,25 @@ public class ProductSpuServiceImpl implements ProductSpuService {
@Override
@Transactional(rollbackFor = Exception.class)
public void passAll(ProductSpuUpdateStatusBatchReqVO updateReqVO) {
List<ProductSpuDO> productSpuDOS = productSpuMapper.selectList(Wrappers.<ProductSpuDO>lambdaQuery()
.in(CommonUtil.isNotEmpty(updateReqVO.getIds()), ProductSpuDO::getId, updateReqVO.getIds())
.eq(ProductSpuDO::getAuditStatus, ErpAuditStatus.PROCESS.getStatus()));
if (CommonUtil.isNotEmpty(productSpuDOS)) {
AuditCommonReqVO auditCommonReqVO = new AuditCommonReqVO();
public void passAll() {
productSpuMapper.update(Wrappers.<ProductSpuDO>lambdaUpdate()
.set(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus()));
/*List<ProductSpuDO> productSpuDOS = productSpuMapper.selectList(Wrappers.<ProductSpuDO>lambdaQuery()
.eq(ProductSpuDO::getStatus, ProductSpuStatusEnum.)*/
// .in(CommonUtil.isNotEmpty(updateReqVO.getIds()), ProductSpuDO::getId, updateReqVO.getIds())
// .eq(ProductSpuDO::getAuditStatus, ErpAuditStatus.PROCESS.getStatus()));
/*if (CommonUtil.isNotEmpty(productSpuDOS)) {
*//*AuditCommonReqVO auditCommonReqVO = new AuditCommonReqVO();
auditCommonReqVO.setAuditReason("批量审核");
auditCommonReqVO.setAuditStatus(updateReqVO.getStatus().toString());
auditCommonReqVO.setAuditStatus(updateReqVO.getStatus().toString());*//*
for (ProductSpuDO item : productSpuDOS) {
auditCommonReqVO.setId(item.getId());
this.audit(auditCommonReqVO);
*//*auditCommonReqVO.setId(item.getId());
this.audit(auditCommonReqVO);*//*
productSpuMapper.update(Wrappers.<ProductSpuDO>lambdaUpdate()
.);
}
}
}*/
}
@Override
......
......@@ -40,11 +40,11 @@
</dependency>-->
<!-- 数据报表。默认注释,保证编译速度 -->
<!--<dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>foodnexus-module-report</artifactId>
<version>${revision}</version>
</dependency>-->
</dependency>
<!-- 工作流。默认注释,保证编译速度 -->
<!--<dependency>
<groupId>cn.iocoder.boot</groupId>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment