完成中转仓管理
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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表)
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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("开始计算销售概览统计数据");
|
||||
|
||||
// 查询所有有订单关联的delivery(order_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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算发车牛只重量(斤)
|
||||
* 发车牛只重量 = (装车过磅重量 - 空车过磅重量) × 2(kg转斤)
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算落地牛只重量(斤)
|
||||
* 落地牛只重量 = (落地过磅重量 - 空车过磅重量) × 2(kg转斤)
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 "未知";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 "未知";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ public final class BaiduYingyanConstants {
|
||||
/**
|
||||
* 百度鹰眼控制台申请的 AK
|
||||
*/
|
||||
public static final String AK = "xITbC7jegaAAuu4m9jC2Zx6eFbQJ29Rj";
|
||||
public static final String AK = "3AN3VahoqaXUs32U8luXD2Dwn86KK5B7";
|
||||
|
||||
/**
|
||||
* 百度鹰眼服务 ID
|
||||
|
||||
@@ -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;
|
||||
```
|
||||
|
||||
如果查询结果中有您的角色,说明权限已分配成功。
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 '权限字符串';
|
||||
|
||||
@@ -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='出仓表';
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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`;
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user