huminmin
2026-05-12 919177aceb22d6cca9c176a46c299d099a0ba0af
分派生产单到班组长,班组长:排产工单到班组成员
已添加1个文件
已修改5个文件
321 ■■■■■ 文件已修改
src/api/productionManagement/productionTeam.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/productionManagement/productionTeamUserRel.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/productionManagement/workOrder.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/productionOrder/index.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionManagement/workOrderEdit/index.vue 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/productionPlan/productionPlan/index.vue 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/productionManagement/productionTeam.js
@@ -3,7 +3,7 @@
// åˆ›å»ºç­ç»„
export function createTeam(data) {
    return request({
        url: "/production_team",
        url: "/productionTeam",
        method: "post",
        data: data,
    });
@@ -12,7 +12,7 @@
// æ›´æ–°ç­ç»„
export function updateTeam(data) {
    return request({
        url: "/production_team",
        url: "/productionTeam",
        method: "put",
        data: data,
    });
@@ -21,7 +21,7 @@
// åˆ é™¤ç­ç»„
export function deleteTeam(id) {
    return request({
        url: "/production_team/" + id,
        url: "/productionTeam/" + id,
        method: "delete",
    });
}
@@ -29,7 +29,7 @@
// æŸ¥è¯¢ç­ç»„详情
export function getTeamDetail(id) {
    return request({
        url: "/production_team/" + id,
        url: "/productionTeam/" + id,
        method: "get",
    });
}
@@ -37,7 +37,7 @@
// æŸ¥è¯¢ç­ç»„列表
export function getTeamList(query) {
    return request({
        url: "/production_team/list",
        url: "/productionTeam/list",
        method: "get",
        params: query,
    });
@@ -46,8 +46,11 @@
// åˆ†é¡µæŸ¥è¯¢ç­ç»„列表
export function getTeamListPage(query) {
    return request({
        url: "/production_team/listPage",
        url: "/productionTeam/listPage",
        method: "get",
        params: query,
    });
}
src/api/productionManagement/productionTeamUserRel.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
import request from "@/utils/request";
// æŸ¥è¯¢ç­ç»„长列表
export function getTeamLeaderList(query) {
    return request({
        url: "/productionTeamUserRel/leaderList",
        method: "get",
        params: query,
    });
}
export function getTeamMemberListByTeamLeader(query) {
    return request({
        url: "/productionTeamUserRel/memberListByLeader",
        method: "get",
        params: query,
    });
}
src/api/productionManagement/workOrder.js
@@ -32,6 +32,17 @@
  });
}
// å·¥å•-指定班组团队成员
export function assignTeamUser(data) {
  return request({
    url: "/productionOperationTask/assignTeamUser",
    method: "post",
    data: data,
  });
}
// ä¸‹è½½å·¥å•流转卡(返回文件流)
export function downProductWorkOrder(id) {
  return request({
src/views/productionManagement/productionOrder/index.vue
@@ -226,6 +226,7 @@
  import { ElMessageBox } from "element-plus";
  import dayjs from "dayjs";
  import { useRouter } from "vue-router";
  import useUserStore from '@/store/modules/user'
  import {
    productOrderListPage,
    listProcessRoute,
@@ -253,6 +254,7 @@
  const { proxy } = getCurrentInstance();
  const userStore = useUserStore();
  const router = useRouter();
  const isShowNewModal = ref(false);
  const sourceDataDialogVisible = ref(false);
@@ -361,6 +363,11 @@
      width: 120,
    },
    {
      label: "班组长",
      prop: "teamLeaderUserName",
      width: "120px",
    },
    {
      dataType: "action",
      label: "操作",
      align: "center",
@@ -402,7 +409,7 @@
          name: "领料",
          type: "text",
          color: "#5EC7AB",
          showHide: row => !row.endOrder && !row.returned,
          showHide: row => !row.endOrder && !row.returned && userStore.id === row.teamLeaderUserId,
          clickFun: row => {
            openMaterialDialog(row);
          },
src/views/productionManagement/workOrderEdit/index.vue
@@ -117,6 +117,45 @@
        </span>
      </template>
    </el-dialog>
    <!-- æŒ‡å®šç­ç»„成员弹窗(单选) -->
    <el-dialog v-model="assignTeamUserDialogVisible"
               title="指定班组成员"
               width="800px">
      <div class="assign-team-user-content">
        <div class="selected-info-box"
             v-if="selectedTeamUserId">
          <div class="info-label">已选择:</div>
          <div class="info-value">{{ getTeamUserNameById(selectedTeamUserId) }}</div>
        </div>
        <div class="team-user-list-container"
             v-loading="teamUserTableLoading">
          <el-radio-group v-model="selectedTeamUserId">
            <div class="team-user-grid">
              <div v-for="item in teamUserTableData"
                   :key="item.userId"
                   class="team-user-item">
                <el-radio :label="item.userId">
                  <div class="team-user-info">
                    <span class="name">{{ item.nickName }}</span>
                  </div>
                </el-radio>
              </div>
            </div>
          </el-radio-group>
          <div v-if="teamUserTableData.length === 0"
               class="empty-text">
            æš‚无匹配人员
          </div>
        </div>
      </div>
      <template #footer>
        <span class="dialog-footer">
          <el-button type="primary"
                     @click="handleSaveTeamUser">确定</el-button>
          <el-button @click="assignTeamUserDialogVisible = false">取消</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
@@ -126,9 +165,10 @@
  import {
    productWorkOrderPage,
    updateProductWorkOrder,
    assignProductWorkOrder,
    assignProductWorkOrder, assignTeamUser,
  } from "@/api/productionManagement/workOrder.js";
  import { listUser } from "@/api/system/user.js";
  import {getTeamMemberListByTeamLeader} from "@/api/productionManagement/productionTeamUserRel.js";
  const { proxy } = getCurrentInstance();
@@ -209,6 +249,11 @@
      width: "180",
    },
    {
      label: "指定班组成员",
      prop: "teamUserName",
      width: "180",
    },
    {
      label: "操作",
      width: "200",
      align: "center",
@@ -225,6 +270,12 @@
          name: "指定报工人",
          clickFun: row => {
            handleAssignReporter(row);
          },
        },
        {
          name: "指定班组成员",
          clickFun: row => {
            handleAssignTeamUser(row);
          },
        },
      ],
@@ -341,6 +392,32 @@
    getEmployeeList();
  };
  // æŒ‡å®šç­ç»„成员相关
  const assignTeamUserDialogVisible = ref(false);
  const teamUserTableLoading = ref(false);
  const teamUserTableData = ref([]);
  const teamUserPage = reactive({
    current: 1,
    size: 100,
    total: 0,
  });
  const currentTeamUser = ref(null);
  const selectedTeamUserId = ref(null);
  const handleAssignTeamUser = row => {
    currentTeamUser.value = row;
    assignTeamUserDialogVisible.value = true;
    // å›žæ˜¾å·²é€‰æ‹©çš„人员(单选)
    if (row.teamUserId) {
      selectedTeamUserId.value = row.teamUserId;
    } else {
      selectedTeamUserId.value = null;
    }
    getTeamUserList(row.leaderUserId);
  };
  const getEmployeeList = () => {
    employeeTableLoading.value = true;
    const params = {
@@ -385,6 +462,45 @@
      .then(() => {
        proxy.$modal.msgSuccess("指定成功");
        assignReporterDialogVisible.value = false;
        getList();
      })
      .catch(() => {
        proxy.$modal.msgError("指定失败");
      });
  };
  const getTeamUserList = (leaderUserId) => {
    teamUserTableLoading.value = true;
    getTeamMemberListByTeamLeader({leaderUserId: leaderUserId})
      .then(res => {
        teamUserTableLoading.value = false;
        teamUserTableData.value = res.data;
      })
      .catch(() => {
        teamUserTableLoading.value = false;
      });
  };
  const getTeamUserNameById = id => {
    const user = teamUserTableData.value.find(item => item.userId === id);
    return user ? user.nickName : id;
  };
  const handleSaveTeamUser = () => {
    if (!selectedTeamUserId.value) {
      proxy.$modal.msgWarning("请选择班组成员");
      return;
    }
    const updateData = {
      id: currentTeamUser.value.id,
      teamUserId: selectedTeamUserId.value,
    };
    assignTeamUser(updateData)
      .then(() => {
        proxy.$modal.msgSuccess("指定成功");
        assignTeamUserDialogVisible.value = false;
        getList();
      })
      .catch(() => {
@@ -493,4 +609,77 @@
      }
    }
  }
</style>
  .assign-team-user-content {
    .selected-info-box {
      margin-bottom: 16px;
      padding: 12px;
      background-color: #f5f7fa;
      border-radius: 4px;
      display: flex;
      align-items: center;
      .info-label {
        font-size: 14px;
        color: #606266;
        margin-right: 8px;
      }
      .info-value {
        font-size: 14px;
        color: #303133;
        font-weight: bold;
      }
    }
    .team-user-list-container {
      max-height: 400px;
      overflow-y: auto;
      padding: 10px;
      border: 1px solid #f0f0f0;
      border-radius: 4px;
      .team-user-grid {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
        gap: 12px;
      }
      .team-user-item {
        :deep(.el-radio) {
          width: 100%;
          margin-right: 0;
          height: auto;
          padding: 8px;
          .el-radio__label {
            width: 100%;
          }
        }
        .team-user-info {
          display: flex;
          flex-direction: column;
          gap: 4px;
          .name {
            font-weight: bold;
            font-size: 14px;
            color: #303133;
          }
          .dept {
            font-size: 12px;
            color: #909399;
          }
        }
      }
      .empty-text {
        text-align: center;
        color: #909399;
        padding: 20px;
      }
    }
  }
</style>
src/views/productionPlan/productionPlan/index.vue
@@ -111,6 +111,7 @@
               title="合并下发"
               width="600px">
      <el-form :model="mergeForm"
               ref="mergeFormRef"
               label-width="120px">
        <el-row :gutter="20">
          <el-col :span="10">
@@ -138,6 +139,29 @@
                           :max="sumAssignedQuantity"
                           @change="onBlur"
                           style="width: 100%" />
        </el-form-item>
        <el-form-item
            prop="leaderId"
            label="班组长"
            :rules="[
              {
                required: true,
                message: '请选择班组长',
                trigger: 'change',
              }
            ]"
        >
          <el-select v-model="mergeForm.leaderId"
                     placeholder="请选择"
                     filterable
                     @focus="fetchTeamLeaderOptions"
                     style="width: 100%">
            <el-option v-for="item in teamLeaderOptions"
                       :key="item.userId"
                       :label="item.nickName"
                       :value="item.userId" />
          </el-select>
        </el-form-item>
      </el-form>
      <template #footer>
@@ -269,8 +293,10 @@
    exportProductionPlan,
  } from "@/api/productionPlan/productionPlan.js";
  import { productTreeList, modelListPage } from "@/api/basicData/product.js";
  import { getTeamLeaderList } from "@/api/productionManagement/productionTeamUserRel.js";
  import PIMTable from "./components/PIMTable.vue";
  import ImportDialog from "@/components/Dialog/ImportDialog.vue";
  import {afterSalesServiceDispose} from "@/api/customerService/index.js";
  const { proxy } = getCurrentInstance();
  const router = useRouter();
@@ -473,7 +499,18 @@
    totalAssignedQuantity: 0,
    planCompleteTime: "",
    productId: "",
    leaderId: "",
  });
  // ç­ç»„长列表
  const teamLeaderOptions = ref([]);
  // æŸ¥è¯¢ç­ç»„长列表
  const fetchTeamLeaderOptions = () => {
    return getTeamLeaderList().then(res => {
      teamLeaderOptions.value = res.data || [];
    });
  };
  // å¯¼å…¥ç›¸å…³
  const importDialogRef = ref(null);
@@ -778,22 +815,26 @@
    const payload = {
      ...mergeForm,
    };
    productionPlanCombine(payload)
      .then(res => {
        if (res.code === 200) {
          ElMessage.success("下发成功");
          getList();
          isShowNewModal.value = false;
          // å¯ä»¥é€‰æ‹©åˆ·æ–°åˆ—表或其他操作
          getList();
        } else {
          ElMessage.error(res.message || "下发失败");
        }
      })
      .catch(err => {
        console.error("合并下发异常:", err);
        ElMessage.error("系统异常,合并下发失败");
      });
    proxy.$refs["mergeFormRef"].validate(valid => {
      if (!valid) return;
      productionPlanCombine(payload)
          .then(res => {
            if (res.code === 200) {
              ElMessage.success("下发成功");
              getList();
              isShowNewModal.value = false;
              // å¯ä»¥é€‰æ‹©åˆ·æ–°åˆ—表或其他操作
              getList();
            } else {
              ElMessage.error(res.message || "下发失败");
            }
          })
          .catch(err => {
            console.error("合并下发异常:", err);
            ElMessage.error("系统异常,合并下发失败");
          });
    })
    // å¯ä»¥é€‰æ‹©åˆ·æ–°åˆ—表或其他操作
  };