Commit cc58b6b0 by 杨浩

bug调整

parent 3f54bac9
...@@ -29,7 +29,7 @@ public class PageParam implements Serializable { ...@@ -29,7 +29,7 @@ public class PageParam implements Serializable {
@Schema(description = "每页条数,最大值为 100", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") @Schema(description = "每页条数,最大值为 100", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
@NotNull(message = "每页条数不能为空") @NotNull(message = "每页条数不能为空")
@Min(value = 1, message = "每页条数最小值为 1") // @Min(value = 1, message = "每页条数最小值为 1")
@Max(value = 100, message = "每页条数最大值为 100") @Max(value = 100, message = "每页条数最大值为 100")
private Integer pageSize = PAGE_SIZE; private Integer pageSize = PAGE_SIZE;
......
...@@ -67,19 +67,19 @@ public class CustomerVisiblePermissionRule implements CustomerPermissionRule { ...@@ -67,19 +67,19 @@ public class CustomerVisiblePermissionRule implements CustomerPermissionRule {
} }
// 获得数据权限 // 获得数据权限
CustomerVisibleProductRespDTO customerVisibleDto = loginUser.getContext(CONTEXT_KEY, CustomerVisibleProductRespDTO.class); /*CustomerVisibleProductRespDTO customerVisibleDto = loginUser.getContext(CONTEXT_KEY, CustomerVisibleProductRespDTO.class);
// 从上下文中拿不到,则调用逻辑进行获取 // 从上下文中拿不到,则调用逻辑进行获取
if (customerVisibleDto == null) { if (customerVisibleDto == null) {*/
Long customerId = customerApi.queryCustomerIdByUserId(loginUser.getId()); Long customerId = customerApi.queryCustomerIdByUserId(loginUser.getId());
customerVisibleDto = inquireCustomerApi.queryCustomerIdByCustomerId(customerId); CustomerVisibleProductRespDTO customerVisibleDto = inquireCustomerApi.queryCustomerIdByCustomerId(customerId);
if (customerVisibleDto == null || CommonUtil.isEmpty(customerVisibleDto.getItems())) { if (customerVisibleDto == null || CommonUtil.isEmpty(customerVisibleDto.getItems())) {
log.error("[getExpression][LoginUser({}) 获取数据权限为 null]", JsonUtils.toJsonString(loginUser)); log.error("[getExpression][LoginUser({}) 获取数据权限为 null]", JsonUtils.toJsonString(loginUser));
throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限", throw new NullPointerException(String.format("LoginUser(%d) Table(%s/%s) 未返回数据权限",
loginUser.getId(), tableName, tableAlias.getName())); loginUser.getId(), tableName, tableAlias.getName()));
} }
// 添加到上下文中,避免重复计算 /* // 添加到上下文中,避免重复计算
loginUser.setContext(CONTEXT_KEY, customerVisibleDto); loginUser.setContext(CONTEXT_KEY, customerVisibleDto);
} }*/
Set<Long> productIds = CommonUtil.listConvertSet(customerVisibleDto.getItems(), CustomerVisibleProductRespDTO.CustomerProduct::getProductId); Set<Long> productIds = CommonUtil.listConvertSet(customerVisibleDto.getItems(), CustomerVisibleProductRespDTO.CustomerProduct::getProductId);
......
...@@ -14,7 +14,9 @@ import org.springframework.data.redis.cache.RedisCacheManager; ...@@ -14,7 +14,9 @@ import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.Objects; import java.util.Objects;
......
...@@ -8,6 +8,7 @@ import org.springframework.boot.autoconfigure.AutoConfiguration; ...@@ -8,6 +8,7 @@ import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer;
/** /**
...@@ -35,7 +36,8 @@ public class FoodnexusRedisAutoConfiguration { ...@@ -35,7 +36,8 @@ public class FoodnexusRedisAutoConfiguration {
} }
public static RedisSerializer<?> buildRedisSerializer() { public static RedisSerializer<?> buildRedisSerializer() {
RedisSerializer<Object> json = RedisSerializer.json(); GenericJackson2JsonRedisSerializer json = new GenericJackson2JsonRedisSerializer();
// RedisSerializer<Object> json = RedisSerializer.json();
// 解决 LocalDateTime 的序列化 // 解决 LocalDateTime 的序列化
ObjectMapper objectMapper = (ObjectMapper) ReflectUtil.getFieldValue(json, "mapper"); ObjectMapper objectMapper = (ObjectMapper) ReflectUtil.getFieldValue(json, "mapper");
objectMapper.registerModules(new JavaTimeModule()); objectMapper.registerModules(new JavaTimeModule());
......
package cn.iocoder.foodnexus.module.erp.api.service; package cn.iocoder.foodnexus.module.erp.api.service;
import cn.hutool.core.lang.Pair;
import cn.iocoder.foodnexus.module.erp.api.vo.customer.CustomerAddReqVO; import cn.iocoder.foodnexus.module.erp.api.vo.customer.CustomerAddReqVO;
import cn.iocoder.foodnexus.module.erp.api.vo.customer.DeptSimpleDTO;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
...@@ -32,4 +34,8 @@ public interface ErpCustomerApi { ...@@ -32,4 +34,8 @@ public interface ErpCustomerApi {
Integer queryCustomerTypeByUserId(Long userId); Integer queryCustomerTypeByUserId(Long userId);
Set<Long> queryCustomerDeptIdsByUserId(Long userId); Set<Long> queryCustomerDeptIdsByUserId(Long userId);
Pair<Boolean, Set<Long>> queryCustomerOrUserByUserId(Long loginUserId);
List<DeptSimpleDTO> querySubDeptByUserId(Long loginUserId);
} }
package cn.iocoder.foodnexus.module.erp.api.vo.customer;
import lombok.Data;
/**
* @author : yanghao
* create at: 2025/11/6 10:03
* @description:
*/
@Data
public class DeptSimpleDTO {
private Long customerDeptId;
private String name;
}
...@@ -191,15 +191,15 @@ public class ErpPurchaseOrderController { ...@@ -191,15 +191,15 @@ public class ErpPurchaseOrderController {
Map<Long, CustomerOrderDTO> customerOrderMap = customerOrderApi.getOrderMap( Map<Long, CustomerOrderDTO> customerOrderMap = customerOrderApi.getOrderMap(
convertSet(list, ErpPurchaseOrderDO::getCustomerOrderId)); convertSet(list, ErpPurchaseOrderDO::getCustomerOrderId));
Map<Long, CustomerOrderItemDTO> customerOrderItemMap; Map<Long, CustomerOrderItemDTO> customerOrderItemMap;
Map<Long, String> checkResultMap; /*Map<Long, String> checkResultMap;*/
List<CustomerOrderItemDTO> customerOrderItems = customerOrderApi.queryItemsByIds(CommonUtil.listConvert(purchaseOrderItemList, ErpPurchaseOrderItemDO::getCustomerOrderItemId)); List<CustomerOrderItemDTO> customerOrderItems = customerOrderApi.queryItemsByIds(CommonUtil.listConvert(purchaseOrderItemList, ErpPurchaseOrderItemDO::getCustomerOrderItemId));
customerOrderItemMap = CommonUtil.listConvertMap(customerOrderItems, CustomerOrderItemDTO::getId); customerOrderItemMap = CommonUtil.listConvertMap(customerOrderItems, CustomerOrderItemDTO::getId);
if (isDetails) { if (isDetails) {
checkResultMap = checkTaskApi.getCheckResultMapByPurchaseOrderItemIds(CommonUtil.listConvertSet(purchaseOrderItemList, /*checkResultMap = checkTaskApi.getCheckResultMapByPurchaseOrderItemIds(CommonUtil.listConvertSet(purchaseOrderItemList,
ErpPurchaseOrderItemDO::getId)); ErpPurchaseOrderItemDO::getId));*/
// TODO 退款待定 // TODO 退款待定
} else { } else {
checkResultMap = new HashMap<>(); /*checkResultMap = new HashMap<>();*/
} }
// 2. 开始拼接 // 2. 开始拼接
return BeanUtils.toBean(list, ErpPurchaseOrderRespVO.class, purchaseOrder -> { return BeanUtils.toBean(list, ErpPurchaseOrderRespVO.class, purchaseOrder -> {
...@@ -209,9 +209,11 @@ public class ErpPurchaseOrderController { ...@@ -209,9 +209,11 @@ public class ErpPurchaseOrderController {
item.setSignedQuantity(customerOrderItem.getSignedQuantity()); item.setSignedQuantity(customerOrderItem.getSignedQuantity());
item.setSignedTotal(customerOrderItem.getSignedTotal()); item.setSignedTotal(customerOrderItem.getSignedTotal());
item.setProductInfo(customerOrderItem.getProductInfo()); item.setProductInfo(customerOrderItem.getProductInfo());
item.setReturnsCount(customerOrderItem.getReturnsQuantity());
item.setReturnsTotal(customerOrderItem.getReturnsTotal());
}); });
if (isDetails) { if (isDetails) {
MapUtils.findAndThen(checkResultMap, item.getId(), item::setCheckResult); /*MapUtils.findAndThen(checkResultMap, item.getId(), item::setCheckResult);*/
}})); }}));
purchaseOrder.setProductNames(CollUtil.join(purchaseOrder.getItems(), ",", item -> purchaseOrder.setProductNames(CollUtil.join(purchaseOrder.getItems(), ",", item ->
Optional.ofNullable(item.getProductInfo()).map(ProductInfo::getName).orElse(""))); Optional.ofNullable(item.getProductInfo()).map(ProductInfo::getName).orElse("")));
......
...@@ -122,6 +122,7 @@ public class ErpPurchaseReturnController { ...@@ -122,6 +122,7 @@ public class ErpPurchaseReturnController {
String orderCode = Optional.ofNullable(customerOrderApi.queryById(purchaseReturnVO.getCustomerOrderId())).map(CustomerOrderDTO::getCode).orElse(""); String orderCode = Optional.ofNullable(customerOrderApi.queryById(purchaseReturnVO.getCustomerOrderId())).map(CustomerOrderDTO::getCode).orElse("");
purchaseReturnVO.setSupplierName(supplierName); purchaseReturnVO.setSupplierName(supplierName);
purchaseReturnVO.setCustomerOrderCode(orderCode); purchaseReturnVO.setCustomerOrderCode(orderCode);
purchaseReturnVO.setCustomerName(customerApi.queryNameStrById(purchaseReturnVO.getCustomerId()));
purchaseReturnVO.setItems(BeanUtils.toBean(purchaseReturnItemList, ErpPurchaseReturnRespVO.Item.class, item -> { purchaseReturnVO.setItems(BeanUtils.toBean(purchaseReturnItemList, ErpPurchaseReturnRespVO.Item.class, item -> {
ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId()); ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId());
item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO); item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO);
......
...@@ -212,8 +212,8 @@ public class ErpPurchaseOrderRespVO { ...@@ -212,8 +212,8 @@ public class ErpPurchaseOrderRespVO {
@Schema(description = "签收总价,单位:分") @Schema(description = "签收总价,单位:分")
private Integer signedTotal; private Integer signedTotal;
@Schema(description = "质检结果(详情接口返回)") /*@Schema(description = "质检结果(详情接口返回)")
private String checkResult; private String checkResult;*/
@Schema(description = "退货数量") @Schema(description = "退货数量")
private Integer returnsCount; private Integer returnsCount;
......
...@@ -8,9 +8,11 @@ import cn.iocoder.foodnexus.framework.common.pojo.PageResult; ...@@ -8,9 +8,11 @@ import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.collection.MapUtils; import cn.iocoder.foodnexus.framework.common.util.collection.MapUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.framework.common.util.spring.SpringUtils;
import cn.iocoder.foodnexus.framework.excel.core.util.ExcelUtils; import cn.iocoder.foodnexus.framework.excel.core.util.ExcelUtils;
import cn.iocoder.foodnexus.module.erp.api.service.ErpSupplierApi; import cn.iocoder.foodnexus.module.erp.api.service.ErpSupplierApi;
import cn.iocoder.foodnexus.module.erp.controller.admin.product.vo.product.ErpProductRespVO; import cn.iocoder.foodnexus.module.erp.controller.admin.product.vo.product.ErpProductRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns.ErpSaleReturnPageReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns.ErpSaleReturnPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns.ErpSaleReturnRespVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns.ErpSaleReturnRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns.ErpSaleReturnSaveReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns.ErpSaleReturnSaveReqVO;
...@@ -30,6 +32,7 @@ import cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo; ...@@ -30,6 +32,7 @@ import cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo;
import cn.iocoder.foodnexus.module.product.api.dto.ProductInfo; import cn.iocoder.foodnexus.module.product.api.dto.ProductInfo;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi; import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.foodnexus.module.system.controller.admin.vo.AuditCommonReqVO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
...@@ -77,6 +80,9 @@ public class ErpSaleReturnController { ...@@ -77,6 +80,9 @@ public class ErpSaleReturnController {
@Autowired @Autowired
private ErpPurchaseReturnService purchaseReturnService; private ErpPurchaseReturnService purchaseReturnService;
@Autowired
private CustomerOrderApi customerOrderApi;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建销售退货") @Operation(summary = "创建销售退货")
...@@ -95,10 +101,8 @@ public class ErpSaleReturnController { ...@@ -95,10 +101,8 @@ public class ErpSaleReturnController {
@PutMapping("/update-status") @PutMapping("/update-status")
@Operation(summary = "更新销售退货的状态(确认退货)") @Operation(summary = "更新销售退货的状态(确认退货)")
@PreAuthorize("@ss.hasPermission('erp:sale-return:update-status')") public CommonResult<Boolean> updateSaleReturnStatus(@RequestBody AuditCommonReqVO auditCommonReqVO) {
public CommonResult<Boolean> updateSaleReturnStatus(@RequestParam("id") Long id, saleReturnService.updateSaleReturnStatus(auditCommonReqVO);
@RequestParam("status") Integer status) {
saleReturnService.updateSaleReturnStatus(id, status);
return success(true); return success(true);
} }
...@@ -129,12 +133,16 @@ public class ErpSaleReturnController { ...@@ -129,12 +133,16 @@ public class ErpSaleReturnController {
saleReturnVO.setCustomerName(customerName); saleReturnVO.setCustomerName(customerName);
saleReturnVO.setCreatorName(creatorName); saleReturnVO.setCreatorName(creatorName);
saleReturnVO.setDeliveryStaffInfo(deliveryStaffApi.querybyStaffId(saleReturnVO.getDeliveryStaffId())); saleReturnVO.setDeliveryStaffInfo(deliveryStaffApi.querybyStaffId(saleReturnVO.getDeliveryStaffId()));
String orderCode = Optional.ofNullable(customerOrderApi.queryById(saleReturnVO.getCustomerOrderId())).map(CustomerOrderDTO::getCode).orElse("");
saleReturnVO.setCustomerOrderCode(orderCode);
saleReturnVO.setItems(BeanUtils.toBean(saleReturnItemList, ErpSaleReturnRespVO.Item.class, item -> { saleReturnVO.setItems(BeanUtils.toBean(saleReturnItemList, ErpSaleReturnRespVO.Item.class, item -> {
ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId()); ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId());
item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO); item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO);
MapUtils.findAndThen(supplierMap, item.getSupplierId(), item::setSupplierName); MapUtils.findAndThen(supplierMap, item.getSupplierId(), item::setSupplierName);
MapUtils.findAndThen(prNoMap, item.getPurchaseReturnOrderId(), item::setPurchaseReturnOrderNo); MapUtils.findAndThen(prNoMap, item.getPurchaseReturnOrderId(), item::setPurchaseReturnOrderNo);
})); }));
CommonResult<ErpSaleOrderRespVO> saleOrder = SpringUtils.getBean(ErpSaleOrderController.class).getSaleOrder(saleReturn.getOrderId());
saleReturnVO.setSaleOrderItems(saleOrder.getData().getItems());
})); }));
} }
...@@ -173,6 +181,7 @@ public class ErpSaleReturnController { ...@@ -173,6 +181,7 @@ public class ErpSaleReturnController {
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(pageResult.getList(), saleReturn -> Long.parseLong(saleReturn.getCreator()))); convertSet(pageResult.getList(), saleReturn -> Long.parseLong(saleReturn.getCreator())));
Map<Long, DeliveryStaffSimpleInfo> deliveryMap = deliveryStaffApi.getMap(CommonUtil.listConvertSet(pageResult.getList(), ErpSaleReturnDO::getDeliveryStaffId)); Map<Long, DeliveryStaffSimpleInfo> deliveryMap = deliveryStaffApi.getMap(CommonUtil.listConvertSet(pageResult.getList(), ErpSaleReturnDO::getDeliveryStaffId));
Map<Long, String> codeMap = customerOrderApi.getCodeMap(CommonUtil.listConvertSet(pageResult.getList(), ErpSaleReturnDO::getCustomerOrderId));
// 2. 开始拼接 // 2. 开始拼接
return BeanUtils.toBean(pageResult, ErpSaleReturnRespVO.class, saleReturn -> { return BeanUtils.toBean(pageResult, ErpSaleReturnRespVO.class, saleReturn -> {
...@@ -182,6 +191,7 @@ public class ErpSaleReturnController { ...@@ -182,6 +191,7 @@ public class ErpSaleReturnController {
MapUtils.findAndThen(customerMap, saleReturn.getCustomerId(), supplier -> saleReturn.setCustomerName(supplier.getName())); MapUtils.findAndThen(customerMap, saleReturn.getCustomerId(), supplier -> saleReturn.setCustomerName(supplier.getName()));
MapUtils.findAndThen(userMap, Long.parseLong(saleReturn.getCreator()), user -> saleReturn.setCreatorName(user.getNickname())); MapUtils.findAndThen(userMap, Long.parseLong(saleReturn.getCreator()), user -> saleReturn.setCreatorName(user.getNickname()));
MapUtils.findAndThen(deliveryMap, saleReturn.getDeliveryStaffId(), saleReturn::setDeliveryStaffInfo); MapUtils.findAndThen(deliveryMap, saleReturn.getDeliveryStaffId(), saleReturn::setDeliveryStaffInfo);
MapUtils.findAndThen(codeMap, saleReturn.getCustomerOrderId(), saleReturn::setCustomerOrderCode);
}); });
} }
......
...@@ -15,9 +15,9 @@ public class DeliveryMyCountRespVO { ...@@ -15,9 +15,9 @@ public class DeliveryMyCountRespVO {
private Long allCount; private Long allCount;
@Schema(description = "今日订单数") @Schema(description = "今日订单数")
private Long todayCount; private Integer todayCount;
@Schema(description = "本月订单数") @Schema(description = "本月订单数")
private Long monthCount; private Integer monthCount;
} }
...@@ -7,6 +7,7 @@ import lombok.Data; ...@@ -7,6 +7,7 @@ import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
import static cn.iocoder.foodnexus.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static cn.iocoder.foodnexus.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
...@@ -29,6 +30,9 @@ public class DeliveryOrderPageReqVO extends PageParam { ...@@ -29,6 +30,9 @@ public class DeliveryOrderPageReqVO extends PageParam {
@Schema(description = "拣货状态") @Schema(description = "拣货状态")
private SaleOrderPickUpStatus pickUpStatus; private SaleOrderPickUpStatus pickUpStatus;
@Schema(description = "拣货状态")
private List<String> pickUpStatusList;
@Schema(description = "订单类型(1-配送单 2-退货单)") @Schema(description = "订单类型(1-配送单 2-退货单)")
private Integer type; private Integer type;
......
...@@ -180,6 +180,9 @@ public class ErpSaleOutRespVO { ...@@ -180,6 +180,9 @@ public class ErpSaleOutRespVO {
@Schema(description = "拣货状态") @Schema(description = "拣货状态")
private SaleOrderPickUpStatus pickUpStatus; private SaleOrderPickUpStatus pickUpStatus;
@Schema(description = "相关文件")
private List<String> remarkFiles;
// ========== 关联字段 ========== // ========== 关联字段 ==========
@Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "巧克力") @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "巧克力")
......
...@@ -3,6 +3,7 @@ package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns; ...@@ -3,6 +3,7 @@ package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.foodnexus.module.erp.api.vo.warehouse.WarehouseInfo; import cn.iocoder.foodnexus.module.erp.api.vo.warehouse.WarehouseInfo;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderRespVO;
import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo; import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo;
import cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo; import cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo;
import cn.iocoder.foodnexus.module.product.api.dto.ProductInfo; import cn.iocoder.foodnexus.module.product.api.dto.ProductInfo;
...@@ -39,6 +40,12 @@ public class ErpSaleReturnRespVO { ...@@ -39,6 +40,12 @@ public class ErpSaleReturnRespVO {
@ExcelProperty("客户名称") @ExcelProperty("客户名称")
private String customerName; private String customerName;
@Schema(description = "客户订单id")
private Long customerOrderId;
@Schema(description = "客户订单code")
private String customerOrderCode;
@Schema(description = "结算账户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "311.89") @Schema(description = "结算账户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "311.89")
@ExcelProperty("结算账户编号") @ExcelProperty("结算账户编号")
private Long accountId; private Long accountId;
...@@ -137,6 +144,15 @@ public class ErpSaleReturnRespVO { ...@@ -137,6 +144,15 @@ public class ErpSaleReturnRespVO {
@Schema(description = "送达时间") @Schema(description = "送达时间")
private LocalDateTime arrivalTime; private LocalDateTime arrivalTime;
@Schema(description = "审核意见")
private String auditReason;
@Schema(description = "审核时间")
private LocalDateTime auditTime;
@Schema(description = "销售配货单子项")
private List<ErpSaleOrderRespVO.Item> saleOrderItems;
@Data @Data
public static class Item { public static class Item {
......
...@@ -199,4 +199,9 @@ public class ErpSaleReturnDO extends BaseDO { ...@@ -199,4 +199,9 @@ public class ErpSaleReturnDO extends BaseDO {
*/ */
private LocalDateTime auditTime; private LocalDateTime auditTime;
/**
* 审核意见
*/
private String auditReason;
} }
\ No newline at end of file
...@@ -135,6 +135,7 @@ public interface ErpPurchaseOrderMapper extends BaseMapperX<ErpPurchaseOrderDO> ...@@ -135,6 +135,7 @@ public interface ErpPurchaseOrderMapper extends BaseMapperX<ErpPurchaseOrderDO>
if (CommonUtil.isNotBlank(reqVO.getCustomerOrderCode())) { if (CommonUtil.isNotBlank(reqVO.getCustomerOrderCode())) {
query.leftJoin("order_customer_order oco3 on oco3.id = t.customer_order_id"); query.leftJoin("order_customer_order oco3 on oco3.id = t.customer_order_id");
query.eq("oco3.code", reqVO.getCustomerOrderCode()); query.eq("oco3.code", reqVO.getCustomerOrderCode());
query.or().eq(ErpPurchaseReturnDO::getNo, reqVO.getCustomerOrderCode());
query.groupBy(ErpPurchaseReturnDO::getId); query.groupBy(ErpPurchaseReturnDO::getId);
} }
return query; return query;
......
...@@ -79,6 +79,7 @@ public interface ErpPurchaseReturnMapper extends BaseMapperX<ErpPurchaseReturnDO ...@@ -79,6 +79,7 @@ public interface ErpPurchaseReturnMapper extends BaseMapperX<ErpPurchaseReturnDO
if (CommonUtil.isNotBlank(reqVO.getCustomerOrderCode())) { if (CommonUtil.isNotBlank(reqVO.getCustomerOrderCode())) {
query.leftJoin("order_customer_order oco3 on oco3.id = t.customer_order_id"); query.leftJoin("order_customer_order oco3 on oco3.id = t.customer_order_id");
query.eq("oco3.code", reqVO.getCustomerOrderCode()); query.eq("oco3.code", reqVO.getCustomerOrderCode());
query.or().eq(ErpPurchaseReturnDO::getNo, reqVO.getCustomerOrderCode());
query.groupBy(ErpPurchaseReturnDO::getId); query.groupBy(ErpPurchaseReturnDO::getId);
} }
return selectJoinPage(reqVO, ErpPurchaseReturnDO.class, query); return selectJoinPage(reqVO, ErpPurchaseReturnDO.class, query);
......
...@@ -85,9 +85,9 @@ public interface ErpSaleOrderMapper extends BaseMapperX<ErpSaleOrderDO> { ...@@ -85,9 +85,9 @@ public interface ErpSaleOrderMapper extends BaseMapperX<ErpSaleOrderDO> {
} }
if (CommonUtil.isNotEmpty(reqVO.getType())) { if (CommonUtil.isNotEmpty(reqVO.getType())) {
if (reqVO.getType() == 1) { if (reqVO.getType() == 1) {
query.in(ErpSaleOrderDO::getPickUpStatus, SaleOrderPickUpStatus.getList(Boolean.TRUE));
} else if (reqVO.getType() == 2) {
query.in(ErpSaleOrderDO::getPickUpStatus, SaleOrderPickUpStatus.getList(Boolean.FALSE)); query.in(ErpSaleOrderDO::getPickUpStatus, SaleOrderPickUpStatus.getList(Boolean.FALSE));
} else if (reqVO.getType() == 2) {
query.in(ErpSaleOrderDO::getPickUpStatus, SaleOrderPickUpStatus.getList(Boolean.TRUE));
} }
} }
return selectJoinPage(reqVO, ErpSaleOrderDO.class, query); return selectJoinPage(reqVO, ErpSaleOrderDO.class, query);
......
...@@ -96,6 +96,7 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00 ...@@ -96,6 +96,7 @@ ErrorCode PURCHASE_ORDER_ITEM_RETURN_FAIL_IN_EXCEED = new ErrorCode(1_030_101_00
ErrorCode SALE_RETURN_FAIL_REFUND_PRICE_EXCEED = new ErrorCode(1_020_203_007, "退款金额({})超过销售退货单总金额({})"); ErrorCode SALE_RETURN_FAIL_REFUND_PRICE_EXCEED = new ErrorCode(1_020_203_007, "退款金额({})超过销售退货单总金额({})");
ErrorCode SALE_RETURN_PROCESS_FAIL_EXISTS_REFUND = new ErrorCode(1_020_203_008, "反审核失败,已存在对应的退款单"); ErrorCode SALE_RETURN_PROCESS_FAIL_EXISTS_REFUND = new ErrorCode(1_020_203_008, "反审核失败,已存在对应的退款单");
ErrorCode SALERETURN_ERROR_ORDER_ITEM = new ErrorCode(1_020_203_009, "订单子项异常"); ErrorCode SALERETURN_ERROR_ORDER_ITEM = new ErrorCode(1_020_203_009, "订单子项异常");
ErrorCode SALE_RETURN_COUNT_ERROR = new ErrorCode(1_020_203_010, "订单子项({})异常,退款数量不能大于签收数量");
// ========== ERP 仓库 1-030-400-000 ========== // ========== ERP 仓库 1-030-400-000 ==========
ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1_030_400_000, "仓库不存在"); ErrorCode WAREHOUSE_NOT_EXISTS = new ErrorCode(1_030_400_000, "仓库不存在");
......
package cn.iocoder.foodnexus.module.erp.service.sale; package cn.iocoder.foodnexus.module.erp.service.sale;
import cn.hutool.core.lang.Pair;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.foodnexus.framework.common.enums.CommonStatusEnum; import cn.iocoder.foodnexus.framework.common.enums.CommonStatusEnum;
import cn.iocoder.foodnexus.framework.common.enums.CustomerTypeEnum; import cn.iocoder.foodnexus.framework.common.enums.CustomerTypeEnum;
import cn.iocoder.foodnexus.framework.common.exception.ServiceException; import cn.iocoder.foodnexus.framework.common.exception.ServiceException;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.framework.common.util.spring.SpringUtils;
import cn.iocoder.foodnexus.module.erp.api.service.ErpCustomerApi; import cn.iocoder.foodnexus.module.erp.api.service.ErpCustomerApi;
import cn.iocoder.foodnexus.module.erp.api.vo.customer.CustomerAddReqVO; import cn.iocoder.foodnexus.module.erp.api.vo.customer.CustomerAddReqVO;
import cn.iocoder.foodnexus.module.erp.api.vo.customer.DeptSimpleDTO;
import cn.iocoder.foodnexus.module.erp.controller.admin.customerwarehouse.vo.CustomerWarehouseSaveReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.customerwarehouse.vo.CustomerWarehouseSaveReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.customer.ErpCustomerPageReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.customer.ErpCustomerPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.customer.ErpCustomerSaveReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.customer.ErpCustomerSaveReqVO;
...@@ -27,6 +31,7 @@ import com.google.common.collect.Maps; ...@@ -27,6 +31,7 @@ import com.google.common.collect.Maps;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.compress.utils.Lists; import org.apache.commons.compress.utils.Lists;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -180,6 +185,7 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp ...@@ -180,6 +185,7 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp
} }
@Override @Override
@Cacheable(cacheNames = RedisKeyConstants.USER_TO_CUSTOMER, key = "#userId")
public ErpCustomerDO getCustomerByUserId(Long userId) { public ErpCustomerDO getCustomerByUserId(Long userId) {
AdminUserDO user = userService.getUser(userId); AdminUserDO user = userService.getUser(userId);
if (!UserSystemEnum.CUSTOMER.getKey().equals(user.getUserSystem())) { if (!UserSystemEnum.CUSTOMER.getKey().equals(user.getUserSystem())) {
...@@ -205,6 +211,7 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp ...@@ -205,6 +211,7 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp
} }
@Override @Override
@CacheEvict(cacheNames = RedisKeyConstants.USER_TO_CUSTOMER, allEntries = true)
public void updateByDept(Long deptId, CustomerAddReqVO customerAddReqVO) { public void updateByDept(Long deptId, CustomerAddReqVO customerAddReqVO) {
ErpCustomerDO customer = customerMapper.selectOne(ErpCustomerDO::getSystemDeptId, deptId); ErpCustomerDO customer = customerMapper.selectOne(ErpCustomerDO::getSystemDeptId, deptId);
if (CommonUtil.isEmpty(customer)) { if (CommonUtil.isEmpty(customer)) {
...@@ -219,13 +226,15 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp ...@@ -219,13 +226,15 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp
} }
@Override @Override
@CacheEvict(cacheNames = RedisKeyConstants.USER_TO_CUSTOMER, allEntries = true)
public void deleteByDept(Long deptId) { public void deleteByDept(Long deptId) {
customerMapper.delete(ErpCustomerDO::getSystemDeptId, deptId); customerMapper.delete(ErpCustomerDO::getSystemDeptId, deptId);
} }
@Override @Override
//@Cacheable(cacheNames = RedisKeyConstants.USER_TO_CUSTOMER, key = "#userId")
public Long queryCustomerIdByUserId(Long userId) { public Long queryCustomerIdByUserId(Long userId) {
AdminUserDO user = userService.getUser(userId); /*AdminUserDO user = userService.getUser(userId);
if (!UserSystemEnum.CUSTOMER.getKey().equals(user.getUserSystem())) { if (!UserSystemEnum.CUSTOMER.getKey().equals(user.getUserSystem())) {
throw exception(ERROR_CUSTOMER_USER); throw exception(ERROR_CUSTOMER_USER);
} }
...@@ -236,8 +245,9 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp ...@@ -236,8 +245,9 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp
} }
if (CommonStatusEnum.isDisable(customer.getStatus())) { if (CommonStatusEnum.isDisable(customer.getStatus())) {
throw exception(CUSTOMER_NOT_ENABLE, customer.getName()); throw exception(CUSTOMER_NOT_ENABLE, customer.getName());
} }*/
return customer.getId(); ErpCustomerServiceImpl bean = SpringUtil.getBean(getClass());
return Optional.ofNullable(bean.getCustomerByUserId(userId)).map(ErpCustomerDO::getId).orElse(null);
} }
@Override @Override
...@@ -295,4 +305,39 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp ...@@ -295,4 +305,39 @@ public class ErpCustomerServiceImpl implements ErpCustomerService, ErpCustomerAp
deptIds.add(user.getDeptId()); deptIds.add(user.getDeptId());
return deptIds; return deptIds;
} }
@Override
public Pair<Boolean, Set<Long>> queryCustomerOrUserByUserId(Long userId) {
AdminUserDO user = userService.getUser(userId);
if (!UserSystemEnum.CUSTOMER.getKey().equals(user.getUserSystem())) {
throw exception(ERROR_CUSTOMER_USER);
}
DeptDO userDept = deptService.getDept(user.getDeptId());
if (Objects.equals(userDept.getParentId(), DeptDO.PARENT_ID_ROOT)) {
Set<Long> deptIds = deptService.getChildDeptIdListFromCache(user.getDeptId());
deptIds.add(user.getDeptId());
return new Pair<>(Boolean.TRUE, deptIds);
}
return new Pair<>(Boolean.FALSE, null);
}
@Override
public List<DeptSimpleDTO> querySubDeptByUserId(Long userId) {
AdminUserDO user = userService.getUser(userId);
if (!UserSystemEnum.CUSTOMER.getKey().equals(user.getUserSystem())) {
throw exception(ERROR_CUSTOMER_USER);
}
DeptDO userDept = deptService.getDept(user.getDeptId());
if (Objects.equals(userDept.getParentId(), DeptDO.PARENT_ID_ROOT)) {
return CommonUtil.listConvert(deptService.getChildDeptList(user.getDeptId()), item->{
DeptSimpleDTO dto = new DeptSimpleDTO();
dto.setCustomerDeptId(item.getId());
dto.setName(item.getName());
return dto;
});
}
return new ArrayList<>();
}
} }
...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; ...@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.collection.MapUtils;
import cn.iocoder.foodnexus.framework.common.util.number.MoneyUtils; import cn.iocoder.foodnexus.framework.common.util.number.MoneyUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.out.ErpSaleOutPageReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.out.ErpSaleOutPageReqVO;
...@@ -217,10 +218,11 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { ...@@ -217,10 +218,11 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
private List<ErpSaleOutItemDO> validateSaleOutItems(List<ErpSaleOutSaveReqVO.Item> list) { private List<ErpSaleOutItemDO> validateSaleOutItems(List<ErpSaleOutSaveReqVO.Item> list) {
// 1. 校验产品存在 // 1. 校验产品存在
Map<Long, ProductSpuDO> productMap = productSpuService.getSpuMap(convertSet(list, ErpSaleOutSaveReqVO.Item::getProductId)); /*Map<Long, ProductSpuDO> productMap = productSpuService.getSpuMap(convertSet(list, ErpSaleOutSaveReqVO.Item::getProductId));*/
// 2. 转化为 ErpSaleOutItemDO 列表 // 2. 转化为 ErpSaleOutItemDO 列表
return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOutItemDO.class, item -> { return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOutItemDO.class, item -> {
item.setProductUnit(productMap.get(item.getProductId()).getUnitName()); // item.setProductUnit(productMap.get(item.getProductId()).getUnitName());
/*MapUtils.findAndThen(productMap, item.getProductId(), product->item.setProductUnit(product.getUnitName()));*/
item.setTotalPrice(item.getProductPrice() * item.getCount()); item.setTotalPrice(item.getProductPrice() * item.getCount());
if (item.getTotalPrice() == null) { if (item.getTotalPrice() == null) {
return; return;
......
...@@ -6,6 +6,7 @@ import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns.ErpSaleR ...@@ -6,6 +6,7 @@ import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns.ErpSaleR
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleReturnDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleReturnDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleReturnItemDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleReturnItemDO;
import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO; import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO;
import cn.iocoder.foodnexus.module.system.controller.admin.vo.AuditCommonReqVO;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -37,10 +38,8 @@ public interface ErpSaleReturnService { ...@@ -37,10 +38,8 @@ public interface ErpSaleReturnService {
/** /**
* 更新销售退货的状态 * 更新销售退货的状态
* *
* @param id 编号
* @param status 状态
*/ */
void updateSaleReturnStatus(Long id, Integer status); void updateSaleReturnStatus(AuditCommonReqVO auditCommonReqVO);
/** /**
* 更新销售退货的退款金额 * 更新销售退货的退款金额
...@@ -111,4 +110,7 @@ public interface ErpSaleReturnService { ...@@ -111,4 +110,7 @@ public interface ErpSaleReturnService {
void delivery(Long id, Long deliveryStaffId); void delivery(Long id, Long deliveryStaffId);
void arrival(DeliveryOrderUpdateReqVO reqVO, Long aLong); void arrival(DeliveryOrderUpdateReqVO reqVO, Long aLong);
ErpSaleReturnDO getSaleReturnByCustomerOrderId(Long id);
} }
\ No newline at end of file
...@@ -33,11 +33,13 @@ import cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseReturnService ...@@ -33,11 +33,13 @@ import cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseReturnService
import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockRecordService; import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockRecordService;
import cn.iocoder.foodnexus.module.erp.service.stock.bo.ErpStockRecordCreateReqBO; import cn.iocoder.foodnexus.module.erp.service.stock.bo.ErpStockRecordCreateReqBO;
import cn.iocoder.foodnexus.module.order.api.CustomerOrderApi; import cn.iocoder.foodnexus.module.order.api.CustomerOrderApi;
import cn.iocoder.foodnexus.module.order.dto.CustomerOrderDTO;
import cn.iocoder.foodnexus.module.order.dto.CustomerOrderItemDTO; import cn.iocoder.foodnexus.module.order.dto.CustomerOrderItemDTO;
import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO; import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO; import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService; import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi; import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import cn.iocoder.foodnexus.module.system.controller.admin.vo.AuditCommonReqVO;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -200,7 +202,9 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService { ...@@ -200,7 +202,9 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateSaleReturnStatus(Long id, Integer status) { public void updateSaleReturnStatus(AuditCommonReqVO reqVO) {
Integer status = Integer.parseInt(reqVO.getAuditStatus());
Long id = reqVO.getId();
boolean approve = ErpAuditStatus.APPROVE.getStatus().equals(status); boolean approve = ErpAuditStatus.APPROVE.getStatus().equals(status);
// 1.1 校验存在 // 1.1 校验存在
ErpSaleReturnDO saleReturn = validateSaleReturnExists(id); ErpSaleReturnDO saleReturn = validateSaleReturnExists(id);
...@@ -215,13 +219,44 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService { ...@@ -215,13 +219,44 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService {
// 2. 更新状态 // 2. 更新状态
int updateCount = saleReturnMapper.updateByIdAndStatus(id, saleReturn.getStatus(), int updateCount = saleReturnMapper.updateByIdAndStatus(id, saleReturn.getStatus(),
new ErpSaleReturnDO().setStatus(status).setAuditTime(LocalDateTime.now()).setReturnsStatus(RETURNS_APPROVE.getType())); new ErpSaleReturnDO().setStatus(status).setAuditReason(reqVO.getAuditReason()).setAuditTime(LocalDateTime.now()).setReturnsStatus(RETURNS_APPROVE.getType()));
if (updateCount == 0) { if (updateCount == 0) {
throw exception(approve ? SALE_RETURN_APPROVE_FAIL : SALE_RETURN_PROCESS_FAIL); throw exception(approve ? SALE_RETURN_APPROVE_FAIL : SALE_RETURN_PROCESS_FAIL);
} }
// 3. 变更库存 // 3. 变更库存
List<ErpSaleReturnItemDO> saleReturnItems = saleReturnItemMapper.selectListByReturnId(id); List<ErpSaleReturnItemDO> saleReturnItems = saleReturnItemMapper.selectListByReturnId(id);
// 更新客户订单退款字段
List<CustomerOrderItemDTO> customerORderItems = customerOrderApi.queryItemsByOrderId(saleReturn.getCustomerOrderId());
Map<Long, CustomerOrderItemDTO> customerOrderItemMap = CommonUtil.listConvertMap(customerORderItems, CustomerOrderItemDTO::getId);
List<CustomerOrderItemDTO> updateItems = new ArrayList<>();
Integer returnsTotal = 0;
for (ErpSaleReturnItemDO item : saleReturnItems) {
Long orderItemId = item.getCustomerOrderItemId();
Integer returnsCount = item.getCount();
if (!customerOrderItemMap.containsKey(orderItemId)) {
throw exception(SALERETURN_ERROR_ORDER_ITEM);
}
CustomerOrderItemDTO orderItem = customerOrderItemMap.get(orderItemId);
CustomerOrderItemDTO updateItem = new CustomerOrderItemDTO();
updateItem.setId(orderItem.getId());
updateItem.setReturnsQuantity(returnsCount);
updateItem.setReturnsTotal(returnsCount * orderItem.getOrderItemPrice());
if (orderItem.getSignedQuantity() < CommonUtil.getEls(updateItem.getReturnsQuantity(), 0)) {
throw exception(SALE_RETURN_COUNT_ERROR, orderItem.getProductName());
}
/*updateItem.setSignedQuantity(orderItem.getSignedQuantity() - returnsCount);
updateItem.setSignedTotal(orderItem.getSignedTotal() - updateItem.getReturnsTotal());*/
updateItems.add(updateItem);
returnsTotal += updateItem.getReturnsTotal();
}
customerOrderApi.updateActualAmount(saleReturn.getCustomerOrderId(), - returnsTotal);
customerOrderApi.updateItems(updateItems);
// TODO 退款确认后才进行库存变更 // TODO 退款确认后才进行库存变更
/*Integer bizType = approve ? ErpStockRecordBizTypeEnum.SALE_RETURN.getType() /*Integer bizType = approve ? ErpStockRecordBizTypeEnum.SALE_RETURN.getType()
: ErpStockRecordBizTypeEnum.SALE_RETURN_CANCEL.getType(); : ErpStockRecordBizTypeEnum.SALE_RETURN_CANCEL.getType();
...@@ -562,4 +597,12 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService { ...@@ -562,4 +597,12 @@ public class ErpSaleReturnServiceImpl implements ErpSaleReturnService {
} }
} }
@Override
public ErpSaleReturnDO getSaleReturnByCustomerOrderId(Long customerOrderId) {
return saleReturnMapper.selectOne(Wrappers.<ErpSaleReturnDO>lambdaQuery()
.eq(ErpSaleReturnDO::getCustomerOrderId, customerOrderId)
.orderByDesc(ErpSaleReturnDO::getId)
.last("LIMIT 1"));
}
} }
...@@ -32,6 +32,9 @@ public class CustomerRequireRespVO { ...@@ -32,6 +32,9 @@ public class CustomerRequireRespVO {
@ExcelProperty("商品分类编号") @ExcelProperty("商品分类编号")
private Long categoryId; private Long categoryId;
@Schema(description = "商品分类名称")
private String categoryName;
@Schema(description = "是否受理", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "是否受理", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("是否受理") @ExcelProperty("是否受理")
private Boolean isRequire; private Boolean isRequire;
......
...@@ -6,6 +6,7 @@ import cn.iocoder.foodnexus.framework.common.pojo.CommonResult; ...@@ -6,6 +6,7 @@ import cn.iocoder.foodnexus.framework.common.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.pojo.PageParam; import cn.iocoder.foodnexus.framework.common.pojo.PageParam;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.collection.MapUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.framework.excel.core.util.ExcelUtils; import cn.iocoder.foodnexus.framework.excel.core.util.ExcelUtils;
import cn.iocoder.foodnexus.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.foodnexus.framework.security.core.util.SecurityFrameworkUtils;
...@@ -16,6 +17,7 @@ import cn.iocoder.foodnexus.module.operations.controller.admin.customerrequire.v ...@@ -16,6 +17,7 @@ import cn.iocoder.foodnexus.module.operations.controller.admin.customerrequire.v
import cn.iocoder.foodnexus.module.operations.controller.admin.customerrequire.vo.CustomerRequireSaveReqVO; import cn.iocoder.foodnexus.module.operations.controller.admin.customerrequire.vo.CustomerRequireSaveReqVO;
import cn.iocoder.foodnexus.module.operations.dal.dataobject.customerrequire.CustomerRequireDO; import cn.iocoder.foodnexus.module.operations.dal.dataobject.customerrequire.CustomerRequireDO;
import cn.iocoder.foodnexus.module.operations.service.customerrequire.CustomerRequireService; import cn.iocoder.foodnexus.module.operations.service.customerrequire.CustomerRequireService;
import cn.iocoder.foodnexus.module.product.service.category.ProductCategoryService;
import cn.iocoder.foodnexus.module.system.annotations.AppSystemAuth; import cn.iocoder.foodnexus.module.system.annotations.AppSystemAuth;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
...@@ -30,6 +32,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -30,6 +32,7 @@ import org.springframework.web.bind.annotation.*;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map;
import static cn.iocoder.foodnexus.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.foodnexus.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success; import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success;
...@@ -47,6 +50,9 @@ public class AppCustomerRequireController { ...@@ -47,6 +50,9 @@ public class AppCustomerRequireController {
@Autowired @Autowired
private ErpCustomerApi customerApi; private ErpCustomerApi customerApi;
@Autowired
private ProductCategoryService productCategoryService;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建客户需求") @Operation(summary = "创建客户需求")
public CommonResult<Long> createCustomerRequire(@Valid @RequestBody CustomerRequireSaveReqVO createReqVO) { public CommonResult<Long> createCustomerRequire(@Valid @RequestBody CustomerRequireSaveReqVO createReqVO) {
...@@ -67,7 +73,9 @@ public class AppCustomerRequireController { ...@@ -67,7 +73,9 @@ public class AppCustomerRequireController {
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<CustomerRequireRespVO> getCustomerRequire(@RequestParam("id") Long id) { public CommonResult<CustomerRequireRespVO> getCustomerRequire(@RequestParam("id") Long id) {
CustomerRequireDO customerRequire = customerRequireService.getCustomerRequire(id); CustomerRequireDO customerRequire = customerRequireService.getCustomerRequire(id);
return success(BeanUtils.toBean(customerRequire, CustomerRequireRespVO.class)); return success(BeanUtils.toBean(customerRequire, CustomerRequireRespVO.class, item -> {
item.setCategoryName(productCategoryService.queryNameById(customerRequire.getCategoryId()));
}));
} }
@GetMapping("/page") @GetMapping("/page")
...@@ -75,7 +83,10 @@ public class AppCustomerRequireController { ...@@ -75,7 +83,10 @@ public class AppCustomerRequireController {
public CommonResult<PageResult<CustomerRequireRespVO>> getCustomerRequirePage(@Valid CustomerRequirePageReqVO pageReqVO) { public CommonResult<PageResult<CustomerRequireRespVO>> getCustomerRequirePage(@Valid CustomerRequirePageReqVO pageReqVO) {
pageReqVO.setCreator(SecurityFrameworkUtils.getLoginUserId()); pageReqVO.setCreator(SecurityFrameworkUtils.getLoginUserId());
PageResult<CustomerRequireDO> pageResult = customerRequireService.getCustomerRequirePage(pageReqVO); PageResult<CustomerRequireDO> pageResult = customerRequireService.getCustomerRequirePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, CustomerRequireRespVO.class)); Map<Long, String> map = productCategoryService.getMap(CommonUtil.listConvertSet(pageResult.getList(), CustomerRequireDO::getCategoryId));
return success(BeanUtils.toBean(pageResult, CustomerRequireRespVO.class, item -> {
MapUtils.findAndThen(map, item.getCategoryId(), item::setCategoryName);
}));
} }
@DeleteMapping("/delete") @DeleteMapping("/delete")
......
...@@ -112,7 +112,7 @@ public class InquireCustomerPushServiceImpl implements InquireCustomerPushServic ...@@ -112,7 +112,7 @@ public class InquireCustomerPushServiceImpl implements InquireCustomerPushServic
* @param id * @param id
*/ */
@Override @Override
@CacheEvict(cacheNames = RedisKeyConstants.CUSTOMER_VISIBLE_PRODUCT, allEntries = true) @CacheEvict(cacheNames = RedisKeyConstants.CUSTOMER_VISIBLE_PRODUCT, key = "#id")
public void confirm(Long id) { public void confirm(Long id) {
validateInquireCustomerPushExists(id); validateInquireCustomerPushExists(id);
inquireCustomerPushMapper.update(Wrappers.<InquireCustomerPushDO>lambdaUpdate() inquireCustomerPushMapper.update(Wrappers.<InquireCustomerPushDO>lambdaUpdate()
......
...@@ -99,7 +99,7 @@ public class InquireSupplierPushServiceImpl implements InquireSupplierPushServic ...@@ -99,7 +99,7 @@ public class InquireSupplierPushServiceImpl implements InquireSupplierPushServic
* @param updateReqVO * @param updateReqVO
*/ */
@Override @Override
@CacheEvict(cacheNames = RedisKeyConstants.CUSTOMER_VISIBLE_PRODUCT, allEntries = true) /*@CacheEvict(cacheNames = RedisKeyConstants.CUSTOMER_VISIBLE_PRODUCT, allEntries = true)*/
public void confirm(AppInquireSupplierPushConfirmReqVO updateReqVO) { public void confirm(AppInquireSupplierPushConfirmReqVO updateReqVO) {
List<InquireSupplierPushDO> inquireSupplierPushDOS = inquireSupplierPushMapper.selectList(new LambdaQueryWrapperX<InquireSupplierPushDO>() List<InquireSupplierPushDO> inquireSupplierPushDOS = inquireSupplierPushMapper.selectList(new LambdaQueryWrapperX<InquireSupplierPushDO>()
.eq(InquireSupplierPushDO::getSupplierId, updateReqVO.getSupplierId()) .eq(InquireSupplierPushDO::getSupplierId, updateReqVO.getSupplierId())
......
...@@ -100,10 +100,10 @@ public class ScoringWeightServiceImpl implements ScoringWeightService { ...@@ -100,10 +100,10 @@ public class ScoringWeightServiceImpl implements ScoringWeightService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void edit(ScoringWeightEditReqVO reqVO) { public void edit(ScoringWeightEditReqVO reqVO) {
Long allCount = scoringWeightMapper.selectCount(); /*Long allCount = scoringWeightMapper.selectCount();
if (reqVO.getEditItems().size() != allCount) { if (reqVO.getEditItems().size() != allCount) {
throw exception(SCORING_WEIGHT_LIST_ERROR); throw exception(SCORING_WEIGHT_LIST_ERROR);
} }*/
double sum = reqVO.getEditItems().stream().mapToDouble(item -> double sum = reqVO.getEditItems().stream().mapToDouble(item ->
item.getWeightRatio().doubleValue()).sum(); item.getWeightRatio().doubleValue()).sum();
if (sum != 100) { if (sum != 100) {
......
...@@ -29,4 +29,6 @@ public interface CustomerOrderApi { ...@@ -29,4 +29,6 @@ public interface CustomerOrderApi {
void updateItems(List<CustomerOrderItemDTO> updateItems); void updateItems(List<CustomerOrderItemDTO> updateItems);
Map<Long, String> getCodeMap(Collection<Long> longs); Map<Long, String> getCodeMap(Collection<Long> longs);
void updateActualAmount(Long id, int addAmount);
} }
...@@ -33,7 +33,7 @@ public class CheckTaskItemsSaveReqVO { ...@@ -33,7 +33,7 @@ public class CheckTaskItemsSaveReqVO {
private String categoryName; private String categoryName;
@Schema(description = "商品封面图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn") @Schema(description = "商品封面图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
@NotEmpty(message = "商品封面图不能为空") // @NotEmpty(message = "商品封面图不能为空")
private String picUrl; private String picUrl;
@Schema(description = "检查数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "24148") @Schema(description = "检查数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "24148")
......
...@@ -11,6 +11,7 @@ import cn.iocoder.foodnexus.framework.common.pojo.PageParam; ...@@ -11,6 +11,7 @@ import cn.iocoder.foodnexus.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Set;
import static cn.iocoder.foodnexus.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; import static cn.iocoder.foodnexus.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
...@@ -79,6 +80,12 @@ public class CustomerOrderPageReqVO extends PageParam { ...@@ -79,6 +80,12 @@ public class CustomerOrderPageReqVO extends PageParam {
@Schema(hidden = true) @Schema(hidden = true)
private Long creator; private Long creator;
@Schema(hidden = true)
private Set<Long> deptIds;
@Schema(description = "灶点id")
private Long customerDeptId;
@Schema(description = "创建月份(yyyy-MM)") @Schema(description = "创建月份(yyyy-MM)")
private String createYearMonth; private String createYearMonth;
......
...@@ -106,6 +106,9 @@ public class CustomerOrderRespVO { ...@@ -106,6 +106,9 @@ public class CustomerOrderRespVO {
@Schema(description = "是否已评论") @Schema(description = "是否已评论")
private Boolean hasScore; private Boolean hasScore;
@Schema(description = "是否已确认")
private Boolean hasFinish;
@Schema(description = "当前订单进度") @Schema(description = "当前订单进度")
private List<CustomerOrderRecordRespVO> currentRecords; private List<CustomerOrderRecordRespVO> currentRecords;
......
package cn.iocoder.foodnexus.module.order.controller.app.customerOrder; package cn.iocoder.foodnexus.module.order.controller.app.customerOrder;
import cn.hutool.core.lang.Pair;
import cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum; import cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum;
import cn.iocoder.foodnexus.framework.common.pojo.CommonResult; import cn.iocoder.foodnexus.framework.common.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.module.erp.api.service.ErpCustomerApi;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutDO;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOutService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOutService;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderPageReqVO; import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderPageReqVO;
...@@ -32,6 +34,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -32,6 +34,7 @@ import org.springframework.web.bind.annotation.*;
import javax.sql.rowset.serial.SerialException; import javax.sql.rowset.serial.SerialException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success; import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success;
import static cn.iocoder.foodnexus.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.foodnexus.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
...@@ -50,6 +53,8 @@ public class AppCustomerOrderController { ...@@ -50,6 +53,8 @@ public class AppCustomerOrderController {
private CustomerOrderRecordService customerOrderRecordService; private CustomerOrderRecordService customerOrderRecordService;
@Autowired @Autowired
private CustomerOrderItemService customerOrderItemService; private CustomerOrderItemService customerOrderItemService;
@Autowired
private ErpCustomerApi customerApi;
@GetMapping("status-count") @GetMapping("status-count")
@Operation(summary = "客户订单各状态对应数量") @Operation(summary = "客户订单各状态对应数量")
...@@ -145,7 +150,12 @@ public class AppCustomerOrderController { ...@@ -145,7 +150,12 @@ public class AppCustomerOrderController {
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得客户总订单分页") @Operation(summary = "获得客户总订单分页")
public CommonResult<PageResult<CustomerOrderRespVO>> getCustomerOrderPage(@Valid CustomerOrderPageReqVO pageReqVO) { public CommonResult<PageResult<CustomerOrderRespVO>> getCustomerOrderPage(@Valid CustomerOrderPageReqVO pageReqVO) {
Pair<Boolean, Set<Long>> pair = customerApi.queryCustomerOrUserByUserId(getLoginUserId());
if (pair.getKey()) {
pageReqVO.setDeptIds(pair.getValue());
} else {
pageReqVO.setCreator(getLoginUserId()); pageReqVO.setCreator(getLoginUserId());
}
PageResult<CustomerOrderDO> pageResult = customerOrderService.getCustomerOrderPage(pageReqVO); PageResult<CustomerOrderDO> pageResult = customerOrderService.getCustomerOrderPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, CustomerOrderRespVO.class, item -> { return success(BeanUtils.toBean(pageResult, CustomerOrderRespVO.class, item -> {
item.setCurrentRecords(customerOrderRecordService.queryCurrentRecords(item.getId(), item.getOrderStatus())); item.setCurrentRecords(customerOrderRecordService.queryCurrentRecords(item.getId(), item.getOrderStatus()));
......
package cn.iocoder.foodnexus.module.order.controller.app.customerOrder; package cn.iocoder.foodnexus.module.order.controller.app.customerOrder;
import cn.hutool.core.lang.Pair;
import cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum; import cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum;
import cn.iocoder.foodnexus.framework.common.pojo.CommonResult; import cn.iocoder.foodnexus.framework.common.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.module.erp.api.service.ErpCustomerApi; import cn.iocoder.foodnexus.module.erp.api.service.ErpCustomerApi;
import cn.iocoder.foodnexus.module.erp.api.vo.customer.DeptSimpleDTO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerMonthOrderRespVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerMonthOrderRespVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerMonthOrderTotalRespVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerMonthOrderTotalRespVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderReconciliationReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderReconciliationReqVO;
...@@ -20,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -20,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Set; import java.util.Set;
import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success; import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success;
...@@ -69,4 +72,10 @@ public class AppCustomerOrderReconciliationController { ...@@ -69,4 +72,10 @@ public class AppCustomerOrderReconciliationController {
return success(Boolean.TRUE); return success(Boolean.TRUE);
} }
@GetMapping("/query-customer-dept-id")
@Operation(summary = "查询灶点信息")
public CommonResult<List<DeptSimpleDTO>> queryCustomerDeptId() {
return success(customerApi.querySubDeptByUserId(getLoginUserId()));
}
} }
...@@ -22,6 +22,9 @@ public class AppCustomerOrderReceiptRespVO { ...@@ -22,6 +22,9 @@ public class AppCustomerOrderReceiptRespVO {
@Schema(description = "实际签收数量") @Schema(description = "实际签收数量")
private Integer signedQuantity; private Integer signedQuantity;
@Schema(description = "签收总价,单位:分")
private Integer signedTotal;
@Schema(description = "说明") @Schema(description = "说明")
private String remark; private String remark;
......
...@@ -20,6 +20,9 @@ public class AppCustomerOrderReturnRespVO { ...@@ -20,6 +20,9 @@ public class AppCustomerOrderReturnRespVO {
@Schema(description = "退货单id") @Schema(description = "退货单id")
private Long saleReturnId; private Long saleReturnId;
@Schema(description = "退货单编号")
private String saleReturnNo;
@Schema(description = "说明") @Schema(description = "说明")
private String remark; private String remark;
......
...@@ -5,25 +5,35 @@ import cn.iocoder.foodnexus.framework.common.pojo.CommonResult; ...@@ -5,25 +5,35 @@ import cn.iocoder.foodnexus.framework.common.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.pojo.PageParam; import cn.iocoder.foodnexus.framework.common.pojo.PageParam;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.collection.MapUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.framework.common.validation.InEnum; import cn.iocoder.foodnexus.framework.common.validation.InEnum;
import cn.iocoder.foodnexus.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.foodnexus.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryMyCountRespVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryMyCountRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryOrderPageReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.out.ErpSaleOutRespVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutItemDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpStockDO;
import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus; import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOutService;
import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService;
import cn.iocoder.foodnexus.module.operations.service.deliverystaffcustomer.DeliveryStaffCustomerService; import cn.iocoder.foodnexus.module.operations.service.deliverystaffcustomer.DeliveryStaffCustomerService;
import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi; import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRespVO; import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRespVO;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorderitem.vo.CustomerOrderItemRespVO; import cn.iocoder.foodnexus.module.order.controller.admin.customerorderitem.vo.CustomerOrderItemRespVO;
import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliveryOrderArrivalDetails;
import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliveryOrderDetails; import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliveryOrderDetails;
import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliverySaleOrderRespVO; import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliverySaleOrderRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryStatusCountRespVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryStatusCountRespVO;
import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO; import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO;
import cn.iocoder.foodnexus.module.order.service.customerorder.CustomerOrderService; import cn.iocoder.foodnexus.module.order.service.customerorder.CustomerOrderService;
import cn.iocoder.foodnexus.module.order.service.customerorderitem.CustomerOrderItemService; import cn.iocoder.foodnexus.module.order.service.customerorderitem.CustomerOrderItemService;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService;
import cn.iocoder.foodnexus.module.system.annotations.AppSystemAuth; import cn.iocoder.foodnexus.module.system.annotations.AppSystemAuth;
import cn.iocoder.foodnexus.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; import cn.iocoder.foodnexus.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
...@@ -31,10 +41,13 @@ import io.swagger.v3.oas.annotations.Parameter; ...@@ -31,10 +41,13 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success; import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success;
...@@ -69,10 +82,13 @@ public class DeliverySaleOrderController { ...@@ -69,10 +82,13 @@ public class DeliverySaleOrderController {
@Autowired @Autowired
private CustomerOrderItemService customerOrderItemService; private CustomerOrderItemService customerOrderItemService;
@Autowired
private ErpSaleOutService saleOutService;
@GetMapping("/my-count") @GetMapping("/my-count")
@Operation(summary = "个人中心 - 配送订单数") @Operation(summary = "个人中心 - 配送订单数")
public CommonResult<DeliveryMyCountRespVO> queryMyCount() { public CommonResult<DeliveryMyCountRespVO> queryMyCount() {
return success(saleOrderService.queryMyCount(getLoginUserId())); return success(saleOrderService.queryMyCount(deliveryStaffApi.queryStaffIdByUserId(getLoginUserId())));
} }
@GetMapping("/status-count") @GetMapping("/status-count")
...@@ -163,4 +179,17 @@ public class DeliverySaleOrderController { ...@@ -163,4 +179,17 @@ public class DeliverySaleOrderController {
return success(Boolean.TRUE); return success(Boolean.TRUE);
} }
@GetMapping("/arrival")
@Operation(summary = "配货单 - 订单到货 详情")
@Parameter(name = "id", description = "客户订单id(customerOrderInfo.id)", required = true)
public CommonResult<List<DeliveryOrderArrivalDetails>> getSaleOut(@RequestParam("id") Long id) {
ErpSaleOutDO saleOut = saleOutService.getSaleOutByCustomerOrderId(id);
if (saleOut == null) {
return success(null);
}
List<ErpSaleOutItemDO> saleOutItemList = saleOutService.getSaleOutItemListByOutId(saleOut.getId());
return success(BeanUtils.toBean(saleOutItemList, DeliveryOrderArrivalDetails.class));
}
} }
...@@ -5,14 +5,19 @@ import cn.iocoder.foodnexus.framework.common.pojo.CommonResult; ...@@ -5,14 +5,19 @@ import cn.iocoder.foodnexus.framework.common.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.pojo.PageParam; import cn.iocoder.foodnexus.framework.common.pojo.PageParam;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.collection.MapUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.framework.common.validation.InEnum; import cn.iocoder.foodnexus.framework.common.validation.InEnum;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryMyCountRespVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryMyCountRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryOrderPageReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryStatusCountRespVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.DeliveryStatusCountRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.returns.ErpSaleReturnRespVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpCustomerDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleReturnDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleReturnDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleReturnItemDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpStockDO;
import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus; import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleReturnService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleReturnService;
...@@ -20,6 +25,7 @@ import cn.iocoder.foodnexus.module.operations.service.deliverystaffcustomer.Deli ...@@ -20,6 +25,7 @@ import cn.iocoder.foodnexus.module.operations.service.deliverystaffcustomer.Deli
import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi; import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRespVO; import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRespVO;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorderitem.vo.CustomerOrderItemRespVO; import cn.iocoder.foodnexus.module.order.controller.admin.customerorderitem.vo.CustomerOrderItemRespVO;
import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliveryOrderArrivalDetails;
import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliveryOrderDetails; import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliveryOrderDetails;
import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliverySaleOrderRespVO; import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliverySaleOrderRespVO;
import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliverySaleReturnRespVO; import cn.iocoder.foodnexus.module.order.controller.app.delivery.vo.DeliverySaleReturnRespVO;
...@@ -27,16 +33,21 @@ import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO; ...@@ -27,16 +33,21 @@ import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO;
import cn.iocoder.foodnexus.module.order.service.customerorder.CustomerOrderService; import cn.iocoder.foodnexus.module.order.service.customerorder.CustomerOrderService;
import cn.iocoder.foodnexus.module.order.service.customerorderitem.CustomerOrderItemService; import cn.iocoder.foodnexus.module.order.service.customerorderitem.CustomerOrderItemService;
import cn.iocoder.foodnexus.module.system.annotations.AppSystemAuth; import cn.iocoder.foodnexus.module.system.annotations.AppSystemAuth;
import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.foodnexus.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO; import cn.iocoder.foodnexus.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success; import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success;
...@@ -91,4 +102,16 @@ public class DeliverySaleReturnController { ...@@ -91,4 +102,16 @@ public class DeliverySaleReturnController {
return success(Boolean.TRUE); return success(Boolean.TRUE);
} }
@GetMapping("/arrival")
@Operation(summary = "退货单 - 订单到货 详情")
@Parameter(name = "id", description = "客户订单id(customerOrderInfo.id)", required = true)
public CommonResult<List<DeliveryOrderArrivalDetails>> getSaleReturn(@RequestParam("id") Long id) {
ErpSaleReturnDO saleReturn = saleReturnService.getSaleReturnByCustomerOrderId(id);
if (saleReturn == null) {
return success(null);
}
List<ErpSaleReturnItemDO> saleReturnItemList = saleReturnService.getSaleReturnItemListByReturnId(saleReturn.getId());
return success(BeanUtils.toBean(saleReturnItemList, DeliveryOrderArrivalDetails.class));
}
} }
package cn.iocoder.foodnexus.module.order.controller.app.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* @author : yanghao
* create at: 2025/11/4 15:10
* @description:
*/
@Data
public class DeliveryOrderArrivalDetails {
@Schema(description = "客户订单子项id")
private Long customerOrderItemId;
@Schema(description = "配送单/退货单 子项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "11756")
private Long orderItemId;
@Schema(description = "签收数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
private BigDecimal count;
@Schema(description = "备注", example = "随便")
private String remark;
@Schema(description = "相关文件")
private List<String> remarkFiles;
}
...@@ -98,7 +98,10 @@ public class ShoppingCartController { ...@@ -98,7 +98,10 @@ public class ShoppingCartController {
PageResult<ShoppingCartDO> pageResult = shoppingCartService.getShoppingCartPage(pageReqVO); PageResult<ShoppingCartDO> pageResult = shoppingCartService.getShoppingCartPage(pageReqVO);
Map<Long, ProductSpuDO> productMap = productService.getSpuMap(CommonUtil.listConvertSet(pageResult.getList(), ShoppingCartDO::getProductId)); Map<Long, ProductSpuDO> productMap = productService.getSpuMap(CommonUtil.listConvertSet(pageResult.getList(), ShoppingCartDO::getProductId));
return success(BeanUtils.toBean(pageResult, ShoppingCartRespVO.class, item -> { return success(BeanUtils.toBean(pageResult, ShoppingCartRespVO.class, item -> {
MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductInfo(BeanUtils.toBean(product, ProductInfo.class))); MapUtils.findAndThen(productMap, item.getProductId(), product -> {
item.setProductInfo(BeanUtils.toBean(product, ProductInfo.class));
item.setStatus(product.getStatus());
});
})); }));
} }
......
...@@ -44,4 +44,7 @@ public class ShoppingCartRespVO { ...@@ -44,4 +44,7 @@ public class ShoppingCartRespVO {
@ExcelProperty("创建时间") @ExcelProperty("创建时间")
private LocalDateTime createTime; private LocalDateTime createTime;
@Schema(description = "商品状态")
private Integer status = 0;
} }
\ No newline at end of file
...@@ -119,4 +119,9 @@ public class CustomerOrderDO extends BaseDO { ...@@ -119,4 +119,9 @@ public class CustomerOrderDO extends BaseDO {
*/ */
private Boolean hasScore; private Boolean hasScore;
/**
* 是否已确认
*/
private Boolean hasFinish;
} }
\ No newline at end of file
...@@ -50,6 +50,8 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> { ...@@ -50,6 +50,8 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> {
.eqIfPresent(CustomerOrderDO::getOperCompany, reqVO.getOperCompany()) .eqIfPresent(CustomerOrderDO::getOperCompany, reqVO.getOperCompany())
.betweenIfPresent(CustomerOrderDO::getCreateTime, reqVO.getCreateTime()) .betweenIfPresent(CustomerOrderDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(CustomerOrderDO::getCreator, reqVO.getCreator()) .eqIfPresent(CustomerOrderDO::getCreator, reqVO.getCreator())
.inIfPresent(CustomerOrderDO::getCustomerDeptId, reqVO.getDeptIds())
.eqIfPresent(CustomerOrderDO::getCustomerDeptId, reqVO.getCustomerDeptId())
.eqIfPresent(CustomerOrderDO::getHasScore, reqVO.getHasScore()) .eqIfPresent(CustomerOrderDO::getHasScore, reqVO.getHasScore())
.likeIfPresent(CustomerOrderDO::getAddressInfo, reqVO.getContactPhone()) .likeIfPresent(CustomerOrderDO::getAddressInfo, reqVO.getContactPhone())
.likeIfPresent(CustomerOrderDO::getAddressInfo, reqVO.getContactUser()) .likeIfPresent(CustomerOrderDO::getAddressInfo, reqVO.getContactUser())
...@@ -95,7 +97,8 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> { ...@@ -95,7 +97,8 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> {
queryWrapperX.select("count(*) as 'orderCount',SUM(order_amount) as 'orderAmount'"); queryWrapperX.select("count(*) as 'orderCount',SUM(order_amount) as 'orderAmount'");
queryWrapperX.between("create_time", begin, end); queryWrapperX.between("create_time", begin, end);
queryWrapperX.in("order_status", CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getKey(), queryWrapperX.in("order_status", CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getKey(),
CustomerOrderStatus.FINISH.getKey())); CustomerOrderStatus.FINISH.getKey(),
CustomerOrderStatus.RETURN.getKey()));
queryWrapperX.in("customer_dept_id", deptIds); queryWrapperX.in("customer_dept_id", deptIds);
return this.selectJoinOne(AppCustomerMonthOrderRespVO.class, queryWrapperX); return this.selectJoinOne(AppCustomerMonthOrderRespVO.class, queryWrapperX);
} }
...@@ -109,7 +112,8 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> { ...@@ -109,7 +112,8 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> {
queryWrapperX.select("CASE WHEN SUM(CASE WHEN order_status='SIGN_RECEIPT' THEN 1 ELSE 0 END)> 0 THEN 0 ELSE 1 END AS 'status'"); queryWrapperX.select("CASE WHEN SUM(CASE WHEN order_status='SIGN_RECEIPT' THEN 1 ELSE 0 END)> 0 THEN 0 ELSE 1 END AS 'status'");
queryWrapperX.between("create_time", begin, end); queryWrapperX.between("create_time", begin, end);
queryWrapperX.in("order_status", CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getKey(), queryWrapperX.in("order_status", CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getKey(),
CustomerOrderStatus.FINISH.getKey())); CustomerOrderStatus.FINISH.getKey(),
CustomerOrderStatus.RETURN.getKey()));
queryWrapperX.in("customer_dept_id", reqVO.getDeptIds()); queryWrapperX.in("customer_dept_id", reqVO.getDeptIds());
queryWrapperX.groupBy("DATE_FORMAT(create_time, '%Y-%m') "); queryWrapperX.groupBy("DATE_FORMAT(create_time, '%Y-%m') ");
queryWrapperX.orderByDesc("id"); queryWrapperX.orderByDesc("id");
...@@ -117,7 +121,7 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> { ...@@ -117,7 +121,7 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> {
return this.selectJoinPage(reqVO, AppCustomerMonthOrderRespVO.MonthItems.class, queryWrapperX); return this.selectJoinPage(reqVO, AppCustomerMonthOrderRespVO.MonthItems.class, queryWrapperX);
} }
default AppCustomerMonthOrderTotalRespVO reconciliationMonthTotal(String yearMonth) { default AppCustomerMonthOrderTotalRespVO reconciliationMonthTotal(String yearMonth, Set<Long> deptIds) {
String createMonth = yearMonth.trim(); String createMonth = yearMonth.trim();
String startOfMonth = createMonth + "-01 00:00:00"; String startOfMonth = createMonth + "-01 00:00:00";
String[] parts = createMonth.split("-"); String[] parts = createMonth.split("-");
...@@ -131,7 +135,9 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> { ...@@ -131,7 +135,9 @@ public interface CustomerOrderMapper extends BaseMapperX<CustomerOrderDO> {
queryWrapperX.select("count(*) as 'orderCount',SUM(order_amount) as 'orderAmount'"); queryWrapperX.select("count(*) as 'orderCount',SUM(order_amount) as 'orderAmount'");
queryWrapperX.between("create_time", startOfMonth, endOfMonth); queryWrapperX.between("create_time", startOfMonth, endOfMonth);
queryWrapperX.in("order_status", CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getKey(), queryWrapperX.in("order_status", CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getKey(),
CustomerOrderStatus.FINISH.getKey())); CustomerOrderStatus.FINISH.getKey(),
CustomerOrderStatus.RETURN.getKey()));
queryWrapperX.in("customer_dept_id", deptIds);
queryWrapperX.orderByDesc("id"); queryWrapperX.orderByDesc("id");
return this.selectJoinOne(AppCustomerMonthOrderTotalRespVO.class, queryWrapperX); return this.selectJoinOne(AppCustomerMonthOrderTotalRespVO.class, queryWrapperX);
} }
......
...@@ -10,6 +10,7 @@ import cn.iocoder.foodnexus.framework.common.exception.ErrorCode; ...@@ -10,6 +10,7 @@ import cn.iocoder.foodnexus.framework.common.exception.ErrorCode;
public interface ErrorCodeConstants { public interface ErrorCodeConstants {
// ========== 购物车 1_018-000-000 ========== // ========== 购物车 1_018-000-000 ==========
ErrorCode SHOPPING_CART_NOT_EXISTS = new ErrorCode(1_018_100_000, "购物车不存在"); ErrorCode SHOPPING_CART_NOT_EXISTS = new ErrorCode(1_018_100_000, "购物车不存在");
ErrorCode PRODUCT_DISABLE = new ErrorCode(1_018_100_001, "商品【{}】已下架");
// ========== 客户总订单 1_019_100_0001 ========== // ========== 客户总订单 1_019_100_0001 ==========
ErrorCode CUSTOMER_ORDER_NOT_EXISTS = new ErrorCode(1_019_100_001, "客户总订单不存在"); ErrorCode CUSTOMER_ORDER_NOT_EXISTS = new ErrorCode(1_019_100_001, "客户总订单不存在");
...@@ -21,6 +22,7 @@ public interface ErrorCodeConstants { ...@@ -21,6 +22,7 @@ public interface ErrorCodeConstants {
ErrorCode CUSTOMER_ORDER_RETURN_PRODUCT_ERROR = new ErrorCode(1_019_100_006, "客户订单退货商品异常"); ErrorCode CUSTOMER_ORDER_RETURN_PRODUCT_ERROR = new ErrorCode(1_019_100_006, "客户订单退货商品异常");
ErrorCode CUSTOMER_ORDER_RETURN_COUNT_ERROR= new ErrorCode(1_019_100_007, "商品{}退货数量异常"); ErrorCode CUSTOMER_ORDER_RETURN_COUNT_ERROR= new ErrorCode(1_019_100_007, "商品{}退货数量异常");
ErrorCode CUSTOMER_ORDER_HAS_RECEIPT = new ErrorCode(1_019_100_006, "客户订单已评价"); ErrorCode CUSTOMER_ORDER_HAS_RECEIPT = new ErrorCode(1_019_100_006, "客户订单已评价");
ErrorCode CUSTOMER_ORDER_HAS_FINISH = new ErrorCode(1_019_100_007, "客户订单【{}】已确认");
// ========== 客户订单-子订单 1_020_100_0001 ========== // ========== 客户订单-子订单 1_020_100_0001 ==========
ErrorCode CUSTOMER_ORDER_ITEM_NOT_EXISTS = new ErrorCode(1_020_100_001, "客户订单-子订单不存在"); ErrorCode CUSTOMER_ORDER_ITEM_NOT_EXISTS = new ErrorCode(1_020_100_001, "客户订单-子订单不存在");
......
...@@ -189,7 +189,7 @@ public class CheckTaskServiceImpl implements CheckTaskService, CheckTaskApi { ...@@ -189,7 +189,7 @@ public class CheckTaskServiceImpl implements CheckTaskService, CheckTaskApi {
throw exception(CHECK_TASK_PURCHASE_ORDER_NOT_EXISTS); throw exception(CHECK_TASK_PURCHASE_ORDER_NOT_EXISTS);
} }
if (!Objects.equals(purchaseOrder.getDeliveryStatus(), ErpDeliveryStatus.ARRIVAL.getStatus())) { if (!Objects.equals(purchaseOrder.getDeliveryStatus(), ErpDeliveryStatus.ARRIVAL.getStatus())) {
throw exception(CHECK_TASK_PURCHASE_ORDER_NOT_EXISTS); throw exception(CHECK_TASK_PURCHASE_ORDER_STATUS_ERROR);
} }
if (CheckTaskStatus.NORMAL.getKey().equals(updateReqVO.getStatus())) { if (CheckTaskStatus.NORMAL.getKey().equals(updateReqVO.getStatus())) {
......
...@@ -342,7 +342,8 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -342,7 +342,8 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
try { try {
CustomerOrderStatus orderStatus = customerOrder.getOrderStatus(); CustomerOrderStatus orderStatus = customerOrder.getOrderStatus();
if (orderStatus.equals(CustomerOrderStatus.ORDER_SUCCESS) || if (orderStatus.equals(CustomerOrderStatus.ORDER_SUCCESS) ||
orderStatus.equals(CustomerOrderStatus.ORDER_MATCH)) { orderStatus.equals(CustomerOrderStatus.ORDER_MATCH) ||
orderStatus.equals(CustomerOrderStatus.SUPPLIER_ACCEPT_ORDER)) {
CustomerOrderRemark orderRemark = new CustomerOrderRemark(); CustomerOrderRemark orderRemark = new CustomerOrderRemark();
orderRemark.setOperTime(new Date()); orderRemark.setOperTime(new Date());
orderRemark.setRemark(CommonUtil.getEls(reqVO.getRemark(), "")); orderRemark.setRemark(CommonUtil.getEls(reqVO.getRemark(), ""));
...@@ -466,10 +467,12 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -466,10 +467,12 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
if (productMap.containsKey(customerOrderItem.getProductId())) { if (productMap.containsKey(customerOrderItem.getProductId())) {
ErpSaleOutItemDO saleOutItem = productMap.get(customerOrderItem.getProductId()); ErpSaleOutItemDO saleOutItem = productMap.get(customerOrderItem.getProductId());
result.setSignedQuantity(saleOutItem.getCount()); result.setSignedQuantity(saleOutItem.getCount());
result.setSignedTotal(saleOutItem.getCount() * saleOutItem.getProductPrice());
result.setRemark(saleOutItem.getRemark()); result.setRemark(saleOutItem.getRemark());
result.setRemarkFiles(saleOutItem.getRemarkFiles()); result.setRemarkFiles(saleOutItem.getRemarkFiles());
} else { } else {
result.setSignedQuantity(customerOrderItem.getOrderItemQuantity()); result.setSignedQuantity(customerOrderItem.getOrderItemQuantity());
result.setSignedTotal(customerOrderItem.getOrderItemQuantity() * customerOrderItem.getOrderItemPrice());
} }
return result; return result;
}); });
...@@ -642,9 +645,10 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -642,9 +645,10 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
} }
// TODO 待评价 // TODO 待评价
result.put("TO_BE_SCORE", customerOrderMapper.selectCount(Wrappers.<CustomerOrderDO>lambdaQuery() result.put("TO_BE_SCORE", customerOrderMapper.selectCount(Wrappers.<CustomerOrderDO>lambdaQuery()
.eq(CustomerOrderDO::getCreator, loginUserId)
.eq(CustomerOrderDO::getHasScore, Boolean.FALSE) .eq(CustomerOrderDO::getHasScore, Boolean.FALSE)
.in(CustomerOrderDO::getOrderStatus, CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getLabel(), .in(CustomerOrderDO::getOrderStatus, CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getKey(),
CustomerOrderStatus.FINISH.getLabel())))); CustomerOrderStatus.FINISH.getKey()))));
return result; return result;
} }
...@@ -671,7 +675,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -671,7 +675,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
*/ */
@Override @Override
public AppCustomerMonthOrderTotalRespVO monthTotal(String yearMonth, Set<Long> deptIds) { public AppCustomerMonthOrderTotalRespVO monthTotal(String yearMonth, Set<Long> deptIds) {
return customerOrderMapper.reconciliationMonthTotal(yearMonth); return customerOrderMapper.reconciliationMonthTotal(yearMonth, deptIds);
} }
@Override @Override
...@@ -682,9 +686,20 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -682,9 +686,20 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
if (CommonUtil.isEmpty(customerOrder)) { if (CommonUtil.isEmpty(customerOrder)) {
throw exception(CUSTOMER_ORDER_NOT_EXISTS); throw exception(CUSTOMER_ORDER_NOT_EXISTS);
} }
if (CustomerOrderStatus.SIGN_RECEIPT.equals(customerOrder.getOrderStatus())) { /*if (customerOrder.getHasFinish()) {
this.updateOrderStatus(id, CustomerOrderStatus.FINISH); throw exception(CUSTOMER_ORDER_HAS_FINISH, customerOrder.getCode());
}*/
if (CustomerOrderStatus.SIGN_RECEIPT.equals(customerOrder.getOrderStatus()) ||
CustomerOrderStatus.RETURN.equals(customerOrder.getOrderStatus())) {
// this.updateOrderStatus(id, CustomerOrderStatus.FINISH);
// 订单记录 // 订单记录
CustomerOrderDO updateDo = new CustomerOrderDO();
updateDo.setId(id);
if (CustomerOrderStatus.SIGN_RECEIPT.equals(customerOrder.getOrderStatus())) {
updateDo.setOrderStatus(CustomerOrderStatus.FINISH);
}
updateDo.setHasFinish(Boolean.TRUE);
customerOrderMapper.updateById(updateDo);
/*CustomerOrderRecordEvent event = new CustomerOrderRecordEvent(); /*CustomerOrderRecordEvent event = new CustomerOrderRecordEvent();
event.setOrderStatus(CustomerOrderStatus.FINISH); event.setOrderStatus(CustomerOrderStatus.FINISH);
event.setCustomerOrderId(id); event.setCustomerOrderId(id);
...@@ -714,6 +729,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -714,6 +729,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
return result; return result;
} }
result.setSaleReturnId(saleReturn.getId()); result.setSaleReturnId(saleReturn.getId());
result.setSaleReturnNo(saleReturn.getNo());
result.setTotalReturnPrice(saleReturn.getTotalPrice()); result.setTotalReturnPrice(saleReturn.getTotalPrice());
result.setRemark(saleReturn.getRemark()); result.setRemark(saleReturn.getRemark());
result.setRemarkFiles(saleReturn.getFilesUrl()); result.setRemarkFiles(saleReturn.getFilesUrl());
...@@ -851,4 +867,22 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -851,4 +867,22 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
return CommonUtil.listConvertMap(customerOrderMapper.selectByIds(ids), CustomerOrderDO::getId, CustomerOrderDO::getCode); return CommonUtil.listConvertMap(customerOrderMapper.selectByIds(ids), CustomerOrderDO::getId, CustomerOrderDO::getCode);
} }
@Override
public void updateActualAmount(Long id, int addAmount) {
String lock = String.format(ORDER_LOCK, id);
RedisUtils.tryLockRds(lock);
try {
CustomerOrderDO customerOrder = this.getCustomerOrder(id);
if (CommonUtil.isNotEmpty(customerOrder)) {
int actualAmount = customerOrder.getActualAmount() + addAmount;
actualAmount = Math.max(actualAmount, 0);
customerOrderMapper.update(Wrappers.<CustomerOrderDO>lambdaUpdate()
.set(CustomerOrderDO::getActualAmount, actualAmount)
.eq(CustomerOrderDO::getId, id));
}
} finally {
RedisUtils.unLockRds(lock);
}
}
} }
\ No newline at end of file
...@@ -4,13 +4,18 @@ import cn.iocoder.foodnexus.framework.common.util.CommonUtil; ...@@ -4,13 +4,18 @@ import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.module.order.controller.app.shoppingcart.vo.ShoppingCartPageReqVO; import cn.iocoder.foodnexus.module.order.controller.app.shoppingcart.vo.ShoppingCartPageReqVO;
import cn.iocoder.foodnexus.module.order.controller.app.shoppingcart.vo.ShoppingCartSaveBatchReqVO; import cn.iocoder.foodnexus.module.order.controller.app.shoppingcart.vo.ShoppingCartSaveBatchReqVO;
import cn.iocoder.foodnexus.module.order.controller.app.shoppingcart.vo.ShoppingCartSaveReqVO; import cn.iocoder.foodnexus.module.order.controller.app.shoppingcart.vo.ShoppingCartSaveReqVO;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.enums.spu.ProductSpuStatusEnum;
import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import cn.iocoder.foodnexus.module.order.dal.dataobject.shoppingcart.ShoppingCartDO; import cn.iocoder.foodnexus.module.order.dal.dataobject.shoppingcart.ShoppingCartDO;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
...@@ -35,8 +40,12 @@ public class ShoppingCartServiceImpl implements ShoppingCartService { ...@@ -35,8 +40,12 @@ public class ShoppingCartServiceImpl implements ShoppingCartService {
@Resource @Resource
private ShoppingCartMapper shoppingCartMapper; private ShoppingCartMapper shoppingCartMapper;
@Autowired
private ProductSpuService productSpuService;
@Override @Override
public Long createShoppingCart(ShoppingCartSaveReqVO createReqVO) { public Long createShoppingCart(ShoppingCartSaveReqVO createReqVO) {
validProduct(createReqVO.getProductId());
ShoppingCartDO cart = shoppingCartMapper.selectOne(Wrappers.<ShoppingCartDO>lambdaQuery() ShoppingCartDO cart = shoppingCartMapper.selectOne(Wrappers.<ShoppingCartDO>lambdaQuery()
.eq(ShoppingCartDO::getProductId, createReqVO.getProductId()) .eq(ShoppingCartDO::getProductId, createReqVO.getProductId())
.eq(ShoppingCartDO::getCreator, getLoginUserId()) .eq(ShoppingCartDO::getCreator, getLoginUserId())
...@@ -57,9 +66,21 @@ public class ShoppingCartServiceImpl implements ShoppingCartService { ...@@ -57,9 +66,21 @@ public class ShoppingCartServiceImpl implements ShoppingCartService {
return shoppingCart.getId(); return shoppingCart.getId();
} }
private void validProduct(Long productId) {
ProductSpuDO appSpu = productSpuService.getAppSpu(productId);
if (CommonUtil.isEmpty(appSpu) || !ProductSpuStatusEnum.isEnable(appSpu.getStatus()) ){
throw exception(PRODUCT_DISABLE, appSpu.getName());
}
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void createBatch(ShoppingCartSaveBatchReqVO createReqVO) { public void createBatch(ShoppingCartSaveBatchReqVO createReqVO) {
List<ProductSpuDO> spuList = productSpuService.getSpuList(CommonUtil.listConvert(createReqVO.getItems(), ShoppingCartSaveReqVO::getProductId));
List<ProductSpuDO> collect = spuList.stream().filter(item -> ProductSpuStatusEnum.isEnable(item.getStatus())).toList();
if (CommonUtil.isEmpty(collect)) {
throw exception(PRODUCT_DISABLE, String.join(",", CommonUtil.listConvertSet(createReqVO.getItems(), ShoppingCartSaveReqVO::getProductName)));
}
for (ShoppingCartSaveReqVO item : createReqVO.getItems()) { for (ShoppingCartSaveReqVO item : createReqVO.getItems()) {
this.createShoppingCart(item); this.createShoppingCart(item);
} }
...@@ -69,6 +90,7 @@ public class ShoppingCartServiceImpl implements ShoppingCartService { ...@@ -69,6 +90,7 @@ public class ShoppingCartServiceImpl implements ShoppingCartService {
public void updateShoppingCart(ShoppingCartSaveReqVO updateReqVO) { public void updateShoppingCart(ShoppingCartSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
validateShoppingCartExists(updateReqVO.getId()); validateShoppingCartExists(updateReqVO.getId());
validProduct(updateReqVO.getProductId());
// 更新 // 更新
ShoppingCartDO updateObj = BeanUtils.toBean(updateReqVO, ShoppingCartDO.class); ShoppingCartDO updateObj = BeanUtils.toBean(updateReqVO, ShoppingCartDO.class);
shoppingCartMapper.updateById(updateObj); shoppingCartMapper.updateById(updateObj);
......
...@@ -7,6 +7,7 @@ import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; ...@@ -7,6 +7,7 @@ import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuRespVO; import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuRespVO;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuStatusRespVO;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO; import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.enums.spu.ProductSpuStatusEnum; import cn.iocoder.foodnexus.module.product.enums.spu.ProductSpuStatusEnum;
import cn.iocoder.foodnexus.module.product.service.history.ProductBrowseHistoryService; import cn.iocoder.foodnexus.module.product.service.history.ProductBrowseHistoryService;
...@@ -27,6 +28,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -27,6 +28,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import static cn.iocoder.foodnexus.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.foodnexus.framework.common.exception.util.ServiceExceptionUtil.exception;
...@@ -47,6 +49,13 @@ public class AppProductSpuController { ...@@ -47,6 +49,13 @@ public class AppProductSpuController {
@Resource @Resource
private ProductBrowseHistoryService productBrowseHistoryService; private ProductBrowseHistoryService productBrowseHistoryService;
@GetMapping("/product-status")
@Operation(summary = "获取商品上下架情况")
public CommonResult<List<AppProductSpuStatusRespVO>> productStatus(@RequestParam("productIds") List<Long> productIds) {
return success(productSpuService.queryProductStatus(productIds));
}
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得商品 SPU 分页") @Operation(summary = "获得商品 SPU 分页")
public CommonResult<PageResult<AppProductSpuRespVO>> getSpuPage(@Valid AppProductSpuPageReqVO pageVO) { public CommonResult<PageResult<AppProductSpuRespVO>> getSpuPage(@Valid AppProductSpuPageReqVO pageVO) {
......
package cn.iocoder.foodnexus.module.product.controller.app.spu.vo; package cn.iocoder.foodnexus.module.product.controller.app.spu.vo;
import cn.iocoder.foodnexus.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO; import cn.iocoder.foodnexus.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO;
import cn.iocoder.foodnexus.module.product.enums.spu.ProductSpuStatusEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
...@@ -46,5 +47,12 @@ public class AppProductSpuDetailRespVO { ...@@ -46,5 +47,12 @@ public class AppProductSpuDetailRespVO {
@Schema(description = "下浮率(%)") @Schema(description = "下浮率(%)")
private BigDecimal discount; private BigDecimal discount;
/**
* 商品状态
*
* 枚举 {@link ProductSpuStatusEnum}
*/
@Schema(description = "商品状态")
private Integer status;
} }
package cn.iocoder.foodnexus.module.product.controller.app.spu.vo; package cn.iocoder.foodnexus.module.product.controller.app.spu.vo;
import cn.iocoder.foodnexus.module.product.enums.spu.ProductSpuStatusEnum;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
...@@ -41,4 +42,12 @@ public class AppProductSpuRespVO { ...@@ -41,4 +42,12 @@ public class AppProductSpuRespVO {
@Schema(description = "下浮率(%)") @Schema(description = "下浮率(%)")
private BigDecimal discount; private BigDecimal discount;
/**
* 商品状态
*
* 枚举 {@link ProductSpuStatusEnum}
*/
@Schema(description = "商品状态")
private Integer status;
} }
package cn.iocoder.foodnexus.module.product.controller.app.spu.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* @author : yanghao
* create at: 2025/11/5 17:28
* @description:
*/
@Data
public class AppProductSpuStatusRespVO {
@Schema(description = "商品id")
private Long productId;
@Schema(description = "商品名称")
private String productName;
@Schema(description = "0-下架 1-上架")
private Integer status;
}
package cn.iocoder.foodnexus.module.product.service.category; package cn.iocoder.foodnexus.module.product.service.category;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.module.product.controller.admin.category.vo.ProductCategoryListReqVO; import cn.iocoder.foodnexus.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.category.vo.ProductCategorySaveReqVO; import cn.iocoder.foodnexus.module.product.controller.admin.category.vo.ProductCategorySaveReqVO;
import cn.iocoder.foodnexus.module.product.dal.dataobject.category.ProductCategoryDO; import cn.iocoder.foodnexus.module.product.dal.dataobject.category.ProductCategoryDO;
...@@ -93,6 +94,9 @@ public interface ProductCategoryService { ...@@ -93,6 +94,9 @@ public interface ProductCategoryService {
void validateCategoryList(Collection<Long> ids); void validateCategoryList(Collection<Long> ids);
default String queryNameById(Long categoryId) { default String queryNameById(Long categoryId) {
if (CommonUtil.isEmpty(categoryId)) {
return "";
}
return Optional.ofNullable(this.getCategory(categoryId)) return Optional.ofNullable(this.getCategory(categoryId))
.map(ProductCategoryDO::getName).orElse(""); .map(ProductCategoryDO::getName).orElse("");
} }
......
...@@ -8,6 +8,7 @@ import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuPag ...@@ -8,6 +8,7 @@ import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuPag
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO; import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO; 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.AppProductSpuPageReqVO;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuStatusRespVO;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO; import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.system.annotations.AutoSetPrice; import cn.iocoder.foodnexus.module.system.annotations.AutoSetPrice;
import cn.iocoder.foodnexus.module.system.controller.admin.vo.AuditCommonReqVO; import cn.iocoder.foodnexus.module.system.controller.admin.vo.AuditCommonReqVO;
...@@ -165,4 +166,7 @@ public interface ProductSpuService { ...@@ -165,4 +166,7 @@ public interface ProductSpuService {
} }
String queryName(Collection<Long> productIds); String queryName(Collection<Long> productIds);
List<AppProductSpuStatusRespVO> queryProductStatus(List<Long> ids);
} }
...@@ -15,6 +15,7 @@ import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuPag ...@@ -15,6 +15,7 @@ import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuPag
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO; import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO;
import cn.iocoder.foodnexus.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO; 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.AppProductSpuPageReqVO;
import cn.iocoder.foodnexus.module.product.controller.app.spu.vo.AppProductSpuStatusRespVO;
import cn.iocoder.foodnexus.module.product.dal.dataobject.category.ProductCategoryDO; import cn.iocoder.foodnexus.module.product.dal.dataobject.category.ProductCategoryDO;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO; import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.dal.mysql.spu.ProductSpuMapper; import cn.iocoder.foodnexus.module.product.dal.mysql.spu.ProductSpuMapper;
...@@ -154,7 +155,7 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -154,7 +155,7 @@ public class ProductSpuServiceImpl implements ProductSpuService {
if (productMap.get(id) == null) { if (productMap.get(id) == null) {
throw exception(SPU_NOT_EXISTS); throw exception(SPU_NOT_EXISTS);
} }
if (CommonStatusEnum.isDisable(product.getStatus())) { if (!ProductSpuStatusEnum.isEnable(product.getStatus())) {
throw exception(SPU_NOT_ENABLE, product.getName()); throw exception(SPU_NOT_ENABLE, product.getName());
} }
} }
...@@ -170,6 +171,21 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -170,6 +171,21 @@ public class ProductSpuServiceImpl implements ProductSpuService {
} }
@Override @Override
@CustomerVisible
public List<AppProductSpuStatusRespVO> queryProductStatus(List<Long> ids) {
List<ProductSpuDO> productSpuDOS = productSpuMapper.selectList(Wrappers.<ProductSpuDO>lambdaQuery()
.in(ProductSpuDO::getId, ids));
return CommonUtil.listConvert(productSpuDOS, item -> {
AppProductSpuStatusRespVO resp = new AppProductSpuStatusRespVO();
resp.setProductId(item.getId());
resp.setProductName(item.getName());
resp.setStatus(item.getStatus());
return resp;
});
}
@Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteSpu(Long id) { public void deleteSpu(Long id) {
// 校验存在 // 校验存在
......
...@@ -119,4 +119,10 @@ public interface RedisKeyConstants { ...@@ -119,4 +119,10 @@ public interface RedisKeyConstants {
*/ */
String USER_ID_TO_DELIVERY_STAFF_ID = "user_id_to_delivery_staff_id"; String USER_ID_TO_DELIVERY_STAFF_ID = "user_id_to_delivery_staff_id";
/**
* 用户绑定客户id
*
*/
String USER_TO_CUSTOMER = "user_to_customer_id_0";
} }
...@@ -52,7 +52,7 @@ public class DeptServiceImpl implements DeptService { ...@@ -52,7 +52,7 @@ public class DeptServiceImpl implements DeptService {
private ErpCustomerApi customerApi; private ErpCustomerApi customerApi;
@Override @Override
@CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST ,
allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public DeptSaveRespVO createDept(DeptSaveReqVO createReqVO) { public DeptSaveRespVO createDept(DeptSaveReqVO createReqVO) {
...@@ -82,7 +82,7 @@ public class DeptServiceImpl implements DeptService { ...@@ -82,7 +82,7 @@ public class DeptServiceImpl implements DeptService {
} }
@Override @Override
@CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, @CacheEvict(cacheNames = { RedisKeyConstants.DEPT_CHILDREN_ID_LIST,RedisKeyConstants.USER_TO_CUSTOMER },
allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateDept(DeptSaveReqVO updateReqVO) { public void updateDept(DeptSaveReqVO updateReqVO) {
...@@ -109,7 +109,7 @@ public class DeptServiceImpl implements DeptService { ...@@ -109,7 +109,7 @@ public class DeptServiceImpl implements DeptService {
} }
@Override @Override
@CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, @CacheEvict(cacheNames = { RedisKeyConstants.DEPT_CHILDREN_ID_LIST,RedisKeyConstants.USER_TO_CUSTOMER },
allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteDept(Long id) { public void deleteDept(Long id) {
...@@ -131,7 +131,7 @@ public class DeptServiceImpl implements DeptService { ...@@ -131,7 +131,7 @@ public class DeptServiceImpl implements DeptService {
} }
@Override @Override
@CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, @CacheEvict(cacheNames = { RedisKeyConstants.DEPT_CHILDREN_ID_LIST,RedisKeyConstants.USER_TO_CUSTOMER },
allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteDeptList(List<Long> ids) { public void deleteDeptList(List<Long> ids) {
......
...@@ -27,6 +27,7 @@ import cn.iocoder.foodnexus.module.system.dal.dataobject.dept.UserPostDO; ...@@ -27,6 +27,7 @@ import cn.iocoder.foodnexus.module.system.dal.dataobject.dept.UserPostDO;
import cn.iocoder.foodnexus.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.foodnexus.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.foodnexus.module.system.dal.mysql.dept.UserPostMapper; import cn.iocoder.foodnexus.module.system.dal.mysql.dept.UserPostMapper;
import cn.iocoder.foodnexus.module.system.dal.mysql.user.AdminUserMapper; import cn.iocoder.foodnexus.module.system.dal.mysql.user.AdminUserMapper;
import cn.iocoder.foodnexus.module.system.dal.redis.RedisKeyConstants;
import cn.iocoder.foodnexus.module.system.service.dept.DeptService; import cn.iocoder.foodnexus.module.system.service.dept.DeptService;
import cn.iocoder.foodnexus.module.system.service.dept.PostService; import cn.iocoder.foodnexus.module.system.service.dept.PostService;
import cn.iocoder.foodnexus.module.system.service.permission.PermissionService; import cn.iocoder.foodnexus.module.system.service.permission.PermissionService;
...@@ -39,6 +40,7 @@ import jakarta.annotation.Resource; ...@@ -39,6 +40,7 @@ import jakarta.annotation.Resource;
import jakarta.validation.ConstraintViolationException; import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -151,6 +153,7 @@ public class AdminUserServiceImpl implements AdminUserService { ...@@ -151,6 +153,7 @@ public class AdminUserServiceImpl implements AdminUserService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}", @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_UPDATE_SUB_TYPE, bizNo = "{{#updateReqVO.id}}",
success = SYSTEM_USER_UPDATE_SUCCESS) success = SYSTEM_USER_UPDATE_SUCCESS)
@CacheEvict(cacheNames = RedisKeyConstants.USER_TO_CUSTOMER, key = "#updateReqVO.id")
public void updateUser(UserSaveReqVO updateReqVO) { public void updateUser(UserSaveReqVO updateReqVO) {
updateReqVO.setPassword(null); // 特殊:此处不更新密码 updateReqVO.setPassword(null); // 特殊:此处不更新密码
// 1. 校验正确性 // 1. 校验正确性
...@@ -246,6 +249,7 @@ public class AdminUserServiceImpl implements AdminUserService { ...@@ -246,6 +249,7 @@ public class AdminUserServiceImpl implements AdminUserService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_DELETE_SUB_TYPE, bizNo = "{{#id}}", @LogRecord(type = SYSTEM_USER_TYPE, subType = SYSTEM_USER_DELETE_SUB_TYPE, bizNo = "{{#id}}",
success = SYSTEM_USER_DELETE_SUCCESS) success = SYSTEM_USER_DELETE_SUCCESS)
@CacheEvict(cacheNames = RedisKeyConstants.USER_TO_CUSTOMER, key = "#id")
public void deleteUser(Long id) { public void deleteUser(Long id) {
// 1. 校验用户存在 // 1. 校验用户存在
AdminUserDO user = validateUserExists(id); AdminUserDO user = validateUserExists(id);
...@@ -263,6 +267,7 @@ public class AdminUserServiceImpl implements AdminUserService { ...@@ -263,6 +267,7 @@ public class AdminUserServiceImpl implements AdminUserService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@CacheEvict(cacheNames = RedisKeyConstants.USER_TO_CUSTOMER, allEntries = true)
public void deleteUserList(List<Long> ids) { public void deleteUserList(List<Long> ids) {
// 1. 批量删除用户 // 1. 批量删除用户
userMapper.deleteByIds(ids); userMapper.deleteByIds(ids);
......
...@@ -81,7 +81,7 @@ spring: ...@@ -81,7 +81,7 @@ spring:
redis: redis:
host: 127.0.0.1 # 地址 host: 127.0.0.1 # 地址
port: 6379 # 端口 port: 6379 # 端口
database: 1 # 数据库索引 database: 2 # 数据库索引
password: 123456 # 密码,建议生产环境开启 password: 123456 # 密码,建议生产环境开启
--- #################### 定时任务相关配置 #################### --- #################### 定时任务相关配置 ####################
......
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