diff --git a/wms-module-system/src/main/java/top/wms/admin/weighManage/model/req/WorkOrderReq.java b/wms-module-system/src/main/java/top/wms/admin/weighManage/model/req/WorkOrderReq.java index fccc967..5d9b032 100644 --- a/wms-module-system/src/main/java/top/wms/admin/weighManage/model/req/WorkOrderReq.java +++ b/wms-module-system/src/main/java/top/wms/admin/weighManage/model/req/WorkOrderReq.java @@ -44,4 +44,16 @@ public class WorkOrderReq implements Serializable { @NotEmpty(message = "称重列表不能为空") private List workOrderInfos; + + /** + * 手动填写的物料数量 + */ + private String inputQuantity; + + + /** + * 电子秤重量 + */ + private String ahDeviceWeight; + } \ No newline at end of file diff --git a/wms-module-system/src/main/java/top/wms/admin/weighManage/model/resp/WorkOrderResp.java b/wms-module-system/src/main/java/top/wms/admin/weighManage/model/resp/WorkOrderResp.java index e62b7ce..920c336 100644 --- a/wms-module-system/src/main/java/top/wms/admin/weighManage/model/resp/WorkOrderResp.java +++ b/wms-module-system/src/main/java/top/wms/admin/weighManage/model/resp/WorkOrderResp.java @@ -79,9 +79,15 @@ public class WorkOrderResp extends BaseDetailResp { private String photoUrl; /** - * 总重量 + * 计算总重量(标重) */ - @Schema(description = "总重量") + @Schema(description = "计算总重量(标重)") + private BigDecimal totalCalculatedWeight; + + /** + * 实际总重量 + */ + @Schema(description = "实际总重量") private BigDecimal totalWeight; /** diff --git a/wms-module-system/src/main/java/top/wms/admin/weighManage/service/WorkOrderService.java b/wms-module-system/src/main/java/top/wms/admin/weighManage/service/WorkOrderService.java index edb0994..3360bd8 100644 --- a/wms-module-system/src/main/java/top/wms/admin/weighManage/service/WorkOrderService.java +++ b/wms-module-system/src/main/java/top/wms/admin/weighManage/service/WorkOrderService.java @@ -22,7 +22,7 @@ public interface WorkOrderService extends BaseService getDetail(Long id); + WorkOrderResp getDetail(Long id); /** * 创建任务工单 @@ -31,4 +31,19 @@ public interface WorkOrderService extends BaseService getWorkOrderInfos(Long id); + + /** + * 校验物料数量和重量是否匹配 + * @param req + * @return + */ + int validateWeighing(WorkOrderReq req); } \ No newline at end of file diff --git a/wms-module-system/src/main/java/top/wms/admin/weighManage/service/impl/WorkOrderServiceImpl.java b/wms-module-system/src/main/java/top/wms/admin/weighManage/service/impl/WorkOrderServiceImpl.java index 6f07f1c..06ffb08 100644 --- a/wms-module-system/src/main/java/top/wms/admin/weighManage/service/impl/WorkOrderServiceImpl.java +++ b/wms-module-system/src/main/java/top/wms/admin/weighManage/service/impl/WorkOrderServiceImpl.java @@ -10,13 +10,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; - +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; - import top.continew.starter.extension.crud.model.query.PageQuery; import top.continew.starter.extension.crud.model.resp.PageResp; import top.continew.starter.extension.crud.service.BaseServiceImpl; 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.WorkOrderMapper; import top.wms.admin.weighManage.model.entity.WorkOrderDO; @@ -39,18 +41,22 @@ import java.util.List; * @since 2026/03/03 17:09 */ @Service +@Slf4j @RequiredArgsConstructor public class WorkOrderServiceImpl extends BaseServiceImpl implements WorkOrderService { private final WorkOrderInfoMapper workOrderInfoMapper; +private final MaterialInfoMapper materialInfoMapper; + +private final ConfigService configService; + @Override public PageResp page(WorkOrderQuery query, PageQuery pageQuery) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like(StrUtil.isNotBlank(query.getMaterialName()), "m.material_name", query.getMaterialName()); queryWrapper.eq(null != query.getOrderNo(), "w.order_no", query.getOrderNo()); - queryWrapper.groupBy("w.id"); this.sort(queryWrapper, pageQuery); IPage page = baseMapper.selectWorkOrderPage(new Page<>(pageQuery.getPage(), pageQuery @@ -60,7 +66,29 @@ private final WorkOrderInfoMapper workOrderInfoMapper; } @Override - public List 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 workOrderInfos = workOrderInfoMapper.selectList(new QueryWrapper().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 getWorkOrderInfos(Long id) { return baseMapper.getDetail(id); } @@ -84,9 +112,11 @@ private final WorkOrderInfoMapper workOrderInfoMapper; totalCount += workOrderInfoReq.getQuantity(); } - 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) + "-" + UserContextHolder.getUsername() + "-" + req.getMaterialName(); workOrder.setTitle(title); @@ -100,8 +130,40 @@ private final WorkOrderInfoMapper workOrderInfoMapper; workOrderInfoDOList.forEach(workOrderInfoDO -> workOrderInfoDO.setWorkOrderId(workOrder.getId())); workOrderInfoMapper.insertBatch(workOrderInfoDOList); - 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; // 验证通过 + } + } \ No newline at end of file diff --git a/wms-module-system/src/main/resources/mapper/WorkOrderMapper.xml b/wms-module-system/src/main/resources/mapper/WorkOrderMapper.xml index f3788f2..9dd1ab0 100644 --- a/wms-module-system/src/main/resources/mapper/WorkOrderMapper.xml +++ b/wms-module-system/src/main/resources/mapper/WorkOrderMapper.xml @@ -10,12 +10,10 @@ m.photo_url, m.unit_weight, u.card_no, - u.username createUserString, - count(*) as totalCount + u.username createUserString from sys_work_order w 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_work_order_info wi on w.id = wi.work_order_id ${ew.customSqlSegment} diff --git a/wms-webapi/src/main/java/top/wms/admin/controller/weighManage/WorkOrderController.java b/wms-webapi/src/main/java/top/wms/admin/controller/weighManage/WorkOrderController.java index 85daedd..d2f85bd 100644 --- a/wms-webapi/src/main/java/top/wms/admin/controller/weighManage/WorkOrderController.java +++ b/wms-webapi/src/main/java/top/wms/admin/controller/weighManage/WorkOrderController.java @@ -1,6 +1,7 @@ package top.wms.admin.controller.weighManage; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.StrUtil; import org.springframework.validation.annotation.Validated; import top.continew.starter.extension.crud.enums.Api; @@ -11,6 +12,7 @@ import org.springframework.web.bind.annotation.*; import lombok.RequiredArgsConstructor; import top.continew.starter.extension.crud.annotation.CrudRequestMapping; 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.weighManage.model.query.WorkOrderQuery; import top.wms.admin.weighManage.model.req.WorkOrderReq; @@ -34,11 +36,17 @@ public class WorkOrderController extends BaseController getDetail(@PathVariable("id") Long id) { - return baseService.getDetail(id); + @GetMapping(value = "/info/{id}") + public List getWorkOrderInfos(@PathVariable("id") Long 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") @PostMapping @@ -46,4 +54,23 @@ public class WorkOrderController extends BaseController