代码优化

This commit is contained in:
zc
2026-03-09 20:33:47 +08:00
parent df9479f870
commit fb05360c5e
7 changed files with 139 additions and 19 deletions

View File

@@ -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;
} }

View File

@@ -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;
/** /**

View File

@@ -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);
} }

View File

@@ -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; // 验证通过
}
} }

View File

@@ -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>

View File

@@ -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();
}
} }

View File

@@ -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}
# 连接超时时间 # 连接超时时间