代码优化
This commit is contained in:
@@ -44,4 +44,16 @@ public class WorkOrderReq implements Serializable {
|
|||||||
@NotEmpty(message = "称重列表不能为空")
|
@NotEmpty(message = "称重列表不能为空")
|
||||||
private List<WorkOrderInfoReq> workOrderInfos;
|
private List<WorkOrderInfoReq> workOrderInfos;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手动填写的物料数量
|
||||||
|
*/
|
||||||
|
private String inputQuantity;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 电子秤重量
|
||||||
|
*/
|
||||||
|
private String ahDeviceWeight;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -79,9 +79,15 @@ public class WorkOrderResp extends BaseDetailResp {
|
|||||||
private String photoUrl;
|
private String photoUrl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 总重量
|
* 计算总重量(标重)
|
||||||
*/
|
*/
|
||||||
@Schema(description = "总重量")
|
@Schema(description = "计算总重量(标重)")
|
||||||
|
private BigDecimal totalCalculatedWeight;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实际总重量
|
||||||
|
*/
|
||||||
|
@Schema(description = "实际总重量")
|
||||||
private BigDecimal totalWeight;
|
private BigDecimal totalWeight;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public interface WorkOrderService extends BaseService<WorkOrderResp, WorkOrderRe
|
|||||||
* @param id 任务工单主键id
|
* @param id 任务工单主键id
|
||||||
* @return 任务工单详情信息
|
* @return 任务工单详情信息
|
||||||
*/
|
*/
|
||||||
List<WorkOrderInfoResp> getDetail(Long id);
|
WorkOrderResp getDetail(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建任务工单
|
* 创建任务工单
|
||||||
@@ -31,4 +31,19 @@ public interface WorkOrderService extends BaseService<WorkOrderResp, WorkOrderRe
|
|||||||
* @return 任务工单信息
|
* @return 任务工单信息
|
||||||
*/
|
*/
|
||||||
WorkOrderResp addWorKerOrder(WorkOrderReq req);
|
WorkOrderResp addWorKerOrder(WorkOrderReq req);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取任务工单详情信息
|
||||||
|
*
|
||||||
|
* @param id 任务工单主键id
|
||||||
|
* @return 任务工单详情信息
|
||||||
|
*/
|
||||||
|
List<WorkOrderInfoResp> getWorkOrderInfos(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 校验物料数量和重量是否匹配
|
||||||
|
* @param req
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int validateWeighing(WorkOrderReq req);
|
||||||
}
|
}
|
||||||
@@ -10,13 +10,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import top.continew.starter.extension.crud.model.query.PageQuery;
|
import top.continew.starter.extension.crud.model.query.PageQuery;
|
||||||
import top.continew.starter.extension.crud.model.resp.PageResp;
|
import top.continew.starter.extension.crud.model.resp.PageResp;
|
||||||
import top.continew.starter.extension.crud.service.BaseServiceImpl;
|
import top.continew.starter.extension.crud.service.BaseServiceImpl;
|
||||||
import top.wms.admin.common.context.UserContextHolder;
|
import top.wms.admin.common.context.UserContextHolder;
|
||||||
|
import top.wms.admin.material.mapper.MaterialInfoMapper;
|
||||||
|
import top.wms.admin.material.model.entity.MaterialInfoDO;
|
||||||
|
import top.wms.admin.system.service.ConfigService;
|
||||||
import top.wms.admin.weighManage.mapper.WorkOrderInfoMapper;
|
import top.wms.admin.weighManage.mapper.WorkOrderInfoMapper;
|
||||||
import top.wms.admin.weighManage.mapper.WorkOrderMapper;
|
import top.wms.admin.weighManage.mapper.WorkOrderMapper;
|
||||||
import top.wms.admin.weighManage.model.entity.WorkOrderDO;
|
import top.wms.admin.weighManage.model.entity.WorkOrderDO;
|
||||||
@@ -39,18 +41,22 @@ import java.util.List;
|
|||||||
* @since 2026/03/03 17:09
|
* @since 2026/03/03 17:09
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
|
@Slf4j
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkOrderDO, WorkOrderResp, WorkOrderResp, WorkOrderQuery, WorkOrderReq> implements WorkOrderService {
|
public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkOrderDO, WorkOrderResp, WorkOrderResp, WorkOrderQuery, WorkOrderReq> implements WorkOrderService {
|
||||||
|
|
||||||
private final WorkOrderInfoMapper workOrderInfoMapper;
|
private final WorkOrderInfoMapper workOrderInfoMapper;
|
||||||
|
|
||||||
|
private final MaterialInfoMapper materialInfoMapper;
|
||||||
|
|
||||||
|
private final ConfigService configService;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResp<WorkOrderResp> page(WorkOrderQuery query, PageQuery pageQuery) {
|
public PageResp<WorkOrderResp> page(WorkOrderQuery query, PageQuery pageQuery) {
|
||||||
QueryWrapper<WorkOrderDO> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<WorkOrderDO> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.like(StrUtil.isNotBlank(query.getMaterialName()), "m.material_name", query.getMaterialName());
|
queryWrapper.like(StrUtil.isNotBlank(query.getMaterialName()), "m.material_name", query.getMaterialName());
|
||||||
queryWrapper.eq(null != query.getOrderNo(), "w.order_no", query.getOrderNo());
|
queryWrapper.eq(null != query.getOrderNo(), "w.order_no", query.getOrderNo());
|
||||||
queryWrapper.groupBy("w.id");
|
|
||||||
this.sort(queryWrapper, pageQuery);
|
this.sort(queryWrapper, pageQuery);
|
||||||
|
|
||||||
IPage<WorkOrderResp> page = baseMapper.selectWorkOrderPage(new Page<>(pageQuery.getPage(), pageQuery
|
IPage<WorkOrderResp> page = baseMapper.selectWorkOrderPage(new Page<>(pageQuery.getPage(), pageQuery
|
||||||
@@ -60,7 +66,29 @@ private final WorkOrderInfoMapper workOrderInfoMapper;
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<WorkOrderInfoResp> getDetail(Long id) {
|
public WorkOrderResp getDetail(Long id) {
|
||||||
|
WorkOrderDO workOrderDO = baseMapper.selectById(id);
|
||||||
|
WorkOrderResp workOrderResp = BeanUtil.copyProperties(workOrderDO, WorkOrderResp.class);
|
||||||
|
if (null != workOrderDO.getMaterialId()) {
|
||||||
|
MaterialInfoDO materialInfoDO = materialInfoMapper.selectById(workOrderDO.getMaterialId());
|
||||||
|
workOrderResp.setMaterialName(materialInfoDO.getMaterialName());
|
||||||
|
workOrderResp.setEncoding(materialInfoDO.getEncoding());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<WorkOrderInfoDO> workOrderInfos = workOrderInfoMapper.selectList(new QueryWrapper<WorkOrderInfoDO>().eq("work_order_id", id));
|
||||||
|
if (CollUtil.isNotEmpty(workOrderInfos)) {
|
||||||
|
BigDecimal bigDecimal = new BigDecimal("0");
|
||||||
|
for (WorkOrderInfoDO workOrderInfoDO : workOrderInfos) {
|
||||||
|
bigDecimal = bigDecimal.add(workOrderInfoDO.getCalculatedWeight());
|
||||||
|
}
|
||||||
|
workOrderResp.setTotalCalculatedWeight(bigDecimal);
|
||||||
|
}
|
||||||
|
|
||||||
|
return workOrderResp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<WorkOrderInfoResp> getWorkOrderInfos(Long id) {
|
||||||
return baseMapper.getDetail(id);
|
return baseMapper.getDetail(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,9 +112,11 @@ private final WorkOrderInfoMapper workOrderInfoMapper;
|
|||||||
totalCount += workOrderInfoReq.getQuantity();
|
totalCount += workOrderInfoReq.getQuantity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
WorkOrderDO workOrder = new WorkOrderDO();
|
WorkOrderDO workOrder = new WorkOrderDO();
|
||||||
workOrder.setOrderNo(DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN) + System.currentTimeMillis());
|
// 生成纯数字订单号:年月日时分秒 + 6位随机数
|
||||||
|
String timestamp = DateUtil.format(new Date(), "yyyyMMddHHmmss");
|
||||||
|
String randomNum = String.format("%06d", (int)(Math.random() * 1000000));
|
||||||
|
workOrder.setOrderNo(timestamp + randomNum);
|
||||||
String title = DateUtil.format(new Date(), DatePattern.CHINESE_DATE_PATTERN) + "-"
|
String title = DateUtil.format(new Date(), DatePattern.CHINESE_DATE_PATTERN) + "-"
|
||||||
+ UserContextHolder.getUsername() + "-" + req.getMaterialName();
|
+ UserContextHolder.getUsername() + "-" + req.getMaterialName();
|
||||||
workOrder.setTitle(title);
|
workOrder.setTitle(title);
|
||||||
@@ -100,8 +130,40 @@ private final WorkOrderInfoMapper workOrderInfoMapper;
|
|||||||
workOrderInfoDOList.forEach(workOrderInfoDO -> workOrderInfoDO.setWorkOrderId(workOrder.getId()));
|
workOrderInfoDOList.forEach(workOrderInfoDO -> workOrderInfoDO.setWorkOrderId(workOrder.getId()));
|
||||||
workOrderInfoMapper.insertBatch(workOrderInfoDOList);
|
workOrderInfoMapper.insertBatch(workOrderInfoDOList);
|
||||||
|
|
||||||
|
|
||||||
return BeanUtil.copyProperties(workOrder, WorkOrderResp.class);
|
return BeanUtil.copyProperties(workOrder, WorkOrderResp.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int validateWeighing(WorkOrderReq req) {
|
||||||
|
log.info("validateWeighing req:{}", req);
|
||||||
|
String configValue = configService.getConfigValue("weight_float_ratio");
|
||||||
|
BigDecimal weightFloat = new BigDecimal("0.06");
|
||||||
|
if (StrUtil.isNotBlank(configValue)) {
|
||||||
|
weightFloat = new BigDecimal(configValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
//计算标准重量
|
||||||
|
MaterialInfoDO materialInfoDO = materialInfoMapper.selectById(req.getMaterialId());
|
||||||
|
BigDecimal standardWeight = materialInfoDO.getUnitWeight().subtract(new BigDecimal(req.getInputQuantity()));
|
||||||
|
BigDecimal electronicWeight = new BigDecimal(req.getAhDeviceWeight());
|
||||||
|
|
||||||
|
// 检查 electronicWeight 是否大于 standardWeight
|
||||||
|
if (electronicWeight.compareTo(standardWeight) <= 0) {
|
||||||
|
log.error("电子秤重量必须大于标准重量");
|
||||||
|
return 500; // 电子秤重量必须大于标准重量
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算比值:(electronicWeight - standardWeight) / standardWeight
|
||||||
|
BigDecimal weightDifference = electronicWeight.subtract(standardWeight);
|
||||||
|
BigDecimal ratio = weightDifference.divide(standardWeight, 4, BigDecimal.ROUND_HALF_UP);
|
||||||
|
|
||||||
|
// 检查比值是否超过 6%
|
||||||
|
if (ratio.compareTo(weightFloat) > 0) {
|
||||||
|
log.error("比值超过 6%,当前比值: {}", ratio);
|
||||||
|
return 500; // 比值超过 6%
|
||||||
|
}
|
||||||
|
|
||||||
|
return 200; // 验证通过
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -10,12 +10,10 @@
|
|||||||
m.photo_url,
|
m.photo_url,
|
||||||
m.unit_weight,
|
m.unit_weight,
|
||||||
u.card_no,
|
u.card_no,
|
||||||
u.username createUserString,
|
u.username createUserString
|
||||||
count(*) as totalCount
|
|
||||||
from sys_work_order w
|
from sys_work_order w
|
||||||
left join sys_material_info m on w.material_id = m.id
|
left join sys_material_info m on w.material_id = m.id
|
||||||
left join sys_user u on w.create_user = u.id
|
left join sys_user u on w.create_user = u.id
|
||||||
left join sys_work_order_info wi on w.id = wi.work_order_id
|
|
||||||
${ew.customSqlSegment}
|
${ew.customSqlSegment}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package top.wms.admin.controller.weighManage;
|
package top.wms.admin.controller.weighManage;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import top.continew.starter.extension.crud.enums.Api;
|
import top.continew.starter.extension.crud.enums.Api;
|
||||||
|
|
||||||
@@ -11,6 +12,7 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
|
import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
|
||||||
import top.continew.starter.log.annotation.Log;
|
import top.continew.starter.log.annotation.Log;
|
||||||
|
import top.continew.starter.web.model.R;
|
||||||
import top.wms.admin.common.controller.BaseController;
|
import top.wms.admin.common.controller.BaseController;
|
||||||
import top.wms.admin.weighManage.model.query.WorkOrderQuery;
|
import top.wms.admin.weighManage.model.query.WorkOrderQuery;
|
||||||
import top.wms.admin.weighManage.model.req.WorkOrderReq;
|
import top.wms.admin.weighManage.model.req.WorkOrderReq;
|
||||||
@@ -34,11 +36,17 @@ public class WorkOrderController extends BaseController<WorkOrderService, WorkOr
|
|||||||
|
|
||||||
@Log(ignore = true)
|
@Log(ignore = true)
|
||||||
@SaCheckPermission("workOrder:record:detail")
|
@SaCheckPermission("workOrder:record:detail")
|
||||||
@GetMapping(value = "/{id}")
|
@GetMapping(value = "/info/{id}")
|
||||||
public List<WorkOrderInfoResp> getDetail(@PathVariable("id") Long id) {
|
public List<WorkOrderInfoResp> getWorkOrderInfos(@PathVariable("id") Long id) {
|
||||||
return baseService.getDetail(id);
|
return baseService.getWorkOrderInfos(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Log(ignore = true)
|
||||||
|
@SaCheckPermission("workOrder:record:detail")
|
||||||
|
@GetMapping(value = "/{id}")
|
||||||
|
public WorkOrderResp getDetail(@PathVariable("id") Long id) {
|
||||||
|
return baseService.getDetail(id);
|
||||||
|
}
|
||||||
|
|
||||||
@SaCheckPermission("workOrder:record:add")
|
@SaCheckPermission("workOrder:record:add")
|
||||||
@PostMapping
|
@PostMapping
|
||||||
@@ -46,4 +54,23 @@ public class WorkOrderController extends BaseController<WorkOrderService, WorkOr
|
|||||||
return baseService.addWorKerOrder(req);
|
return baseService.addWorKerOrder(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/validateWeighing")
|
||||||
|
public R validateWeighing(@RequestBody WorkOrderReq req) {
|
||||||
|
if (null == req.getMaterialId()) {
|
||||||
|
return R.fail("400", "物料主键id不能为空");
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(req.getInputQuantity())) {
|
||||||
|
return R.fail("400", "输入数量不能为空");
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(req.getAhDeviceWeight())) {
|
||||||
|
return R.fail("400", "电子称重量不能为空");
|
||||||
|
}
|
||||||
|
|
||||||
|
int validateResult = baseService.validateWeighing(req);
|
||||||
|
if (validateResult != 200) {
|
||||||
|
return R.fail("500", "重量不匹配!");
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -48,12 +48,12 @@ spring.data:
|
|||||||
## Redis 配置(单机模式)
|
## Redis 配置(单机模式)
|
||||||
redis:
|
redis:
|
||||||
# 地址
|
# 地址
|
||||||
# host: ${REDIS_HOST:192.168.2.30}
|
host: ${REDIS_HOST:192.168.2.30}
|
||||||
host: ${REDIS_HOST:127.0.0.1}
|
# host: ${REDIS_HOST:127.0.0.1}
|
||||||
# 端口(默认 6379)
|
# 端口(默认 6379)
|
||||||
port: ${REDIS_PORT:6379}
|
port: ${REDIS_PORT:6379}
|
||||||
# 密码(未设置密码时请注释掉)
|
# 密码(未设置密码时请注释掉)
|
||||||
# password: ${REDIS_PWD:redis2025}
|
password: ${REDIS_PWD:redis2025}
|
||||||
# 数据库索引
|
# 数据库索引
|
||||||
database: ${REDIS_DB:1}
|
database: ${REDIS_DB:1}
|
||||||
# 连接超时时间
|
# 连接超时时间
|
||||||
|
|||||||
Reference in New Issue
Block a user