完成中转仓管理

This commit is contained in:
xuqiuyun
2025-12-08 15:24:43 +08:00
parent e968fcf52a
commit 620975c04d
981 changed files with 154245 additions and 83 deletions

View File

@@ -0,0 +1,141 @@
package com.aiotagro.cattletrade.business.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.aiotagro.cattletrade.business.entity.SalesOverview;
import com.aiotagro.cattletrade.business.service.ISalesOverviewService;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Map;
/**
* 销售概览控制器
*
* @author System
* @date 2025-01-20
*/
@RestController
@RequestMapping("/salesoverview")
public class SalesOverviewController {
private static final Logger logger = LoggerFactory.getLogger(SalesOverviewController.class);
@Autowired
private ISalesOverviewService salesOverviewService;
/**
* 查询销售概览列表(分页+搜索)
*/
@SaCheckPermission("salesoverview:list")
@PostMapping("/list")
public PageResultResponse<SalesOverview> list(@RequestBody Map<String, Object> params) {
try {
logger.info("查询销售概览列表,参数:{}", params);
PageResultResponse<SalesOverview> result = salesOverviewService.pageQuery(params);
logger.info("查询成功,共{}条记录", result.getData().getTotal());
return result;
} catch (Exception e) {
logger.error("查询销售概览列表失败:{}", e.getMessage(), e);
return new PageResultResponse<>(0, new ArrayList<>());
}
}
/**
* 新增销售概览
*/
@SaCheckPermission("salesoverview:add")
@PostMapping("/add")
public AjaxResult add(@RequestBody SalesOverview salesOverview) {
try {
logger.info("新增销售概览");
return salesOverviewService.addSalesOverview(salesOverview);
} catch (Exception e) {
logger.error("新增销售概览失败:{}", e.getMessage(), e);
return AjaxResult.error("新增销售概览失败:" + e.getMessage());
}
}
/**
* 编辑销售概览
*/
@SaCheckPermission("salesoverview:edit")
@PostMapping("/edit")
public AjaxResult edit(@RequestBody SalesOverview salesOverview) {
try {
logger.info("编辑销售概览ID{}", salesOverview.getId());
if (salesOverview.getId() == null) {
logger.error("编辑失败销售概览ID不能为空");
return AjaxResult.error("销售概览ID不能为空");
}
return salesOverviewService.updateSalesOverview(salesOverview);
} catch (Exception e) {
logger.error("编辑销售概览失败:{}", e.getMessage(), e);
return AjaxResult.error("编辑销售概览失败:" + e.getMessage());
}
}
/**
* 删除销售概览
*/
@SaCheckPermission("salesoverview:delete")
@GetMapping("/delete")
public AjaxResult delete(@RequestParam Integer id) {
try {
logger.info("删除销售概览ID{}", id);
if (id == null) {
logger.error("删除失败销售概览ID不能为空");
return AjaxResult.error("销售概览ID不能为空");
}
return salesOverviewService.deleteSalesOverview(id);
} catch (Exception e) {
logger.error("删除销售概览失败:{}", e.getMessage(), e);
return AjaxResult.error("删除销售概览失败:" + e.getMessage());
}
}
/**
* 查询销售概览详情
*/
@SaCheckPermission("salesoverview:view")
@GetMapping("/detail")
public AjaxResult detail(@RequestParam Integer id) {
try {
logger.info("查询销售概览详情ID{}", id);
if (id == null) {
logger.error("查询失败销售概览ID不能为空");
return AjaxResult.error("销售概览ID不能为空");
}
return salesOverviewService.getSalesOverviewDetail(id);
} catch (Exception e) {
logger.error("查询销售概览详情失败:{}", e.getMessage(), e);
return AjaxResult.error("查询销售概览详情失败:" + e.getMessage());
}
}
/**
* 手动触发计算统计数据
*/
@SaCheckPermission("salesoverview:calculate")
@PostMapping("/calculate")
public AjaxResult calculate() {
try {
logger.info("手动触发计算销售概览统计数据");
return salesOverviewService.calculateStatistics();
} catch (Exception e) {
logger.error("计算销售概览统计数据失败:{}", e.getMessage(), e);
return AjaxResult.error("计算失败:" + e.getMessage());
}
}
}

View File

@@ -0,0 +1,121 @@
package com.aiotagro.cattletrade.business.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.aiotagro.cattletrade.business.dto.WarehouseCreateDto;
import com.aiotagro.cattletrade.business.dto.WarehouseDto;
import com.aiotagro.cattletrade.business.dto.WarehouseEditDto;
import com.aiotagro.cattletrade.business.entity.Warehouse;
import com.aiotagro.cattletrade.business.service.IWarehouseService;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 中转仓管理控制器
*
* @author System
* @date 2025-01-20
*/
@RestController
@RequestMapping("/warehouse")
public class WarehouseController {
@Autowired
private IWarehouseService warehouseService;
/**
* 分页查询中转仓列表
*/
@SaCheckPermission("warehouse:query")
@PostMapping("/list")
public AjaxResult list(@RequestBody WarehouseDto dto) {
try {
PageResultResponse<Warehouse> result = warehouseService.pageQuery(dto);
return AjaxResult.success(result);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("查询中转仓列表失败:" + e.getMessage());
}
}
/**
* 新增中转仓
*/
@SaCheckPermission("warehouse:add")
@PostMapping("/add")
public AjaxResult add(@Validated @RequestBody WarehouseCreateDto dto) {
try {
return warehouseService.addWarehouse(dto);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("新增中转仓失败:" + e.getMessage());
}
}
/**
* 编辑中转仓
*/
@SaCheckPermission("warehouse:edit")
@PostMapping("/edit")
public AjaxResult edit(@Validated @RequestBody WarehouseEditDto dto) {
try {
return warehouseService.updateWarehouse(dto);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("编辑中转仓失败:" + e.getMessage());
}
}
/**
* 删除中转仓(逻辑删除)
*/
@SaCheckPermission("warehouse:delete")
@GetMapping("/delete")
public AjaxResult delete(@RequestParam Integer id) {
try {
if (id == null) {
return AjaxResult.error("中转仓ID不能为空");
}
return warehouseService.deleteWarehouse(id);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("删除中转仓失败:" + e.getMessage());
}
}
/**
* 获取中转仓详情
*/
@SaCheckPermission("warehouse:query")
@GetMapping("/detail")
public AjaxResult detail(@RequestParam Integer id) {
try {
if (id == null) {
return AjaxResult.error("中转仓ID不能为空");
}
return warehouseService.getWarehouseDetail(id);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("查询中转仓详情失败:" + e.getMessage());
}
}
/**
* 获取所有启用的中转仓(下拉选择用)
*/
@GetMapping("/all")
public AjaxResult getAllEnabled() {
try {
List<Warehouse> list = warehouseService.getAllEnabled();
return AjaxResult.success("查询成功", list);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("查询中转仓列表失败:" + e.getMessage());
}
}
}

View File

@@ -0,0 +1,105 @@
package com.aiotagro.cattletrade.business.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.aiotagro.cattletrade.business.dto.WarehouseInCreateDto;
import com.aiotagro.cattletrade.business.dto.WarehouseInDto;
import com.aiotagro.cattletrade.business.dto.WarehouseInEditDto;
import com.aiotagro.cattletrade.business.service.IWarehouseInService;
import com.aiotagro.cattletrade.business.vo.WarehouseInVo;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 进仓管理控制器
*
* @author System
* @date 2025-01-20
*/
@RestController
@RequestMapping("/warehouseIn")
public class WarehouseInController {
@Autowired
private IWarehouseInService warehouseInService;
/**
* 分页查询进仓列表
*/
@SaCheckPermission("warehousein:query")
@PostMapping("/list")
public AjaxResult list(@RequestBody WarehouseInDto dto) {
try {
PageResultResponse<WarehouseInVo> result = warehouseInService.pageQuery(dto);
return AjaxResult.success(result);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("查询进仓列表失败:" + e.getMessage());
}
}
/**
* 新增进仓记录
*/
@SaCheckPermission("warehousein:add")
@PostMapping("/add")
public AjaxResult add(@Validated @RequestBody WarehouseInCreateDto dto) {
try {
return warehouseInService.addWarehouseIn(dto);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("新增进仓记录失败:" + e.getMessage());
}
}
/**
* 编辑进仓记录
*/
@SaCheckPermission("warehousein:edit")
@PostMapping("/edit")
public AjaxResult edit(@Validated @RequestBody WarehouseInEditDto dto) {
try {
return warehouseInService.updateWarehouseIn(dto);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("编辑进仓记录失败:" + e.getMessage());
}
}
/**
* 删除进仓记录(逻辑删除)
*/
@SaCheckPermission("warehousein:delete")
@GetMapping("/delete")
public AjaxResult delete(@RequestParam Integer id) {
try {
if (id == null) {
return AjaxResult.error("进仓记录ID不能为空");
}
return warehouseInService.deleteWarehouseIn(id);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("删除进仓记录失败:" + e.getMessage());
}
}
/**
* 获取进仓详情
*/
@SaCheckPermission("warehousein:query")
@GetMapping("/detail")
public AjaxResult detail(@RequestParam Integer id) {
try {
if (id == null) {
return AjaxResult.error("进仓记录ID不能为空");
}
return warehouseInService.getWarehouseInDetail(id);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("查询进仓详情失败:" + e.getMessage());
}
}
}

View File

@@ -0,0 +1,105 @@
package com.aiotagro.cattletrade.business.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.aiotagro.cattletrade.business.dto.WarehouseOutCreateDto;
import com.aiotagro.cattletrade.business.dto.WarehouseOutDto;
import com.aiotagro.cattletrade.business.dto.WarehouseOutEditDto;
import com.aiotagro.cattletrade.business.service.IWarehouseOutService;
import com.aiotagro.cattletrade.business.vo.WarehouseOutVo;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 出仓管理控制器
*
* @author System
* @date 2025-01-20
*/
@RestController
@RequestMapping("/warehouseOut")
public class WarehouseOutController {
@Autowired
private IWarehouseOutService warehouseOutService;
/**
* 分页查询出仓列表
*/
@SaCheckPermission("warehouseout:query")
@PostMapping("/list")
public AjaxResult list(@RequestBody WarehouseOutDto dto) {
try {
PageResultResponse<WarehouseOutVo> result = warehouseOutService.pageQuery(dto);
return AjaxResult.success(result);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("查询出仓列表失败:" + e.getMessage());
}
}
/**
* 新增出仓记录
*/
@SaCheckPermission("warehouseout:add")
@PostMapping("/add")
public AjaxResult add(@Validated @RequestBody WarehouseOutCreateDto dto) {
try {
return warehouseOutService.addWarehouseOut(dto);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("新增出仓记录失败:" + e.getMessage());
}
}
/**
* 编辑出仓记录
*/
@SaCheckPermission("warehouseout:edit")
@PostMapping("/edit")
public AjaxResult edit(@Validated @RequestBody WarehouseOutEditDto dto) {
try {
return warehouseOutService.updateWarehouseOut(dto);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("编辑出仓记录失败:" + e.getMessage());
}
}
/**
* 删除出仓记录(逻辑删除)
*/
@SaCheckPermission("warehouseout:delete")
@GetMapping("/delete")
public AjaxResult delete(@RequestParam Integer id) {
try {
if (id == null) {
return AjaxResult.error("出仓记录ID不能为空");
}
return warehouseOutService.deleteWarehouseOut(id);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("删除出仓记录失败:" + e.getMessage());
}
}
/**
* 获取出仓详情
*/
@SaCheckPermission("warehouseout:query")
@GetMapping("/detail")
public AjaxResult detail(@RequestParam Integer id) {
try {
if (id == null) {
return AjaxResult.error("出仓记录ID不能为空");
}
return warehouseOutService.getWarehouseOutDetail(id);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("查询出仓详情失败:" + e.getMessage());
}
}
}

View File

@@ -0,0 +1,32 @@
package com.aiotagro.cattletrade.business.dto;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
* 销售概览创建DTO
*
* @author System
* @date 2025-01-20
*/
@Data
public class SalesOverviewCreateDto {
/**
* 应收货款(元)
*/
private BigDecimal accountsReceivable;
/**
* 未收货款(元)
*/
private BigDecimal uncollectedPayment;
/**
* 实收货款(元)
*/
private BigDecimal actualPayment;
}

View File

@@ -0,0 +1,35 @@
package com.aiotagro.cattletrade.business.dto;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
* 销售概览编辑DTO
*
* @author System
* @date 2025-01-20
*/
@Data
public class SalesOverviewEditDto {
@NotNull(message = "销售概览ID不能为空")
private Integer id;
/**
* 应收货款(元)
*/
private BigDecimal accountsReceivable;
/**
* 未收货款(元)
*/
private BigDecimal uncollectedPayment;
/**
* 实收货款(元)
*/
private BigDecimal actualPayment;
}

View File

@@ -0,0 +1,70 @@
package com.aiotagro.cattletrade.business.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 中转仓创建DTO
*
* @author System
* @date 2025-01-20
*/
@Data
public class WarehouseCreateDto {
/**
* 中转仓名称
*/
@NotBlank(message = "中转仓名称不能为空")
private String warehouseName;
/**
* 中转仓编码(可选,为空时自动生成)
*/
private String warehouseCode;
/**
* 地址
*/
@NotBlank(message = "地址不能为空")
private String address;
/**
* 经度
*/
private String longitude;
/**
* 纬度
*/
private String latitude;
/**
* 容量(可存储牛只数量)
*/
@NotNull(message = "容量不能为空")
private Integer capacity;
/**
* 负责人姓名
*/
private String managerName;
/**
* 负责人联系电话
*/
private String managerMobile;
/**
* 状态1-启用0-禁用
*/
private Integer status;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,31 @@
package com.aiotagro.cattletrade.business.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 中转仓查询DTO
*
* @author System
* @date 2025-01-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class WarehouseDto extends BaseDto {
/**
* 中转仓名称
*/
private String warehouseName;
/**
* 中转仓编码
*/
private String warehouseCode;
/**
* 状态1-启用0-禁用
*/
private Integer status;
}

View File

@@ -0,0 +1,77 @@
package com.aiotagro.cattletrade.business.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 中转仓编辑DTO
*
* @author System
* @date 2025-01-20
*/
@Data
public class WarehouseEditDto {
/**
* 主键ID
*/
@NotNull(message = "ID不能为空")
private Integer id;
/**
* 中转仓名称
*/
@NotBlank(message = "中转仓名称不能为空")
private String warehouseName;
/**
* 中转仓编码
*/
@NotBlank(message = "中转仓编码不能为空")
private String warehouseCode;
/**
* 地址
*/
@NotBlank(message = "地址不能为空")
private String address;
/**
* 经度
*/
private String longitude;
/**
* 纬度
*/
private String latitude;
/**
* 容量(可存储牛只数量)
*/
@NotNull(message = "容量不能为空")
private Integer capacity;
/**
* 负责人姓名
*/
private String managerName;
/**
* 负责人联系电话
*/
private String managerMobile;
/**
* 状态1-启用0-禁用
*/
private Integer status;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,83 @@
package com.aiotagro.cattletrade.business.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
/**
* 进仓创建DTO
*
* @author System
* @date 2025-01-20
*/
@Data
public class WarehouseInCreateDto {
/**
* 中转仓ID
*/
@NotNull(message = "中转仓ID不能为空")
private Integer warehouseId;
/**
* 订单ID多个订单用逗号分隔
*/
private String orderId;
/**
* 运送清单ID
*/
private Integer deliveryId;
/**
* 来源地
*/
private String sourceLocation;
/**
* 来源地经度
*/
private String sourceLon;
/**
* 来源地纬度
*/
private String sourceLat;
/**
* 牛只数量
*/
@NotNull(message = "牛只数量不能为空")
private Integer cattleCount;
/**
* 重量(公斤)
*/
private BigDecimal weight;
/**
* 进仓时间
*/
@NotNull(message = "进仓时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date inTime;
/**
* 照片URL多个用逗号分隔
*/
private String photos;
/**
* 视频URL多个用逗号分隔
*/
private String videos;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,46 @@
package com.aiotagro.cattletrade.business.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 进仓查询DTO
*
* @author System
* @date 2025-01-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class WarehouseInDto extends BaseDto {
/**
* 进仓单号
*/
private String inNumber;
/**
* 中转仓ID
*/
private Integer warehouseId;
/**
* 运送清单ID
*/
private Integer deliveryId;
/**
* 状态1-待进仓2-已进仓3-已出仓
*/
private Integer status;
/**
* 开始时间
*/
private String startTime;
/**
* 结束时间
*/
private String endTime;
}

View File

@@ -0,0 +1,94 @@
package com.aiotagro.cattletrade.business.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
/**
* 进仓编辑DTO
*
* @author System
* @date 2025-01-20
*/
@Data
public class WarehouseInEditDto {
/**
* 主键ID
*/
@NotNull(message = "ID不能为空")
private Integer id;
/**
* 中转仓ID
*/
@NotNull(message = "中转仓ID不能为空")
private Integer warehouseId;
/**
* 订单ID多个订单用逗号分隔
*/
private String orderId;
/**
* 运送清单ID
*/
private Integer deliveryId;
/**
* 来源地
*/
private String sourceLocation;
/**
* 来源地经度
*/
private String sourceLon;
/**
* 来源地纬度
*/
private String sourceLat;
/**
* 牛只数量
*/
@NotNull(message = "牛只数量不能为空")
private Integer cattleCount;
/**
* 重量(公斤)
*/
private BigDecimal weight;
/**
* 进仓时间
*/
@NotNull(message = "进仓时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date inTime;
/**
* 照片URL多个用逗号分隔
*/
private String photos;
/**
* 视频URL多个用逗号分隔
*/
private String videos;
/**
* 备注
*/
private String remark;
/**
* 状态1-待进仓2-已进仓3-已出仓
*/
private Integer status;
}

View File

@@ -0,0 +1,88 @@
package com.aiotagro.cattletrade.business.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
/**
* 出仓创建DTO
*
* @author System
* @date 2025-01-20
*/
@Data
public class WarehouseOutCreateDto {
/**
* 中转仓ID
*/
@NotNull(message = "中转仓ID不能为空")
private Integer warehouseId;
/**
* 进仓记录ID可选
*/
private Integer warehouseInId;
/**
* 订单ID多个订单用逗号分隔
*/
private String orderId;
/**
* 运送清单ID
*/
private Integer deliveryId;
/**
* 目的地
*/
private String destinationLocation;
/**
* 目的地经度
*/
private String destinationLon;
/**
* 目的地纬度
*/
private String destinationLat;
/**
* 牛只数量
*/
@NotNull(message = "牛只数量不能为空")
private Integer cattleCount;
/**
* 重量(公斤)
*/
private BigDecimal weight;
/**
* 出仓时间
*/
@NotNull(message = "出仓时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date outTime;
/**
* 照片URL多个用逗号分隔
*/
private String photos;
/**
* 视频URL多个用逗号分隔
*/
private String videos;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,51 @@
package com.aiotagro.cattletrade.business.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 出仓查询DTO
*
* @author System
* @date 2025-01-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class WarehouseOutDto extends BaseDto {
/**
* 出仓单号
*/
private String outNumber;
/**
* 中转仓ID
*/
private Integer warehouseId;
/**
* 进仓记录ID
*/
private Integer warehouseInId;
/**
* 运送清单ID
*/
private Integer deliveryId;
/**
* 状态1-待出仓2-已出仓
*/
private Integer status;
/**
* 开始时间
*/
private String startTime;
/**
* 结束时间
*/
private String endTime;
}

View File

@@ -0,0 +1,99 @@
package com.aiotagro.cattletrade.business.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
/**
* 出仓编辑DTO
*
* @author System
* @date 2025-01-20
*/
@Data
public class WarehouseOutEditDto {
/**
* 主键ID
*/
@NotNull(message = "ID不能为空")
private Integer id;
/**
* 中转仓ID
*/
@NotNull(message = "中转仓ID不能为空")
private Integer warehouseId;
/**
* 进仓记录ID可选
*/
private Integer warehouseInId;
/**
* 订单ID多个订单用逗号分隔
*/
private String orderId;
/**
* 运送清单ID
*/
private Integer deliveryId;
/**
* 目的地
*/
private String destinationLocation;
/**
* 目的地经度
*/
private String destinationLon;
/**
* 目的地纬度
*/
private String destinationLat;
/**
* 牛只数量
*/
@NotNull(message = "牛只数量不能为空")
private Integer cattleCount;
/**
* 重量(公斤)
*/
private BigDecimal weight;
/**
* 出仓时间
*/
@NotNull(message = "出仓时间不能为空")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date outTime;
/**
* 照片URL多个用逗号分隔
*/
private String photos;
/**
* 视频URL多个用逗号分隔
*/
private String videos;
/**
* 备注
*/
private String remark;
/**
* 状态1-待出仓2-已出仓
*/
private Integer status;
}

View File

@@ -53,6 +53,12 @@ public class Order implements Serializable {
@TableField("firm_price")
private java.math.BigDecimal firmPrice;
/**
* 预付款(元)
*/
@TableField("advance_payment")
private java.math.BigDecimal advancePayment;
/**
* 运送清单ID关联delivery表
*/

View File

@@ -0,0 +1,100 @@
package com.aiotagro.cattletrade.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 销售概览实体类
*
* @author System
* @date 2025-01-20
*/
@Data
@TableName("salesoverview")
public class SalesOverview implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 采购总额(元)
*/
@TableField("toal_procurement_amount")
private BigDecimal toalProcurementAmount;
/**
* 销售总额(元)
*/
@TableField("toal_sales_amount")
private BigDecimal toalSalesAmount;
/**
* 利润(元)
*/
@TableField("profits")
private BigDecimal profits;
/**
* 应收货款(元)
*/
@TableField("accounts_receivable")
private BigDecimal accountsReceivable;
/**
* 未收货款(元)
*/
@TableField("uncollected_payment")
private BigDecimal uncollectedPayment;
/**
* 实收货款(元)
*/
@TableField("actual_payment")
private BigDecimal actualPayment;
/**
* 采购数量(头)
*/
@TableField("total_purchase")
private Integer totalPurchase;
/**
* 采购单数(车)
*/
@TableField("total_order")
private Integer totalOrder;
/**
* 销售单数(单)
*/
@TableField("total_sales")
private Integer totalSales;
/**
* 创建时间
*/
@TableField("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 更新时间
*/
@TableField("up_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date upTime;
}

View File

@@ -0,0 +1,125 @@
package com.aiotagro.cattletrade.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 中转仓实体类
*
* @author System
* @date 2025-01-20
*/
@Data
@TableName("warehouse")
public class Warehouse implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 中转仓名称
*/
@TableField("warehouse_name")
private String warehouseName;
/**
* 中转仓编码
*/
@TableField("warehouse_code")
private String warehouseCode;
/**
* 地址
*/
@TableField("address")
private String address;
/**
* 经度
*/
@TableField("longitude")
private String longitude;
/**
* 纬度
*/
@TableField("latitude")
private String latitude;
/**
* 容量(可存储牛只数量)
*/
@TableField("capacity")
private Integer capacity;
/**
* 负责人姓名
*/
@TableField("manager_name")
private String managerName;
/**
* 负责人联系电话
*/
@TableField("manager_mobile")
private String managerMobile;
/**
* 状态1-启用0-禁用
*/
@TableField("status")
private Integer status;
/**
* 备注
*/
@TableField("remark")
private String remark;
/**
* 逻辑删除标记(0-正常,1-已删除)
*/
@TableLogic(value = "0", delval = "1")
@TableField("is_delete")
private Integer isDelete;
/**
* 创建时间
*/
@TableField("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 创建人ID
*/
@TableField("created_by")
private Integer createdBy;
/**
* 更新时间
*/
@TableField("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* 更新人ID
*/
@TableField("updated_by")
private Integer updatedBy;
}

View File

@@ -0,0 +1,151 @@
package com.aiotagro.cattletrade.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 进仓实体类
*
* @author System
* @date 2025-01-20
*/
@Data
@TableName("warehouse_in")
public class WarehouseIn implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 进仓单号
*/
@TableField("in_number")
private String inNumber;
/**
* 中转仓ID
*/
@TableField("warehouse_id")
private Integer warehouseId;
/**
* 订单ID多个订单用逗号分隔
*/
@TableField("order_id")
private String orderId;
/**
* 运送清单ID
*/
@TableField("delivery_id")
private Integer deliveryId;
/**
* 来源地
*/
@TableField("source_location")
private String sourceLocation;
/**
* 来源地经度
*/
@TableField("source_lon")
private String sourceLon;
/**
* 来源地纬度
*/
@TableField("source_lat")
private String sourceLat;
/**
* 牛只数量
*/
@TableField("cattle_count")
private Integer cattleCount;
/**
* 重量(公斤)
*/
@TableField("weight")
private BigDecimal weight;
/**
* 进仓时间
*/
@TableField("in_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date inTime;
/**
* 照片URL多个用逗号分隔
*/
@TableField("photos")
private String photos;
/**
* 视频URL多个用逗号分隔
*/
@TableField("videos")
private String videos;
/**
* 备注
*/
@TableField("remark")
private String remark;
/**
* 状态1-待进仓2-已进仓3-已出仓
*/
@TableField("status")
private Integer status;
/**
* 逻辑删除标记(0-正常,1-已删除)
*/
@TableLogic(value = "0", delval = "1")
@TableField("is_delete")
private Integer isDelete;
/**
* 创建时间
*/
@TableField("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 创建人ID
*/
@TableField("created_by")
private Integer createdBy;
/**
* 更新时间
*/
@TableField("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* 更新人ID
*/
@TableField("updated_by")
private Integer updatedBy;
}

View File

@@ -0,0 +1,157 @@
package com.aiotagro.cattletrade.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 出仓实体类
*
* @author System
* @date 2025-01-20
*/
@Data
@TableName("warehouse_out")
public class WarehouseOut implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 出仓单号
*/
@TableField("out_number")
private String outNumber;
/**
* 中转仓ID
*/
@TableField("warehouse_id")
private Integer warehouseId;
/**
* 进仓记录ID可选
*/
@TableField("warehouse_in_id")
private Integer warehouseInId;
/**
* 订单ID多个订单用逗号分隔
*/
@TableField("order_id")
private String orderId;
/**
* 运送清单ID
*/
@TableField("delivery_id")
private Integer deliveryId;
/**
* 目的地
*/
@TableField("destination_location")
private String destinationLocation;
/**
* 目的地经度
*/
@TableField("destination_lon")
private String destinationLon;
/**
* 目的地纬度
*/
@TableField("destination_lat")
private String destinationLat;
/**
* 牛只数量
*/
@TableField("cattle_count")
private Integer cattleCount;
/**
* 重量(公斤)
*/
@TableField("weight")
private BigDecimal weight;
/**
* 出仓时间
*/
@TableField("out_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date outTime;
/**
* 照片URL多个用逗号分隔
*/
@TableField("photos")
private String photos;
/**
* 视频URL多个用逗号分隔
*/
@TableField("videos")
private String videos;
/**
* 备注
*/
@TableField("remark")
private String remark;
/**
* 状态1-待出仓2-已出仓
*/
@TableField("status")
private Integer status;
/**
* 逻辑删除标记(0-正常,1-已删除)
*/
@TableLogic(value = "0", delval = "1")
@TableField("is_delete")
private Integer isDelete;
/**
* 创建时间
*/
@TableField("create_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 创建人ID
*/
@TableField("created_by")
private Integer createdBy;
/**
* 更新时间
*/
@TableField("update_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* 更新人ID
*/
@TableField("updated_by")
private Integer updatedBy;
}

View File

@@ -0,0 +1,16 @@
package com.aiotagro.cattletrade.business.mapper;
import com.aiotagro.cattletrade.business.entity.SalesOverview;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 销售概览 Mapper 接口
*
* @author System
* @date 2025-01-20
*/
@Mapper
public interface SalesOverviewMapper extends BaseMapper<SalesOverview> {
}

View File

@@ -0,0 +1,34 @@
package com.aiotagro.cattletrade.business.mapper;
import com.aiotagro.cattletrade.business.entity.WarehouseIn;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* 进仓管理 Mapper 接口
*
* @author System
* @date 2025-01-20
*/
@Mapper
public interface WarehouseInMapper extends BaseMapper<WarehouseIn> {
/**
* 根据进仓单号查询进仓记录(唯一性校验)
* @param inNumber 进仓单号
* @return 进仓记录
*/
@Select("SELECT * FROM warehouse_in WHERE in_number = #{inNumber} AND is_delete = 0")
WarehouseIn selectByInNumber(@Param("inNumber") String inNumber);
/**
* 获取当天最大流水号
* @param datePrefix 日期前缀IN20250120
* @return 最大流水号4位数字
*/
@Select("SELECT COALESCE(MAX(CAST(SUBSTRING(in_number, 11) AS UNSIGNED)), 0) FROM warehouse_in WHERE in_number LIKE CONCAT(#{datePrefix}, '%') AND is_delete = 0")
Integer getMaxSequenceByDate(@Param("datePrefix") String datePrefix);
}

View File

@@ -0,0 +1,35 @@
package com.aiotagro.cattletrade.business.mapper;
import com.aiotagro.cattletrade.business.entity.Warehouse;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 中转仓管理 Mapper 接口
*
* @author System
* @date 2025-01-20
*/
@Mapper
public interface WarehouseMapper extends BaseMapper<Warehouse> {
/**
* 根据中转仓编码查询中转仓(唯一性校验)
* @param warehouseCode 中转仓编码
* @return 中转仓信息
*/
@Select("SELECT * FROM warehouse WHERE warehouse_code = #{warehouseCode} AND is_delete = 0")
Warehouse selectByWarehouseCode(@Param("warehouseCode") String warehouseCode);
/**
* 获取所有启用的中转仓(下拉选择用)
* @return 中转仓列表
*/
@Select("SELECT id, warehouse_name, warehouse_code FROM warehouse WHERE status = 1 AND is_delete = 0 ORDER BY create_time DESC")
List<Warehouse> selectAllEnabled();
}

View File

@@ -0,0 +1,34 @@
package com.aiotagro.cattletrade.business.mapper;
import com.aiotagro.cattletrade.business.entity.WarehouseOut;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* 出仓管理 Mapper 接口
*
* @author System
* @date 2025-01-20
*/
@Mapper
public interface WarehouseOutMapper extends BaseMapper<WarehouseOut> {
/**
* 根据出仓单号查询出仓记录(唯一性校验)
* @param outNumber 出仓单号
* @return 出仓记录
*/
@Select("SELECT * FROM warehouse_out WHERE out_number = #{outNumber} AND is_delete = 0")
WarehouseOut selectByOutNumber(@Param("outNumber") String outNumber);
/**
* 获取当天最大流水号
* @param datePrefix 日期前缀OUT20250120
* @return 最大流水号4位数字
*/
@Select("SELECT COALESCE(MAX(CAST(SUBSTRING(out_number, 12) AS UNSIGNED)), 0) FROM warehouse_out WHERE out_number LIKE CONCAT(#{datePrefix}, '%') AND is_delete = 0")
Integer getMaxSequenceByDate(@Param("datePrefix") String datePrefix);
}

View File

@@ -0,0 +1,65 @@
package com.aiotagro.cattletrade.business.service;
import com.aiotagro.cattletrade.business.entity.SalesOverview;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Map;
/**
* 销售概览服务接口
*
* @author System
* @date 2025-01-20
*/
public interface ISalesOverviewService extends IService<SalesOverview> {
/**
* 分页查询销售概览列表
*
* @param params 查询参数
* @return 分页结果
*/
PageResultResponse<SalesOverview> pageQuery(Map<String, Object> params);
/**
* 新增销售概览
*
* @param salesOverview 销售概览信息
* @return AjaxResult
*/
AjaxResult addSalesOverview(SalesOverview salesOverview);
/**
* 更新销售概览信息
*
* @param salesOverview 销售概览信息
* @return AjaxResult
*/
AjaxResult updateSalesOverview(SalesOverview salesOverview);
/**
* 删除销售概览
*
* @param id 销售概览ID
* @return AjaxResult
*/
AjaxResult deleteSalesOverview(Integer id);
/**
* 查询销售概览详情
*
* @param id 销售概览ID
* @return AjaxResult
*/
AjaxResult getSalesOverviewDetail(Integer id);
/**
* 计算统计数据并保存
*
* @return AjaxResult
*/
AjaxResult calculateStatistics();
}

View File

@@ -0,0 +1,60 @@
package com.aiotagro.cattletrade.business.service;
import com.aiotagro.cattletrade.business.dto.WarehouseInCreateDto;
import com.aiotagro.cattletrade.business.dto.WarehouseInDto;
import com.aiotagro.cattletrade.business.dto.WarehouseInEditDto;
import com.aiotagro.cattletrade.business.entity.WarehouseIn;
import com.aiotagro.cattletrade.business.vo.WarehouseInVo;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 进仓管理服务接口
*
* @author System
* @date 2025-01-20
*/
public interface IWarehouseInService extends IService<WarehouseIn> {
/**
* 分页查询进仓列表
*
* @param dto 查询参数
* @return 分页结果
*/
PageResultResponse<WarehouseInVo> pageQuery(WarehouseInDto dto);
/**
* 新增进仓记录
*
* @param dto 进仓创建DTO
* @return AjaxResult
*/
AjaxResult addWarehouseIn(WarehouseInCreateDto dto);
/**
* 更新进仓记录
*
* @param dto 进仓编辑DTO
* @return AjaxResult
*/
AjaxResult updateWarehouseIn(WarehouseInEditDto dto);
/**
* 删除进仓记录(逻辑删除)
*
* @param id 进仓记录ID
* @return AjaxResult
*/
AjaxResult deleteWarehouseIn(Integer id);
/**
* 获取进仓详情
*
* @param id 进仓记录ID
* @return AjaxResult
*/
AjaxResult getWarehouseInDetail(Integer id);
}

View File

@@ -0,0 +1,60 @@
package com.aiotagro.cattletrade.business.service;
import com.aiotagro.cattletrade.business.dto.WarehouseOutCreateDto;
import com.aiotagro.cattletrade.business.dto.WarehouseOutDto;
import com.aiotagro.cattletrade.business.dto.WarehouseOutEditDto;
import com.aiotagro.cattletrade.business.entity.WarehouseOut;
import com.aiotagro.cattletrade.business.vo.WarehouseOutVo;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* 出仓管理服务接口
*
* @author System
* @date 2025-01-20
*/
public interface IWarehouseOutService extends IService<WarehouseOut> {
/**
* 分页查询出仓列表
*
* @param dto 查询参数
* @return 分页结果
*/
PageResultResponse<WarehouseOutVo> pageQuery(WarehouseOutDto dto);
/**
* 新增出仓记录
*
* @param dto 出仓创建DTO
* @return AjaxResult
*/
AjaxResult addWarehouseOut(WarehouseOutCreateDto dto);
/**
* 更新出仓记录
*
* @param dto 出仓编辑DTO
* @return AjaxResult
*/
AjaxResult updateWarehouseOut(WarehouseOutEditDto dto);
/**
* 删除出仓记录(逻辑删除)
*
* @param id 出仓记录ID
* @return AjaxResult
*/
AjaxResult deleteWarehouseOut(Integer id);
/**
* 获取出仓详情
*
* @param id 出仓记录ID
* @return AjaxResult
*/
AjaxResult getWarehouseOutDetail(Integer id);
}

View File

@@ -0,0 +1,68 @@
package com.aiotagro.cattletrade.business.service;
import com.aiotagro.cattletrade.business.dto.WarehouseCreateDto;
import com.aiotagro.cattletrade.business.dto.WarehouseDto;
import com.aiotagro.cattletrade.business.dto.WarehouseEditDto;
import com.aiotagro.cattletrade.business.entity.Warehouse;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 中转仓管理服务接口
*
* @author System
* @date 2025-01-20
*/
public interface IWarehouseService extends IService<Warehouse> {
/**
* 分页查询中转仓列表
*
* @param dto 查询参数
* @return 分页结果
*/
PageResultResponse<Warehouse> pageQuery(WarehouseDto dto);
/**
* 新增中转仓
*
* @param dto 中转仓创建DTO
* @return AjaxResult
*/
AjaxResult addWarehouse(WarehouseCreateDto dto);
/**
* 更新中转仓信息
*
* @param dto 中转仓编辑DTO
* @return AjaxResult
*/
AjaxResult updateWarehouse(WarehouseEditDto dto);
/**
* 删除中转仓(逻辑删除)
*
* @param id 中转仓ID
* @return AjaxResult
*/
AjaxResult deleteWarehouse(Integer id);
/**
* 获取中转仓详情
*
* @param id 中转仓ID
* @return AjaxResult
*/
AjaxResult getWarehouseDetail(Integer id);
/**
* 获取所有启用的中转仓(下拉选择用)
*
* @return 中转仓列表
*/
List<Warehouse> getAllEnabled();
}

View File

@@ -0,0 +1,740 @@
package com.aiotagro.cattletrade.business.service.impl;
import com.aiotagro.cattletrade.business.entity.Delivery;
import com.aiotagro.cattletrade.business.entity.Order;
import com.aiotagro.cattletrade.business.entity.SalesOverview;
import com.aiotagro.cattletrade.business.mapper.DeliveryMapper;
import com.aiotagro.cattletrade.business.mapper.MemberMapper;
import com.aiotagro.cattletrade.business.mapper.OrderMapper;
import com.aiotagro.cattletrade.business.mapper.SalesOverviewMapper;
import com.aiotagro.cattletrade.business.service.ISalesOverviewService;
import com.aiotagro.common.core.utils.StringUtils;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
/**
* 销售概览服务实现类
*
* @author System
* @date 2025-01-20
*/
@Service
public class SalesOverviewServiceImpl extends ServiceImpl<SalesOverviewMapper, SalesOverview> implements ISalesOverviewService {
private static final Logger logger = LoggerFactory.getLogger(SalesOverviewServiceImpl.class);
@Autowired
private SalesOverviewMapper salesOverviewMapper;
@Autowired
private DeliveryMapper deliveryMapper;
@Autowired
private OrderMapper orderMapper;
@Autowired
private MemberMapper memberMapper;
/**
* 分页查询销售概览列表
*/
@Override
public PageResultResponse<SalesOverview> pageQuery(Map<String, Object> params) {
Integer pageNum = params.get("pageNum") != null ? (Integer) params.get("pageNum") : 1;
Integer pageSize = params.get("pageSize") != null ? (Integer) params.get("pageSize") : 10;
logger.info("分页查询销售概览列表,页码:{},每页数量:{}", pageNum, pageSize);
PageHelper.startPage(pageNum, pageSize);
LambdaQueryWrapper<SalesOverview> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.orderByDesc(SalesOverview::getCreateTime);
List<SalesOverview> list = this.list(queryWrapper);
long total = this.count(queryWrapper);
logger.info("查询成功,共{}条记录", total);
return new PageResultResponse<>(total, list);
}
/**
* 新增销售概览
*/
@Override
@Transactional
public AjaxResult addSalesOverview(SalesOverview salesOverview) {
try {
logger.info("新增销售概览");
Date now = new Date();
salesOverview.setCreateTime(now);
salesOverview.setUpTime(now);
int result = salesOverviewMapper.insert(salesOverview);
if (result > 0) {
logger.info("新增销售概览成功ID{}", salesOverview.getId());
return AjaxResult.success("新增成功", salesOverview);
} else {
logger.error("新增销售概览失败:插入数据库失败");
return AjaxResult.error("新增失败");
}
} catch (Exception e) {
logger.error("新增销售概览失败:{}", e.getMessage(), e);
return AjaxResult.error("新增失败:" + e.getMessage());
}
}
/**
* 更新销售概览信息
*/
@Override
@Transactional
public AjaxResult updateSalesOverview(SalesOverview salesOverview) {
try {
logger.info("更新销售概览ID{}", salesOverview.getId());
if (salesOverview.getId() == null) {
logger.error("更新失败销售概览ID不能为空");
return AjaxResult.error("销售概览ID不能为空");
}
SalesOverview existing = this.getById(salesOverview.getId());
if (existing == null) {
logger.error("更新失败销售概览不存在ID{}", salesOverview.getId());
return AjaxResult.error("销售概览不存在");
}
salesOverview.setUpTime(new Date());
boolean result = this.updateById(salesOverview);
if (result) {
logger.info("更新销售概览成功ID{}", salesOverview.getId());
return AjaxResult.success("更新成功", salesOverview);
} else {
logger.error("更新销售概览失败:更新数据库失败");
return AjaxResult.error("更新失败");
}
} catch (Exception e) {
logger.error("更新销售概览失败:{}", e.getMessage(), e);
return AjaxResult.error("更新失败:" + e.getMessage());
}
}
/**
* 删除销售概览
*/
@Override
@Transactional
public AjaxResult deleteSalesOverview(Integer id) {
try {
logger.info("删除销售概览ID{}", id);
if (id == null) {
logger.error("删除失败销售概览ID不能为空");
return AjaxResult.error("销售概览ID不能为空");
}
SalesOverview existing = this.getById(id);
if (existing == null) {
logger.error("删除失败销售概览不存在ID{}", id);
return AjaxResult.error("销售概览不存在");
}
boolean result = this.removeById(id);
if (result) {
logger.info("删除销售概览成功ID{}", id);
return AjaxResult.success("删除成功");
} else {
logger.error("删除销售概览失败:删除数据库失败");
return AjaxResult.error("删除失败");
}
} catch (Exception e) {
logger.error("删除销售概览失败:{}", e.getMessage(), e);
return AjaxResult.error("删除失败:" + e.getMessage());
}
}
/**
* 查询销售概览详情
*/
@Override
public AjaxResult getSalesOverviewDetail(Integer id) {
try {
logger.info("查询销售概览详情ID{}", id);
if (id == null) {
logger.error("查询失败销售概览ID不能为空");
return AjaxResult.error("销售概览ID不能为空");
}
SalesOverview salesOverview = this.getById(id);
if (salesOverview == null) {
logger.error("查询失败销售概览不存在ID{}", id);
return AjaxResult.error("销售概览不存在");
}
return AjaxResult.success("查询成功", salesOverview);
} catch (Exception e) {
logger.error("查询销售概览详情失败:{}", e.getMessage(), e);
return AjaxResult.error("查询失败:" + e.getMessage());
}
}
/**
* 计算统计数据并保存
*/
@Override
@Transactional
public AjaxResult calculateStatistics() {
try {
logger.info("开始计算销售概览统计数据");
// 查询所有有订单关联的deliveryorder_id不为空
LambdaQueryWrapper<Delivery> deliveryWrapper = new LambdaQueryWrapper<>();
deliveryWrapper.isNotNull(Delivery::getOrderId);
deliveryWrapper.ne(Delivery::getOrderId, "");
List<Delivery> deliveries = deliveryMapper.selectList(deliveryWrapper);
logger.info("查询到{}个有订单关联的运送清单", deliveries.size());
BigDecimal totalProcurementAmount = BigDecimal.ZERO; // 采购总额
BigDecimal totalSalesAmount = BigDecimal.ZERO; // 销售总额
BigDecimal totalAccountsReceivable = BigDecimal.ZERO; // 应收货款总额
BigDecimal totalActualPayment = BigDecimal.ZERO; // 实收货款总额
int totalPurchase = 0; // 采购数量(头)
int totalOrder = 0; // 采购单数(车)
int totalSales = 0; // 销售单数(单)
// 遍历每个delivery计算金额
for (Delivery delivery : deliveries) {
try {
String orderIdStr = delivery.getOrderId();
if (StringUtils.isEmpty(orderIdStr)) {
logger.warn("运送清单{}的order_id为空跳过", delivery.getId());
continue;
}
// 解析订单ID列表
List<Integer> orderIds = Arrays.stream(orderIdStr.split(","))
.map(String::trim)
.filter(s -> !s.isEmpty())
.map(Integer::parseInt)
.collect(Collectors.toList());
if (orderIds.isEmpty()) {
logger.warn("运送清单{}的order_id解析后为空跳过", delivery.getId());
continue;
}
// 查询关联的订单
List<Order> orders = orderMapper.selectBatchIds(orderIds);
if (orders == null || orders.isEmpty()) {
logger.warn("运送清单{}关联的订单不存在,跳过", delivery.getId());
continue;
}
// 过滤未删除的订单
orders = orders.stream()
.filter(order -> order.getIsDelete() == null || order.getIsDelete() == 0)
.collect(Collectors.toList());
if (orders.isEmpty()) {
logger.warn("运送清单{}关联的订单全部已删除,跳过", delivery.getId());
continue;
}
// 填充订单信息(买方名称、卖方名称)
for (Order order : orders) {
fillOrderInfo(order);
}
// 按链路排序订单
List<Order> sortedOrders = sortOrdersByChain(orders);
if (sortedOrders == null || sortedOrders.isEmpty()) {
logger.warn("运送清单{}的订单排序后为空,跳过", delivery.getId());
continue;
}
// 获取第一个订单(起始订单,用于计算采购金额)
Order firstOrder = sortedOrders.get(0);
// 获取最后一个订单(用于计算销售金额)
Order lastOrder = sortedOrders.get(sortedOrders.size() - 1);
logger.info("运送清单{}起始订单ID={}最后订单ID={}", delivery.getId(), firstOrder.getId(), lastOrder.getId());
// 计算采购金额
BigDecimal procurementAmount = calculateOrderAmount(delivery, firstOrder);
if (procurementAmount != null) {
totalProcurementAmount = totalProcurementAmount.add(procurementAmount);
logger.info("运送清单{}:采购金额={}", delivery.getId(), procurementAmount);
}
// 计算销售金额
BigDecimal salesAmount = calculateOrderAmount(delivery, lastOrder);
if (salesAmount != null) {
totalSalesAmount = totalSalesAmount.add(salesAmount);
logger.info("运送清单{}:销售金额={}", delivery.getId(), salesAmount);
}
// 计算应收货款(取最后一个订单的约定价格 × 重量)
BigDecimal accountsReceivableAmount = calculateAccountsReceivable(delivery, lastOrder);
if (accountsReceivableAmount != null) {
totalAccountsReceivable = totalAccountsReceivable.add(accountsReceivableAmount);
logger.info("运送清单{}:应收货款={}", delivery.getId(), accountsReceivableAmount);
}
// 计算实收货款(取最后一个订单的预付款)
BigDecimal actualPaymentAmount = calculateActualPayment(lastOrder);
if (actualPaymentAmount != null) {
totalActualPayment = totalActualPayment.add(actualPaymentAmount);
logger.info("运送清单{}:实收货款={}", delivery.getId(), actualPaymentAmount);
}
// 累计采购数量
if (delivery.getRatedQuantity() != null) {
totalPurchase += delivery.getRatedQuantity();
}
totalOrder++; // 采购单数
totalSales++; // 销售单数
} catch (Exception e) {
logger.error("计算运送清单{}的统计数据失败:{}", delivery.getId(), e.getMessage(), e);
// 继续处理下一个delivery
}
}
// 计算利润
BigDecimal profits = totalSalesAmount.subtract(totalProcurementAmount);
// 计算未收货款
BigDecimal uncollectedPayment = totalAccountsReceivable.subtract(totalActualPayment);
logger.info("计算完成:采购总额={},销售总额={},利润={},采购数量={},采购单数={},销售单数={},应收货款={},实收货款={},未收货款={}",
totalProcurementAmount, totalSalesAmount, profits, totalPurchase, totalOrder, totalSales,
totalAccountsReceivable, totalActualPayment, uncollectedPayment);
// 创建或更新销售概览记录
SalesOverview salesOverview = new SalesOverview();
// 注意:新增时不要设置 id让数据库自动生成
salesOverview.setToalProcurementAmount(totalProcurementAmount);
salesOverview.setToalSalesAmount(totalSalesAmount);
salesOverview.setProfits(profits);
salesOverview.setTotalPurchase(totalPurchase);
salesOverview.setTotalOrder(totalOrder);
salesOverview.setTotalSales(totalSales);
salesOverview.setAccountsReceivable(totalAccountsReceivable);
salesOverview.setActualPayment(totalActualPayment);
salesOverview.setUncollectedPayment(uncollectedPayment);
Date now = new Date();
salesOverview.setCreateTime(now);
salesOverview.setUpTime(now);
// 保存或更新(如果已存在则更新,否则新增)
LambdaQueryWrapper<SalesOverview> wrapper = new LambdaQueryWrapper<>();
List<SalesOverview> existing = this.list(wrapper);
if (!existing.isEmpty()) {
// 更新第一条记录
SalesOverview existingRecord = existing.get(0);
salesOverview.setId(existingRecord.getId()); // 更新时需要设置ID
this.updateById(salesOverview);
logger.info("更新销售概览记录ID{}", existingRecord.getId());
} else {
// 新增记录 - 确保 id 为 null让数据库自动生成
salesOverview.setId(null); // 明确设置为 null确保使用数据库自增
boolean saved = this.save(salesOverview);
if (saved) {
logger.info("新增销售概览记录成功ID{}", salesOverview.getId());
} else {
logger.error("新增销售概览记录失败");
return AjaxResult.error("保存统计数据失败");
}
}
return AjaxResult.success("计算成功", salesOverview);
} catch (Exception e) {
logger.error("计算销售概览统计数据失败:{}", e.getMessage(), e);
return AjaxResult.error("计算失败:" + e.getMessage());
}
}
/**
* 计算订单金额
*
* @param delivery 运送清单
* @param order 订单
* @return 金额(元)
*/
private BigDecimal calculateOrderAmount(Delivery delivery, Order order) {
try {
// 检查单价
if (order.getFirmPrice() == null || order.getFirmPrice().compareTo(BigDecimal.ZERO) <= 0) {
logger.warn("订单{}的单价为空或无效,跳过计算", order.getId());
return null;
}
// 检查结算方式
Integer settlementType = order.getSettlementType();
if (settlementType == null) {
logger.warn("订单{}的结算方式为空,跳过计算", order.getId());
return null;
}
BigDecimal weight = null; // 重量(斤)
// 根据结算方式计算重量
if (settlementType == 1) {
// 1-上车重量:使用发车牛只重量
weight = calculateDepartureCattleWeight(delivery);
} else if (settlementType == 2) {
// 2-下车重量:使用落地牛只重量
weight = calculateLandingCattleWeight(delivery);
} else {
// 3-按肉价结算:暂不支持,跳过
logger.warn("订单{}的结算方式为按肉价结算,暂不支持计算", order.getId());
return null;
}
if (weight == null || weight.compareTo(BigDecimal.ZERO) <= 0) {
logger.warn("订单{}的重量计算失败或为0跳过计算", order.getId());
return null;
}
// 金额 = 单价(元/斤)× 重量(斤)
BigDecimal amount = order.getFirmPrice().multiply(weight);
amount = amount.setScale(2, RoundingMode.HALF_UP); // 保留2位小数
logger.info("订单{}:单价={},重量={},金额={}", order.getId(), order.getFirmPrice(), weight, amount);
return amount;
} catch (Exception e) {
logger.error("计算订单{}的金额失败:{}", order.getId(), e.getMessage(), e);
return null;
}
}
/**
* 计算应收货款
* 取最后一个订单的约定价格 × 重量(根据结算方式)
*
* @param delivery 运送清单
* @param lastOrder 链路中最后一个订单
* @return 应收货款(元)
*/
private BigDecimal calculateAccountsReceivable(Delivery delivery, Order lastOrder) {
try {
// 检查单价
if (lastOrder.getFirmPrice() == null || lastOrder.getFirmPrice().compareTo(BigDecimal.ZERO) <= 0) {
logger.warn("订单{}的单价为空或无效,跳过应收货款计算", lastOrder.getId());
return null;
}
// 检查结算方式
Integer settlementType = lastOrder.getSettlementType();
if (settlementType == null) {
logger.warn("订单{}的结算方式为空,跳过应收货款计算", lastOrder.getId());
return null;
}
BigDecimal weight = null; // 重量(斤)
// 根据结算方式计算重量
if (settlementType == 1) {
// 1-上车重量:使用发车牛只重量
weight = calculateDepartureCattleWeight(delivery);
} else if (settlementType == 2) {
// 2-下车重量:使用落地牛只重量
weight = calculateLandingCattleWeight(delivery);
} else {
// 3-按肉价结算:暂不支持,跳过
logger.warn("订单{}的结算方式为按肉价结算,跳过应收货款计算", lastOrder.getId());
return null;
}
if (weight == null || weight.compareTo(BigDecimal.ZERO) <= 0) {
logger.warn("订单{}的重量计算失败或为0跳过应收货款计算", lastOrder.getId());
return null;
}
// 应收货款 = 约定价格(元/斤)× 重量(斤)
BigDecimal accountsReceivable = lastOrder.getFirmPrice().multiply(weight);
accountsReceivable = accountsReceivable.setScale(2, RoundingMode.HALF_UP); // 保留2位小数
logger.info("订单{}:约定价格={},重量={},应收货款={}", lastOrder.getId(), lastOrder.getFirmPrice(), weight, accountsReceivable);
return accountsReceivable;
} catch (Exception e) {
logger.error("计算订单{}的应收货款失败:{}", lastOrder.getId(), e.getMessage(), e);
return null;
}
}
/**
* 计算实收货款(预付款)
* 取最后一个订单的预付款
*
* @param lastOrder 链路中最后一个订单
* @return 实收货款(元)
*/
private BigDecimal calculateActualPayment(Order lastOrder) {
try {
if (lastOrder.getAdvancePayment() == null) {
logger.warn("订单{}的预付款为空,跳过实收货款计算", lastOrder.getId());
return null;
}
BigDecimal actualPayment = lastOrder.getAdvancePayment();
if (actualPayment.compareTo(BigDecimal.ZERO) < 0) {
logger.warn("订单{}的预付款为负数,跳过实收货款计算", lastOrder.getId());
return null;
}
logger.info("订单{}:预付款={},实收货款={}", lastOrder.getId(), actualPayment, actualPayment);
return actualPayment;
} catch (Exception e) {
logger.error("计算订单{}的实收货款失败:{}", lastOrder.getId(), e.getMessage(), e);
return null;
}
}
/**
* 计算发车牛只重量(斤)
* 发车牛只重量 = (装车过磅重量 - 空车过磅重量) × 2kg转斤
*/
private BigDecimal calculateDepartureCattleWeight(Delivery delivery) {
try {
String emptyWeightStr = delivery.getEmptyWeight();
String entruckWeightStr = delivery.getEntruckWeight();
if (StringUtils.isEmpty(emptyWeightStr) || StringUtils.isEmpty(entruckWeightStr)) {
logger.warn("运送清单{}的空车过磅重量或装车过磅重量为空", delivery.getId());
return null;
}
BigDecimal emptyWeight = new BigDecimal(emptyWeightStr);
BigDecimal entruckWeight = new BigDecimal(entruckWeightStr);
if (emptyWeight.compareTo(BigDecimal.ZERO) <= 0 || entruckWeight.compareTo(emptyWeight) <= 0) {
logger.warn("运送清单{}的重量数据无效:空车={},装车={}", delivery.getId(), emptyWeight, entruckWeight);
return null;
}
// 发车牛只重量kg= 装车过磅重量 - 空车过磅重量
BigDecimal cattleWeightKg = entruckWeight.subtract(emptyWeight);
// 转换为斤kg × 2
BigDecimal cattleWeightJin = cattleWeightKg.multiply(new BigDecimal("2"));
cattleWeightJin = cattleWeightJin.setScale(2, RoundingMode.HALF_UP);
logger.info("运送清单{}:发车牛只重量={}kg={}斤", delivery.getId(), cattleWeightKg, cattleWeightJin);
return cattleWeightJin;
} catch (Exception e) {
logger.error("计算运送清单{}的发车牛只重量失败:{}", delivery.getId(), e.getMessage(), e);
return null;
}
}
/**
* 计算落地牛只重量(斤)
* 落地牛只重量 = (落地过磅重量 - 空车过磅重量) × 2kg转斤
*/
private BigDecimal calculateLandingCattleWeight(Delivery delivery) {
try {
String emptyWeightStr = delivery.getEmptyWeight();
String landingWeightStr = delivery.getLandingEntruckWeight();
if (StringUtils.isEmpty(emptyWeightStr) || StringUtils.isEmpty(landingWeightStr)) {
logger.warn("运送清单{}的空车过磅重量或落地过磅重量为空", delivery.getId());
return null;
}
BigDecimal emptyWeight = new BigDecimal(emptyWeightStr);
BigDecimal landingWeight = new BigDecimal(landingWeightStr);
if (emptyWeight.compareTo(BigDecimal.ZERO) <= 0 || landingWeight.compareTo(emptyWeight) <= 0) {
logger.warn("运送清单{}的重量数据无效:空车={},落地={}", delivery.getId(), emptyWeight, landingWeight);
return null;
}
// 落地牛只重量kg= 落地过磅重量 - 空车过磅重量
BigDecimal cattleWeightKg = landingWeight.subtract(emptyWeight);
// 转换为斤kg × 2
BigDecimal cattleWeightJin = cattleWeightKg.multiply(new BigDecimal("2"));
cattleWeightJin = cattleWeightJin.setScale(2, RoundingMode.HALF_UP);
logger.info("运送清单{}:落地牛只重量={}kg={}斤", delivery.getId(), cattleWeightKg, cattleWeightJin);
return cattleWeightJin;
} catch (Exception e) {
logger.error("计算运送清单{}的落地牛只重量失败:{}", delivery.getId(), e.getMessage(), e);
return null;
}
}
/**
* 按买卖关系链排序订单
* 复用OrderServiceImpl中的逻辑
*/
private List<Order> sortOrdersByChain(List<Order> orders) {
if (orders == null || orders.size() <= 1) {
return orders;
}
List<Order> result = new ArrayList<>();
List<Order> remaining = new ArrayList<>(orders);
// 辅助方法:检查两个名称是否匹配(支持逗号分隔的多个名称)
java.util.function.BiFunction<String, String, Boolean> namesMatch = (name1, name2) -> {
if (name1 == null || name2 == null) {
return false;
}
String[] names1 = name1.split(",\\s*");
String[] names2 = name2.split(",\\s*");
for (String n1 : names1) {
String trimmed1 = n1.trim();
if (trimmed1.isEmpty()) {
continue;
}
for (String n2 : names2) {
String trimmed2 = n2.trim();
if (trimmed1.equals(trimmed2)) {
return true;
}
}
}
return false;
};
// 找到链条的起点:没有其他订单的卖方等于这个订单的买方
Order startOrder = null;
for (Order order : remaining) {
String buyerName = order.getBuyerName();
if (buyerName == null || buyerName.trim().isEmpty()) {
continue;
}
boolean isStart = true;
for (Order other : remaining) {
if (order == other) {
continue;
}
String otherSellerName = other.getSellerName();
if (otherSellerName != null && namesMatch.apply(buyerName, otherSellerName)) {
isStart = false;
break;
}
}
if (isStart) {
startOrder = order;
break;
}
}
if (startOrder == null) {
startOrder = remaining.get(0);
}
result.add(startOrder);
remaining.remove(startOrder);
// 按照买卖关系链依次添加订单
while (!remaining.isEmpty()) {
Order currentOrder = result.get(result.size() - 1);
boolean found = false;
String currentSellerName = currentOrder.getSellerName();
if (currentSellerName != null && !currentSellerName.trim().isEmpty()) {
for (Order nextOrder : remaining) {
String nextBuyerName = nextOrder.getBuyerName();
if (nextBuyerName != null && namesMatch.apply(currentSellerName, nextBuyerName)) {
result.add(nextOrder);
remaining.remove(nextOrder);
found = true;
break;
}
}
}
if (!found) {
// 如果当前链条无法继续,将剩余订单按创建时间倒序添加
remaining.sort((o1, o2) -> {
if (o1.getCreateTime() != null && o2.getCreateTime() != null) {
return o2.getCreateTime().compareTo(o1.getCreateTime());
}
return 0;
});
result.addAll(remaining);
break;
}
}
return result;
}
/**
* 填充订单关联信息(买方名称、卖方名称)
*/
private void fillOrderInfo(Order order) {
// 填充买方名称
if (order.getBuyerId() != null && !order.getBuyerId().isEmpty()) {
String buyerNames = Arrays.stream(order.getBuyerId().split(","))
.map(buyerId -> {
try {
Map<String, Object> memberUser = memberMapper.selectMemberUserById(Integer.parseInt(buyerId.trim()));
if (memberUser != null && memberUser.get("username") != null) {
return (String) memberUser.get("username");
}
} catch (Exception e) {
logger.warn("查询买方信息失败买方ID{}", buyerId);
}
return "";
})
.filter(name -> !name.isEmpty())
.collect(Collectors.joining(", "));
order.setBuyerName(buyerNames);
}
// 填充卖方名称
if (order.getSellerId() != null && !order.getSellerId().isEmpty()) {
String sellerNames = Arrays.stream(order.getSellerId().split(","))
.map(sellerId -> {
try {
Map<String, Object> memberUser = memberMapper.selectMemberUserById(Integer.parseInt(sellerId.trim()));
if (memberUser != null && memberUser.get("username") != null) {
return (String) memberUser.get("username");
}
} catch (Exception e) {
logger.warn("查询卖方信息失败卖方ID{}", sellerId);
}
return "";
})
.filter(name -> !name.isEmpty())
.collect(Collectors.joining(", "));
order.setSellerName(sellerNames);
}
}
}

View File

@@ -0,0 +1,343 @@
package com.aiotagro.cattletrade.business.service.impl;
import com.aiotagro.cattletrade.business.dto.WarehouseInCreateDto;
import com.aiotagro.cattletrade.business.dto.WarehouseInDto;
import com.aiotagro.cattletrade.business.dto.WarehouseInEditDto;
import com.aiotagro.cattletrade.business.entity.Delivery;
import com.aiotagro.cattletrade.business.entity.Warehouse;
import com.aiotagro.cattletrade.business.entity.WarehouseIn;
import com.aiotagro.cattletrade.business.mapper.DeliveryMapper;
import com.aiotagro.cattletrade.business.mapper.WarehouseInMapper;
import com.aiotagro.cattletrade.business.mapper.WarehouseMapper;
import com.aiotagro.cattletrade.business.service.IWarehouseInService;
import com.aiotagro.cattletrade.business.vo.WarehouseInVo;
import com.aiotagro.common.core.utils.SecurityUtil;
import com.aiotagro.common.core.utils.StringUtils;
import com.aiotagro.common.core.utils.bean.BeanUtils;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 进仓管理服务实现类
*
* @author System
* @date 2025-01-20
*/
@Service
public class WarehouseInServiceImpl extends ServiceImpl<WarehouseInMapper, WarehouseIn> implements IWarehouseInService {
@Autowired
private WarehouseInMapper warehouseInMapper;
@Autowired
private WarehouseMapper warehouseMapper;
@Autowired
private DeliveryMapper deliveryMapper;
/**
* 分页查询进仓列表
*/
@Override
public PageResultResponse<WarehouseInVo> pageQuery(WarehouseInDto dto) {
Integer pageNum = dto.getPageNum() != null ? dto.getPageNum() : 1;
Integer pageSize = dto.getPageSize() != null ? dto.getPageSize() : 10;
// 使用PageHelper进行分页
Page<WarehouseIn> page = PageHelper.startPage(pageNum, pageSize);
// 构建查询条件
LambdaQueryWrapper<WarehouseIn> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.and(wrapper -> wrapper.eq(WarehouseIn::getIsDelete, 0).or().isNull(WarehouseIn::getIsDelete));
if (StringUtils.isNotEmpty(dto.getInNumber())) {
queryWrapper.like(WarehouseIn::getInNumber, dto.getInNumber());
}
if (dto.getWarehouseId() != null) {
queryWrapper.eq(WarehouseIn::getWarehouseId, dto.getWarehouseId());
}
if (dto.getDeliveryId() != null) {
queryWrapper.eq(WarehouseIn::getDeliveryId, dto.getDeliveryId());
}
if (dto.getStatus() != null) {
queryWrapper.eq(WarehouseIn::getStatus, dto.getStatus());
}
if (StringUtils.isNotEmpty(dto.getStartTime())) {
queryWrapper.ge(WarehouseIn::getInTime, dto.getStartTime() + " 00:00:00");
}
if (StringUtils.isNotEmpty(dto.getEndTime())) {
queryWrapper.le(WarehouseIn::getInTime, dto.getEndTime() + " 23:59:59");
}
queryWrapper.orderByDesc(WarehouseIn::getCreateTime);
// 执行查询
List<WarehouseIn> list = warehouseInMapper.selectList(queryWrapper);
// 转换为VO并填充关联信息
List<WarehouseInVo> voList = new ArrayList<>();
for (WarehouseIn warehouseIn : list) {
WarehouseInVo vo = new WarehouseInVo();
BeanUtils.copyProperties(warehouseIn, vo);
// 关联查询中转仓名称
if (warehouseIn.getWarehouseId() != null) {
Warehouse warehouse = warehouseMapper.selectById(warehouseIn.getWarehouseId());
if (warehouse != null) {
vo.setWarehouseName(warehouse.getWarehouseName());
}
}
// 关联查询运送清单信息(车牌号、司机信息等)
if (warehouseIn.getDeliveryId() != null) {
Delivery delivery = deliveryMapper.selectById(warehouseIn.getDeliveryId());
if (delivery != null) {
vo.setDeliveryNumber(delivery.getDeliveryNumber());
vo.setLicensePlate(delivery.getLicensePlate());
vo.setDriverName(delivery.getDriverName());
vo.setDriverMobile(delivery.getDriverMobile());
}
}
// 设置状态描述
vo.setStatusDesc(getStatusDesc(warehouseIn.getStatus()));
voList.add(vo);
}
// 构建分页结果
return new PageResultResponse<>(page.getTotal(), voList);
}
/**
* 新增进仓记录
*/
@Override
@Transactional
public AjaxResult addWarehouseIn(WarehouseInCreateDto dto) {
// 校验中转仓是否存在且启用
Warehouse warehouse = warehouseMapper.selectById(dto.getWarehouseId());
if (warehouse == null || (warehouse.getIsDelete() != null && warehouse.getIsDelete() == 1)) {
return AjaxResult.error("中转仓不存在");
}
if (warehouse.getStatus() == null || warehouse.getStatus() == 0) {
return AjaxResult.error("中转仓未启用,无法进仓");
}
// 生成进仓单号IN + 年月日 + 4位流水号
String inNumber = generateInNumber();
// 创建进仓实体
WarehouseIn warehouseIn = new WarehouseIn();
BeanUtils.copyProperties(dto, warehouseIn);
warehouseIn.setInNumber(inNumber);
warehouseIn.setStatus(1); // 默认待进仓
// 设置创建人和创建时间
Integer userId = SecurityUtil.getCurrentUserId();
warehouseIn.setCreatedBy(userId);
warehouseIn.setCreateTime(new Date());
try {
// 插入数据库
int result = warehouseInMapper.insert(warehouseIn);
if (result > 0) {
return AjaxResult.success("新增进仓记录成功", warehouseIn);
} else {
return AjaxResult.error("新增进仓记录失败");
}
} catch (DuplicateKeyException e) {
String errorMessage = e.getMessage();
if (errorMessage != null && errorMessage.contains("in_number")) {
return AjaxResult.error("进仓单号已存在,请重试");
}
return AjaxResult.error("数据重复:" + errorMessage);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("新增进仓记录失败:" + e.getMessage());
}
}
/**
* 更新进仓记录
*/
@Override
@Transactional
public AjaxResult updateWarehouseIn(WarehouseInEditDto dto) {
if (dto.getId() == null) {
return AjaxResult.error("进仓记录ID不能为空");
}
// 验证进仓记录是否存在
WarehouseIn existingWarehouseIn = warehouseInMapper.selectById(dto.getId());
if (existingWarehouseIn == null) {
return AjaxResult.error("进仓记录不存在");
}
// 校验中转仓是否存在且启用
Warehouse warehouse = warehouseMapper.selectById(dto.getWarehouseId());
if (warehouse == null || (warehouse.getIsDelete() != null && warehouse.getIsDelete() == 1)) {
return AjaxResult.error("中转仓不存在");
}
if (warehouse.getStatus() == null || warehouse.getStatus() == 0) {
return AjaxResult.error("中转仓未启用");
}
// 更新进仓信息
WarehouseIn warehouseIn = new WarehouseIn();
BeanUtils.copyProperties(dto, warehouseIn);
// 设置更新人和更新时间
Integer userId = SecurityUtil.getCurrentUserId();
warehouseIn.setUpdatedBy(userId);
warehouseIn.setUpdateTime(new Date());
try {
// 更新数据库
int result = warehouseInMapper.updateById(warehouseIn);
if (result > 0) {
return AjaxResult.success("更新进仓记录成功");
} else {
return AjaxResult.error("更新进仓记录失败");
}
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("更新进仓记录失败:" + e.getMessage());
}
}
/**
* 删除进仓记录(逻辑删除)
*/
@Override
@Transactional
public AjaxResult deleteWarehouseIn(Integer id) {
if (id == null) {
return AjaxResult.error("进仓记录ID不能为空");
}
// 查询进仓记录是否存在
WarehouseIn warehouseIn = warehouseInMapper.selectById(id);
if (warehouseIn == null) {
return AjaxResult.error("进仓记录不存在");
}
// 获取当前用户ID
Integer userId = SecurityUtil.getCurrentUserId();
// 直接使用 SQL 更新,不依赖 @TableLogic
UpdateWrapper<WarehouseIn> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", id)
.eq("is_delete", 0); // 只更新未删除的记录
updateWrapper.set("is_delete", 1)
.set("updated_by", userId)
.set("update_time", new Date());
int result = warehouseInMapper.update(null, updateWrapper);
if (result > 0) {
return AjaxResult.success("删除进仓记录成功");
} else {
return AjaxResult.error("删除进仓记录失败");
}
}
/**
* 获取进仓详情
*/
@Override
public AjaxResult getWarehouseInDetail(Integer id) {
if (id == null) {
return AjaxResult.error("进仓记录ID不能为空");
}
WarehouseIn warehouseIn = warehouseInMapper.selectById(id);
if (warehouseIn == null || (warehouseIn.getIsDelete() != null && warehouseIn.getIsDelete() == 1)) {
return AjaxResult.error("进仓记录不存在");
}
// 转换为VO并填充关联信息
WarehouseInVo vo = new WarehouseInVo();
BeanUtils.copyProperties(warehouseIn, vo);
// 关联查询中转仓名称
if (warehouseIn.getWarehouseId() != null) {
Warehouse warehouse = warehouseMapper.selectById(warehouseIn.getWarehouseId());
if (warehouse != null) {
vo.setWarehouseName(warehouse.getWarehouseName());
}
}
// 关联查询运送清单信息
if (warehouseIn.getDeliveryId() != null) {
Delivery delivery = deliveryMapper.selectById(warehouseIn.getDeliveryId());
if (delivery != null) {
vo.setDeliveryNumber(delivery.getDeliveryNumber());
vo.setLicensePlate(delivery.getLicensePlate());
vo.setDriverName(delivery.getDriverName());
vo.setDriverMobile(delivery.getDriverMobile());
}
}
// 设置状态描述
vo.setStatusDesc(getStatusDesc(warehouseIn.getStatus()));
return AjaxResult.success("查询成功", vo);
}
/**
* 生成进仓单号IN + 年月日 + 4位流水号IN202501200001
*/
private String generateInNumber() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dateStr = sdf.format(new Date());
String datePrefix = "IN" + dateStr;
// 查询当天最大流水号
Integer maxSequence = warehouseInMapper.getMaxSequenceByDate(datePrefix);
if (maxSequence == null) {
maxSequence = 0;
}
// 生成新的流水号
int nextSequence = maxSequence + 1;
return String.format("%s%04d", datePrefix, nextSequence);
}
/**
* 获取状态描述
*/
private String getStatusDesc(Integer status) {
if (status == null) {
return "未知";
}
switch (status) {
case 1:
return "待进仓";
case 2:
return "已进仓";
case 3:
return "已出仓";
default:
return "未知";
}
}
}

View File

@@ -0,0 +1,389 @@
package com.aiotagro.cattletrade.business.service.impl;
import com.aiotagro.cattletrade.business.dto.WarehouseOutCreateDto;
import com.aiotagro.cattletrade.business.dto.WarehouseOutDto;
import com.aiotagro.cattletrade.business.dto.WarehouseOutEditDto;
import com.aiotagro.cattletrade.business.entity.Delivery;
import com.aiotagro.cattletrade.business.entity.Warehouse;
import com.aiotagro.cattletrade.business.entity.WarehouseIn;
import com.aiotagro.cattletrade.business.entity.WarehouseOut;
import com.aiotagro.cattletrade.business.mapper.DeliveryMapper;
import com.aiotagro.cattletrade.business.mapper.WarehouseInMapper;
import com.aiotagro.cattletrade.business.mapper.WarehouseMapper;
import com.aiotagro.cattletrade.business.mapper.WarehouseOutMapper;
import com.aiotagro.cattletrade.business.service.IWarehouseOutService;
import com.aiotagro.cattletrade.business.vo.WarehouseOutVo;
import com.aiotagro.common.core.utils.SecurityUtil;
import com.aiotagro.common.core.utils.StringUtils;
import com.aiotagro.common.core.utils.bean.BeanUtils;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 出仓管理服务实现类
*
* @author System
* @date 2025-01-20
*/
@Service
public class WarehouseOutServiceImpl extends ServiceImpl<WarehouseOutMapper, WarehouseOut> implements IWarehouseOutService {
@Autowired
private WarehouseOutMapper warehouseOutMapper;
@Autowired
private WarehouseMapper warehouseMapper;
@Autowired
private WarehouseInMapper warehouseInMapper;
@Autowired
private DeliveryMapper deliveryMapper;
/**
* 分页查询出仓列表
*/
@Override
public PageResultResponse<WarehouseOutVo> pageQuery(WarehouseOutDto dto) {
Integer pageNum = dto.getPageNum() != null ? dto.getPageNum() : 1;
Integer pageSize = dto.getPageSize() != null ? dto.getPageSize() : 10;
// 使用PageHelper进行分页
Page<WarehouseOut> page = PageHelper.startPage(pageNum, pageSize);
// 构建查询条件
LambdaQueryWrapper<WarehouseOut> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.and(wrapper -> wrapper.eq(WarehouseOut::getIsDelete, 0).or().isNull(WarehouseOut::getIsDelete));
if (StringUtils.isNotEmpty(dto.getOutNumber())) {
queryWrapper.like(WarehouseOut::getOutNumber, dto.getOutNumber());
}
if (dto.getWarehouseId() != null) {
queryWrapper.eq(WarehouseOut::getWarehouseId, dto.getWarehouseId());
}
if (dto.getWarehouseInId() != null) {
queryWrapper.eq(WarehouseOut::getWarehouseInId, dto.getWarehouseInId());
}
if (dto.getDeliveryId() != null) {
queryWrapper.eq(WarehouseOut::getDeliveryId, dto.getDeliveryId());
}
if (dto.getStatus() != null) {
queryWrapper.eq(WarehouseOut::getStatus, dto.getStatus());
}
if (StringUtils.isNotEmpty(dto.getStartTime())) {
queryWrapper.ge(WarehouseOut::getOutTime, dto.getStartTime() + " 00:00:00");
}
if (StringUtils.isNotEmpty(dto.getEndTime())) {
queryWrapper.le(WarehouseOut::getOutTime, dto.getEndTime() + " 23:59:59");
}
queryWrapper.orderByDesc(WarehouseOut::getCreateTime);
// 执行查询
List<WarehouseOut> list = warehouseOutMapper.selectList(queryWrapper);
// 转换为VO并填充关联信息
List<WarehouseOutVo> voList = new ArrayList<>();
for (WarehouseOut warehouseOut : list) {
WarehouseOutVo vo = new WarehouseOutVo();
BeanUtils.copyProperties(warehouseOut, vo);
// 关联查询中转仓名称
if (warehouseOut.getWarehouseId() != null) {
Warehouse warehouse = warehouseMapper.selectById(warehouseOut.getWarehouseId());
if (warehouse != null) {
vo.setWarehouseName(warehouse.getWarehouseName());
}
}
// 关联查询进仓记录
if (warehouseOut.getWarehouseInId() != null) {
WarehouseIn warehouseIn = warehouseInMapper.selectById(warehouseOut.getWarehouseInId());
if (warehouseIn != null) {
vo.setWarehouseInNumber(warehouseIn.getInNumber());
}
}
// 关联查询运送清单信息(车牌号、司机信息等)
if (warehouseOut.getDeliveryId() != null) {
Delivery delivery = deliveryMapper.selectById(warehouseOut.getDeliveryId());
if (delivery != null) {
vo.setDeliveryNumber(delivery.getDeliveryNumber());
vo.setLicensePlate(delivery.getLicensePlate());
vo.setDriverName(delivery.getDriverName());
vo.setDriverMobile(delivery.getDriverMobile());
}
}
// 设置状态描述
vo.setStatusDesc(getStatusDesc(warehouseOut.getStatus()));
voList.add(vo);
}
// 构建分页结果
return new PageResultResponse<>(page.getTotal(), voList);
}
/**
* 新增出仓记录
*/
@Override
@Transactional
public AjaxResult addWarehouseOut(WarehouseOutCreateDto dto) {
// 校验中转仓是否存在且启用
Warehouse warehouse = warehouseMapper.selectById(dto.getWarehouseId());
if (warehouse == null || (warehouse.getIsDelete() != null && warehouse.getIsDelete() == 1)) {
return AjaxResult.error("中转仓不存在");
}
if (warehouse.getStatus() == null || warehouse.getStatus() == 0) {
return AjaxResult.error("中转仓未启用,无法出仓");
}
// 如果关联了进仓记录,校验进仓记录是否存在
if (dto.getWarehouseInId() != null) {
WarehouseIn warehouseIn = warehouseInMapper.selectById(dto.getWarehouseInId());
if (warehouseIn == null || (warehouseIn.getIsDelete() != null && warehouseIn.getIsDelete() == 1)) {
return AjaxResult.error("进仓记录不存在");
}
// 校验出仓数量不能超过进仓数量
if (dto.getCattleCount() > warehouseIn.getCattleCount()) {
return AjaxResult.error("出仓数量不能超过进仓数量");
}
}
// 生成出仓单号OUT + 年月日 + 4位流水号
String outNumber = generateOutNumber();
// 创建出仓实体
WarehouseOut warehouseOut = new WarehouseOut();
BeanUtils.copyProperties(dto, warehouseOut);
warehouseOut.setOutNumber(outNumber);
warehouseOut.setStatus(1); // 默认待出仓
// 设置创建人和创建时间
Integer userId = SecurityUtil.getCurrentUserId();
warehouseOut.setCreatedBy(userId);
warehouseOut.setCreateTime(new Date());
try {
// 插入数据库
int result = warehouseOutMapper.insert(warehouseOut);
if (result > 0) {
return AjaxResult.success("新增出仓记录成功", warehouseOut);
} else {
return AjaxResult.error("新增出仓记录失败");
}
} catch (DuplicateKeyException e) {
String errorMessage = e.getMessage();
if (errorMessage != null && errorMessage.contains("out_number")) {
return AjaxResult.error("出仓单号已存在,请重试");
}
return AjaxResult.error("数据重复:" + errorMessage);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("新增出仓记录失败:" + e.getMessage());
}
}
/**
* 更新出仓记录
*/
@Override
@Transactional
public AjaxResult updateWarehouseOut(WarehouseOutEditDto dto) {
if (dto.getId() == null) {
return AjaxResult.error("出仓记录ID不能为空");
}
// 验证出仓记录是否存在
WarehouseOut existingWarehouseOut = warehouseOutMapper.selectById(dto.getId());
if (existingWarehouseOut == null) {
return AjaxResult.error("出仓记录不存在");
}
// 校验中转仓是否存在且启用
Warehouse warehouse = warehouseMapper.selectById(dto.getWarehouseId());
if (warehouse == null || (warehouse.getIsDelete() != null && warehouse.getIsDelete() == 1)) {
return AjaxResult.error("中转仓不存在");
}
if (warehouse.getStatus() == null || warehouse.getStatus() == 0) {
return AjaxResult.error("中转仓未启用");
}
// 如果关联了进仓记录,校验进仓记录是否存在
if (dto.getWarehouseInId() != null) {
WarehouseIn warehouseIn = warehouseInMapper.selectById(dto.getWarehouseInId());
if (warehouseIn == null || (warehouseIn.getIsDelete() != null && warehouseIn.getIsDelete() == 1)) {
return AjaxResult.error("进仓记录不存在");
}
// 校验出仓数量不能超过进仓数量
if (dto.getCattleCount() > warehouseIn.getCattleCount()) {
return AjaxResult.error("出仓数量不能超过进仓数量");
}
}
// 更新出仓信息
WarehouseOut warehouseOut = new WarehouseOut();
BeanUtils.copyProperties(dto, warehouseOut);
// 设置更新人和更新时间
Integer userId = SecurityUtil.getCurrentUserId();
warehouseOut.setUpdatedBy(userId);
warehouseOut.setUpdateTime(new Date());
try {
// 更新数据库
int result = warehouseOutMapper.updateById(warehouseOut);
if (result > 0) {
return AjaxResult.success("更新出仓记录成功");
} else {
return AjaxResult.error("更新出仓记录失败");
}
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("更新出仓记录失败:" + e.getMessage());
}
}
/**
* 删除出仓记录(逻辑删除)
*/
@Override
@Transactional
public AjaxResult deleteWarehouseOut(Integer id) {
if (id == null) {
return AjaxResult.error("出仓记录ID不能为空");
}
// 查询出仓记录是否存在
WarehouseOut warehouseOut = warehouseOutMapper.selectById(id);
if (warehouseOut == null) {
return AjaxResult.error("出仓记录不存在");
}
// 获取当前用户ID
Integer userId = SecurityUtil.getCurrentUserId();
// 直接使用 SQL 更新,不依赖 @TableLogic
UpdateWrapper<WarehouseOut> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", id)
.eq("is_delete", 0); // 只更新未删除的记录
updateWrapper.set("is_delete", 1)
.set("updated_by", userId)
.set("update_time", new Date());
int result = warehouseOutMapper.update(null, updateWrapper);
if (result > 0) {
return AjaxResult.success("删除出仓记录成功");
} else {
return AjaxResult.error("删除出仓记录失败");
}
}
/**
* 获取出仓详情
*/
@Override
public AjaxResult getWarehouseOutDetail(Integer id) {
if (id == null) {
return AjaxResult.error("出仓记录ID不能为空");
}
WarehouseOut warehouseOut = warehouseOutMapper.selectById(id);
if (warehouseOut == null || (warehouseOut.getIsDelete() != null && warehouseOut.getIsDelete() == 1)) {
return AjaxResult.error("出仓记录不存在");
}
// 转换为VO并填充关联信息
WarehouseOutVo vo = new WarehouseOutVo();
BeanUtils.copyProperties(warehouseOut, vo);
// 关联查询中转仓名称
if (warehouseOut.getWarehouseId() != null) {
Warehouse warehouse = warehouseMapper.selectById(warehouseOut.getWarehouseId());
if (warehouse != null) {
vo.setWarehouseName(warehouse.getWarehouseName());
}
}
// 关联查询进仓记录
if (warehouseOut.getWarehouseInId() != null) {
WarehouseIn warehouseIn = warehouseInMapper.selectById(warehouseOut.getWarehouseInId());
if (warehouseIn != null) {
vo.setWarehouseInNumber(warehouseIn.getInNumber());
}
}
// 关联查询运送清单信息
if (warehouseOut.getDeliveryId() != null) {
Delivery delivery = deliveryMapper.selectById(warehouseOut.getDeliveryId());
if (delivery != null) {
vo.setDeliveryNumber(delivery.getDeliveryNumber());
vo.setLicensePlate(delivery.getLicensePlate());
vo.setDriverName(delivery.getDriverName());
vo.setDriverMobile(delivery.getDriverMobile());
}
}
// 设置状态描述
vo.setStatusDesc(getStatusDesc(warehouseOut.getStatus()));
return AjaxResult.success("查询成功", vo);
}
/**
* 生成出仓单号OUT + 年月日 + 4位流水号OUT202501200001
*/
private String generateOutNumber() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dateStr = sdf.format(new Date());
String datePrefix = "OUT" + dateStr;
// 查询当天最大流水号
Integer maxSequence = warehouseOutMapper.getMaxSequenceByDate(datePrefix);
if (maxSequence == null) {
maxSequence = 0;
}
// 生成新的流水号
int nextSequence = maxSequence + 1;
return String.format("%s%04d", datePrefix, nextSequence);
}
/**
* 获取状态描述
*/
private String getStatusDesc(Integer status) {
if (status == null) {
return "未知";
}
switch (status) {
case 1:
return "待出仓";
case 2:
return "已出仓";
default:
return "未知";
}
}
}

View File

@@ -0,0 +1,270 @@
package com.aiotagro.cattletrade.business.service.impl;
import com.aiotagro.cattletrade.business.dto.WarehouseCreateDto;
import com.aiotagro.cattletrade.business.dto.WarehouseDto;
import com.aiotagro.cattletrade.business.dto.WarehouseEditDto;
import com.aiotagro.cattletrade.business.entity.Warehouse;
import com.aiotagro.cattletrade.business.mapper.WarehouseMapper;
import com.aiotagro.cattletrade.business.service.IWarehouseService;
import com.aiotagro.common.core.utils.SecurityUtil;
import com.aiotagro.common.core.utils.bean.BeanUtils;
import com.aiotagro.common.core.web.domain.AjaxResult;
import com.aiotagro.common.core.web.domain.PageResultResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.List;
/**
* 中转仓管理服务实现类
*
* @author System
* @date 2025-01-20
*/
@Service
public class WarehouseServiceImpl extends ServiceImpl<WarehouseMapper, Warehouse> implements IWarehouseService {
@Autowired
private WarehouseMapper warehouseMapper;
/**
* 分页查询中转仓列表
*/
@Override
public PageResultResponse<Warehouse> pageQuery(WarehouseDto dto) {
Integer pageNum = dto.getPageNum() != null ? dto.getPageNum() : 1;
Integer pageSize = dto.getPageSize() != null ? dto.getPageSize() : 10;
// 使用PageHelper进行分页
Page<Warehouse> page = PageHelper.startPage(pageNum, pageSize);
// 构建查询条件
LambdaQueryWrapper<Warehouse> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.and(wrapper -> wrapper.eq(Warehouse::getIsDelete, 0).or().isNull(Warehouse::getIsDelete));
if (StringUtils.hasText(dto.getWarehouseName())) {
queryWrapper.like(Warehouse::getWarehouseName, dto.getWarehouseName());
}
if (StringUtils.hasText(dto.getWarehouseCode())) {
queryWrapper.like(Warehouse::getWarehouseCode, dto.getWarehouseCode());
}
if (dto.getStatus() != null) {
queryWrapper.eq(Warehouse::getStatus, dto.getStatus());
}
queryWrapper.orderByDesc(Warehouse::getCreateTime);
// 执行查询
List<Warehouse> list = warehouseMapper.selectList(queryWrapper);
// 构建分页结果
return new PageResultResponse<>(page.getTotal(), list);
}
/**
* 新增中转仓
*/
@Override
@Transactional
public AjaxResult addWarehouse(WarehouseCreateDto dto) {
// 如果中转仓编码为空,自动生成
String warehouseCode = dto.getWarehouseCode();
if (!StringUtils.hasText(warehouseCode)) {
warehouseCode = generateWarehouseCode();
} else {
// 如果用户提供了编码,验证是否已存在
Warehouse existingWarehouse = warehouseMapper.selectByWarehouseCode(warehouseCode);
if (existingWarehouse != null) {
return AjaxResult.error("中转仓编码已存在");
}
}
// 创建中转仓实体
Warehouse warehouse = new Warehouse();
BeanUtils.copyProperties(dto, warehouse);
warehouse.setWarehouseCode(warehouseCode);
// 设置默认状态
if (warehouse.getStatus() == null) {
warehouse.setStatus(1); // 默认启用
}
// 设置创建人和创建时间
Integer userId = SecurityUtil.getCurrentUserId();
warehouse.setCreatedBy(userId);
warehouse.setCreateTime(new Date());
try {
// 插入数据库
int result = warehouseMapper.insert(warehouse);
if (result > 0) {
return AjaxResult.success("新增中转仓成功");
} else {
return AjaxResult.error("新增中转仓失败");
}
} catch (DuplicateKeyException e) {
String errorMessage = e.getMessage();
if (errorMessage != null && errorMessage.contains("warehouse_code")) {
return AjaxResult.error("中转仓编码已存在,请使用其他编码");
}
return AjaxResult.error("数据重复:" + errorMessage);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("新增中转仓失败:" + e.getMessage());
}
}
/**
* 更新中转仓信息
*/
@Override
@Transactional
public AjaxResult updateWarehouse(WarehouseEditDto dto) {
if (dto.getId() == null) {
return AjaxResult.error("中转仓ID不能为空");
}
// 验证中转仓是否存在
Warehouse existingWarehouse = warehouseMapper.selectById(dto.getId());
if (existingWarehouse == null) {
return AjaxResult.error("中转仓不存在");
}
// 验证中转仓编码唯一性(排除当前记录)
Warehouse codeWarehouse = warehouseMapper.selectByWarehouseCode(dto.getWarehouseCode());
if (codeWarehouse != null && !codeWarehouse.getId().equals(dto.getId())) {
return AjaxResult.error("中转仓编码已存在");
}
// 更新中转仓信息
Warehouse warehouse = new Warehouse();
BeanUtils.copyProperties(dto, warehouse);
// 设置更新人和更新时间
Integer userId = SecurityUtil.getCurrentUserId();
warehouse.setUpdatedBy(userId);
warehouse.setUpdateTime(new Date());
try {
// 更新数据库
int result = warehouseMapper.updateById(warehouse);
if (result > 0) {
return AjaxResult.success("更新中转仓成功");
} else {
return AjaxResult.error("更新中转仓失败");
}
} catch (DuplicateKeyException e) {
String errorMessage = e.getMessage();
if (errorMessage != null && errorMessage.contains("warehouse_code")) {
return AjaxResult.error("中转仓编码已存在,请使用其他编码");
}
return AjaxResult.error("数据重复:" + errorMessage);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("更新中转仓失败:" + e.getMessage());
}
}
/**
* 删除中转仓(逻辑删除)
*/
@Override
@Transactional
public AjaxResult deleteWarehouse(Integer id) {
if (id == null) {
return AjaxResult.error("中转仓ID不能为空");
}
// 查询中转仓是否存在
Warehouse warehouse = warehouseMapper.selectById(id);
if (warehouse == null) {
return AjaxResult.error("中转仓不存在");
}
// 获取当前用户ID
Integer userId = SecurityUtil.getCurrentUserId();
// 直接使用 SQL 更新,不依赖 @TableLogic
UpdateWrapper<Warehouse> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", id)
.eq("is_delete", 0); // 只更新未删除的记录
updateWrapper.set("is_delete", 1)
.set("updated_by", userId)
.set("update_time", new Date());
int result = warehouseMapper.update(null, updateWrapper);
if (result > 0) {
return AjaxResult.success("删除中转仓成功");
} else {
return AjaxResult.error("删除中转仓失败");
}
}
/**
* 获取中转仓详情
*/
@Override
public AjaxResult getWarehouseDetail(Integer id) {
if (id == null) {
return AjaxResult.error("中转仓ID不能为空");
}
Warehouse warehouse = warehouseMapper.selectById(id);
if (warehouse == null || (warehouse.getIsDelete() != null && warehouse.getIsDelete() == 1)) {
return AjaxResult.error("中转仓不存在");
}
return AjaxResult.success("查询成功", warehouse);
}
/**
* 获取所有启用的中转仓(下拉选择用)
*/
@Override
public List<Warehouse> getAllEnabled() {
return warehouseMapper.selectAllEnabled();
}
/**
* 生成中转仓编码WH + 4位流水号
*/
private String generateWarehouseCode() {
// 查询当前最大编码
LambdaQueryWrapper<Warehouse> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.likeRight(Warehouse::getWarehouseCode, "WH");
queryWrapper.orderByDesc(Warehouse::getWarehouseCode);
queryWrapper.last("LIMIT 1");
Warehouse lastWarehouse = warehouseMapper.selectOne(queryWrapper);
if (lastWarehouse != null && lastWarehouse.getWarehouseCode() != null) {
String lastCode = lastWarehouse.getWarehouseCode();
if (lastCode.startsWith("WH")) {
try {
String numStr = lastCode.substring(2);
int num = Integer.parseInt(numStr);
return String.format("WH%04d", num + 1);
} catch (NumberFormatException e) {
// 如果解析失败从1开始
}
}
}
// 如果没有找到从0001开始
return "WH0001";
}
}

View File

@@ -0,0 +1,83 @@
package com.aiotagro.cattletrade.business.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 销售概览视图对象
*
* @author System
* @date 2025-01-20
*/
@Data
public class SalesOverviewVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
private Integer id;
/**
* 采购总额(元)
*/
private BigDecimal toalProcurementAmount;
/**
* 销售总额(元)
*/
private BigDecimal toalSalesAmount;
/**
* 利润(元)
*/
private BigDecimal profits;
/**
* 应收货款(元)
*/
private BigDecimal accountsReceivable;
/**
* 未收货款(元)
*/
private BigDecimal uncollectedPayment;
/**
* 实收货款(元)
*/
private BigDecimal actualPayment;
/**
* 采购数量(头)
*/
private Integer totalPurchase;
/**
* 采购单数(车)
*/
private Integer totalOrder;
/**
* 销售单数(单)
*/
private Integer totalSales;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date upTime;
}

View File

@@ -0,0 +1,146 @@
package com.aiotagro.cattletrade.business.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 进仓视图对象(包含订单、运送清单等信息)
*
* @author System
* @date 2025-01-20
*/
@Data
public class WarehouseInVo {
/**
* 主键ID
*/
private Integer id;
/**
* 进仓单号
*/
private String inNumber;
/**
* 中转仓ID
*/
private Integer warehouseId;
/**
* 中转仓名称
*/
private String warehouseName;
/**
* 订单ID多个订单用逗号分隔
*/
private String orderId;
/**
* 运送清单ID
*/
private Integer deliveryId;
/**
* 运单号通过delivery_id关联查询
*/
private String deliveryNumber;
/**
* 车牌号通过delivery_id关联查询
*/
private String licensePlate;
/**
* 司机姓名通过delivery_id关联查询
*/
private String driverName;
/**
* 司机手机号通过delivery_id关联查询
*/
private String driverMobile;
/**
* 来源地
*/
private String sourceLocation;
/**
* 来源地经度
*/
private String sourceLon;
/**
* 来源地纬度
*/
private String sourceLat;
/**
* 牛只数量
*/
private Integer cattleCount;
/**
* 重量(公斤)
*/
private BigDecimal weight;
/**
* 进仓时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date inTime;
/**
* 照片URL多个用逗号分隔
*/
private String photos;
/**
* 视频URL多个用逗号分隔
*/
private String videos;
/**
* 备注
*/
private String remark;
/**
* 状态1-待进仓2-已进仓3-已出仓
*/
private Integer status;
/**
* 状态描述
*/
private String statusDesc;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 创建人ID
*/
private Integer createdBy;
/**
* 创建人姓名
*/
private String createdByName;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
}

View File

@@ -0,0 +1,156 @@
package com.aiotagro.cattletrade.business.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 出仓视图对象(包含订单、运送清单、进仓记录等信息)
*
* @author System
* @date 2025-01-20
*/
@Data
public class WarehouseOutVo {
/**
* 主键ID
*/
private Integer id;
/**
* 出仓单号
*/
private String outNumber;
/**
* 中转仓ID
*/
private Integer warehouseId;
/**
* 中转仓名称
*/
private String warehouseName;
/**
* 进仓记录ID可选
*/
private Integer warehouseInId;
/**
* 进仓单号通过warehouse_in_id关联查询
*/
private String warehouseInNumber;
/**
* 订单ID多个订单用逗号分隔
*/
private String orderId;
/**
* 运送清单ID
*/
private Integer deliveryId;
/**
* 运单号通过delivery_id关联查询
*/
private String deliveryNumber;
/**
* 车牌号通过delivery_id关联查询
*/
private String licensePlate;
/**
* 司机姓名通过delivery_id关联查询
*/
private String driverName;
/**
* 司机手机号通过delivery_id关联查询
*/
private String driverMobile;
/**
* 目的地
*/
private String destinationLocation;
/**
* 目的地经度
*/
private String destinationLon;
/**
* 目的地纬度
*/
private String destinationLat;
/**
* 牛只数量
*/
private Integer cattleCount;
/**
* 重量(公斤)
*/
private BigDecimal weight;
/**
* 出仓时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date outTime;
/**
* 照片URL多个用逗号分隔
*/
private String photos;
/**
* 视频URL多个用逗号分隔
*/
private String videos;
/**
* 备注
*/
private String remark;
/**
* 状态1-待出仓2-已出仓
*/
private Integer status;
/**
* 状态描述
*/
private String statusDesc;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 创建人ID
*/
private Integer createdBy;
/**
* 创建人姓名
*/
private String createdByName;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
}

View File

@@ -0,0 +1,99 @@
package com.aiotagro.cattletrade.business.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
/**
* 中转仓视图对象
*
* @author System
* @date 2025-01-20
*/
@Data
public class WarehouseVo {
/**
* 主键ID
*/
private Integer id;
/**
* 中转仓名称
*/
private String warehouseName;
/**
* 中转仓编码
*/
private String warehouseCode;
/**
* 地址
*/
private String address;
/**
* 经度
*/
private String longitude;
/**
* 纬度
*/
private String latitude;
/**
* 容量(可存储牛只数量)
*/
private Integer capacity;
/**
* 负责人姓名
*/
private String managerName;
/**
* 负责人联系电话
*/
private String managerMobile;
/**
* 状态1-启用0-禁用
*/
private Integer status;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 创建人ID
*/
private Integer createdBy;
/**
* 创建人姓名
*/
private String createdByName;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* 更新人ID
*/
private Integer updatedBy;
}

View File

@@ -0,0 +1,40 @@
package com.aiotagro.cattletrade.job;
import com.aiotagro.cattletrade.business.service.ISalesOverviewService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 销售概览计算定时任务
* 每天凌晨1点执行一次
*
* @author System
* @date 2025-01-20
*/
@Component
public class SalesOverviewCalculateJob {
private static final Logger logger = LoggerFactory.getLogger(SalesOverviewCalculateJob.class);
@Autowired
private ISalesOverviewService salesOverviewService;
/**
* 每天凌晨1点执行一次
* cron表达式秒 分 时 日 月 周
*/
@Scheduled(cron = "0 0 1 * * ?")
public void calculateSalesOverview() {
try {
logger.info("========== 开始执行销售概览计算定时任务 ==========");
salesOverviewService.calculateStatistics();
logger.info("========== 销售概览计算定时任务执行完成 ==========");
} catch (Exception e) {
logger.error("销售概览计算定时任务执行失败", e);
}
}
}

View File

@@ -13,7 +13,7 @@ public final class BaiduYingyanConstants {
/**
* 百度鹰眼控制台申请的 AK
*/
public static final String AK = "xITbC7jegaAAuu4m9jC2Zx6eFbQJ29Rj";
public static final String AK = "3AN3VahoqaXUs32U8luXD2Dwn86KK5B7";
/**
* 百度鹰眼服务 ID

View File

@@ -0,0 +1,137 @@
# 销售概览菜单配置说明
## 问题说明
如果销售概览页面可以访问,但侧边栏菜单中没有显示,通常是因为:
1. 菜单已插入数据库,但没有给用户/角色分配权限
2. 菜单的 `org_type` 配置与用户不匹配
## 解决步骤
### 步骤1检查菜单是否已插入
执行检查SQL
```sql
-- 文件check_salesoverview_menu.sql
USE cattletrade;
SELECT * FROM sys_menu WHERE name = '销售概览' AND is_delete = 0;
```
如果查询结果为空,说明菜单未插入,需要先执行 `insert_salesoverview_menu.sql`
### 步骤2分配菜单权限
有两种方式分配权限:
#### 方式A通过SQL脚本分配推荐
执行权限分配SQL
```sql
-- 文件assign_salesoverview_menu_permission.sql
-- 该脚本会为角色ID=1超级管理员分配销售概览菜单权限
```
**注意**如果您的超级管理员角色ID不是1请先查询
```sql
SELECT id, name FROM sys_role WHERE name LIKE '%管理员%' OR name LIKE '%admin%';
```
然后修改SQL脚本中的角色ID。
#### 方式B通过系统界面分配
1. 登录系统管理后台
2. 进入 **权限管理****操作权限管理**
3. 选择需要分配权限的角色
4. 勾选销售概览相关的菜单项:
- 销售概览(主菜单)
- 新增
- 编辑
- 删除
- 计算统计数据
5. 点击保存
### 步骤3检查菜单的org_type配置
菜单的 `org_type` 字段:
- 1 = 海关端
- 2 = 企业端
- 3 = 海关企业共用
如果您的用户是企业端,但菜单的 `org_type` 是1海关端菜单也不会显示。
**检查当前用户的org_type**
```sql
-- 查询用户所属机构类型
SELECT u.id, u.name, u.mobile, r.name AS role_name, r.org_type
FROM sys_user u
LEFT JOIN sys_role r ON u.role_id = r.id
WHERE u.mobile = '15900000000'; -- 替换为实际手机号
```
**如果需要修改菜单的org_type**
```sql
-- 将销售概览菜单设置为企业端和海关端共用
UPDATE sys_menu
SET org_type = 3
WHERE name = '销售概览' AND type = 1 AND is_delete = 0;
```
### 步骤4刷新页面
执行完SQL或分配权限后
1. 退出登录
2. 重新登录系统
3. 刷新页面
菜单应该会出现在侧边栏中。
## 快速修复SQL一键执行
如果确认菜单已插入只需要分配权限可以执行以下SQL
```sql
USE cattletrade;
-- 查询销售概览菜单ID
SET @menu_id = (SELECT id FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0 LIMIT 1);
-- 为角色ID=1超级管理员分配主菜单权限
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @menu_id
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = @menu_id)
AND @menu_id IS NOT NULL;
-- 为角色ID=1分配所有按钮权限
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, id
FROM sys_menu
WHERE parent_id = @menu_id AND type = 2 AND is_delete = 0
AND NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = sys_menu.id)
AND @menu_id IS NOT NULL;
```
## 验证
执行以下SQL验证权限是否分配成功
```sql
USE cattletrade;
-- 查询销售概览菜单权限分配情况
SELECT
r.id AS role_id,
r.name AS role_name,
m.id AS menu_id,
m.name AS menu_name,
m.type AS menu_type,
m.page_url
FROM sys_role_menu rm
INNER JOIN sys_role r ON rm.role_id = r.id
INNER JOIN sys_menu m ON rm.menu_id = m.id
WHERE m.name = '销售概览' OR m.parent_id = (SELECT id FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0 LIMIT 1)
ORDER BY r.id, m.type, m.sort;
```
如果查询结果中有您的角色,说明权限已分配成功。

View File

@@ -0,0 +1,146 @@
USE cattletrade;
-- 为角色分配销售概览菜单权限
-- 注意:需要根据实际情况修改 role_id
-- 1. 查询销售概览菜单ID包括主菜单和按钮权限
SET @salesoverview_menu_id = (SELECT id FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0 LIMIT 1);
SET @salesoverview_add_id = (SELECT id FROM sys_menu WHERE name = '新增' AND parent_id = @salesoverview_menu_id AND type = 2 AND is_delete = 0 LIMIT 1);
SET @salesoverview_edit_id = (SELECT id FROM sys_menu WHERE name = '编辑' AND parent_id = @salesoverview_menu_id AND type = 2 AND is_delete = 0 LIMIT 1);
SET @salesoverview_delete_id = (SELECT id FROM sys_menu WHERE name = '删除' AND parent_id = @salesoverview_menu_id AND type = 2 AND is_delete = 0 LIMIT 1);
SET @salesoverview_calculate_id = (SELECT id FROM sys_menu WHERE name = '计算统计数据' AND parent_id = @salesoverview_menu_id AND type = 2 AND is_delete = 0 LIMIT 1);
-- 显示查询到的菜单ID用于调试
SELECT
@salesoverview_menu_id AS '主菜单ID',
@salesoverview_add_id AS '新增按钮ID',
@salesoverview_edit_id AS '编辑按钮ID',
@salesoverview_delete_id AS '删除按钮ID',
@salesoverview_calculate_id AS '计算按钮ID';
-- 2. 查询所有角色ID用于批量分配
-- SELECT id, name FROM sys_role WHERE is_delete = 0;
-- 3. 为指定角色分配销售概览菜单权限
-- 方式1为单个角色分配需要替换 @role_id 为实际角色ID
-- SET @role_id = 1; -- 替换为实际角色ID例如超级管理员角色ID
-- 删除该角色原有的销售概览权限(如果存在)
-- DELETE FROM sys_role_menu
-- WHERE role_id = @role_id
-- AND menu_id IN (@salesoverview_menu_id, @salesoverview_add_id, @salesoverview_edit_id, @salesoverview_delete_id, @salesoverview_calculate_id);
-- 插入新的权限
-- INSERT INTO sys_role_menu (role_id, menu_id)
-- VALUES
-- (@role_id, @salesoverview_menu_id),
-- (@role_id, @salesoverview_add_id),
-- (@role_id, @salesoverview_edit_id),
-- (@role_id, @salesoverview_delete_id),
-- (@role_id, @salesoverview_calculate_id)
-- ON DUPLICATE KEY UPDATE role_id = role_id; -- 如果已存在则忽略
-- 方式2为所有角色分配销售概览菜单权限谨慎使用
-- INSERT INTO sys_role_menu (role_id, menu_id)
-- SELECT r.id, @salesoverview_menu_id
-- FROM sys_role r
-- WHERE r.is_delete = 0
-- AND NOT EXISTS (
-- SELECT 1 FROM sys_role_menu rm
-- WHERE rm.role_id = r.id AND rm.menu_id = @salesoverview_menu_id
-- );
-- INSERT INTO sys_role_menu (role_id, menu_id)
-- SELECT r.id, @salesoverview_add_id
-- FROM sys_role r
-- WHERE r.is_delete = 0
-- AND NOT EXISTS (
-- SELECT 1 FROM sys_role_menu rm
-- WHERE rm.role_id = r.id AND rm.menu_id = @salesoverview_add_id
-- );
-- INSERT INTO sys_role_menu (role_id, menu_id)
-- SELECT r.id, @salesoverview_edit_id
-- FROM sys_role r
-- WHERE r.is_delete = 0
-- AND NOT EXISTS (
-- SELECT 1 FROM sys_role_menu rm
-- WHERE rm.role_id = r.id AND rm.menu_id = @salesoverview_edit_id
-- );
-- INSERT INTO sys_role_menu (role_id, menu_id)
-- SELECT r.id, @salesoverview_delete_id
-- FROM sys_role r
-- WHERE r.is_delete = 0
-- AND NOT EXISTS (
-- SELECT 1 FROM sys_role_menu rm
-- WHERE rm.role_id = r.id AND rm.menu_id = @salesoverview_delete_id
-- );
-- INSERT INTO sys_role_menu (role_id, menu_id)
-- SELECT r.id, @salesoverview_calculate_id
-- FROM sys_role r
-- WHERE r.is_delete = 0
-- AND NOT EXISTS (
-- SELECT 1 FROM sys_role_menu rm
-- WHERE rm.role_id = r.id AND rm.menu_id = @salesoverview_calculate_id
-- );
-- 方式3为超级管理员角色分配推荐使用
-- 假设超级管理员角色ID为1需要根据实际情况调整
-- 如果角色ID不是1请先查询SELECT id, name FROM sys_role WHERE name LIKE '%管理员%' OR name LIKE '%admin%';
-- 为角色ID=1分配销售概览菜单权限请根据实际情况修改角色ID
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @salesoverview_menu_id
WHERE NOT EXISTS (
SELECT 1 FROM sys_role_menu rm
WHERE rm.role_id = 1 AND rm.menu_id = @salesoverview_menu_id
)
AND @salesoverview_menu_id IS NOT NULL;
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @salesoverview_add_id
WHERE NOT EXISTS (
SELECT 1 FROM sys_role_menu rm
WHERE rm.role_id = 1 AND rm.menu_id = @salesoverview_add_id
)
AND @salesoverview_add_id IS NOT NULL;
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @salesoverview_edit_id
WHERE NOT EXISTS (
SELECT 1 FROM sys_role_menu rm
WHERE rm.role_id = 1 AND rm.menu_id = @salesoverview_edit_id
)
AND @salesoverview_edit_id IS NOT NULL;
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @salesoverview_delete_id
WHERE NOT EXISTS (
SELECT 1 FROM sys_role_menu rm
WHERE rm.role_id = 1 AND rm.menu_id = @salesoverview_delete_id
)
AND @salesoverview_delete_id IS NOT NULL;
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @salesoverview_calculate_id
WHERE NOT EXISTS (
SELECT 1 FROM sys_role_menu rm
WHERE rm.role_id = 1 AND rm.menu_id = @salesoverview_calculate_id
)
AND @salesoverview_calculate_id IS NOT NULL;
-- 4. 验证权限分配结果
SELECT
rm.role_id,
r.name AS role_name,
rm.menu_id,
m.name AS menu_name,
m.type AS menu_type
FROM sys_role_menu rm
INNER JOIN sys_role r ON rm.role_id = r.id
INNER JOIN sys_menu m ON rm.menu_id = m.id
WHERE m.name = '销售概览' OR m.parent_id = (SELECT id FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0 LIMIT 1)
ORDER BY rm.role_id, m.type, m.sort;

View File

@@ -0,0 +1,40 @@
USE cattletrade;
-- 检查销售概览菜单是否已插入
SELECT
id,
parent_id,
type,
icon,
name,
sort,
route_url,
page_url,
org_type,
authority,
is_delete,
create_time
FROM sys_menu
WHERE name = '销售概览'
ORDER BY type, sort;
-- 检查是否有重复的销售概览菜单
SELECT COUNT(*) as count, name, type
FROM sys_menu
WHERE name = '销售概览' AND is_delete = 0
GROUP BY name, type;
-- 查询所有顶级菜单parent_id = 0用于参考
SELECT
id,
name,
type,
icon,
sort,
page_url,
org_type,
authority
FROM sys_menu
WHERE parent_id = 0 AND is_delete = 0
ORDER BY sort;

View File

@@ -0,0 +1,82 @@
USE cattletrade;
-- 检查 sys_menu 表的字段长度
-- 用于诊断字段值被截断的问题
-- ============================================
-- 1. 检查 page_url 和 authority 字段的定义
-- ============================================
-- 执行以下查询查看字段定义:
SHOW COLUMNS FROM sys_menu WHERE Field IN ('page_url', 'authority');
-- 或者使用以下查询:
SELECT
COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'cattletrade'
AND TABLE_NAME = 'sys_menu'
AND COLUMN_NAME IN ('page_url', 'authority');
-- ============================================
-- 2. 检查当前菜单数据的字段长度
-- ============================================
SELECT
id,
parent_id,
type,
name,
route_url,
page_url,
LENGTH(page_url) as page_url_length,
authority,
LENGTH(authority) as authority_length
FROM sys_menu
WHERE (id = 82 OR parent_id = 82)
AND is_delete = 0
ORDER BY id, sort;
-- ============================================
-- 3. 检查是否有被截断的字段值
-- ============================================
-- 检查进仓管理菜单
SELECT
id,
name,
page_url,
LENGTH(page_url) as page_url_length,
'warehouse/warehouseIn' as expected_value,
LENGTH('warehouse/warehouseIn') as expected_length
FROM sys_menu
WHERE id = 88
AND is_delete = 0;
-- 检查出仓管理菜单
SELECT
id,
name,
page_url,
LENGTH(page_url) as page_url_length,
authority,
LENGTH(authority) as authority_length,
'warehouse/warehouseOut' as expected_page_url,
LENGTH('warehouse/warehouseOut') as expected_page_url_length,
'warehouseout:list' as expected_authority,
LENGTH('warehouseout:list') as expected_authority_length
FROM sys_menu
WHERE id = 93
AND is_delete = 0;
-- ============================================
-- 4. 如果需要扩展字段长度,执行以下语句(取消注释)
-- ============================================
-- 注意:执行前请先备份数据库!
-- 扩展 page_url 字段长度到 255
-- ALTER TABLE sys_menu MODIFY COLUMN page_url VARCHAR(255) COMMENT '前端路由地址';
-- 扩展 authority 字段长度到 100
-- ALTER TABLE sys_menu MODIFY COLUMN authority VARCHAR(100) COMMENT '权限字符串';

View File

@@ -0,0 +1,113 @@
USE cattletrade;
-- 创建中转仓管理相关表
-- 1. 中转仓表warehouse
-- 2. 进仓表warehouse_in
-- 3. 出仓表warehouse_out
-- ============================================
-- 1. 中转仓表warehouse
-- ============================================
CREATE TABLE IF NOT EXISTS `warehouse` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`warehouse_name` VARCHAR(100) NOT NULL COMMENT '中转仓名称',
`warehouse_code` VARCHAR(50) NOT NULL COMMENT '中转仓编码',
`address` VARCHAR(255) NOT NULL COMMENT '地址',
`longitude` VARCHAR(50) DEFAULT NULL COMMENT '经度',
`latitude` VARCHAR(50) DEFAULT NULL COMMENT '纬度',
`capacity` INT(11) NOT NULL COMMENT '容量(可存储牛只数量)',
`manager_name` VARCHAR(50) DEFAULT NULL COMMENT '负责人姓名',
`manager_mobile` VARCHAR(20) DEFAULT NULL COMMENT '负责人联系电话',
`status` TINYINT(1) DEFAULT 1 COMMENT '状态1-启用0-禁用',
`remark` TEXT COMMENT '备注',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
`created_by` INT(11) DEFAULT NULL COMMENT '创建人ID',
`updated_by` INT(11) DEFAULT NULL COMMENT '更新人ID',
`is_delete` TINYINT(1) DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_warehouse_code` (`warehouse_code`),
KEY `idx_status` (`status`),
KEY `idx_is_delete` (`is_delete`),
KEY `idx_warehouse_name` (`warehouse_name`),
KEY `idx_create_time` (`create_time`),
KEY `idx_status_is_delete` (`status`, `is_delete`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='中转仓表';
-- ============================================
-- 2. 进仓表warehouse_in
-- ============================================
CREATE TABLE IF NOT EXISTS `warehouse_in` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`in_number` VARCHAR(50) NOT NULL COMMENT '进仓单号',
`warehouse_id` INT(11) NOT NULL COMMENT '中转仓ID',
`order_id` VARCHAR(100) DEFAULT NULL COMMENT '订单ID多个订单用逗号分隔',
`delivery_id` INT(11) DEFAULT NULL COMMENT '运送清单ID',
`source_location` VARCHAR(255) DEFAULT NULL COMMENT '来源地',
`source_lon` VARCHAR(50) DEFAULT NULL COMMENT '来源地经度',
`source_lat` VARCHAR(50) DEFAULT NULL COMMENT '来源地纬度',
`cattle_count` INT(11) NOT NULL COMMENT '牛只数量',
`weight` DECIMAL(10,2) DEFAULT NULL COMMENT '重量(公斤)',
`in_time` DATETIME NOT NULL COMMENT '进仓时间',
`photos` TEXT COMMENT '照片URL多个用逗号分隔',
`videos` TEXT COMMENT '视频URL多个用逗号分隔',
`remark` TEXT COMMENT '备注',
`status` TINYINT(1) DEFAULT 1 COMMENT '状态1-待进仓2-已进仓3-已出仓',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
`created_by` INT(11) DEFAULT NULL COMMENT '创建人ID',
`updated_by` INT(11) DEFAULT NULL COMMENT '更新人ID',
`is_delete` TINYINT(1) DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_in_number` (`in_number`),
KEY `idx_warehouse_id` (`warehouse_id`),
KEY `idx_delivery_id` (`delivery_id`),
KEY `idx_in_time` (`in_time`),
KEY `idx_is_delete` (`is_delete`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`),
KEY `idx_warehouse_id_status` (`warehouse_id`, `status`),
KEY `idx_is_delete_create_time` (`is_delete`, `create_time`),
CONSTRAINT `fk_warehouse_in_warehouse` FOREIGN KEY (`warehouse_id`) REFERENCES `warehouse` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='进仓表';
-- ============================================
-- 3. 出仓表warehouse_out
-- ============================================
CREATE TABLE IF NOT EXISTS `warehouse_out` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`out_number` VARCHAR(50) NOT NULL COMMENT '出仓单号',
`warehouse_id` INT(11) NOT NULL COMMENT '中转仓ID',
`warehouse_in_id` INT(11) DEFAULT NULL COMMENT '进仓记录ID可选',
`order_id` VARCHAR(100) DEFAULT NULL COMMENT '订单ID多个订单用逗号分隔',
`delivery_id` INT(11) DEFAULT NULL COMMENT '运送清单ID',
`destination_location` VARCHAR(255) DEFAULT NULL COMMENT '目的地',
`destination_lon` VARCHAR(50) DEFAULT NULL COMMENT '目的地经度',
`destination_lat` VARCHAR(50) DEFAULT NULL COMMENT '目的地纬度',
`cattle_count` INT(11) NOT NULL COMMENT '牛只数量',
`weight` DECIMAL(10,2) DEFAULT NULL COMMENT '重量(公斤)',
`out_time` DATETIME NOT NULL COMMENT '出仓时间',
`photos` TEXT COMMENT '照片URL多个用逗号分隔',
`videos` TEXT COMMENT '视频URL多个用逗号分隔',
`remark` TEXT COMMENT '备注',
`status` TINYINT(1) DEFAULT 1 COMMENT '状态1-待出仓2-已出仓',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
`created_by` INT(11) DEFAULT NULL COMMENT '创建人ID',
`updated_by` INT(11) DEFAULT NULL COMMENT '更新人ID',
`is_delete` TINYINT(1) DEFAULT 0 COMMENT '逻辑删除0-未删除1-已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_out_number` (`out_number`),
KEY `idx_warehouse_id` (`warehouse_id`),
KEY `idx_warehouse_in_id` (`warehouse_in_id`),
KEY `idx_delivery_id` (`delivery_id`),
KEY `idx_out_time` (`out_time`),
KEY `idx_is_delete` (`is_delete`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`),
KEY `idx_warehouse_id_status` (`warehouse_id`, `status`),
KEY `idx_is_delete_create_time` (`is_delete`, `create_time`),
CONSTRAINT `fk_warehouse_out_warehouse` FOREIGN KEY (`warehouse_id`) REFERENCES `warehouse` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `fk_warehouse_out_warehouse_in` FOREIGN KEY (`warehouse_in_id`) REFERENCES `warehouse_in` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出仓表';

View File

@@ -0,0 +1,105 @@
USE cattletrade;
-- 诊断和修复脚本:检查问题并强制修复
-- ============================================
-- ============================================
-- 步骤1诊断当前状态
-- ============================================
SELECT
'=== 当前状态 ===' as info,
id,
name,
page_url,
CHAR_LENGTH(page_url) as page_url_len,
HEX(page_url) as page_url_hex,
authority,
CHAR_LENGTH(authority) as authority_len,
HEX(authority) as authority_hex
FROM sys_menu
WHERE id IN (88, 93);
-- ============================================
-- 步骤2检查是否有触发器
-- ============================================
SHOW TRIGGERS FROM cattletrade LIKE 'sys_menu';
-- ============================================
-- 步骤3检查字段定义和约束
-- ============================================
SHOW COLUMNS FROM sys_menu WHERE Field IN ('page_url', 'authority');
-- ============================================
-- 步骤4尝试强制更新使用不同的方法
-- ============================================
-- 方法1直接UPDATE不检查任何条件
UPDATE sys_menu
SET page_url = 'warehouse/warehouseIn'
WHERE id = 88;
-- 检查是否成功
SELECT
'=== 更新 id=88 后 ===' as info,
id,
name,
page_url,
CHAR_LENGTH(page_url) as page_url_len
FROM sys_menu
WHERE id = 88;
-- 方法2更新 id=93
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list'
WHERE id = 93;
-- 检查是否成功
SELECT
'=== 更新 id=93 后 ===' as info,
id,
name,
page_url,
CHAR_LENGTH(page_url) as page_url_len,
authority,
CHAR_LENGTH(authority) as authority_len
FROM sys_menu
WHERE id = 93;
-- ============================================
-- 步骤5如果上述方法失败尝试使用 REPLACE
-- ============================================
-- 注意REPLACE 会删除并重新插入,需要所有字段值
-- 先查询完整记录
SELECT * FROM sys_menu WHERE id = 88;
SELECT * FROM sys_menu WHERE id = 93;
-- 如果 UPDATE 失败,可以使用以下方法(需要根据实际字段值调整):
-- REPLACE INTO sys_menu (id, parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
-- SELECT id, parent_id, type, icon, name, sort, route_url, 'warehouse/warehouseIn', org_type, authority, create_time, NOW(), is_delete
-- FROM sys_menu WHERE id = 88;
-- ============================================
-- 步骤6最终验证
-- ============================================
SELECT
'=== 最终验证 ===' as info,
id,
name,
page_url,
CHAR_LENGTH(page_url) as page_url_len,
CASE
WHEN page_url = 'warehouse/warehouseIn' THEN '✓ 正确'
ELSE '✗ 错误'
END as page_url_status,
authority,
CHAR_LENGTH(authority) as authority_len,
CASE
WHEN authority = 'warehouseout:list' THEN '✓ 正确'
ELSE '✗ 错误'
END as authority_status
FROM sys_menu
WHERE id IN (88, 93);

View File

@@ -0,0 +1,197 @@
USE cattletrade;
-- 一键修复:确保销售概览菜单在侧边栏显示
-- 该脚本会:
-- 1. 检查菜单是否存在,不存在则插入
-- 2. 为超级管理员角色role_id=1分配菜单权限
-- 3. 将菜单的org_type设置为3海关企业共用确保所有用户都能看到
-- ========== 步骤1确保菜单已插入 ==========
-- 如果菜单不存在,则插入
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
0 AS parent_id,
1 AS type,
'el-icon-data-line' AS icon,
'销售概览' AS name,
50 AS sort,
NULL AS route_url,
'/salesOverview/list' AS page_url,
3 AS org_type, -- 设置为3海关企业共用确保所有用户都能看到
'salesoverview:list' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0
);
-- 获取销售概览菜单ID
SET @salesoverview_menu_id = (SELECT id FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0 LIMIT 1);
-- 更新菜单的org_type为3如果已存在
UPDATE sys_menu
SET org_type = 3, update_time = NOW()
WHERE id = @salesoverview_menu_id AND org_type != 3;
-- ========== 步骤2确保按钮权限已插入 ==========
-- 插入新增按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
@salesoverview_menu_id AS parent_id,
2 AS type,
NULL AS icon,
'新增' AS name,
2 AS sort,
NULL AS route_url,
NULL AS page_url,
3 AS org_type,
'salesoverview:add' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu
WHERE parent_id = @salesoverview_menu_id AND name = '新增' AND type = 2 AND is_delete = 0
)
AND @salesoverview_menu_id IS NOT NULL;
-- 插入编辑按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
@salesoverview_menu_id AS parent_id,
2 AS type,
NULL AS icon,
'编辑' AS name,
3 AS sort,
NULL AS route_url,
NULL AS page_url,
3 AS org_type,
'salesoverview:edit' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu
WHERE parent_id = @salesoverview_menu_id AND name = '编辑' AND type = 2 AND is_delete = 0
)
AND @salesoverview_menu_id IS NOT NULL;
-- 插入删除按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
@salesoverview_menu_id AS parent_id,
2 AS type,
NULL AS icon,
'删除' AS name,
4 AS sort,
NULL AS route_url,
NULL AS page_url,
3 AS org_type,
'salesoverview:delete' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu
WHERE parent_id = @salesoverview_menu_id AND name = '删除' AND type = 2 AND is_delete = 0
)
AND @salesoverview_menu_id IS NOT NULL;
-- 插入计算统计数据按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
@salesoverview_menu_id AS parent_id,
2 AS type,
NULL AS icon,
'计算统计数据' AS name,
5 AS sort,
NULL AS route_url,
NULL AS page_url,
3 AS org_type,
'salesoverview:calculate' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu
WHERE parent_id = @salesoverview_menu_id AND name = '计算统计数据' AND type = 2 AND is_delete = 0
)
AND @salesoverview_menu_id IS NOT NULL;
-- ========== 步骤3为超级管理员角色分配权限 ==========
-- 查询所有销售概览相关的菜单ID
SET @menu_main = @salesoverview_menu_id;
SET @menu_add = (SELECT id FROM sys_menu WHERE parent_id = @salesoverview_menu_id AND name = '新增' AND type = 2 AND is_delete = 0 LIMIT 1);
SET @menu_edit = (SELECT id FROM sys_menu WHERE parent_id = @salesoverview_menu_id AND name = '编辑' AND type = 2 AND is_delete = 0 LIMIT 1);
SET @menu_delete = (SELECT id FROM sys_menu WHERE parent_id = @salesoverview_menu_id AND name = '删除' AND type = 2 AND is_delete = 0 LIMIT 1);
SET @menu_calculate = (SELECT id FROM sys_menu WHERE parent_id = @salesoverview_menu_id AND name = '计算统计数据' AND type = 2 AND is_delete = 0 LIMIT 1);
-- 为角色ID=1超级管理员分配主菜单权限
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @menu_main
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = @menu_main)
AND @menu_main IS NOT NULL;
-- 为角色ID=1分配新增权限
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @menu_add
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = @menu_add)
AND @menu_add IS NOT NULL;
-- 为角色ID=1分配编辑权限
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @menu_edit
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = @menu_edit)
AND @menu_edit IS NOT NULL;
-- 为角色ID=1分配删除权限
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @menu_delete
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = @menu_delete)
AND @menu_delete IS NOT NULL;
-- 为角色ID=1分配计算权限
INSERT INTO sys_role_menu (role_id, menu_id)
SELECT 1, @menu_calculate
WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = @menu_calculate)
AND @menu_calculate IS NOT NULL;
-- ========== 步骤4验证结果 ==========
-- 显示菜单信息
SELECT
'菜单信息' AS info_type,
id,
name,
type,
parent_id,
page_url,
org_type,
authority
FROM sys_menu
WHERE name = '销售概览' OR parent_id = @salesoverview_menu_id
ORDER BY type, sort;
-- 显示权限分配情况
SELECT
'权限分配' AS info_type,
rm.role_id,
r.name AS role_name,
rm.menu_id,
m.name AS menu_name,
m.type AS menu_type
FROM sys_role_menu rm
INNER JOIN sys_role r ON rm.role_id = r.id
INNER JOIN sys_menu m ON rm.menu_id = m.id
WHERE m.name = '销售概览' OR m.parent_id = @salesoverview_menu_id
ORDER BY rm.role_id, m.type, m.sort;
-- 提示信息
SELECT
'提示' AS info_type,
CONCAT('销售概览菜单ID: ', @salesoverview_menu_id) AS message
UNION ALL
SELECT
'提示' AS info_type,
'请重新登录系统以刷新菜单' AS message;

View File

@@ -0,0 +1,31 @@
USE cattletrade;
-- 修复 salesoverview 表的 id 字段,设置为 AUTO_INCREMENT
-- 如果表不存在,先创建表;如果表存在但 id 字段不是自增,则修改字段
-- 检查表是否存在
-- 如果表不存在,创建表
CREATE TABLE IF NOT EXISTS `salesoverview` (
`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`toal_procurement_amount` DECIMAL(18,2) DEFAULT 0.00 COMMENT '采购总额(元)',
`toal_sales_amount` DECIMAL(18,2) DEFAULT 0.00 COMMENT '销售总额(元)',
`profits` DECIMAL(18,2) DEFAULT 0.00 COMMENT '利润(元)',
`accounts_receivable` DECIMAL(18,2) DEFAULT 0.00 COMMENT '应收货款(元)',
`uncollected_payment` DECIMAL(18,2) DEFAULT 0.00 COMMENT '未收货款(元)',
`actual_payment` DECIMAL(18,2) DEFAULT 0.00 COMMENT '实收货款(元)',
`total_purchase` INT(11) DEFAULT 0 COMMENT '采购数量(头)',
`total_order` INT(11) DEFAULT 0 COMMENT '采购单数(车)',
`total_sales` INT(11) DEFAULT 0 COMMENT '销售单数(单)',
`create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
`up_time` DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='销售概览表';
-- 如果表已存在,修改 id 字段为 AUTO_INCREMENT
-- 注意:如果表中已有数据,需要先备份
ALTER TABLE `salesoverview`
MODIFY COLUMN `id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID';
-- 验证表结构
SHOW CREATE TABLE `salesoverview`;

View File

@@ -0,0 +1,118 @@
USE cattletrade;
-- 完整修复中转仓管理菜单数据
-- 1. 检查并扩展字段长度(如果需要)
-- 2. 修复被截断的字段值
-- 3. 删除重复的菜单数据
-- ============================================
-- 步骤0检查并扩展字段长度如果需要
-- ============================================
-- 如果 page_url 或 authority 字段长度不足,先扩展字段长度
-- 注意:执行前请先检查当前字段长度,如果已经足够则不需要执行
-- 扩展 page_url 字段长度(如果需要)
-- ALTER TABLE sys_menu MODIFY COLUMN page_url VARCHAR(255) COMMENT '前端路由地址';
-- 扩展 authority 字段长度(如果需要)
-- ALTER TABLE sys_menu MODIFY COLUMN authority VARCHAR(100) COMMENT '权限字符串';
-- ============================================
-- 步骤1删除重复的菜单数据
-- ============================================
-- 删除 id=98 的子菜单的按钮权限(如果存在)
DELETE FROM sys_menu
WHERE parent_id IN (99, 104, 109)
AND type = 2
AND is_delete = 0;
-- 删除 id=98 的子菜单(二级菜单)
DELETE FROM sys_menu
WHERE id IN (99, 104, 109)
AND parent_id = 98
AND type = 1
AND is_delete = 0;
-- 删除 id=98 的父菜单(如果存在)
DELETE FROM sys_menu
WHERE id = 98
AND name = '中转仓管理'
AND parent_id = 0
AND (type = 0 OR type IS NULL)
AND is_delete = 0;
-- ============================================
-- 步骤2修复被截断的字段值直接通过ID修复
-- ============================================
-- 修复进仓管理菜单id=88的 page_url
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE id = 88
AND is_delete = 0;
-- 修复出仓管理菜单id=93的 page_url 和 authority
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list',
update_time = NOW()
WHERE id = 93
AND is_delete = 0;
-- ============================================
-- 步骤3确保所有字段值正确通过名称修复作为后备
-- ============================================
-- 修复进仓管理菜单的 page_url通过名称匹配
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE name = '进仓管理'
AND type = 1
AND parent_id = 82
AND page_url != 'warehouse/warehouseIn'
AND is_delete = 0;
-- 修复出仓管理菜单的 page_url 和 authority通过名称匹配
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list',
update_time = NOW()
WHERE name = '出仓管理'
AND type = 1
AND parent_id = 82
AND (page_url != 'warehouse/warehouseOut' OR authority != 'warehouseout:list')
AND is_delete = 0;
-- ============================================
-- 步骤4确保父菜单的 type 字段正确
-- ============================================
UPDATE sys_menu
SET
type = 0,
update_time = NOW()
WHERE id = 82
AND (type IS NULL OR type != 0)
AND is_delete = 0;
-- ============================================
-- 步骤5验证修复结果
-- ============================================
-- 执行以下查询验证数据是否正确:
-- SELECT id, parent_id, type, name, route_url, page_url, authority, LENGTH(page_url) as page_url_len, LENGTH(authority) as authority_len
-- FROM sys_menu
-- WHERE (id = 82 OR parent_id = 82)
-- AND is_delete = 0
-- ORDER BY id, sort;
--
-- 预期结果:
-- id=82: type = 0, page_url = NULL, authority = NULL
-- id=83: route_url = 'list', page_url = 'warehouse/warehouse', authority = 'warehouse:list'
-- id=88: route_url = 'in', page_url = 'warehouse/warehouseIn', authority = 'warehousein:list'
-- id=93: route_url = 'out', page_url = 'warehouse/warehouseOut', authority = 'warehouseout:list'

View File

@@ -0,0 +1,83 @@
USE cattletrade;
-- 修复中转仓管理菜单的组件路径
-- 该脚本用于修复已存在的菜单记录,确保组件路径正确
-- ============================================
-- 1. 修复中转仓管理菜单list
-- ============================================
UPDATE sys_menu
SET
route_url = 'list',
page_url = 'warehouse/warehouse',
update_time = NOW()
WHERE name = '中转仓管理'
AND parent_id IN (SELECT id FROM (SELECT id FROM sys_menu WHERE name = '中转仓管理' AND type = 0 AND is_delete = 0) AS temp)
AND type = 1
AND is_delete = 0
AND page_url != 'warehouse/warehouse';
-- ============================================
-- 2. 修复进仓管理菜单in
-- ============================================
UPDATE sys_menu
SET
route_url = 'in',
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE name = '进仓管理'
AND parent_id IN (SELECT id FROM (SELECT id FROM sys_menu WHERE name = '中转仓管理' AND type = 0 AND is_delete = 0) AS temp)
AND type = 1
AND is_delete = 0
AND page_url != 'warehouse/warehouseIn';
-- ============================================
-- 3. 修复出仓管理菜单out
-- ============================================
UPDATE sys_menu
SET
route_url = 'out',
page_url = 'warehouse/warehouseOut',
update_time = NOW()
WHERE name = '出仓管理'
AND parent_id IN (SELECT id FROM (SELECT id FROM sys_menu WHERE name = '中转仓管理' AND type = 0 AND is_delete = 0) AS temp)
AND type = 1
AND is_delete = 0
AND page_url != 'warehouse/warehouseOut';
-- ============================================
-- 4. 修复运输管理菜单中的shippingList如果存在
-- ============================================
-- 注意:如果数据库中存在 shipping/shippinglist 的菜单,需要手动修复
-- 实际文件是 shipping/shippingList.vue注意大小写
-- 修复所有可能的变体shipping/shippinglist, shipping/ShippingList, shipping/SHIPPINGLIST 等
-- 使用 LOWER() 函数进行大小写不敏感匹配
UPDATE sys_menu
SET
page_url = 'shipping/shippingList',
update_time = NOW()
WHERE LOWER(page_url) = 'shipping/shippinglist'
AND page_url != 'shipping/shippingList'
AND is_delete = 0;
-- 修复其他可能的变体(包含路径的情况,包括带前导斜杠的情况)
UPDATE sys_menu
SET
page_url = 'shipping/shippingList',
update_time = NOW()
WHERE (LOWER(page_url) LIKE '%shipping/shippinglist%'
OR LOWER(page_url) LIKE '%/shipping/shippinglist%'
OR page_url LIKE '%shipping/ShippingList%'
OR page_url LIKE '%shipping/SHIPPINGLIST%')
AND page_url != 'shipping/shippingList'
AND page_url != '/shipping/shippingList'
AND is_delete = 0;
-- 修复带前导斜杠的情况(如 /shipping/shippinglist -> shipping/shippingList
UPDATE sys_menu
SET
page_url = 'shipping/shippingList',
update_time = NOW()
WHERE LOWER(page_url) = '/shipping/shippinglist'
AND is_delete = 0;

View File

@@ -0,0 +1,96 @@
USE cattletrade;
-- 修复中转仓管理菜单数据
-- 1. 删除重复的菜单数据(保留较早创建的,删除较晚创建的)
-- 2. 修复被截断的字段值
-- ============================================
-- 步骤1删除重复的菜单数据
-- 保留 id=82 的父菜单及其子菜单,删除 id=98 的父菜单及其子菜单
-- ============================================
-- 删除 id=98 的子菜单的按钮权限(如果存在)
-- 先删除所有以 id=99, 104, 109 为父菜单的按钮权限
DELETE FROM sys_menu
WHERE parent_id IN (99, 104, 109)
AND type = 2
AND is_delete = 0;
-- 删除 id=98 的子菜单(二级菜单)
DELETE FROM sys_menu
WHERE id IN (99, 104, 109)
AND parent_id = 98
AND type = 1
AND is_delete = 0;
-- 删除 id=98 的父菜单(如果存在)
DELETE FROM sys_menu
WHERE id = 98
AND name = '中转仓管理'
AND parent_id = 0
AND (type = 0 OR type IS NULL)
AND is_delete = 0;
-- ============================================
-- 步骤2修复被截断的字段值
-- ============================================
-- 修复进仓管理菜单的 page_url修复所有被截断的情况
-- 包括warehouse/warehouselr, warehouse/warehouselr* 等
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE name = '进仓管理'
AND type = 1
AND parent_id = 82
AND (page_url LIKE 'warehouse/warehouselr%'
OR page_url = 'warehouse/warehouselr'
OR page_url LIKE 'warehouse/warehouseIn%' AND page_url != 'warehouse/warehouseIn'
OR page_url IS NULL
OR LENGTH(page_url) < 20) -- 如果长度小于20可能是被截断了
AND is_delete = 0;
-- 修复出仓管理菜单的 page_url 和 authority修复所有被截断的情况
-- 包括warehouse/warehouseO, warehouse/warehouseO* 等
-- 以及warehouseout:li, warehouseout:li* 等
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list',
update_time = NOW()
WHERE name = '出仓管理'
AND type = 1
AND parent_id = 82
AND (page_url LIKE 'warehouse/warehouseO%' AND page_url != 'warehouse/warehouseOut'
OR page_url = 'warehouse/warehouseO'
OR page_url LIKE 'warehouse/warehouseOut%' AND page_url != 'warehouse/warehouseOut'
OR page_url IS NULL
OR LENGTH(page_url) < 20 -- 如果长度小于20可能是被截断了
OR authority LIKE 'warehouseout:li%' AND authority != 'warehouseout:list'
OR authority = 'warehouseout:li'
OR authority IS NULL
OR LENGTH(authority) < 15) -- 如果长度小于15可能是被截断了
AND is_delete = 0;
-- ============================================
-- 步骤3确保父菜单的 type 字段正确(应该是 0
-- ============================================
UPDATE sys_menu
SET
type = 0,
update_time = NOW()
WHERE id = 82
AND (type IS NULL OR type != 0)
AND is_delete = 0;
-- ============================================
-- 步骤4验证修复结果
-- ============================================
-- 执行以下查询验证数据是否正确:
-- SELECT id, parent_id, type, name, route_url, page_url, authority
-- FROM sys_menu
-- WHERE (id = 82 OR parent_id = 82)
-- AND is_delete = 0
-- ORDER BY id, sort;

View File

@@ -0,0 +1,82 @@
USE cattletrade;
-- 直接修复脚本:强制更新被截断的字段值
-- 使用最直接的方式,确保更新成功
-- ============================================
-- 步骤1先查看当前值用于确认
-- ============================================
-- SELECT id, name, page_url, authority FROM sys_menu WHERE id IN (88, 93) AND is_delete = 0;
-- ============================================
-- 步骤2修复进仓管理菜单id=88
-- ============================================
-- 当前错误值warehouse/warehouselr
-- 目标正确值warehouse/warehouseIn
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE id = 88;
-- 验证更新是否成功
SELECT
id,
name,
page_url,
CHAR_LENGTH(page_url) as page_url_len,
'warehouse/warehouseIn' as expected,
CHAR_LENGTH('warehouse/warehouseIn') as expected_len
FROM sys_menu
WHERE id = 88;
-- ============================================
-- 步骤3修复出仓管理菜单id=93
-- ============================================
-- 当前错误值page_url = warehouse/warehouseO, authority = warehouseout:li
-- 目标正确值page_url = warehouse/warehouseOut, authority = warehouseout:list
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list',
update_time = NOW()
WHERE id = 93;
-- 验证更新是否成功
SELECT
id,
name,
page_url,
CHAR_LENGTH(page_url) as page_url_len,
authority,
CHAR_LENGTH(authority) as authority_len,
'warehouse/warehouseOut' as expected_page_url,
CHAR_LENGTH('warehouse/warehouseOut') as expected_page_url_len,
'warehouseout:list' as expected_authority,
CHAR_LENGTH('warehouseout:list') as expected_authority_len
FROM sys_menu
WHERE id = 93;
-- ============================================
-- 步骤4最终验证执行后运行此查询
-- ============================================
SELECT
id,
parent_id,
type,
name,
route_url,
page_url,
CHAR_LENGTH(page_url) as page_url_len,
authority,
CHAR_LENGTH(authority) as authority_len
FROM sys_menu
WHERE id IN (88, 93)
AND is_delete = 0;
-- 预期结果:
-- id=88: page_url='warehouse/warehouseIn', page_url_len=20
-- id=93: page_url='warehouse/warehouseOut', page_url_len=21, authority='warehouseout:list', authority_len=16

View File

@@ -0,0 +1,122 @@
USE cattletrade;
-- 最终修复中转仓管理菜单数据
-- 根据表结构page_url VARCHAR(100), authority VARCHAR(50)
-- 需要存储的值:
-- warehouse/warehouseIn = 20 字符在100以内足够
-- warehouse/warehouseOut = 21 字符在100以内足够
-- warehouseout:list = 16 字符在50以内足够
--
-- 字段长度足够问题可能是插入时被截断直接UPDATE修复即可
-- ============================================
-- 步骤1删除重复的菜单数据如果存在
-- ============================================
-- 删除 id=98 的子菜单的按钮权限(如果存在)
DELETE FROM sys_menu
WHERE parent_id IN (99, 104, 109)
AND type = 2
AND is_delete = 0;
-- 删除 id=98 的子菜单(二级菜单)
DELETE FROM sys_menu
WHERE id IN (99, 104, 109)
AND parent_id = 98
AND type = 1
AND is_delete = 0;
-- 删除 id=98 的父菜单(如果存在)
DELETE FROM sys_menu
WHERE id = 98
AND name = '中转仓管理'
AND parent_id = 0
AND (type = 0 OR type IS NULL)
AND is_delete = 0;
-- ============================================
-- 步骤2修复被截断的字段值直接通过ID修复最可靠
-- ============================================
-- 修复进仓管理菜单id=88的 page_url
-- 修复warehouse/warehouselr -> warehouse/warehouseIn
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE id = 88
AND is_delete = 0;
-- 修复出仓管理菜单id=93的 page_url 和 authority
-- 修复warehouse/warehouseO -> warehouse/warehouseOut
-- 修复warehouseout:li -> warehouseout:list
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list',
update_time = NOW()
WHERE id = 93
AND is_delete = 0;
-- ============================================
-- 步骤3通过名称匹配修复作为后备方案确保所有记录都被修复
-- ============================================
-- 修复进仓管理菜单的 page_url通过名称匹配
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE name = '进仓管理'
AND type = 1
AND parent_id = 82
AND page_url != 'warehouse/warehouseIn'
AND is_delete = 0;
-- 修复出仓管理菜单的 page_url 和 authority通过名称匹配
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list',
update_time = NOW()
WHERE name = '出仓管理'
AND type = 1
AND parent_id = 82
AND (page_url != 'warehouse/warehouseOut' OR authority != 'warehouseout:list')
AND is_delete = 0;
-- ============================================
-- 步骤4确保父菜单的 type 字段正确(应该是 0
-- ============================================
UPDATE sys_menu
SET
type = 0,
update_time = NOW()
WHERE id = 82
AND (type IS NULL OR type != 0)
AND is_delete = 0;
-- ============================================
-- 步骤5验证修复结果
-- ============================================
-- 执行以下查询验证数据是否正确:
SELECT
id,
parent_id,
type,
name,
route_url,
page_url,
LENGTH(page_url) as page_url_len,
authority,
LENGTH(authority) as authority_len
FROM sys_menu
WHERE (id = 82 OR parent_id = 82)
AND is_delete = 0
ORDER BY id, sort;
-- 预期结果:
-- id=82: type=0, page_url=NULL, authority=NULL
-- id=83: route_url='list', page_url='warehouse/warehouse', authority='warehouse:list'
-- id=88: route_url='in', page_url='warehouse/warehouseIn' (长度=20), authority='warehousein:list'
-- id=93: route_url='out', page_url='warehouse/warehouseOut' (长度=21), authority='warehouseout:list' (长度=16)

View File

@@ -0,0 +1,51 @@
USE cattletrade;
-- 简单直接的修复脚本:修复被截断的字段值
-- 直接通过ID更新确保修复成功
-- ============================================
-- 修复进仓管理菜单id=88的 page_url
-- 当前值warehouse/warehouselr (长度21)
-- 目标值warehouse/warehouseIn (长度20)
-- ============================================
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE id = 88
AND is_delete = 0;
-- ============================================
-- 修复出仓管理菜单id=93的 page_url 和 authority
-- 当前值page_url = warehouse/warehouseO (长度22), authority = warehouseout:li (长度17)
-- 目标值page_url = warehouse/warehouseOut (长度21), authority = warehouseout:list (长度16)
-- ============================================
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list',
update_time = NOW()
WHERE id = 93
AND is_delete = 0;
-- ============================================
-- 验证修复结果(执行后运行此查询)
-- ============================================
SELECT
id,
parent_id,
type,
name,
route_url,
page_url,
LENGTH(page_url) as page_url_len,
authority,
LENGTH(authority) as authority_len
FROM sys_menu
WHERE id IN (88, 93)
AND is_delete = 0;
-- 预期结果:
-- id=88: page_url='warehouse/warehouseIn', page_url_len=20
-- id=93: page_url='warehouse/warehouseOut', page_url_len=21, authority='warehouseout:list', authority_len=16

View File

@@ -0,0 +1,83 @@
USE cattletrade;
-- 修复中转仓管理菜单中被截断的字段值
-- 该脚本专门用于修复字段值被截断的问题
-- ============================================
-- 修复进仓管理菜单id=88的 page_url
-- ============================================
-- 修复warehouse/warehouselr -> warehouse/warehouseIn
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE id = 88
AND name = '进仓管理'
AND type = 1
AND parent_id = 82
AND page_url != 'warehouse/warehouseIn'
AND is_delete = 0;
-- 如果上面的更新没有生效,尝试更宽泛的条件
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseIn',
update_time = NOW()
WHERE name = '进仓管理'
AND type = 1
AND parent_id = 82
AND (page_url LIKE 'warehouse/warehouselr%'
OR page_url = 'warehouse/warehouselr'
OR page_url LIKE 'warehouse/warehouseIn%' AND page_url != 'warehouse/warehouseIn'
OR LENGTH(page_url) < 20)
AND is_delete = 0;
-- ============================================
-- 修复出仓管理菜单id=93的 page_url 和 authority
-- ============================================
-- 修复warehouse/warehouseO -> warehouse/warehouseOut
-- 修复warehouseout:li -> warehouseout:list
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list',
update_time = NOW()
WHERE id = 93
AND name = '出仓管理'
AND type = 1
AND parent_id = 82
AND (page_url != 'warehouse/warehouseOut' OR authority != 'warehouseout:list')
AND is_delete = 0;
-- 如果上面的更新没有生效,尝试更宽泛的条件
UPDATE sys_menu
SET
page_url = 'warehouse/warehouseOut',
authority = 'warehouseout:list',
update_time = NOW()
WHERE name = '出仓管理'
AND type = 1
AND parent_id = 82
AND (page_url LIKE 'warehouse/warehouseO%' AND page_url != 'warehouse/warehouseOut'
OR page_url = 'warehouse/warehouseO'
OR page_url LIKE 'warehouse/warehouseOut%' AND page_url != 'warehouse/warehouseOut'
OR LENGTH(page_url) < 20
OR authority LIKE 'warehouseout:li%' AND authority != 'warehouseout:list'
OR authority = 'warehouseout:li'
OR LENGTH(authority) < 15)
AND is_delete = 0;
-- ============================================
-- 验证修复结果
-- ============================================
-- 执行以下查询验证数据是否正确:
-- SELECT id, parent_id, type, name, route_url, page_url, authority
-- FROM sys_menu
-- WHERE (id = 82 OR parent_id = 82)
-- AND is_delete = 0
-- ORDER BY id, sort;
--
-- 预期结果:
-- id=88: page_url = 'warehouse/warehouseIn'
-- id=93: page_url = 'warehouse/warehouseOut', authority = 'warehouseout:list'

View File

@@ -0,0 +1,94 @@
USE cattletrade;
-- 插入销售概览菜单
-- 菜单类型0-目录1-菜单2-按钮
-- 排序:数字越小越靠前
-- 1. 插入销售概览主菜单type=1菜单
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
VALUES (
0, -- parent_id: 0表示顶级菜单
1, -- type: 1-菜单
'el-icon-data-line', -- icon: 数据统计图标
'销售概览', -- name: 菜单名称
50, -- sort: 排序(可以根据实际情况调整)
NULL, -- route_url: 后端路由地址(菜单不需要)
'/salesOverview/list', -- page_url: 前端路由地址
2, -- org_type: 2-企业端(根据实际情况调整)
'salesoverview:list', -- authority: 权限字符串
NOW(), -- create_time
NOW(), -- update_time
0 -- is_delete: 0-未删除
);
-- 2. 插入销售概览相关按钮权限type=2按钮
-- 使用子查询获取刚插入的菜单ID作为parent_id
-- 2.1 新增权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
(SELECT id FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0 LIMIT 1) AS parent_id,
2 AS type,
NULL AS icon,
'新增' AS name,
2 AS sort,
NULL AS route_url,
NULL AS page_url,
2 AS org_type,
'salesoverview:add' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE EXISTS (SELECT 1 FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0);
-- 2.2 编辑权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
(SELECT id FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0 LIMIT 1) AS parent_id,
2 AS type,
NULL AS icon,
'编辑' AS name,
3 AS sort,
NULL AS route_url,
NULL AS page_url,
2 AS org_type,
'salesoverview:edit' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE EXISTS (SELECT 1 FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0);
-- 2.3 删除权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
(SELECT id FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0 LIMIT 1) AS parent_id,
2 AS type,
NULL AS icon,
'删除' AS name,
4 AS sort,
NULL AS route_url,
NULL AS page_url,
2 AS org_type,
'salesoverview:delete' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE EXISTS (SELECT 1 FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0);
-- 2.4 计算统计数据权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
(SELECT id FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0 LIMIT 1) AS parent_id,
2 AS type,
NULL AS icon,
'计算统计数据' AS name,
5 AS sort,
NULL AS route_url,
NULL AS page_url,
2 AS org_type,
'salesoverview:calculate' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE EXISTS (SELECT 1 FROM sys_menu WHERE name = '销售概览' AND type = 1 AND is_delete = 0);

View File

@@ -0,0 +1,115 @@
USE cattletrade;
-- 插入中转仓管理菜单
-- 菜单类型0-目录1-菜单2-按钮
-- 排序:数字越小越靠前
-- ============================================
-- 1. 插入一级菜单中转仓管理type=0目录
-- ============================================
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
VALUES (
0, -- parent_id: 0表示顶级菜单
0, -- type: 0-目录
'el-icon-office-building', -- icon: 仓库图标
'中转仓管理', -- name: 菜单名称
60, -- sort: 排序(可以根据实际情况调整)
NULL, -- route_url: 后端路由地址(目录不需要)
NULL, -- page_url: 前端路由地址(目录不需要)
2, -- org_type: 2-企业端
NULL, -- authority: 权限字符串(目录不需要)
NOW(), -- create_time
NOW(), -- update_time
0 -- is_delete: 0-未删除
);
-- 获取刚插入的一级菜单ID
SET @warehouse_parent_id = LAST_INSERT_ID();
-- ============================================
-- 2. 插入二级菜单中转仓管理type=1菜单
-- ============================================
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
VALUES (
@warehouse_parent_id, -- parent_id: 一级菜单ID
1, -- type: 1-菜单
'el-icon-office-building', -- icon: 仓库图标
'中转仓管理', -- name: 菜单名称
1, -- sort: 排序
'list', -- route_url: 路由路径(相对于父菜单)
'warehouse/warehouse', -- page_url: 前端组件路径相对于views目录
2, -- org_type: 2-企业端
'warehouse:list', -- authority: 权限字符串
NOW(), -- create_time
NOW(), -- update_time
0 -- is_delete: 0-未删除
);
SET @warehouse_list_menu_id = LAST_INSERT_ID();
-- 中转仓管理按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
VALUES
(@warehouse_list_menu_id, 2, NULL, '新增', 1, NULL, NULL, 2, 'warehouse:add', NOW(), NOW(), 0),
(@warehouse_list_menu_id, 2, NULL, '编辑', 2, NULL, NULL, 2, 'warehouse:edit', NOW(), NOW(), 0),
(@warehouse_list_menu_id, 2, NULL, '删除', 3, NULL, NULL, 2, 'warehouse:delete', NOW(), NOW(), 0),
(@warehouse_list_menu_id, 2, NULL, '查询', 4, NULL, NULL, 2, 'warehouse:query', NOW(), NOW(), 0);
-- ============================================
-- 3. 插入二级菜单进仓管理type=1菜单
-- ============================================
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
VALUES (
@warehouse_parent_id, -- parent_id: 一级菜单ID
1, -- type: 1-菜单
'el-icon-upload', -- icon: 上传图标
'进仓管理', -- name: 菜单名称
2, -- sort: 排序
'in', -- route_url: 路由路径(相对于父菜单)
'warehouse/warehouseIn', -- page_url: 前端组件路径相对于views目录
2, -- org_type: 2-企业端
'warehousein:list', -- authority: 权限字符串
NOW(), -- create_time
NOW(), -- update_time
0 -- is_delete: 0-未删除
);
SET @warehouse_in_menu_id = LAST_INSERT_ID();
-- 进仓管理按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
VALUES
(@warehouse_in_menu_id, 2, NULL, '新增', 1, NULL, NULL, 2, 'warehousein:add', NOW(), NOW(), 0),
(@warehouse_in_menu_id, 2, NULL, '编辑', 2, NULL, NULL, 2, 'warehousein:edit', NOW(), NOW(), 0),
(@warehouse_in_menu_id, 2, NULL, '删除', 3, NULL, NULL, 2, 'warehousein:delete', NOW(), NOW(), 0),
(@warehouse_in_menu_id, 2, NULL, '查询', 4, NULL, NULL, 2, 'warehousein:query', NOW(), NOW(), 0);
-- ============================================
-- 4. 插入二级菜单出仓管理type=1菜单
-- ============================================
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
VALUES (
@warehouse_parent_id, -- parent_id: 一级菜单ID
1, -- type: 1-菜单
'el-icon-download', -- icon: 下载图标
'出仓管理', -- name: 菜单名称
3, -- sort: 排序
'out', -- route_url: 路由路径(相对于父菜单)
'warehouse/warehouseOut', -- page_url: 前端组件路径相对于views目录
2, -- org_type: 2-企业端
'warehouseout:list', -- authority: 权限字符串
NOW(), -- create_time
NOW(), -- update_time
0 -- is_delete: 0-未删除
);
SET @warehouse_out_menu_id = LAST_INSERT_ID();
-- 出仓管理按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
VALUES
(@warehouse_out_menu_id, 2, NULL, '新增', 1, NULL, NULL, 2, 'warehouseout:add', NOW(), NOW(), 0),
(@warehouse_out_menu_id, 2, NULL, '编辑', 2, NULL, NULL, 2, 'warehouseout:edit', NOW(), NOW(), 0),
(@warehouse_out_menu_id, 2, NULL, '删除', 3, NULL, NULL, 2, 'warehouseout:delete', NOW(), NOW(), 0),
(@warehouse_out_menu_id, 2, NULL, '查询', 4, NULL, NULL, 2, 'warehouseout:query', NOW(), NOW(), 0);

View File

@@ -0,0 +1,213 @@
USE cattletrade;
-- 安全插入中转仓管理菜单(可重复执行,不会重复插入)
-- 菜单类型0-目录1-菜单2-按钮
-- 排序:数字越小越靠前
-- ============================================
-- 1. 插入一级菜单中转仓管理type=0目录
-- ============================================
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
0 AS parent_id,
0 AS type,
'el-icon-office-building' AS icon,
'中转仓管理' AS name,
60 AS sort,
NULL AS route_url,
NULL AS page_url,
2 AS org_type,
NULL AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE name = '中转仓管理' AND type = 0 AND is_delete = 0
);
-- 获取一级菜单ID如果已存在则查询否则使用刚插入的ID
SET @warehouse_parent_id = COALESCE(
(SELECT id FROM sys_menu WHERE name = '中转仓管理' AND type = 0 AND is_delete = 0 LIMIT 1),
LAST_INSERT_ID()
);
-- ============================================
-- 2. 插入二级菜单中转仓管理type=1菜单
-- ============================================
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
@warehouse_parent_id AS parent_id,
1 AS type,
'el-icon-office-building' AS icon,
'中转仓管理' AS name,
1 AS sort,
'list' AS route_url,
'warehouse/warehouse' AS page_url,
2 AS org_type,
'warehouse:list' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu
WHERE parent_id = @warehouse_parent_id
AND name = '中转仓管理'
AND type = 1
AND is_delete = 0
)
AND @warehouse_parent_id IS NOT NULL;
SET @warehouse_list_menu_id = COALESCE(
(SELECT id FROM sys_menu WHERE parent_id = @warehouse_parent_id AND name = '中转仓管理' AND type = 1 AND is_delete = 0 LIMIT 1),
LAST_INSERT_ID()
);
-- 中转仓管理按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_list_menu_id, 2, NULL, '新增', 1, NULL, NULL, 2, 'warehouse:add', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_list_menu_id AND name = '新增' AND type = 2 AND authority = 'warehouse:add' AND is_delete = 0
)
AND @warehouse_list_menu_id IS NOT NULL;
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_list_menu_id, 2, NULL, '编辑', 2, NULL, NULL, 2, 'warehouse:edit', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_list_menu_id AND name = '编辑' AND type = 2 AND authority = 'warehouse:edit' AND is_delete = 0
)
AND @warehouse_list_menu_id IS NOT NULL;
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_list_menu_id, 2, NULL, '删除', 3, NULL, NULL, 2, 'warehouse:delete', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_list_menu_id AND name = '删除' AND type = 2 AND authority = 'warehouse:delete' AND is_delete = 0
)
AND @warehouse_list_menu_id IS NOT NULL;
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_list_menu_id, 2, NULL, '查询', 4, NULL, NULL, 2, 'warehouse:query', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_list_menu_id AND name = '查询' AND type = 2 AND authority = 'warehouse:query' AND is_delete = 0
)
AND @warehouse_list_menu_id IS NOT NULL;
-- ============================================
-- 3. 插入二级菜单进仓管理type=1菜单
-- ============================================
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
@warehouse_parent_id AS parent_id,
1 AS type,
'el-icon-upload' AS icon,
'进仓管理' AS name,
2 AS sort,
'in' AS route_url,
'warehouse/warehouseIn' AS page_url,
2 AS org_type,
'warehousein:list' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu
WHERE parent_id = @warehouse_parent_id
AND name = '进仓管理'
AND type = 1
AND is_delete = 0
)
AND @warehouse_parent_id IS NOT NULL;
SET @warehouse_in_menu_id = COALESCE(
(SELECT id FROM sys_menu WHERE parent_id = @warehouse_parent_id AND name = '进仓管理' AND type = 1 AND is_delete = 0 LIMIT 1),
LAST_INSERT_ID()
);
-- 进仓管理按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_in_menu_id, 2, NULL, '新增', 1, NULL, NULL, 2, 'warehousein:add', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_in_menu_id AND name = '新增' AND type = 2 AND authority = 'warehousein:add' AND is_delete = 0
)
AND @warehouse_in_menu_id IS NOT NULL;
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_in_menu_id, 2, NULL, '编辑', 2, NULL, NULL, 2, 'warehousein:edit', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_in_menu_id AND name = '编辑' AND type = 2 AND authority = 'warehousein:edit' AND is_delete = 0
)
AND @warehouse_in_menu_id IS NOT NULL;
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_in_menu_id, 2, NULL, '删除', 3, NULL, NULL, 2, 'warehousein:delete', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_in_menu_id AND name = '删除' AND type = 2 AND authority = 'warehousein:delete' AND is_delete = 0
)
AND @warehouse_in_menu_id IS NOT NULL;
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_in_menu_id, 2, NULL, '查询', 4, NULL, NULL, 2, 'warehousein:query', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_in_menu_id AND name = '查询' AND type = 2 AND authority = 'warehousein:query' AND is_delete = 0
)
AND @warehouse_in_menu_id IS NOT NULL;
-- ============================================
-- 4. 插入二级菜单出仓管理type=1菜单
-- ============================================
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT
@warehouse_parent_id AS parent_id,
1 AS type,
'el-icon-download' AS icon,
'出仓管理' AS name,
3 AS sort,
'out' AS route_url,
'warehouse/warehouseOut' AS page_url,
2 AS org_type,
'warehouseout:list' AS authority,
NOW() AS create_time,
NOW() AS update_time,
0 AS is_delete
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu
WHERE parent_id = @warehouse_parent_id
AND name = '出仓管理'
AND type = 1
AND is_delete = 0
)
AND @warehouse_parent_id IS NOT NULL;
SET @warehouse_out_menu_id = COALESCE(
(SELECT id FROM sys_menu WHERE parent_id = @warehouse_parent_id AND name = '出仓管理' AND type = 1 AND is_delete = 0 LIMIT 1),
LAST_INSERT_ID()
);
-- 出仓管理按钮权限
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_out_menu_id, 2, NULL, '新增', 1, NULL, NULL, 2, 'warehouseout:add', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_out_menu_id AND name = '新增' AND type = 2 AND authority = 'warehouseout:add' AND is_delete = 0
)
AND @warehouse_out_menu_id IS NOT NULL;
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_out_menu_id, 2, NULL, '编辑', 2, NULL, NULL, 2, 'warehouseout:edit', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_out_menu_id AND name = '编辑' AND type = 2 AND authority = 'warehouseout:edit' AND is_delete = 0
)
AND @warehouse_out_menu_id IS NOT NULL;
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_out_menu_id, 2, NULL, '删除', 3, NULL, NULL, 2, 'warehouseout:delete', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_out_menu_id AND name = '删除' AND type = 2 AND authority = 'warehouseout:delete' AND is_delete = 0
)
AND @warehouse_out_menu_id IS NOT NULL;
INSERT INTO sys_menu (parent_id, type, icon, name, sort, route_url, page_url, org_type, authority, create_time, update_time, is_delete)
SELECT @warehouse_out_menu_id, 2, NULL, '查询', 4, NULL, NULL, 2, 'warehouseout:query', NOW(), NOW(), 0
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE parent_id = @warehouse_out_menu_id AND name = '查询' AND type = 2 AND authority = 'warehouseout:query' AND is_delete = 0
)
AND @warehouse_out_menu_id IS NOT NULL;

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aiotagro.cattletrade.business.mapper.SalesOverviewMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.aiotagro.cattletrade.business.entity.SalesOverview">
<id column="id" property="id" />
<result column="toal_procurement_amount" property="toalProcurementAmount" />
<result column="toal_sales_amount" property="toalSalesAmount" />
<result column="profits" property="profits" />
<result column="accounts_receivable" property="accountsReceivable" />
<result column="uncollected_payment" property="uncollectedPayment" />
<result column="actual_payment" property="actualPayment" />
<result column="total_purchase" property="totalPurchase" />
<result column="total_order" property="totalOrder" />
<result column="total_sales" property="totalSales" />
<result column="create_time" property="createTime" />
<result column="up_time" property="upTime" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, toal_procurement_amount, toal_sales_amount, profits, accounts_receivable,
uncollected_payment, actual_payment, total_purchase, total_order, total_sales,
create_time, up_time
</sql>
</mapper>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aiotagro.cattletrade.business.mapper.WarehouseInMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.aiotagro.cattletrade.business.entity.WarehouseIn">
<id column="id" property="id" />
<result column="in_number" property="inNumber" />
<result column="warehouse_id" property="warehouseId" />
<result column="order_id" property="orderId" />
<result column="delivery_id" property="deliveryId" />
<result column="source_location" property="sourceLocation" />
<result column="source_lon" property="sourceLon" />
<result column="source_lat" property="sourceLat" />
<result column="cattle_count" property="cattleCount" />
<result column="weight" property="weight" />
<result column="in_time" property="inTime" />
<result column="photos" property="photos" />
<result column="videos" property="videos" />
<result column="remark" property="remark" />
<result column="status" property="status" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
<result column="created_by" property="createdBy" />
<result column="updated_by" property="updatedBy" />
<result column="is_delete" property="isDelete" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, in_number, warehouse_id, order_id, delivery_id, source_location, source_lon, source_lat, cattle_count, weight, in_time, photos, videos, remark, status, create_time, update_time, created_by, updated_by, is_delete
</sql>
</mapper>

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aiotagro.cattletrade.business.mapper.WarehouseMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.aiotagro.cattletrade.business.entity.Warehouse">
<id column="id" property="id" />
<result column="warehouse_name" property="warehouseName" />
<result column="warehouse_code" property="warehouseCode" />
<result column="address" property="address" />
<result column="longitude" property="longitude" />
<result column="latitude" property="latitude" />
<result column="capacity" property="capacity" />
<result column="manager_name" property="managerName" />
<result column="manager_mobile" property="managerMobile" />
<result column="status" property="status" />
<result column="remark" property="remark" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
<result column="created_by" property="createdBy" />
<result column="updated_by" property="updatedBy" />
<result column="is_delete" property="isDelete" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, warehouse_name, warehouse_code, address, longitude, latitude, capacity, manager_name, manager_mobile, status, remark, create_time, update_time, created_by, updated_by, is_delete
</sql>
</mapper>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aiotagro.cattletrade.business.mapper.WarehouseOutMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.aiotagro.cattletrade.business.entity.WarehouseOut">
<id column="id" property="id" />
<result column="out_number" property="outNumber" />
<result column="warehouse_id" property="warehouseId" />
<result column="warehouse_in_id" property="warehouseInId" />
<result column="order_id" property="orderId" />
<result column="delivery_id" property="deliveryId" />
<result column="destination_location" property="destinationLocation" />
<result column="destination_lon" property="destinationLon" />
<result column="destination_lat" property="destinationLat" />
<result column="cattle_count" property="cattleCount" />
<result column="weight" property="weight" />
<result column="out_time" property="outTime" />
<result column="photos" property="photos" />
<result column="videos" property="videos" />
<result column="remark" property="remark" />
<result column="status" property="status" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
<result column="created_by" property="createdBy" />
<result column="updated_by" property="updatedBy" />
<result column="is_delete" property="isDelete" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, out_number, warehouse_id, warehouse_in_id, order_id, delivery_id, destination_location, destination_lon, destination_lat, cattle_count, weight, out_time, photos, videos, remark, status, create_time, update_time, created_by, updated_by, is_delete
</sql>
</mapper>