1
xiazhengtongxue
2 天以前 5b34a1458e74f8902d01ebd844c2954f554c9e74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
<template>
  <div>
    <!-- 手动创建机器人任务弹窗 -->
    <vol-box v-model="showManualCreate" :lazy="true" width="550px" :padding="15" title="手动创建机器人任务">
      <el-form :model="manualFormData" ref="form" label-width="120px">
        <!-- 任务类型选择 -->
        <el-form-item label="任务类型" prop="robotRoadway" required>
          <el-select v-model="manualFormData.robotRoadway" placeholder="请选择任务类型" @change="onTaskTypeChange">
            <el-option label="组盘任务" value="GroupPallet"></el-option>
            <el-option label="换盘任务" value="ChangePallet"></el-option>
            <el-option label="拆盘任务" value="SplitPallet"></el-option>
          </el-select>
        </el-form-item>
 
        <!-- 组盘任务:仅需目标地址托盘码和任务总数 -->
        <template v-if="manualFormData.robotRoadway === 'GroupPallet'">
          <el-form-item label="目标地址托盘码" prop="robotTargetAddressPalletCode" required>
            <el-input v-model="manualFormData.robotTargetAddressPalletCode" placeholder="请输入目标地址托盘码"></el-input>
          </el-form-item>
          <el-form-item label="任务总数" prop="robotTaskTotalNum" required>
            <el-input-number v-model="manualFormData.robotTaskTotalNum" :min="1" :max="999" label="任务总数"></el-input-number>
          </el-form-item>
        </template>
 
        <!-- 换盘任务:需来源、目标托盘码和4个方向 -->
        <template v-if="manualFormData.robotRoadway === 'ChangePallet'">
          <el-form-item label="来源地址托盘码" prop="robotSourceAddressPalletCode" required>
            <el-input v-model="manualFormData.robotSourceAddressPalletCode" placeholder="请输入来源地址托盘码"></el-input>
          </el-form-item>
          <el-form-item label="目标地址托盘码" prop="robotTargetAddressPalletCode" required>
            <el-input v-model="manualFormData.robotTargetAddressPalletCode" placeholder="请输入目标地址托盘码"></el-input>
          </el-form-item>
          <el-form-item label="方向" prop="forward" required>
            <el-radio-group v-model="manualFormData.forward">
              <el-radio :label="1">去化成1: 源:1(11010) → 目标:3(2103)</el-radio>
              <el-radio :label="2">去化成2: 源:2(11001) → 目标:4(2101)</el-radio>
              <el-radio :label="3">回高温3: 源:4(2103) → 目标:2(11010)</el-radio>
              <el-radio :label="4">回高温4: 源:4(2101) → 目标:2(11001)</el-radio>
            </el-radio-group>
          </el-form-item>
          <el-form-item label="任务总数" prop="robotTaskTotalNum" required>
            <el-input-number v-model="manualFormData.robotTaskTotalNum" :min="1" :max="999" label="任务总数"></el-input-number>
          </el-form-item>
        </template>
 
        <!-- 拆盘任务:仅需来源地址托盘码和任务总数 -->
        <template v-if="manualFormData.robotRoadway === 'SplitPallet'">
          <el-form-item label="来源地址托盘码" prop="robotSourceAddressPalletCode" required>
            <el-input v-model="manualFormData.robotSourceAddressPalletCode" placeholder="请输入来源地址托盘码"></el-input>
          </el-form-item>
          <el-form-item label="任务总数" prop="robotTaskTotalNum" required>
            <el-input-number v-model="manualFormData.robotTaskTotalNum" :min="1" :max="999" label="任务总数"></el-input-number>
          </el-form-item>
        </template>
      </el-form>
      <template #footer>
        <el-button type="primary" size="small" @click="submitManualCreate">确定</el-button>
        <el-button type="danger" size="small" @click="closeDialog">关闭</el-button>
      </template>
    </vol-box>
  </div>
</template>
 
<script>
import VolBox from "@/components/basic/VolBox.vue";
 
export default {
  components: { VolBox },
  emits: ["parentCall"],
  data() {
    return {
      showManualCreate: false,
      // 任务类型映射(用于显示中文名称)
      taskTypeMap: {
        GroupPallet: "组盘任务",
        ChangePallet: "换盘任务",
        SplitPallet: "拆盘任务",
      },
      // 方向描述映射
      directionMap: {
        1: "去化成1: 源:1(11010) → 目标:3(2103)",
        2: "去化成2: 源:2(11001) → 目标:4(2101)",
        3: "回高温3: 源:4(2103) → 目标:2(11010)",
        4: "回高温4: 源:4(2101) → 目标:2(11001)",
      },
      manualFormData: {
        robotRoadway: "",               // 机器人名称/任务类型
        robotSourceAddressPalletCode: "", // 来源地址托盘码
        robotTargetAddressPalletCode: "", // 目标地址托盘码
        forward: 1,                     // 方向(换盘任务使用,1-4)
        robotTaskTotalNum: 1,           // 任务总数
      },
    };
  },
  methods: {
    // 打开弹窗
    open() {
      this.showManualCreate = true;
      this.resetManualForm();
    },
 
    // 关闭弹窗
    closeDialog() {
      this.showManualCreate = false;
    },
 
    // 重置表单
    resetManualForm() {
      this.manualFormData = {
        robotRoadway: "",
        robotSourceAddressPalletCode: "",
        robotTargetAddressPalletCode: "",
        forward: 1,
        robotTaskTotalNum: 1,
      };
    },
 
    // 任务类型切换时重置相关字段
    onTaskTypeChange(value) {
      this.manualFormData.robotSourceAddressPalletCode = "";
      this.manualFormData.robotTargetAddressPalletCode = "";
      this.manualFormData.forward = 1;
    },
 
    // 表单验证
    validateForm() {
      const data = this.manualFormData;
 
      // 1. 必选任务类型
      if (!data.robotRoadway) {
        this.$message.error("请选择任务类型");
        return false;
      }
 
      // 2. 根据任务类型验证必填字段
      const taskType = data.robotRoadway;
 
      if (taskType === "GroupPallet") {
        if (!data.robotTargetAddressPalletCode) {
          this.$message.error("组盘任务:请输入目标地址托盘码");
          return false;
        }
      } else if (taskType === "ChangePallet") {
        if (!data.robotSourceAddressPalletCode) {
          this.$message.error("换盘任务:请输入来源地址托盘码");
          return false;
        }
        if (!data.robotTargetAddressPalletCode) {
          this.$message.error("换盘任务:请输入目标地址托盘码");
          return false;
        }
        // 验证方向 1-4
        if (![1, 2, 3, 4].includes(data.forward)) {
          this.$message.error("换盘任务:请选择有效的方向(1-4)");
          return false;
        }
      } else if (taskType === "SplitPallet") {
        if (!data.robotSourceAddressPalletCode) {
          this.$message.error("拆盘任务:请输入来源地址托盘码");
          return false;
        }
      }
 
      // 3. 验证任务总数
      if (data.robotTaskTotalNum < 1) {
        this.$message.error("任务总数不能小于1");
        return false;
      }
 
      return true;
    },
 
    // 提交手动创建任务
    submitManualCreate() {
      // 表单验证
      if (!this.validateForm()) {
        return;
      }
 
      // 构建请求参数(与后端 ManualRobotTaskDto 对应)
      const params = {
        robotRoadway: this.manualFormData.robotRoadway,
        robotSourceAddressPalletCode: this.manualFormData.robotSourceAddressPalletCode,
        robotTargetAddressPalletCode: this.manualFormData.robotTargetAddressPalletCode,
        robotTaskTotalNum: this.manualFormData.robotTaskTotalNum,
        forward: this.manualFormData.forward,  // 方向,整型 1-4
      };
 
      // 获取任务类型中文名称用于提示
      const taskTypeName = this.taskTypeMap[params.robotRoadway] || "机器人";
 
      // 获取方向描述(仅换盘任务)
      let directionDesc = "";
      if (params.robotRoadway === "ChangePallet") {
        directionDesc = this.directionMap[params.forward] || "";
      }
 
      // 调用后端API创建机器人任务
      this.http
        .post("api/RobotTask/CreateRobotTaskManually", params, `创建${taskTypeName}${directionDesc ? ' - ' + directionDesc : ''}中...`)
        .then((res) => {
          if (!res.status) {
            return this.$message.error(res.message);
          }
          this.$message.success(`${taskTypeName}${directionDesc ? ' - ' + directionDesc : ''}创建成功`);
          this.showManualCreate = false;
          // 刷新父页面数据
          this.$emit("parentCall", ($vue) => {
            $vue.refresh();
          });
        })
        .catch((err) => {
          this.$message.error(`创建${taskTypeName}失败:` + (err.message || "未知错误"));
        });
    },
  },
};
</script>