diff --git a/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java b/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java index 5382548..5e51e87 100644 --- a/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java +++ b/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java @@ -44,6 +44,7 @@ public class PipelineTaskDTO { private LocalDateTime deadline; // 截止时间 private String releaseType; // 发布类型:default/recruitment/assigned private Long receiverId; // 指定接收人ID(assigned模式使用) + private List productBarcodes; // 商品条码列表(已验证库存) /** * 子任务项DTO diff --git a/backend/src/main/java/com/designhub/entity/Task.java b/backend/src/main/java/com/designhub/entity/Task.java index 089d7c8..3db1c6f 100644 --- a/backend/src/main/java/com/designhub/entity/Task.java +++ b/backend/src/main/java/com/designhub/entity/Task.java @@ -236,6 +236,12 @@ public class Task implements Serializable { */ private Integer productIdFilled; + /** + * 商品条码列表(逗号分隔,已验证库存) + */ + @TableField("product_barcodes") + private String productBarcodes; + /** * 是否紧急:0-否 1-是 */ diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index f076b91..89b294e 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -296,6 +296,11 @@ public class TaskService { task.setRemark(dto.getRemark()); task.setPriority(dto.getPriority() != null ? dto.getPriority() : 1); // 默认优先级:1-普通 + // 设置商品条码列表(如果有) + if (dto.getProductBarcodes() != null && !dto.getProductBarcodes().isEmpty()) { + task.setProductBarcodes(String.join(",", dto.getProductBarcodes())); + } + // 设置时间字段 task.setCreateTime(LocalDateTime.now()); // 如果前端没有传递截止时间,默认为创建时间+7天 diff --git a/frontend/src/views/CreateTask.vue b/frontend/src/views/CreateTask.vue index 26ece8e..b3fed9e 100644 --- a/frontend/src/views/CreateTask.vue +++ b/frontend/src/views/CreateTask.vue @@ -226,45 +226,61 @@ - + +
+
+ 已添加条码 ({{ formData.productBarcodes.length }}个) +
+
+ + {{ barcode }} + +
+
+ + + - 检查库存 + 验证并添加 - +
-
+
商品名称: {{ inventoryCheckResult.name || '-' }}
可用库存: - - {{ inventoryCheckResult.availableQty }} - + {{ inventoryCheckResult.availableQty }}
@@ -602,11 +618,14 @@ const formData = reactive({ previewImage: '', // 预览图URL remark: '', // 备注信息 releaseType: 'default', - productBarcode: '', // 商品条码(库存检查用) + productBarcodes: [] as string[], // 商品条码列表(已验证库存) // receiverId: undefined, // 已移除,改用子任务指定 isUrgent: false }) +// 新条码输入框 +const newBarcodeInput = ref('') + // 库存检查相关 const checkingInventory = ref(false) const inventoryCheckResult = ref(null) @@ -618,24 +637,39 @@ const selectedSubTypeNeedsInventoryCheck = computed(() => { return selectedSubType?.checkInventory === 1 }) -// 检查库存 -const handleCheckInventory = async () => { - if (!formData.productBarcode) { +// 验证并添加条码 +const handleAddBarcode = async () => { + const barcode = newBarcodeInput.value.trim() + + if (!barcode) { message.warning('请输入商品条码') return } + // 检查是否已添加 + if (formData.productBarcodes.includes(barcode)) { + message.warning('该条码已添加') + return + } + checkingInventory.value = true inventoryCheckResult.value = null try { - const response = await checkInventoryForTask(formData.productBarcode) + const response = await checkInventoryForTask(barcode) inventoryCheckResult.value = response.data if (response.data.canPublish) { - message.success('库存检查通过,可以发布任务') + // 库存充足,添加到列表 + formData.productBarcodes.push(barcode) + newBarcodeInput.value = '' // 清空输入框 + message.success(`条码 ${barcode} 库存充足,已添加`) + // 2秒后清除结果提示 + setTimeout(() => { + inventoryCheckResult.value = null + }, 2000) } else { - message.error(response.data.message || '库存不足,请先申请样品') + message.error(response.data.message || '库存不足,无法添加该条码') } } catch (error: any) { console.error('检查库存失败:', error) @@ -645,6 +679,14 @@ const handleCheckInventory = async () => { } } +// 移除条码 +const removeBarcode = (index: number) => { + formData.productBarcodes.splice(index, 1) +} + +// 兼容旧函数名 +const handleCheckInventory = handleAddBarcode + // 表单验证规则 const formRules = { title: [ @@ -1110,16 +1152,8 @@ const handleSubmit = async () => { // 检查库存(如果需要) if (selectedSubTypeNeedsInventoryCheck.value) { - if (!formData.productBarcode) { - message.error('请输入商品条码') - return - } - if (!inventoryCheckResult.value) { - message.error('请先检查库存') - return - } - if (!inventoryCheckResult.value.canPublish) { - message.error('库存不足,请先申请样品后再发布任务') + if (!formData.productBarcodes || formData.productBarcodes.length === 0) { + message.error('请至少添加一个已验证库存的商品条码') return } } @@ -1207,7 +1241,8 @@ const handleSubmit = async () => { remark: formData.remark || '', priority: formData.isUrgent ? 3 : 1, // 0-低 1-普通 2-高 3-紧急 releaseType: formData.releaseType, // 发布类型 - receiverId: undefined // 主任务不设接收人,由子任务指定 + receiverId: undefined, // 主任务不设接收人,由子任务指定 + productBarcodes: formData.productBarcodes // 商品条码列表 } let response: any @@ -2285,6 +2320,45 @@ onUnmounted(() => { } } +// 条码列表样式 +.barcode-list { + padding: 12px; + background: rgba(49, 240, 139, 0.05); + border: 1px solid rgba(49, 240, 139, 0.2); + border-radius: 8px; + margin-bottom: 8px; + + .barcode-list-title { + font-size: 12px; + color: $text-tertiary; + margin-bottom: 8px; + } + + .barcode-tags { + display: flex; + flex-wrap: wrap; + gap: 8px; + + :deep(.ant-tag) { + margin: 0; + padding: 4px 10px; + font-size: 13px; + border-radius: 4px; + background: rgba(49, 240, 139, 0.15); + border-color: rgba(49, 240, 139, 0.3); + color: #31f08b; + + .anticon-close { + color: rgba(255, 255, 255, 0.6); + + &:hover { + color: #ff4d4f; + } + } + } + } +} + // 库存检查结果样式 .inventory-result { margin-top: 12px;