【需求】订单、计划、任务调整

dev
zengchenxi 6 months ago
parent b255556b35
commit 4f2b13f4b1

@ -3,6 +3,8 @@ package com.chanko.yunxi.mes.module.biz.controller.admin.plan;
import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanPageReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanRespVO; import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanRespVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanSaveReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanSaveReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanWorkshopDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.biz.service.plan.PlanService; import com.chanko.yunxi.mes.module.biz.service.plan.PlanService;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -101,4 +103,24 @@ public class PlanController {
BeanUtils.toBean(list, PlanRespVO.class)); BeanUtils.toBean(list, PlanRespVO.class));
} }
// ==================== 子表(生产计划子项目) ====================
@GetMapping("/plan-sub/list-by-project-plan-id")
@Operation(summary = "获得生产计划子项目列表")
@Parameter(name = "projectPlanId", description = "计划id")
@PreAuthorize("@ss.hasPermission('biz:plan:query')")
public CommonResult<List<PlanSubDO>> getPlanSubListByProjectPlanId(@RequestParam("projectPlanId") Long projectPlanId) {
return success(planService.getPlanSubListByProjectPlanId(projectPlanId));
}
// ==================== 子表(生产计划车间计划) ====================
@GetMapping("/plan-workshop/list-by-project-plan-id")
@Operation(summary = "获得生产计划车间计划列表")
@Parameter(name = "projectPlanId", description = "计划id")
@PreAuthorize("@ss.hasPermission('biz:plan:query')")
public CommonResult<List<PlanWorkshopDO>> getPlanWorkshopListByProjectPlanId(@RequestParam("projectPlanId") Long projectPlanId) {
return success(planService.getPlanWorkshopListByProjectPlanId(projectPlanId));
}
} }

@ -1,12 +1,13 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo; package com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanWorkshopDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.Data;
import java.util.*;
import javax.validation.constraints.*; import javax.validation.constraints.NotNull;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 生产计划新增/修改 Request VO") @Schema(description = "管理后台 - 生产计划新增/修改 Request VO")
@Data @Data
@ -67,4 +68,9 @@ public class PlanSaveReqVO {
@Schema(description = "项目变更次数") @Schema(description = "项目变更次数")
private Integer changeNum; private Integer changeNum;
@Schema(description = "生产计划子项目列表")
private List<PlanSubDO> planSubs;
@Schema(description = "生产计划车间计划列表")
private List<PlanWorkshopDO> planWorkshops;
} }

@ -1,131 +0,0 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.plantask;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo.PlanTaskPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo.PlanTaskRespVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo.PlanTaskSaveReqVO;
import com.chanko.yunxi.mes.module.biz.service.plantask.PlanTaskService;
import com.chanko.yunxi.mes.module.biz.enums.BusinessTypeEnum;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.*;
import javax.servlet.http.*;
import java.time.LocalDateTime;
import java.util.*;
import java.io.IOException;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog;
import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantask.PlanTaskDO;
@Tag(name = "管理后台 - 生产计划任务")
@RestController
@RequestMapping("/biz/plan-task")
@Validated
public class PlanTaskController {
@Resource
private PlanTaskService planTaskService;
@Resource
private OperateLogFrameworkService operateLogFrameworkService;
@Resource
private HttpServletRequest request;
@PostMapping("/create")
@Operation(summary = "创建生产计划任务")
@PreAuthorize("@ss.hasPermission('biz:plan-task:create')")
public CommonResult<Long> createPlanTask(@Valid @RequestBody PlanTaskSaveReqVO createReqVO) {
return success(planTaskService.createPlanTask(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新生产计划任务")
@PreAuthorize("@ss.hasPermission('biz:plan-task:update')")
public CommonResult<Boolean> updatePlanTask(@Valid @RequestBody PlanTaskSaveReqVO updateReqVO) {
LocalDateTime startTime = LocalDateTime.now();
planTaskService.updatePlanTask(updateReqVO);
// 手动记录日志
operateLogFrameworkService.createOperateLog(request,
startTime,
BusinessTypeEnum.PLAN_TASK.name(),
updateReqVO.getId(),
OperateTypeEnum.valueOf(updateReqVO.getActive()).getType(),
"");
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除生产计划任务")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:plan-task:delete')")
public CommonResult<Boolean> deletePlanTask(@RequestParam("id") Long id) {
planTaskService.deletePlanTask(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得生产计划任务")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:plan-task:query')")
public CommonResult<PlanTaskRespVO> getPlanTask(@RequestParam("id") Long id) {
PlanTaskDO planTask = planTaskService.getPlanTask(id);
return success(BeanUtils.toBean(planTask, PlanTaskRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得生产计划任务分页")
@PreAuthorize("@ss.hasPermission('biz:plan-task:query')")
public CommonResult<PageResult<PlanTaskRespVO>> getPlanTaskPage(@Valid PlanTaskPageReqVO pageReqVO) {
PageResult<PlanTaskDO> pageResult = planTaskService.getPlanTaskPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, PlanTaskRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出生产计划任务 Excel")
@PreAuthorize("@ss.hasPermission('biz:plan-task:export')")
@OperateLog(type = EXPORT)
public void exportPlanTaskExcel(@Valid PlanTaskPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<PlanTaskDO> list = planTaskService.getPlanTaskPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "生产计划任务.xls", "数据", PlanTaskRespVO.class,
BeanUtils.toBean(list, PlanTaskRespVO.class));
}
@GetMapping("/get-version-status")
@Operation(summary = "获得bom需要更新的状态")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:plan-task:query')")
public CommonResult<Integer> getPlanTaskBomStatus(@RequestParam("id") Long id) {
return success(planTaskService.getPlanTaskBomStatus(id));
}
@GetMapping("/refresh")
@Operation(summary = "刷新生产计划任务单最新数据")
@Parameter(name = "id", description = "生产计划id", required = true)
@PreAuthorize("@ss.hasPermission('biz:plan-task:query')")
public CommonResult<Integer> refreshPlanTaskByPlanId(@RequestParam("id") Long id) {
return success(planTaskService.refreshPlanTaskByPlanId(id));
}
}

@ -1,68 +0,0 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.chanko.yunxi.mes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 生产计划任务分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PlanTaskPageReqVO extends PageParam {
@Schema(description = "自增字段,唯一")
private Long id;
@Schema(description = "项目id")
private Long projectId;
@Schema(description = "生产计划id")
private Long projectPlanId;
@Schema(description = "生产计划子项目id")
private Long projectPlanSubId;
@Schema(description = "工艺bomid")
private Long processBomId;
@Schema(description = "生产计划编号,唯一")
private String taskNo;
@Schema(description = "bom版本号")
private Integer bomVersion;
@Schema(description = "备注")
private String description;
@Schema(description = "状态,1已保存2已提交3已终止 默认是1")
private Integer status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "客户名称")
private String customerName;
@Schema(description = "项目编号")
private String projectCode;
@Schema(description = "项目名称")
private String projectName;
@Schema(description = "生产计划单号")
private String planNo;
@Schema(description = "子项目编号")
private String projectSubCode;
@Schema(description = "子项目名称")
private String projectSubName;
}

@ -1,92 +0,0 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 生产计划任务 Response VO")
@Data
@ExcelIgnoreUnannotated
public class PlanTaskRespVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("自增字段,唯一")
private Long id;
@Schema(description = "项目id")
@ExcelProperty("项目id")
private Long projectId;
@Schema(description = "生产计划id", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("生产计划id")
private Long projectPlanId;
@Schema(description = "生产计划子项目id")
@ExcelProperty("生产计划子项目id")
private Long projectPlanSubId;
@Schema(description = "工艺bomid")
@ExcelProperty("工艺bomid")
private Long processBomId;
@Schema(description = "生产计划编号,唯一")
@ExcelProperty("生产计划编号,唯一")
private String taskNo;
@Schema(description = "bom版本号")
@ExcelProperty("bom版本号")
private Integer bomVersion;
@Schema(description = "备注")
@ExcelProperty("备注")
private String description;
@Schema(description = "状态,1已保存2已提交3已终止 默认是1")
@ExcelProperty("状态,1已保存2已提交3已终止 默认是1")
private Integer status;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "客户名称")
@ExcelProperty("客户名称")
private String customerName;
@Schema(description = "项目编号")
@ExcelProperty("项目编号")
private String projectCode;
@Schema(description = "项目名称")
@ExcelProperty("项目名称")
private String projectName;
@Schema(description = "生产计划编号")
@ExcelProperty("生产计划编号")
private String planNo;
@Schema(description = "子项目编号")
@ExcelProperty("子项目编号")
private String projectSubCode;
@Schema(description = "子项目名称")
@ExcelProperty("子项目名称")
private String projectSubName;
@Schema(description = "项目结束时间")
@ExcelProperty("项目结束时间")
private LocalDateTime projectEndTime;
@Schema(description = "bom编号")
@ExcelProperty("bom编号")
private String bomCode;
@Schema(description = "子项目数量")
@ExcelProperty("子项目数量")
private Integer orderSubAmount;
}

@ -1,47 +0,0 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom.PlanTaskBomDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 生产计划任务新增/修改 Request VO")
@Data
public class PlanTaskSaveReqVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "项目id")
private Long projectId;
@Schema(description = "生产计划id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "生产计划id不能为空")
private Long projectPlanId;
@Schema(description = "生产计划子项目id")
private Long projectPlanSubId;
@Schema(description = "工艺bomid")
private Long processBomId;
@Schema(description = "生产计划编号,唯一")
private String taskNo;
@Schema(description = "bom版本号")
private Integer bomVersion;
@Schema(description = "备注")
private String description;
@Schema(description = "状态,1已保存2已提交3已终止 默认是1")
private Integer status;
@Schema(description = "操作类型")
private String active;
@Schema(description = "工艺bom明细列表")
private List<PlanTaskBomDO> bomDetails;
}

@ -1,96 +0,0 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo.PlanTaskBomPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo.PlanTaskBomRespVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo.PlanTaskBomSaveReqVO;
import com.chanko.yunxi.mes.module.biz.service.plantaskbom.PlanTaskBomService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.annotations.OperateLog;
import static com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum.*;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom.PlanTaskBomDO;
@Tag(name = "管理后台 - 生产计划任务Bom")
@RestController
@RequestMapping("/biz/plan-task-bom")
@Validated
public class PlanTaskBomController {
@Resource
private PlanTaskBomService planTaskBomService;
@PostMapping("/create")
@Operation(summary = "创建生产计划任务Bom")
@PreAuthorize("@ss.hasPermission('biz:plan-task-bom:create')")
public CommonResult<Long> createPlanTaskBom(@Valid @RequestBody PlanTaskBomSaveReqVO createReqVO) {
return success(planTaskBomService.createPlanTaskBom(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新生产计划任务Bom")
@PreAuthorize("@ss.hasPermission('biz:plan-task-bom:update')")
public CommonResult<Boolean> updatePlanTaskBom(@Valid @RequestBody PlanTaskBomSaveReqVO updateReqVO) {
planTaskBomService.updatePlanTaskBom(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除生产计划任务Bom")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:plan-task-bom:delete')")
public CommonResult<Boolean> deletePlanTaskBom(@RequestParam("id") Long id) {
planTaskBomService.deletePlanTaskBom(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得生产计划任务Bom")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:plan-task-bom:query')")
public CommonResult<PlanTaskBomRespVO> getPlanTaskBom(@RequestParam("id") Long id) {
PlanTaskBomDO planTaskBom = planTaskBomService.getPlanTaskBom(id);
return success(BeanUtils.toBean(planTaskBom, PlanTaskBomRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得生产计划任务Bom分页")
@PreAuthorize("@ss.hasPermission('biz:plan-task-bom:query')")
public CommonResult<PageResult<PlanTaskBomRespVO>> getPlanTaskBomPage(@Valid PlanTaskBomPageReqVO pageReqVO) {
PageResult<PlanTaskBomDO> pageResult = planTaskBomService.getPlanTaskBomPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, PlanTaskBomRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出生产计划任务Bom Excel")
@PreAuthorize("@ss.hasPermission('biz:plan-task-bom:export')")
@OperateLog(type = EXPORT)
public void exportPlanTaskBomExcel(@Valid PlanTaskBomPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<PlanTaskBomDO> list = planTaskBomService.getPlanTaskBomPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "生产计划任务Bom.xls", "数据", PlanTaskBomRespVO.class,
BeanUtils.toBean(list, PlanTaskBomRespVO.class));
}
}

@ -1,51 +0,0 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.chanko.yunxi.mes.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 生产计划任务Bom分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PlanTaskBomPageReqVO extends PageParam {
@Schema(description = "自增字段,唯一")
private Long id;
@Schema(description = "生产任务id")
private Long taskId;
@Schema(description = "bom明细id")
private Long bomDetailId;
@Schema(description = "负责人")
private String owner;
@Schema(description = "要求完成日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] requireEndDate;
@Schema(description = "项目id")
private Long projectId;
@Schema(description = "子项目id")
private Long projectSubId;
@Schema(description = "零件类型 1 标准件|2 其它")
private String materialType;
private Long projectPlanId;
private Long projectPlanSubId;
private Boolean sortByBlueprintNo;
}

@ -1,69 +0,0 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 生产计划任务Bom Response VO")
@Data
@ExcelIgnoreUnannotated
public class PlanTaskBomRespVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("自增字段,唯一")
private Long id;
@Schema(description = "生产任务id", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("生产任务id")
private Long taskId;
@Schema(description = "bom明细id", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("bom明细id")
private Long bomDetailId;
@Schema(description = "负责人")
@ExcelProperty("负责人")
private String owner;
@Schema(description = "要求完成日期")
@ExcelProperty("要求完成日期")
private LocalDateTime requireEndDate;
@Schema(description = "零件名称")
private String materialName;
@Schema(description = "物料名称")
private String compositionName;
@Schema(description = "图号")
private String blueprintNo;
@Schema(description = "零件类型 1 标准件|2 其它")
private String type;
@Schema(description = "物料id")
private Long materialId;
@Schema(description = "物料编码")
private String materialCode;
@Schema(description = "材质id")
private Long compositionId;
@Schema(description = "规格")
private String spec;
@Schema(description = "单位")
private String unit;
@Schema(description = "数量")
private Integer amount;
@Schema(description = "负责人名称")
private String ownerName;
}

@ -1,32 +0,0 @@
package com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 生产计划任务Bom新增/修改 Request VO")
@Data
public class PlanTaskBomSaveReqVO {
@Schema(description = "自增字段,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "生产任务id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "生产任务id不能为空")
private Long taskId;
@Schema(description = "bom明细id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "bom明细id不能为空")
private Long bomDetailId;
@Schema(description = "负责人")
private String owner;
@Schema(description = "要求完成日期")
private LocalDateTime requireEndDate;
}

@ -35,6 +35,9 @@ public class TaskDispatchPageReqVO extends PageParam {
@Schema(description = "子项目id", example = "21985") @Schema(description = "子项目id", example = "21985")
private Long projectSubId; private Long projectSubId;
@Schema(description = "车间id", example = "21985")
private Long workshopId;
@Schema(description = "bom明细id", example = "15969") @Schema(description = "bom明细id", example = "15969")
private Long bomDetailId; private Long bomDetailId;

@ -43,6 +43,9 @@ public class TaskDispatchRespVO {
@ExcelProperty("子项目id") @ExcelProperty("子项目id")
private Long projectSubId; private Long projectSubId;
@Schema(description = "车间id", example = "21985")
private Long workshopId;
@Schema(description = "bom明细id", example = "15969") @Schema(description = "bom明细id", example = "15969")
@ExcelProperty("bom明细id") @ExcelProperty("bom明细id")
private Long bomDetailId; private Long bomDetailId;

@ -36,6 +36,10 @@ public class TaskDispatchSaveReqVO {
@NotNull(message = "子项目id不能为空") @NotNull(message = "子项目id不能为空")
private Long projectSubId; private Long projectSubId;
@Schema(description = "车间id", example = "21985")
@NotNull(message = "车间id不能为空")
private Long workshopId;
@Schema(description = "bom明细id", example = "15969") @Schema(description = "bom明细id", example = "15969")
private Long bomDetailId; private Long bomDetailId;

@ -0,0 +1,52 @@
package com.chanko.yunxi.mes.module.biz.dal.dataobject.plan;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.time.LocalDateTime;
/**
* DO
*
* @author
*/
@TableName("project_plan_workshop")
@KeySequence("project_plan_workshop_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PlanWorkshopDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
* id
*/
private Long projectPlanId;
/**
* id
*/
private Long projectId;
/**
* id
*/
private Long workshopId;
/**
*
*/
private LocalDateTime startTime;
/**
*
*/
private LocalDateTime endTime;
}

@ -1,82 +0,0 @@
package com.chanko.yunxi.mes.module.biz.dal.dataobject.plantask;
import cn.hutool.core.date.DateTime;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
/**
* DO
*
* @author
*/
@TableName("project_plan_task")
@KeySequence("project_plan_task_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PlanTaskDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
* id
*/
private Long projectId;
/**
* id
*/
private Long projectPlanId;
/**
* id
*/
private Long projectPlanSubId;
/**
* bomid
*/
private Long processBomId;
/**
*
*/
private String taskNo;
/**
* bom
*/
private Integer bomVersion;
/**
*
*/
private String description;
/**
* ,123 1
*/
private Integer status;
@TableField(exist = false)
private String customerName;
@TableField(exist = false)
private String projectCode;
@TableField(exist = false)
private String projectName;
@TableField(exist = false)
private LocalDateTime projectEndTime;
@TableField(exist = false)
private String planNo;
@TableField(exist = false)
private String projectSubCode;
@TableField(exist = false)
private String projectSubName;
@TableField(exist = false)
private String bomCode;
@TableField(exist = false)
private Integer orderSubAmount;
}

@ -1,94 +0,0 @@
package com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.time.LocalDateTime;
/**
* Bom DO
*
* @author
*/
@TableName("project_plan_task_bom")
@KeySequence("project_plan_task_bom_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PlanTaskBomDO extends BaseDO {
/**
*
*/
@TableId
private Long id;
/**
* id
*/
private Long taskId;
/**
* bomid
*/
private Long bomDetailId;
/**
*
*/
private String owner;
/**
*
*/
private LocalDateTime requireEndDate;
@TableField(exist = false)
private String materialName;
@TableField(exist = false)
private String compositionName;
@TableField(exist = false)
private String blueprintNo;
@TableField(exist = false)
private String type;
/**
* id
*/
@TableField(exist = false)
private Long materialId;
/**
*
*/
@TableField(exist = false)
private String materialCode;
/**
* id
*/
@TableField(exist = false)
private Long compositionId;
/**
*
*/
@TableField(exist = false)
private String spec;
/**
*
*/
@TableField(exist = false)
private String unit;
/**
*
*/
@TableField(exist = false)
private Integer amount;
@TableField(exist = false)
private String ownerName;
}

@ -5,6 +5,7 @@ import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import lombok.*; import lombok.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Set; import java.util.Set;
/** /**
@ -121,4 +122,28 @@ public class ProjectOrderSubDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private String spec; private String spec;
@TableField(exist = false)
private String projectExternalCode;
@TableField(exist = false)
private String planCode;
@TableField(exist = false)
private String productionStatus;
@TableField(exist = false)
private LocalDateTime projectStartTime;
@TableField(exist = false)
private LocalDateTime projectEndTime;
@TableField(exist = false)
private String workshopName;
@TableField(exist = false)
private String procedureName;
@TableField(exist = false)
private Integer restDays;
} }

@ -57,6 +57,10 @@ public class TaskDispatchDO extends BaseDO {
* id * id
*/ */
private Long projectSubId; private Long projectSubId;
/**
* id
*/
private Long workshopId;
/** /**
* bomid * bomid
*/ */

@ -0,0 +1,25 @@
package com.chanko.yunxi.mes.module.biz.dal.mysql.plan;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanWorkshopDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* Mapper
*
* @author
*/
@Mapper
public interface PlanWorkshopMapper extends BaseMapperX<PlanWorkshopDO> {
default List<PlanWorkshopDO> selectListByProjectPlanId(Long projectPlanId) {
return selectList(PlanWorkshopDO::getProjectPlanId, projectPlanId);
}
default int deleteByProjectPlanId(Long projectPlanId) {
return delete(PlanWorkshopDO::getProjectPlanId, projectPlanId);
}
}

@ -55,4 +55,12 @@ public interface PlanSubMapper extends BaseMapperX<PlanSubDO> {
return selectList(query); return selectList(query);
} }
default int deleteByProjectPlanId(Long projectPlanId) {
return delete(PlanSubDO::getProjectPlanId, projectPlanId);
}
default List<PlanSubDO> selectListByProjectPlanId(Long projectPlanId) {
return selectList(PlanSubDO::getProjectPlanId, projectPlanId);
}
} }

@ -1,84 +0,0 @@
package com.chanko.yunxi.mes.module.biz.dal.mysql.plantask;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo.PlanTaskPageReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantask.PlanTaskDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.util.StringUtils;
/**
* Mapper
*
* @author
*/
@Mapper
public interface PlanTaskMapper extends BaseMapperX<PlanTaskDO> {
default PageResult<PlanTaskDO> selectPage(PlanTaskPageReqVO reqVO) {
MPJLambdaWrapper<PlanTaskDO> query = new MPJLambdaWrapper<>();
query.selectAll(PlanTaskDO.class)
.select("e.name as customerName","p.code as projectCode","p.project_name as projectName","p.project_end_time as projectEndTime")
.select("pl.plan_no as planNo","ps.project_sub_code as projectSubCode","po.name as projectSubName","concat('BOM-', ps.project_sub_code) as bomCode")
.select("po.amount as orderSubAmount")
.leftJoin(PlanDO.class, "pl", PlanDO::getId, PlanTaskDO::getProjectPlanId)
.leftJoin(PlanSubDO.class, "ps", PlanSubDO::getId, PlanTaskDO::getProjectPlanSubId)
.leftJoin(ProjectOrderDO.class, "p", ProjectOrderDO::getId, PlanTaskDO::getProjectId)
.leftJoin(ProjectOrderSubDO.class, "po", ProjectOrderSubDO::getId, PlanSubDO::getProjectSubId)
.leftJoin(CustomerDO.class, "e", CustomerDO::getId, ProjectOrderDO::getCustomerId)
.leftJoin(ProcessBomDO.class, "pb", ProcessBomDO::getId, PlanTaskDO::getProcessBomId)
.disableSubLogicDel()
.orderByDesc(PlanTaskDO::getCreateTime);
query.like(!StringUtils.isEmpty(reqVO.getTaskNo()), PlanTaskDO::getTaskNo, reqVO.getTaskNo())
.like(!StringUtils.isEmpty(reqVO.getProjectCode()), "p.code", reqVO.getProjectCode())
.like(!StringUtils.isEmpty(reqVO.getCustomerName()), "e.name", reqVO.getCustomerName())
.like(!StringUtils.isEmpty(reqVO.getProjectName()), "p.project_name", reqVO.getProjectName())
.like(!StringUtils.isEmpty(reqVO.getPlanNo()), "pl.plan_no", reqVO.getPlanNo())
.like(!StringUtils.isEmpty(reqVO.getProjectSubCode()), "ps.project_sub_code", reqVO.getProjectSubCode())
.like(!StringUtils.isEmpty(reqVO.getProjectSubName()), "po.name", reqVO.getProjectSubName())
.eq(reqVO.getStatus() != null, PlanTaskDO::getStatus, reqVO.getStatus());
return selectPage(reqVO, query);
// return selectPage(reqVO, new LambdaQueryWrapperX<PlanTaskDO>()
// .eqIfPresent(PlanTaskDO::getId, reqVO.getId())
// .eqIfPresent(PlanTaskDO::getProjectId, reqVO.getProjectId())
// .eqIfPresent(PlanTaskDO::getProjectPlanId, reqVO.getProjectPlanId())
// .eqIfPresent(PlanTaskDO::getProjectPlanSubId, reqVO.getProjectPlanSubId())
// .eqIfPresent(PlanTaskDO::getProcessBomId, reqVO.getProcessBomId())
// .eqIfPresent(PlanTaskDO::getTaskNo, reqVO.getTaskNo())
// .eqIfPresent(PlanTaskDO::getBomVersion, reqVO.getBomVersion())
// .eqIfPresent(PlanTaskDO::getDescription, reqVO.getDescription())
// .eqIfPresent(PlanTaskDO::getStatus, reqVO.getStatus())
// .betweenIfPresent(PlanTaskDO::getCreateTime, reqVO.getCreateTime())
// .orderByDesc(PlanTaskDO::getId));
}
default PlanTaskDO selectById(Long id) {
MPJLambdaWrapper<PlanTaskDO> query = new MPJLambdaWrapper<>();
query.selectAll(PlanTaskDO.class)
.select("e.name as customerName","p.code as projectCode","p.project_name as projectName","p.project_end_time as projectEndTime")
.select("pl.plan_no as planNo","ps.project_sub_code as projectSubCode","po.name as projectSubName","concat('BOM-', ps.project_sub_code) as bomCode")
.select("po.amount as orderSubAmount")
.leftJoin(PlanDO.class, "pl", PlanDO::getId, PlanTaskDO::getProjectPlanId)
.leftJoin(PlanSubDO.class, "ps", PlanSubDO::getId, PlanTaskDO::getProjectPlanSubId)
.leftJoin(ProjectOrderDO.class, "p", ProjectOrderDO::getId, PlanTaskDO::getProjectId)
.leftJoin(ProjectOrderSubDO.class, "po", ProjectOrderSubDO::getId, PlanSubDO::getProjectSubId)
.leftJoin(CustomerDO.class, "e", CustomerDO::getId, ProjectOrderDO::getCustomerId)
.leftJoin(ProcessBomDO.class, "pb", ProcessBomDO::getId, PlanTaskDO::getProcessBomId)
.eq(PlanTaskDO::getId, id)
.last("LIMIT 1")
.disableSubLogicDel();
return selectOne(query);
}
}

@ -1,58 +0,0 @@
package com.chanko.yunxi.mes.module.biz.dal.mysql.plantaskbom;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo.PlanTaskBomPageReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.composition.CompositionDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantask.PlanTaskDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom.PlanTaskBomDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.util.StringUtils;
/**
* Bom Mapper
*
* @author
*/
@Mapper
public interface PlanTaskBomMapper extends BaseMapperX<PlanTaskBomDO> {
default PageResult<PlanTaskBomDO> selectPage(PlanTaskBomPageReqVO reqVO) {
MPJLambdaWrapper<PlanTaskBomDO> query = new MPJLambdaWrapper<>();
query.selectAll(PlanTaskBomDO.class)
.select("f.material_name as materialName", "f.blueprint_no as blueprintNo")
.select("f.type as type","f.material_id as materialId","f.material_code as materialCode")
.select("f.composition_id as compositionId","f.spec as spec","f.unit as unit","f.amount*c.amount as amount")
.select("g.name as compositionName")
.select("u1.nickname as ownerName")
.leftJoin(PlanTaskDO.class, "a", PlanTaskDO::getId, PlanTaskBomDO::getTaskId)
.leftJoin(PlanSubDO.class, "b", PlanSubDO::getId, PlanTaskDO::getProjectPlanSubId)
.leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, PlanSubDO::getProjectSubId)
.leftJoin(ProjectOrderDO.class, "d", ProjectOrderDO::getId, PlanTaskDO::getProjectId)
.leftJoin(ProcessBomDetailDO.class, "f", ProcessBomDetailDO::getId, PlanTaskBomDO::getBomDetailId)
.leftJoin(CompositionDO.class,"g", CompositionDO::getId, ProcessBomDetailDO::getCompositionId)
.leftJoin(AdminUserDO.class, "u1", AdminUserDO::getId, PlanTaskBomDO::getOwner)
.disableSubLogicDel();
if(reqVO.getSortByBlueprintNo() != null && reqVO.getSortByBlueprintNo()){
query.orderByAsc(ProcessBomDetailDO::getBlueprintNo);
}else{
query.orderByDesc(PlanTaskBomDO::getId);
}
query.eq(reqVO.getTaskId() != null, PlanTaskDO::getId, reqVO.getTaskId())
.eq(reqVO.getProjectId() != null, PlanTaskDO::getProjectId, reqVO.getProjectId())
.eq(reqVO.getProjectSubId() != null, ProjectOrderSubDO::getId, reqVO.getProjectSubId())
.eq(!StringUtils.isEmpty(reqVO.getMaterialType()), ProcessBomDetailDO::getType, reqVO.getMaterialType())
.eq(reqVO.getProjectPlanId() != null, PlanTaskDO::getProjectPlanId, reqVO.getProjectPlanId())
.eq(reqVO.getProjectPlanSubId() != null, PlanTaskDO::getProjectPlanSubId, reqVO.getProjectPlanSubId())
;
return selectPage(reqVO, query);
}
}

@ -11,8 +11,12 @@ import com.chanko.yunxi.mes.module.biz.dal.dataobject.equip.EquipDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.material.MaterialDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.procedure.ProcedureDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskreport.TaskReportDO;
import com.chanko.yunxi.mes.module.biz.enums.BusinessTypeEnum; import com.chanko.yunxi.mes.module.biz.enums.BusinessTypeEnum;
import com.chanko.yunxi.mes.module.biz.enums.ProjectOrderStatusEnum; import com.chanko.yunxi.mes.module.biz.enums.ProjectOrderStatusEnum;
import com.chanko.yunxi.mes.module.biz.enums.YesOrNoEnum; import com.chanko.yunxi.mes.module.biz.enums.YesOrNoEnum;
@ -122,10 +126,19 @@ public interface ProjectOrderSubMapper extends BaseMapperX<ProjectOrderSubDO> {
default PageResult<ProjectOrderSubDO> selectProjectScheduleTrackPage(ProjectOrderPageReqVO reqVO) { default PageResult<ProjectOrderSubDO> selectProjectScheduleTrackPage(ProjectOrderPageReqVO reqVO) {
MPJLambdaWrapper<ProjectOrderSubDO> query = new MPJLambdaWrapper<>(); MPJLambdaWrapper<ProjectOrderSubDO> query = new MPJLambdaWrapper<>();
query.selectAll(ProjectOrderSubDO.class) query.selectAll(ProjectOrderSubDO.class)
.leftJoin(ProjectOrderSubDO.class, "a", ProjectOrderSubDO::getProjectOrderId, ProjectOrderDO::getId) .select("a.code projectCode", "a.external_code as externalCode", "a.project_end_time as projectEndTime")
.select("DateDiff(a.project_end_time,CURRENT_DATE) as restDays")
.select("b.plan_no as planCode")
.select("d.name as projectSubName", "d.code as projectSubCode")
.select("COALESCE(SUM(h.amount), 0) as reportAmount")
.leftJoin(ProjectOrderDO.class, "a", ProjectOrderDO::getId, ProjectOrderSubDO::getProjectId)
.leftJoin(PlanDO.class, "b", PlanDO::getProjectId, ProjectOrderDO::getId) .leftJoin(PlanDO.class, "b", PlanDO::getProjectId, ProjectOrderDO::getId)
.leftJoin(CustomerDO.class, "c", CustomerDO::getId, ProjectOrderDO::getCustomerId) .leftJoin(CustomerDO.class, "c", CustomerDO::getId, ProjectOrderDO::getCustomerId)
.leftJoin(MaterialDO.class, "d", MaterialDO::getId, ProjectOrderSubDO::getMaterialId) .leftJoin(MaterialDO.class, "d", MaterialDO::getId, ProjectOrderSubDO::getMaterialId)
.leftJoin(TaskDispatchDO.class, "e", TaskDispatchDO::getProjectSubId, ProjectOrderSubDO::getId)
.leftJoin(TaskDispatchDetailDO.class, "f", TaskDispatchDetailDO::getDispatchId, TaskDispatchDO::getId)
.leftJoin(ProcedureDO.class, "g", Wrapper -> Wrapper.eq(ProcedureDO::getId, TaskDispatchDetailDO::getProcedureId).eq(ProcedureDO::getIsFinal, YesOrNoEnum.Y.getCode()))
.leftJoin(TaskReportDO.class, "h", Wrapper -> Wrapper.eq(TaskReportDO::getDispatchDetailId, TaskDispatchDetailDO::getId).eq(TaskReportDO::getHasReport, YesOrNoEnum.Y.getCode()))
.disableSubLogicDel() .disableSubLogicDel()
.groupBy(ProjectOrderSubDO::getId) .groupBy(ProjectOrderSubDO::getId)
.orderByAsc(ProjectOrderDO::getProjectEndTime); .orderByAsc(ProjectOrderDO::getProjectEndTime);

@ -6,15 +6,12 @@ import com.chanko.yunxi.mes.module.biz.controller.admin.taskdispatch.vo.TaskDisp
import com.chanko.yunxi.mes.module.biz.dal.dataobject.composition.CompositionDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.composition.CompositionDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantask.PlanTaskDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom.PlanTaskBomDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processdesign.ProcessDesignDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.processdesign.ProcessDesignDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDO;
import com.chanko.yunxi.mes.module.biz.enums.TaskDispatchTypeEnum; import com.chanko.yunxi.mes.module.biz.enums.TaskDispatchTypeEnum;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -36,9 +33,6 @@ public interface TaskDispatchMapper extends BaseMapperX<TaskDispatchDO> {
.select("f.material_name as materialName", "f.composition_id as compositionId", "f.spec", "f.blueprint_no as blueprintNo") .select("f.material_name as materialName", "f.composition_id as compositionId", "f.spec", "f.blueprint_no as blueprintNo")
.select("case when t.dispatch_type='"+ TaskDispatchTypeEnum.ASSEMBLE.name() +"' then c.unit else f.unit end unit", "case when t.dispatch_type='"+ TaskDispatchTypeEnum.ASSEMBLE.name() +"' then c.amount else f.amount*c.amount end amount") .select("case when t.dispatch_type='"+ TaskDispatchTypeEnum.ASSEMBLE.name() +"' then c.unit else f.unit end unit", "case when t.dispatch_type='"+ TaskDispatchTypeEnum.ASSEMBLE.name() +"' then c.amount else f.amount*c.amount end amount")
.select("g.name as compositionName") .select("g.name as compositionName")
.select("h.task_no as taskCode")
.select("i.require_end_date as requiredCompletedDate")
.select("u1.nickname as ownerName")
.leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessDesignDO::getPlanId) .leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessDesignDO::getPlanId)
.leftJoin("project_plan_sub b on b.project_plan_id = t.plan_id and b.project_sub_id = t.project_sub_id") .leftJoin("project_plan_sub b on b.project_plan_id = t.plan_id and b.project_sub_id = t.project_sub_id")
.leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, ProcessDesignDO::getProjectSubId) .leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, ProcessDesignDO::getProjectSubId)
@ -46,9 +40,6 @@ public interface TaskDispatchMapper extends BaseMapperX<TaskDispatchDO> {
.leftJoin(CustomerDO.class, "e", CustomerDO::getId, ProjectOrderDO::getCustomerId) .leftJoin(CustomerDO.class, "e", CustomerDO::getId, ProjectOrderDO::getCustomerId)
.leftJoin(ProcessBomDetailDO.class, "f", ProcessBomDetailDO::getId, TaskDispatchDO::getBomDetailId) .leftJoin(ProcessBomDetailDO.class, "f", ProcessBomDetailDO::getId, TaskDispatchDO::getBomDetailId)
.leftJoin(CompositionDO.class,"g", CompositionDO::getId, ProcessBomDetailDO::getCompositionId) .leftJoin(CompositionDO.class,"g", CompositionDO::getId, ProcessBomDetailDO::getCompositionId)
.leftJoin(PlanTaskDO.class, "h", PlanTaskDO::getId, TaskDispatchDO::getTaskId)
.leftJoin(PlanTaskBomDO.class, "i", wrapper -> wrapper.eq(PlanTaskBomDO::getTaskId, PlanTaskDO::getId).eq(PlanTaskBomDO::getBomDetailId, TaskDispatchDO::getBomDetailId))
.leftJoin(AdminUserDO.class, "u1", AdminUserDO::getId, PlanTaskBomDO::getOwner)
.orderByDesc(TaskDispatchDO::getId) .orderByDesc(TaskDispatchDO::getId)
.disableSubLogicDel(); .disableSubLogicDel();
@ -61,7 +52,6 @@ public interface TaskDispatchMapper extends BaseMapperX<TaskDispatchDO> {
.eq(reqVO.getDispatchStatus() != null, TaskDispatchDO::getDispatchStatus, reqVO.getDispatchStatus()) .eq(reqVO.getDispatchStatus() != null, TaskDispatchDO::getDispatchStatus, reqVO.getDispatchStatus())
.eq(!StringUtils.isEmpty(reqVO.getDispatchType()), TaskDispatchDO::getDispatchType, reqVO.getDispatchType()) .eq(!StringUtils.isEmpty(reqVO.getDispatchType()), TaskDispatchDO::getDispatchType, reqVO.getDispatchType())
.like(!StringUtils.isEmpty(reqVO.getOwnerName()), "u1.nickname", reqVO.getOwnerName()) .like(!StringUtils.isEmpty(reqVO.getOwnerName()), "u1.nickname", reqVO.getOwnerName())
.like(!StringUtils.isEmpty(reqVO.getTaskCode()), PlanTaskDO::getTaskNo, reqVO.getTaskCode())
.like(!StringUtils.isEmpty(reqVO.getPlanCode()), PlanDO::getPlanNo, reqVO.getPlanCode()) .like(!StringUtils.isEmpty(reqVO.getPlanCode()), PlanDO::getPlanNo, reqVO.getPlanCode())
; ;
return selectPage(reqVO, query); return selectPage(reqVO, query);
@ -76,9 +66,6 @@ public interface TaskDispatchMapper extends BaseMapperX<TaskDispatchDO> {
.select("f.material_name as materialName", "f.composition_id as compositionId", "f.spec", "f.blueprint_no as blueprintNo") .select("f.material_name as materialName", "f.composition_id as compositionId", "f.spec", "f.blueprint_no as blueprintNo")
.select("case when t.dispatch_type='"+ TaskDispatchTypeEnum.ASSEMBLE.name() +"' then c.unit else f.unit end unit", "case when t.dispatch_type='"+ TaskDispatchTypeEnum.ASSEMBLE.name() +"' then c.amount else f.amount*c.amount end amount") .select("case when t.dispatch_type='"+ TaskDispatchTypeEnum.ASSEMBLE.name() +"' then c.unit else f.unit end unit", "case when t.dispatch_type='"+ TaskDispatchTypeEnum.ASSEMBLE.name() +"' then c.amount else f.amount*c.amount end amount")
.select("g.name as compositionName") .select("g.name as compositionName")
.select("h.task_no as taskCode")
.select("i.require_end_date as requiredCompletedDate")
.select("u1.nickname as ownerName")
.leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessDesignDO::getPlanId) .leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessDesignDO::getPlanId)
.leftJoin("project_plan_sub b on b.project_plan_id = t.plan_id and b.project_sub_id = t.project_sub_id") .leftJoin("project_plan_sub b on b.project_plan_id = t.plan_id and b.project_sub_id = t.project_sub_id")
.leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, ProcessDesignDO::getProjectSubId) .leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, ProcessDesignDO::getProjectSubId)
@ -86,9 +73,6 @@ public interface TaskDispatchMapper extends BaseMapperX<TaskDispatchDO> {
.leftJoin(CustomerDO.class, "e", CustomerDO::getId, ProjectOrderDO::getCustomerId) .leftJoin(CustomerDO.class, "e", CustomerDO::getId, ProjectOrderDO::getCustomerId)
.leftJoin(ProcessBomDetailDO.class, "f", ProcessBomDetailDO::getId, TaskDispatchDO::getBomDetailId) .leftJoin(ProcessBomDetailDO.class, "f", ProcessBomDetailDO::getId, TaskDispatchDO::getBomDetailId)
.leftJoin(CompositionDO.class,"g", CompositionDO::getId, ProcessBomDetailDO::getCompositionId) .leftJoin(CompositionDO.class,"g", CompositionDO::getId, ProcessBomDetailDO::getCompositionId)
.leftJoin(PlanTaskDO.class, "h", PlanTaskDO::getId, TaskDispatchDO::getTaskId)
.leftJoin(PlanTaskBomDO.class, "i", wrapper -> wrapper.eq(PlanTaskBomDO::getTaskId, PlanTaskDO::getId).eq(PlanTaskBomDO::getBomDetailId, TaskDispatchDO::getBomDetailId))
.leftJoin(AdminUserDO.class, "u1", AdminUserDO::getId, PlanTaskBomDO::getOwner)
.eq(TaskDispatchDO::getId, id) .eq(TaskDispatchDO::getId, id)
.last("LIMIT 1") .last("LIMIT 1")
.disableSubLogicDel(); .disableSubLogicDel();

@ -7,28 +7,6 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum; import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService; import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
import com.chanko.yunxi.mes.module.biz.dal.mysql.deliverorder.DeliverOrderSubMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.material.MaterialMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.outsourcestock.OutsourceStockDetailMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.outsourcestock.OutsourceStockMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plantask.PlanTaskMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plantaskbom.PlanTaskBomMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.procedure.ProcedureMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.processbom.ProcessBomMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.processdesign.ProcessDesignMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderSubMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.purchaseorder.PurchaseOrderMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.storage.StorageMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.storagelog.StorageLogMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.storagemat.StorageMatMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.taskdispatch.TaskDispatchMapper;
import com.chanko.yunxi.mes.module.biz.service.plan.PlanService;
import com.chanko.yunxi.mes.module.biz.service.processbom.ProcessBomService;
import com.chanko.yunxi.mes.module.biz.service.processdesign.ProcessDesignService;
import com.chanko.yunxi.mes.module.biz.service.storage.StorageService;
import com.chanko.yunxi.mes.module.biz.service.taskdispatch.TaskDispatchService;
import com.chanko.yunxi.mes.module.biz.controller.admin.deliverorder.vo.DeliverOrderSaveReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.deliverorder.vo.DeliverOrderSaveReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.processbom.vo.ProcessBomSaveReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.processbom.vo.ProcessBomSaveReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.processdesign.vo.ProcessDesignSaveReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.processdesign.vo.ProcessDesignSaveReqVO;
@ -38,22 +16,33 @@ import com.chanko.yunxi.mes.module.biz.dal.dataobject.deliverorder.DeliverOrderD
import com.chanko.yunxi.mes.module.biz.dal.dataobject.deliverorder.DeliverOrderSubDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.deliverorder.DeliverOrderSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.material.MaterialDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.outsourcestock.OutsourceStockDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.outsourcestock.OutsourceStockDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.outsourcestock.OutsourceStockDetailDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantask.PlanTaskDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom.PlanTaskBomDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.procedure.ProcedureDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.procedure.ProcedureDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processdesign.ProcessDesignDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.processdesign.ProcessDesignDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.purchaseorder.PurchaseOrderDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storage.StorageDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.storage.StorageDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storagelog.StorageLogDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.storagemat.StorageMatDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.storagemat.StorageMatDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.taskdispatch.TaskDispatchDO;
import com.chanko.yunxi.mes.module.biz.dal.mysql.deliverorder.DeliverOrderSubMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.material.MaterialMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.outsourcestock.OutsourceStockMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.procedure.ProcedureMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.processbom.ProcessBomMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.processdesign.ProcessDesignMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderSubMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.storage.StorageMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.storagelog.StorageLogMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.storagemat.StorageMatMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.taskdispatch.TaskDispatchMapper;
import com.chanko.yunxi.mes.module.biz.enums.*; import com.chanko.yunxi.mes.module.biz.enums.*;
import com.chanko.yunxi.mes.module.biz.service.plan.PlanService;
import com.chanko.yunxi.mes.module.biz.service.processbom.ProcessBomService;
import com.chanko.yunxi.mes.module.biz.service.processdesign.ProcessDesignService;
import com.chanko.yunxi.mes.module.biz.service.storage.StorageService;
import com.chanko.yunxi.mes.module.biz.service.taskdispatch.TaskDispatchService;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -61,7 +50,10 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.module.biz.enums.CodeEnum.STOCK_IN; import static com.chanko.yunxi.mes.module.biz.enums.CodeEnum.STOCK_IN;
@ -104,23 +96,13 @@ public class CrossOrderManager {
@Resource @Resource
private TaskDispatchMapper taskDispatchMapper; private TaskDispatchMapper taskDispatchMapper;
@Resource @Resource
private PlanTaskMapper planTaskMapper;
@Resource
private PlanTaskBomMapper planTaskBomMapper;
@Resource
private TaskDispatchService taskDispatchService; private TaskDispatchService taskDispatchService;
@Resource @Resource
private PlanSubMapper planSubMapper;
@Resource
private ProcedureMapper procedureMapper; private ProcedureMapper procedureMapper;
@Resource @Resource
private OutsourceStockMapper outsourceStockMapper; private OutsourceStockMapper outsourceStockMapper;
@Resource @Resource
private OutsourceStockDetailMapper outsourceStockDetailMapper;
@Resource
private StorageService storageService; private StorageService storageService;
@Resource
private PurchaseOrderMapper purchaseOrderMapper;
/** /**
* *
@ -328,22 +310,10 @@ public class CrossOrderManager {
planService.updatePlanStatusToTerminateByProjectId(projectId); planService.updatePlanStatusToTerminateByProjectId(projectId);
// 同时更新工艺设计状态 // 同时更新工艺设计状态
updateProcessDesignStatusToTerminate(projectId); updateProcessDesignStatusToTerminate(projectId);
// 同时更新生产任务状态
updatePlanTaskStatusToTerminate(projectId);
// 同时更新派工任务状态 // 同时更新派工任务状态
updateTaskDispatchStatusToTerminate(projectId); updateTaskDispatchStatusToTerminate(projectId);
} }
/**
*
* @param projectId
*/
public void updatePlanTaskStatusToTerminate(Long projectId) {
UpdateWrapper<PlanTaskDO> update = new UpdateWrapper<>();
update.eq("project_id", projectId).set("status", TaskDispatchStatusEnum.TERMINATE.getCode());
planTaskMapper.update(update);
}
/** /**
* *
* @param projectId * @param projectId
@ -420,58 +390,6 @@ public class CrossOrderManager {
} }
/**
*
* @param planTaskId
*/
@Transactional(rollbackFor = Exception.class)
public void generateProductionTaskDispatch(Long planTaskId){
// 锁住任务数据
PlanTaskDO planTaskDO = planTaskMapper.selectOne(new LambdaQueryWrapper<PlanTaskDO>() {{
eq(PlanTaskDO::getId, planTaskId).last("LIMIT 1 FOR UPDATE");
}});
PlanSubDO planSubDO = planSubMapper.selectById(planTaskDO.getProjectPlanSubId());
// 获取非标准件明细
MPJLambdaWrapper<PlanTaskBomDO> query = new MPJLambdaWrapper<>();
query.selectAll(PlanTaskBomDO.class)
.leftJoin(PlanTaskDO.class, "a", PlanTaskDO::getId, PlanTaskBomDO::getTaskId)
.leftJoin(ProcessBomDetailDO.class, "b", ProcessBomDetailDO::getId, PlanTaskBomDO::getBomDetailId)
;
query.eq(PlanTaskDO::getId, planTaskId).ne(ProcessBomDetailDO::getType, YesOrNoEnum.Y.getCode());
List<PlanTaskBomDO> planTaskBomDOList = planTaskBomMapper.selectList(query);
if(planTaskBomDOList != null && !planTaskBomDOList.isEmpty()){
// 是否已生成派工任务
List<TaskDispatchDO> generatedTaskDispatchList = taskDispatchMapper.selectList(new LambdaQueryWrapper<TaskDispatchDO>() {{
eq(TaskDispatchDO::getDispatchType, TaskDispatchTypeEnum.PRODUCTION.name())
.in(TaskDispatchDO::getBomDetailId, planTaskBomDOList.stream().map(PlanTaskBomDO::getBomDetailId).collect(Collectors.toSet()));
}});
if(generatedTaskDispatchList.size() == planTaskBomDOList.size()){
return;
}
if(generatedTaskDispatchList.size() < planTaskBomDOList.size()){
List<PlanTaskBomDO> goingToGenerateTaskList = planTaskBomDOList.stream().filter(planTaskBomDO -> !generatedTaskDispatchList.stream().anyMatch(taskDispatchDO -> planTaskBomDO.getBomDetailId().longValue() == taskDispatchDO.getBomDetailId().longValue())).collect(Collectors.toList());
// 生成派工单
goingToGenerateTaskList.forEach(planTaskBomDO -> {
TaskDispatchSaveReqVO taskDispatchSaveReqVO = new TaskDispatchSaveReqVO();
taskDispatchSaveReqVO.setDispatchType(TaskDispatchTypeEnum.PRODUCTION.name())
.setTaskId(planTaskId)
.setPlanId(planTaskDO.getProjectPlanId())
.setProjectId(planTaskDO.getProjectId())
.setProjectSubId(planSubDO.getProjectSubId())
.setBomDetailId(planTaskBomDO.getBomDetailId())
.setActive(OperateTypeEnum.SAVE.name())
.setDispatchStatus(TaskDispatchStatusEnum.SAVE.getCode())
.setStatus(ValidStatusEnum.VALID.getCode());
taskDispatchService.createTaskDispatch(taskDispatchSaveReqVO);
});
}
}
}
/** /**
* *
* @param projectId * @param projectId

@ -4,8 +4,11 @@ import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanPageReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanSaveReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanSaveReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanWorkshopDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List;
/** /**
* Service * Service
@ -59,4 +62,22 @@ public interface PlanService {
void updatePlanStatusToTerminateByProjectId(Long projectId); void updatePlanStatusToTerminateByProjectId(Long projectId);
/**
*
*
* @param projectPlanId id
* @return
*/
List<PlanSubDO> getPlanSubListByProjectPlanId(Long projectPlanId);
// ==================== 子表(生产计划车间计划) ====================
/**
*
*
* @param projectPlanId id
* @return
*/
List<PlanWorkshopDO> getPlanWorkshopListByProjectPlanId(Long projectPlanId);
} }

@ -4,31 +4,20 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam; import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plan.PlanMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plantask.PlanTaskMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plantaskbom.PlanTaskBomMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.processbom.ProcessBomMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.projectorder.ProjectOrderMapper;
import com.chanko.yunxi.mes.module.biz.service.projectorder.ProjectOrderService;
import com.chanko.yunxi.mes.module.biz.service.serialnumber.SerialNumberService;
import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanPageReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanSaveReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.plan.vo.PlanSaveReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plansub.vo.PlanSubPageReqVO; import com.chanko.yunxi.mes.module.biz.controller.admin.plansub.vo.PlanSubPageReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plan.PlanWorkshopDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantask.PlanTaskDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom.PlanTaskBomDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.serialnumber.SerialNumberDO; import com.chanko.yunxi.mes.module.biz.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.biz.enums.BusinessTypeEnum; import com.chanko.yunxi.mes.module.biz.dal.mysql.plan.PlanMapper;
import com.chanko.yunxi.mes.module.biz.enums.ProcessBomStatusEnum; import com.chanko.yunxi.mes.module.biz.dal.mysql.plan.PlanWorkshopMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.biz.enums.ProjectPlanStatusEnum; import com.chanko.yunxi.mes.module.biz.enums.ProjectPlanStatusEnum;
import com.chanko.yunxi.mes.module.biz.service.projectorder.ProjectOrderService;
import com.chanko.yunxi.mes.module.biz.service.serialnumber.SerialNumberService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -36,7 +25,6 @@ import org.springframework.validation.annotation.Validated;
import org.thymeleaf.util.StringUtils; import org.thymeleaf.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
@ -44,7 +32,6 @@ import java.util.List;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.biz.enums.CodeEnum.PROJECT_PLAN; import static com.chanko.yunxi.mes.module.biz.enums.CodeEnum.PROJECT_PLAN;
import static com.chanko.yunxi.mes.module.biz.enums.CodeEnum.PROJECT_PLAN_TASK;
import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.PLAN_NOT_EXISTS; import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.PLAN_NOT_EXISTS;
/** /**
@ -57,12 +44,6 @@ import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.PLAN_NOT_
@Validated @Validated
public class PlanServiceImpl implements PlanService { public class PlanServiceImpl implements PlanService {
@Resource
private OperateLogFrameworkService operateLogFrameworkService;
@Resource
private HttpServletRequest request;
@Resource @Resource
private PlanMapper planMapper; private PlanMapper planMapper;
@ -76,19 +57,7 @@ public class PlanServiceImpl implements PlanService {
private SerialNumberService serialNumberService; private SerialNumberService serialNumberService;
@Resource @Resource
private ProcessBomMapper processBomMapper; private PlanWorkshopMapper planWorkshopMapper;
@Resource
private PlanTaskMapper planTaskMapper;
@Resource
private ProjectOrderMapper projectOrderMapper;
@Resource
private ProcessBomDetailMapper processBomDetailMapper;
@Resource
private PlanTaskBomMapper planTaskBomMapper;
@Override @Override
public Long createPlan(PlanSaveReqVO createReqVO) { public Long createPlan(PlanSaveReqVO createReqVO) {
@ -249,8 +218,6 @@ public class PlanServiceImpl implements PlanService {
planDO.setStatus(ProjectPlanStatusEnum.TERMINATE.getCode()); planDO.setStatus(ProjectPlanStatusEnum.TERMINATE.getCode());
planMapper.updateById(planDO); planMapper.updateById(planDO);
// 更新生产任务单状态
updatePlanTaskStatusToTerminateByPlanId(planDO.getId());
} }
} }
@ -261,161 +228,51 @@ public class PlanServiceImpl implements PlanService {
@Override @Override
public void generatePlanTaskByPlanId(Long planId){ public void generatePlanTaskByPlanId(Long planId){
// 获取生产计划 // 获取生产计划
PlanDO planDO = planMapper.selectOne(new LambdaQueryWrapper<PlanDO>() {{
eq(PlanDO::getId, planId);
orderByDesc(PlanDO::getId);
last("LIMIT 1");
}});
// 获取生产计划子项目信息
List<PlanSubDO> planSubDOS = planSubMapper.selectList(new LambdaQueryWrapper<PlanSubDO>() {{
eq(PlanSubDO::getProjectPlanId, planId);
}});
// 获取订单信息 }
ProjectOrderDO projectOrderDO = projectOrderMapper.selectOne(new LambdaQueryWrapper<ProjectOrderDO>() {{
eq(ProjectOrderDO::getId, planDO.getProjectId());
last("LIMIT 1");
}});
for(PlanSubDO item : planSubDOS){ // ==================== 子表(生产计划子项目) ====================
// 获取生产计划bom信息一个生产计划一个生产计划子项目对应一个bom信息
ProcessBomDO processBomDO = processBomMapper.selectOne(new LambdaQueryWrapper<ProcessBomDO>() {{
eq(ProcessBomDO::getProjectId, planDO.getProjectId());
eq(ProcessBomDO::getPlanId, planId);
eq(ProcessBomDO::getProjectSubId, item.getProjectSubId());
last("LIMIT 1");
}});
PlanTaskDO planTaskDO = planTaskMapper.selectOne(new LambdaQueryWrapper<PlanTaskDO>() {{
eq(PlanTaskDO::getProjectId, planDO.getProjectId());
eq(PlanTaskDO::getProjectPlanId, planId);
eq(PlanTaskDO::getProjectPlanSubId, item.getId());
if(processBomDO!=null){
eq(PlanTaskDO::getProcessBomId, processBomDO.getId());
}
last("LIMIT 1"); @Override
}}); public List<PlanSubDO> getPlanSubListByProjectPlanId(Long projectPlanId) {
return planSubMapper.selectListByProjectPlanId(projectPlanId);
// 生产计划任务单存在则更新版本号和状态,不存在则新增 }
if(planTaskDO == null){
planTaskDO = new PlanTaskDO();
// 日度流水号
SerialNumberDO serialNumberDO = new SerialNumberDO();
serialNumberDO = serialNumberService.getSerialNumber(PROJECT_PLAN_TASK.name(), new SimpleDateFormat("yyyyMMdd").format(new Date()));
serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1);
// 生产计划任务单编号PT+年月日+日度顺序号(三位流水)
planTaskDO.setTaskNo(PROJECT_PLAN_TASK.getCode(serialNumberDO.getSerialNumber().toString()));
// 项目id
planTaskDO.setProjectId(planDO.getProjectId());
// 生产计划id
planTaskDO.setProjectPlanId(planId);
// 生产计划子项目id
planTaskDO.setProjectPlanSubId(item.getId());
if(processBomDO != null) {
// bom id
planTaskDO.setProcessBomId(processBomDO.getId());
// bom 版本号
planTaskDO.setBomVersion(processBomDO.getVersion());
}
// 订单状态更新生产计划任务
planTaskDO.setStatus(projectOrderDO.getStatus());
planTaskMapper.insert(planTaskDO); private void createPlanSubList(Long projectPlanId, List<PlanSubDO> list) {
list.forEach(o -> o.setProjectPlanId(projectPlanId));
planSubMapper.insertBatch(list);
}
// 回写序列记录 private void updatePlanSubList(Long projectPlanId, List<PlanSubDO> list) {
serialNumberService.updateSerialNumber(serialNumberDO); deletePlanSubByProjectPlanId(projectPlanId);
list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下1id 冲突2updateTime 不更新
createPlanSubList(projectPlanId, list);
}
}else { private void deletePlanSubByProjectPlanId(Long projectPlanId) {
if(processBomDO != null) { planSubMapper.deleteByProjectPlanId(projectPlanId);
// bom id }
planTaskDO.setProcessBomId(processBomDO.getId());
// bom 版本号
planTaskDO.setBomVersion(processBomDO.getVersion());
}
// 订单状态更新生产计划任务
planTaskDO.setStatus(projectOrderDO.getStatus());
planTaskMapper.updateById(planTaskDO); // ==================== 子表(生产计划车间计划) ====================
}
// // 手动记录日志 @Override
// LocalDateTime startTime = LocalDateTime.now(); public List<PlanWorkshopDO> getPlanWorkshopListByProjectPlanId(Long projectPlanId) {
// operateLogFrameworkService.createOperateLog(request, return planWorkshopMapper.selectListByProjectPlanId(projectPlanId);
// startTime,
// BusinessTypeEnum.PLAN_TASK.name(),
// planTaskDO.getId(),
// OperateTypeEnum.valueOf("SAVE").getType(),
// "");
// 生成生产计划任务单加工件明细
generatePlanTaskBom(planTaskDO.getId(),processBomDO);
}
} }
/** private void createPlanWorkshopList(Long projectPlanId, List<PlanWorkshopDO> list) {
* list.forEach(o -> o.setProjectPlanId(projectPlanId));
* @param planTaskId planWorkshopMapper.insertBatch(list);
* @param processBomDO
*/
private void generatePlanTaskBom(Long planTaskId,ProcessBomDO processBomDO){
if(processBomDO != null){
// 获取bom下的加工件明细
List<ProcessBomDetailDO> processBomDetailDOS = processBomDetailMapper.selectList(
new LambdaQueryWrapper<ProcessBomDetailDO>() {{
eq(ProcessBomDetailDO::getBomId, processBomDO.getId());
}}
);
// 获取生产任务单下的加工件明细
List<PlanTaskBomDO> planTaskBomDOS = planTaskBomMapper.selectList(
new LambdaQueryWrapper<PlanTaskBomDO>() {{
eq(PlanTaskBomDO::getTaskId, planTaskId);
}}
);
for(PlanTaskBomDO record : planTaskBomDOS){
// 生产任务单下加工件是否已删除
if(!processBomDetailDOS.stream().anyMatch(a ->a.getId().equals(record.getBomDetailId()))) {
planTaskBomMapper.deleteById(record);
}
}
for(ProcessBomDetailDO record : processBomDetailDOS){
// 生产任务单下不存在该加工件,则插入,否则不处理
if(!planTaskBomDOS.stream().anyMatch(a ->a.getBomDetailId().equals(record.getId()))) {
PlanTaskBomDO planTaskBomDO = new PlanTaskBomDO();
planTaskBomDO.setTaskId(planTaskId);
planTaskBomDO.setBomDetailId(record.getId());
planTaskBomMapper.insert(planTaskBomDO);
}
}
}
} }
/** private void updatePlanWorkshopList(Long projectPlanId, List<PlanWorkshopDO> list) {
* deletePlanWorkshopByProjectPlanId(projectPlanId);
* @param planId list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下1id 冲突2updateTime 不更新
*/ createPlanWorkshopList(projectPlanId, list);
private void updatePlanTaskStatusToTerminateByPlanId(Long planId){ }
List<PlanTaskDO> planTaskDOS = planTaskMapper.selectList(new LambdaQueryWrapper<PlanTaskDO>() {{
eq(PlanTaskDO::getProjectPlanId, planId);
}});
for(PlanTaskDO task :planTaskDOS){
task.setStatus(ProjectPlanStatusEnum.TERMINATE.getCode());
planTaskMapper.updateById(task);
// 手动记录日志 private void deletePlanWorkshopByProjectPlanId(Long projectPlanId) {
LocalDateTime startTime = LocalDateTime.now(); planWorkshopMapper.deleteByProjectPlanId(projectPlanId);
operateLogFrameworkService.createOperateLog(request,
startTime,
BusinessTypeEnum.PLAN_TASK.name(),
planId,
ProcessBomStatusEnum.TERMINATE.getCode(),
"");
}
} }
} }

@ -1,65 +0,0 @@
package com.chanko.yunxi.mes.module.biz.service.plantask;
import javax.validation.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo.PlanTaskPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo.PlanTaskSaveReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantask.PlanTaskDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
/**
* Service
*
* @author
*/
public interface PlanTaskService {
/**
*
*
* @param createReqVO
* @return
*/
Long createPlanTask(@Valid PlanTaskSaveReqVO createReqVO);
/**
*
*
* @param updateReqVO
*/
void updatePlanTask(@Valid PlanTaskSaveReqVO updateReqVO);
/**
*
*
* @param id
*/
void deletePlanTask(Long id);
/**
*
*
* @param id
* @return
*/
PlanTaskDO getPlanTask(Long id);
/**
*
*
* @param pageReqVO
* @return
*/
PageResult<PlanTaskDO> getPlanTaskPage(PlanTaskPageReqVO pageReqVO);
/**
*
*
* @param id
* @return 01
*/
Integer getPlanTaskBomStatus(Long id);
Integer refreshPlanTaskByPlanId(Long planId);
}

@ -1,132 +0,0 @@
package com.chanko.yunxi.mes.module.biz.service.plantask;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo.PlanTaskPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantask.vo.PlanTaskSaveReqVO;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plantask.PlanTaskMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plantaskbom.PlanTaskBomMapper;
import com.chanko.yunxi.mes.module.biz.dal.mysql.processbom.ProcessBomMapper;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom.PlanTaskBomDO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.biz.enums.ProcessBomStatusEnum;
import com.chanko.yunxi.mes.module.biz.manager.CrossOrderManager;
import com.chanko.yunxi.mes.module.biz.service.plan.PlanServiceImpl;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantask.PlanTaskDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.*;
/**
* Service
*
* @author
*/
@Service
@Validated
public class PlanTaskServiceImpl implements PlanTaskService {
@Resource
private PlanServiceImpl planServiceImpl;
@Resource
private PlanTaskMapper planTaskMapper;
@Resource
private PlanTaskBomMapper planTaskBomMapper;
@Resource
private ProcessBomMapper processBomMapper;
@Resource
private CrossOrderManager crossOrderManager;
@Override
public Long createPlanTask(PlanTaskSaveReqVO createReqVO) {
// 插入
PlanTaskDO planTask = BeanUtils.toBean(createReqVO, PlanTaskDO.class);
planTaskMapper.insert(planTask);
// 返回
return planTask.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updatePlanTask(PlanTaskSaveReqVO updateReqVO) {
// 校验存在
validatePlanTaskExists(updateReqVO.getId());
// 更新
PlanTaskDO updateObj = BeanUtils.toBean(updateReqVO, PlanTaskDO.class);
planTaskMapper.updateById(updateObj);
// 更新加工件明细
List<PlanTaskBomDO> planTaskBomDOS= updateReqVO.getBomDetails().stream().filter(o -> o.getId() != null).collect(Collectors.toList());
if(planTaskBomDOS.stream().count()>0) {
planTaskBomMapper.updateBatch(planTaskBomDOS);
}
// 生产任务单提交同时生成派工单
if(updateObj.getStatus().equals(ProcessBomStatusEnum.SUBMIT.getCode())){
crossOrderManager.generateProductionTaskDispatch(updateObj.getId());
}
}
@Override
public void deletePlanTask(Long id) {
// 校验存在
validatePlanTaskExists(id);
// 删除
planTaskMapper.deleteById(id);
}
private void validatePlanTaskExists(Long id) {
if (planTaskMapper.selectById(id) == null) {
throw exception(PLAN_TASK_NOT_EXISTS);
}
}
@Override
public PlanTaskDO getPlanTask(Long id) {
return planTaskMapper.selectById(id);
}
@Override
public PageResult<PlanTaskDO> getPlanTaskPage(PlanTaskPageReqVO pageReqVO) {
return planTaskMapper.selectPage(pageReqVO);
}
@Override
public Integer getPlanTaskBomStatus(Long id){
// 刷新状态1为刷新0为不刷新
Integer refreshStatus = 0;
PlanTaskDO planTaskDO = planTaskMapper.selectById(id);
if(planTaskDO.getProcessBomId()==null){
// 无bomid时需要刷新
refreshStatus = 1;
}else{
ProcessBomDO processBomDO = processBomMapper.selectById(planTaskDO.getProcessBomId());
// 生产任务版本号与bom版本号不同需要刷新
if(!planTaskDO.getBomVersion().equals(processBomDO.getVersion())){
refreshStatus = 1;
}
}
return refreshStatus;
}
@Override
public Integer refreshPlanTaskByPlanId(Long planId){
planServiceImpl.generatePlanTaskByPlanId(planId);
return 1;
}
}

@ -1,55 +0,0 @@
package com.chanko.yunxi.mes.module.biz.service.plantaskbom;
import javax.validation.*;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo.PlanTaskBomPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo.PlanTaskBomSaveReqVO;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom.PlanTaskBomDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
/**
* Bom Service
*
* @author
*/
public interface PlanTaskBomService {
/**
* Bom
*
* @param createReqVO
* @return
*/
Long createPlanTaskBom(@Valid PlanTaskBomSaveReqVO createReqVO);
/**
* Bom
*
* @param updateReqVO
*/
void updatePlanTaskBom(@Valid PlanTaskBomSaveReqVO updateReqVO);
/**
* Bom
*
* @param id
*/
void deletePlanTaskBom(Long id);
/**
* Bom
*
* @param id
* @return Bom
*/
PlanTaskBomDO getPlanTaskBom(Long id);
/**
* Bom
*
* @param pageReqVO
* @return Bom
*/
PageResult<PlanTaskBomDO> getPlanTaskBomPage(PlanTaskBomPageReqVO pageReqVO);
}

@ -1,71 +0,0 @@
package com.chanko.yunxi.mes.module.biz.service.plantaskbom;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo.PlanTaskBomPageReqVO;
import com.chanko.yunxi.mes.module.biz.controller.admin.plantaskbom.vo.PlanTaskBomSaveReqVO;
import com.chanko.yunxi.mes.module.biz.dal.mysql.plantaskbom.PlanTaskBomMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import com.chanko.yunxi.mes.module.biz.dal.dataobject.plantaskbom.PlanTaskBomDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.biz.enums.ErrorCodeConstants.*;
/**
* Bom Service
*
* @author
*/
@Service
@Validated
public class PlanTaskBomServiceImpl implements PlanTaskBomService {
@Resource
private PlanTaskBomMapper planTaskBomMapper;
@Override
public Long createPlanTaskBom(PlanTaskBomSaveReqVO createReqVO) {
// 插入
PlanTaskBomDO planTaskBom = BeanUtils.toBean(createReqVO, PlanTaskBomDO.class);
planTaskBomMapper.insert(planTaskBom);
// 返回
return planTaskBom.getId();
}
@Override
public void updatePlanTaskBom(PlanTaskBomSaveReqVO updateReqVO) {
// 校验存在
validatePlanTaskBomExists(updateReqVO.getId());
// 更新
PlanTaskBomDO updateObj = BeanUtils.toBean(updateReqVO, PlanTaskBomDO.class);
planTaskBomMapper.updateById(updateObj);
}
@Override
public void deletePlanTaskBom(Long id) {
// 校验存在
validatePlanTaskBomExists(id);
// 删除
planTaskBomMapper.deleteById(id);
}
private void validatePlanTaskBomExists(Long id) {
if (planTaskBomMapper.selectById(id) == null) {
throw exception(PLAN_TASK_BOM_NOT_EXISTS);
}
}
@Override
public PlanTaskBomDO getPlanTaskBom(Long id) {
return planTaskBomMapper.selectById(id);
}
@Override
public PageResult<PlanTaskBomDO> getPlanTaskBomPage(PlanTaskBomPageReqVO pageReqVO) {
return planTaskBomMapper.selectPage(pageReqVO);
}
}

@ -54,3 +54,17 @@ export const deletePlan = async (id: number) => {
export const exportPlan = async (params) => { export const exportPlan = async (params) => {
return await request.download({ url: `/biz/plan/export-excel`, params }) return await request.download({ url: `/biz/plan/export-excel`, params })
} }
// ==================== 子表(生产计划子项目) ====================
// 获得生产计划子项目列表
export const getPlanSubListByProjectPlanId = async (projectPlanId) => {
return await request.get({ url: `/biz/plan/plan-sub/list-by-project-plan-id?projectPlanId=` + projectPlanId })
}
// ==================== 子表(生产计划车间计划) ====================
// 获得生产计划车间计划列表
export const getPlanWorkshopListByProjectPlanId = async (projectPlanId) => {
return await request.get({ url: `/biz/plan/plan-workshop/list-by-project-plan-id?projectPlanId=` + projectPlanId })
}

@ -1,54 +0,0 @@
import request from '@/config/axios'
export interface PlanTaskVO {
id: number
projectId: number
projectPlanId: number
projectPlanSubId: number
processBomId: number
taskNo: string
bomVersion: number
description: string
status: number
active:string
}
// 刷新生产计划任务单最新数据
export const refreshPlanTaskByPlanId = async (id: number) => {
return await request.get({ url: `/biz/plan-task/refresh?id=` + id })
}
// 获得bom需要更新的状态
export const getPlanTaskBomStatus = async (id: number) => {
return await request.get({ url: `/biz/plan-task/get-version-status?id=` + id })
}
// 查询生产计划任务分页
export const getPlanTaskPage = async (params) => {
return await request.get({ url: `/biz/plan-task/page`, params })
}
// 查询生产计划任务详情
export const getPlanTask = async (id: number) => {
return await request.get({ url: `/biz/plan-task/get?id=` + id })
}
// 新增生产计划任务
export const createPlanTask = async (data: PlanTaskVO) => {
return await request.post({ url: `/biz/plan-task/create`, data })
}
// 修改生产计划任务
export const updatePlanTask = async (data: PlanTaskVO) => {
return await request.put({ url: `/biz/plan-task/update`, data })
}
// 删除生产计划任务
export const deletePlanTask = async (id: number) => {
return await request.delete({ url: `/biz/plan-task/delete?id=` + id })
}
// 导出生产计划任务 Excel
export const exportPlanTask = async (params) => {
return await request.download({ url: `/biz/plan-task/export-excel`, params })
}

@ -1,39 +0,0 @@
import request from '@/config/axios'
export interface PlanTaskBomVO {
id: number
taskId: number
bomDetailId: number
owner: string
endTime: Date
}
// 查询生产计划任务Bom分页
export const getPlanTaskBomPage = async (params) => {
return await request.get({ url: `/biz/plan-task-bom/page`, params })
}
// 查询生产计划任务Bom详情
export const getPlanTaskBom = async (id: number) => {
return await request.get({ url: `/biz/plan-task-bom/get?id=` + id })
}
// 新增生产计划任务Bom
export const createPlanTaskBom = async (data: PlanTaskBomVO) => {
return await request.post({ url: `/biz/plan-task-bom/create`, data })
}
// 修改生产计划任务Bom
export const updatePlanTaskBom = async (data: PlanTaskBomVO) => {
return await request.put({ url: `/biz/plan-task-bom/update`, data })
}
// 删除生产计划任务Bom
export const deletePlanTaskBom = async (id: number) => {
return await request.delete({ url: `/biz/plan-task-bom/delete?id=` + id })
}
// 导出生产计划任务Bom Excel
export const exportPlanTaskBom = async (params) => {
return await request.download({ url: `/biz/plan-task-bom/export-excel`, params })
}

@ -0,0 +1,126 @@
<template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
v-loading="formLoading"
label-width="0px"
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="项目id" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.projectId`" :rules="formRules.projectId" class="mb-0px!">
<el-input v-model="row.projectId" placeholder="请输入项目id" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="车间id" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.workshopId`" :rules="formRules.workshopId" class="mb-0px!">
<el-input v-model="row.workshopId" placeholder="请输入车间id" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="预计开始时间" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.startTime`" :rules="formRules.startTime" class="mb-0px!">
<el-date-picker
v-model="row.startTime"
type="date"
value-format="x"
placeholder="选择预计开始时间"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="预计结束时间" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.endTime`" :rules="formRules.endTime" class="mb-0px!">
<el-date-picker
v-model="row.endTime"
type="date"
value-format="x"
placeholder="选择预计结束时间"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link></el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加生产计划车间计划</el-button>
</el-row>
</template>
<script setup lang="ts">
import * as PlanApi from '@/api/biz/plan'
const props = defineProps<{
projectPlanId: undefined // id
}>()
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
projectPlanId: [{ required: true, message: '计划id不能为空', trigger: 'blur' }],
projectId: [{ required: true, message: '项目id不能为空', trigger: 'blur' }],
workshopId: [{ required: true, message: '车间id不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.projectPlanId,
async (val) => {
// 1.
formData.value = []
// 2. val
if (!val) {
return;
}
try {
formLoading.value = true
formData.value = await PlanApi.getPlanWorkshopListByProjectPlanId(val)
} finally {
formLoading.value = false
}
},
{ immediate: true }
)
/** 新增按钮操作 */
const handleAdd = () => {
const row = {
id: undefined,
projectPlanId: undefined,
projectId: undefined,
workshopId: undefined,
startTime: undefined,
endTime: undefined,
}
row.projectPlanId = props.projectPlanId
formData.value.push(row)
}
/** 删除按钮操作 */
const handleDelete = (index) => {
formData.value.splice(index, 1)
}
/** 表单校验 */
const validate = () => {
return formRef.value.validate()
}
/** 表单值 */
const getData = () => {
return formData.value
}
defineExpose({ validate, getData })
</script>

@ -1,126 +0,0 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="项目id" prop="projectId">
<el-input v-model="formData.projectId" placeholder="请输入项目id" />
</el-form-item>
<el-form-item label="生产计划id" prop="projectPlanId">
<el-input v-model="formData.projectPlanId" placeholder="请输入生产计划id" />
</el-form-item>
<el-form-item label="生产计划子项目id" prop="projectPlanSubId">
<el-input v-model="formData.projectPlanSubId" placeholder="请输入生产计划子项目id" />
</el-form-item>
<el-form-item label="工艺bomid" prop="processBomId">
<el-input v-model="formData.processBomId" placeholder="请输入工艺bomid" />
</el-form-item>
<el-form-item label="生产计划编号,唯一" prop="taskNo">
<el-input v-model="formData.taskNo" placeholder="请输入生产计划编号,唯一" />
</el-form-item>
<el-form-item label="bom版本号" prop="bomVersion">
<el-input v-model="formData.bomVersion" placeholder="请输入bom版本号" />
</el-form-item>
<el-form-item label="备注" prop="description">
<Editor v-model="formData.description" height="150px" />
</el-form-item>
<el-form-item label="状态,1已保存2已提交3已终止 默认是1" prop="status">
<el-radio-group v-model="formData.status">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as PlanTaskApi from '@/api/biz/plantask'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
projectId: undefined,
projectPlanId: undefined,
projectPlanSubId: undefined,
processBomId: undefined,
taskNo: undefined,
bomVersion: undefined,
description: undefined,
status: undefined,
})
const formRules = reactive({
projectPlanId: [{ required: true, message: '生产计划id不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await PlanTaskApi.getPlanTask(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as PlanTaskApi.PlanTaskVO
if (formType.value === 'create') {
await PlanTaskApi.createPlanTask(data)
message.success(t('common.createSuccess'))
} else {
await PlanTaskApi.updatePlanTask(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
projectId: undefined,
projectPlanId: undefined,
projectPlanSubId: undefined,
processBomId: undefined,
taskNo: undefined,
bomVersion: undefined,
description: undefined,
status: undefined,
}
formRef.value?.resetFields()
}
</script>

@ -1,390 +0,0 @@
<template>
<el-card class="hl-card" style="position: relative">
<template #header>
<span><span v-html="dialogTitle"></span></span>
</template>
<div class="abstatus">
<img src="/src/assets/imgs/status/status64.png" v-if="formData.status == 3" alt="" />
<img src="/src/assets/imgs/status/status2.png" v-else-if="formData.status == 2" alt="" />
</div>
<el-form ref="formRef" :model="formData" label-width="160px" v-loading="formLoading">
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span>
</template>
<el-row>
<el-col :span="24">
<el-row>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="生产任务单号" prop="taskNo">
<el-input class="!w-265px" placeholder="系统自动生成" v-model="formData.taskNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="项目名称" prop="projectName">
<el-input class="!w-265px" placeholder="项目名称" v-model="formData.projectName" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="子项目数量" prop="orderSubAmount">
<el-input class="!w-265px" placeholder="" v-model="formData.orderSubAmount" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="80">
<el-form-item label="备注" prop="description">
<el-input :disabled="detailDisabled" class="!w-713px" type="textarea" v-model="formData.description" show-word-limit maxlength="200" />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="生产计划单号" prop="planNo">
<el-input class="!w-265px" placeholder="生产计划单号" v-model="formData.planNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="项目结束日期" prop="projectEndTime">
<el-date-picker class="!w-265px" v-model="formData.projectEndTime" type="date" value-format="x" placeholder="项目结束日期" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="BOM清单号" prop="bomCode">
<el-input class="!w-265px" placeholder="" v-model="formData.bomCode" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="项目编号" prop="projectCode">
<el-input class="!w-265px" placeholder="项目编号" v-model="formData.projectCode" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="子项目名称" prop="projectSubName">
<el-input class="!w-265px" placeholder="子项目名称" v-model="formData.projectSubName" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="BOM版本号" prop="bomVersion">
<el-input class="!w-265px" placeholder="BOM版本号" v-model="formData.bomVersion" disabled>
<template #append v-if="refreshStatus == 1"><el-button @click="handleReFresh" style="background-color:var(--el-color-primary); color:#fff">
<Icon icon="ep:refresh" />
</el-button></template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="单据状态" prop="status">
<el-select v-model="formData.status" placeholder="单据状态" clearable class="!w-265px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_BOM_STATUS)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="客户名称" prop="customerName">
<el-input class="!w-265px" v-model="formData.customerName" placeholder="客户名称" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="子项目编号" prop="projectSubCode">
<el-input class="!w-265px" v-model="formData.projectSubCode" placeholder="子项目编号" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker class="!w-265px" v-model="formData.createTime" type="date" value-format="x" placeholder="创建时间" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
<!-- 表格类信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">任务明细</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-form ref="subFormRef" :model="formData.bomDetails" :rules="subFormRules" v-loading="formLoading" label-width="0">
<el-table :data="formData.bomDetails" class="hl-table">
<el-table-column label="序号" type="index" width="80" />
<el-table-column label="零件名称" prop="materialName" min-width="180" />
<el-table-column label="零件编码" prop="materialCode" min-width="120" />
<el-table-column label="是否标准件" prop="typeName" min-width="200" />
<el-table-column label="材质" prop="compositionName" min-width="180" />
<el-table-column label="规格型号" prop="spec" min-width="140" />
<el-table-column label="图号" prop="blueprintNo" min-width="150" />
<el-table-column label="数量" prop="amount" min-width="150" />
<el-table-column label="系统单位" prop="unit" min-width="180">
<template #header> <span class="hl-table_header">*</span>系统单位</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unit`" class="mb-0px!">
<span v-if="row.type == '1'">{{ getDictLabel(DICT_TYPE.BIZ_MATERIAL_UNIT, row.unit) }}</span>
<el-select disabled v-else v-model="row.unit" clearable class="!w-250px">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.BIZ_MATERIAL_UNIT)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="190" align="center" fixed="right">
<template #header><span class="hl-table_header">*</span>负责人</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.owner`" class="mb-0px!" :rules="subFormRules.owner">
<UserSelect :disabled="detailDisabled" v-model="row.owner" @update:newValue="handleSelectedUser9($index, $event)" class="!w-265px" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="190" align="center" fixed="right">
<template #header><span class="hl-table_header">*</span>需求完成日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.requireEndDate`" class="mb-0px!" :rules="subFormRules.requireEndDate">
<el-date-picker :disabled="detailDisabled" class="!w-265px" v-model="row.requireEndDate" type="date" value-format="x" placeholder="需求完成日期" />
</el-form-item>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-table :data="formData.operateLogs" class="hl-table" :style="{ height: formData.operateLogs?.length > 10 ? '450px' : '' }">
<el-table-column prop="type" label="操作" align="center" width="200px">
<template #default="scope">
{{ getDictLabel(DICT_TYPE.SYSTEM_OPERATE_TYPE, scope.row.type) }}
</template>
</el-table-column>
<el-table-column prop="userNickname" label="操作人" align="center" />
<el-table-column label="操作时间" align="center" prop="startTime" width="220" :formatter="dateFormatter" />
</el-table>
</el-card>
</el-col>
</el-row>
</el-card>
</el-form>
<div class="text-center hl-footer">
<el-button @click="() => router.back()" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SAVE')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SUBMIT')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 2" @click="submitForm('CANCEL_SUBMIT')" type="danger" :disabled="formLoading" size="large"></el-button>
</div>
</el-card>
</template>
<script setup lang="ts">
import { inject } from 'vue'
import { Search, Plus } from '@element-plus/icons-vue'
import { getIntDictOptions, getStrDictOptions, getDictLabel, DICT_TYPE } from '@/utils/dict'
import { betweenDay, formatDate, dateFormatter } from '@/utils/formatTime'
import { getOperateLogPage } from '@/api/system/operatelog'
import * as PlanTaskApi from '@/api/biz/plantask'
import * as PlanTaskBomApi from '@/api/biz/plantaskbom'
import UserSelect from '@/views/biz/hlvuestyle/userSelect.vue'
const reload: any = inject('reload')
const { t } = useI18n() //
const message = useMessage() //
const { query } = useRoute()
const router = useRouter()
const formLoading = ref(false) // 12
const formRef = ref() //
const subFormRef = ref() // Ref
const formData = ref({
id: undefined,
active: undefined,
projectId: undefined,
projectPlanId: undefined,
projectPlanSubId: undefined,
processBomId: undefined,
orderSubAmount:undefined,
taskNo: undefined,
planNo: undefined,
projectCode: undefined,
customerName: undefined,
projectName: undefined,
projectEndTime: undefined,
projectSubCode: undefined,
projectSubName: undefined,
bomCode: undefined,
bomVersion: undefined,
createTime: undefined,
description: undefined,
status: undefined,
operateLogs: [],
bomDetails: []
})
const subFormRules = reactive({
owner: [{ required: true, message: '负责人不能为空', trigger: 'blur' }],
requireEndDate: [{ required: true, message: '要求完成日期不能为空', trigger: 'blur' }]
})
//
const handleSelectedMaterial = (row: any, newValue: any) => {
row.materialId = newValue.id
row.materialName = newValue.name
row.materialCode = newValue.code
row.spec = newValue.spec
row.unit = newValue.unit
}
const submitForm = async (operate) => {
//
await subFormRef.value.validate()
if (operate == 'SUBMIT' && formData.value.bomDetails.length == 0) {
message.alertWarning('任务明细不能为空')
return
}
//
formLoading.value = true
try {
formData.value.active = operate
const data = formData.value as unknown as PlanTaskApi.PlanTaskVO
data.status = operate == 'SUBMIT' ? 2 : 1
await PlanTaskApi.updatePlanTask(data)
message.success(t('common.updateSuccess'))
//
emit('success')
} finally {
formLoading.value = false
reload()
}
}
const handleReFresh = async () => {
if(formData.value.status == 2){
message.alertWarning('请先取消提交,再点击此按钮!')
return
}
//
formLoading.value = true
try {
await PlanTaskApi.refreshPlanTaskByPlanId(formData.value.projectPlanId)
} finally {
reload()
}
formLoading.value = false
}
const refreshStatus = ref()
const queryParams = reactive({
pageNo: 1,
pageSize: 99,
taskId: undefined
})
const dialogTitle = ref('')
const detailDisabled = ref(false)
const pageType = ref('')
onMounted(async () => {
pageType.value = query.type
dialogTitle.value = t('action.' + query.type)
//
formData.value = await PlanTaskApi.getPlanTask(query.id)
// bom
refreshStatus.value = await PlanTaskApi.getPlanTaskBomStatus(query.id)
queryParams.taskId = query.id
formData.value.bomDetails = (await PlanTaskBomApi.getPlanTaskBomPage(queryParams)).list
formData.value.bomDetails.forEach((item) => {
item.typeName = item.type == 1 ? '是' : '否'
if(item.owner){
item.owner = Number(item.owner)
}
})
//
let logParams = {
pageNo: 1,
pageSize: 99,
businessId: formData.value.id,
businessType: 'PLAN_TASK'
}
formData.value.operateLogs = (await getOperateLogPage(logParams)).list
if ('detail' == query.type || formData.value.status == 2) {
detailDisabled.value = true
}
})
//
const handleSelectedUser9 = (currentIndex, newValue: any) => {
formData.value.bomDetails[currentIndex].owner = newValue?.id
}
</script>
<style>
a {
color: #409eff;
text-decoration: none;
}
.upload-file-uploader {
margin-bottom: 10px;
display: inline-block;
margin-right: 20px;
}
.hl-card .alter-class {
position: relative;
border: solid 1px orange;
outline: solid 1px orange;
}
.el-form-item__content {
margin-left: 0px !important;
}
</style>

@ -1,179 +0,0 @@
<template>
<el-card class="hl-card">
<template #header>
<span>生产任务单</span>
</template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px">
<el-form-item label="生产任务单号" prop="taskNo">
<el-input v-model="queryParams.taskNo" placeholder="生产任务单号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="生产计划单号" prop="planNo">
<el-input v-model="queryParams.planNo" placeholder="生产计划单号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="项目编号" prop="projectCode">
<el-input v-model="queryParams.projectCode" placeholder="项目编号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input v-model="queryParams.customerName" placeholder="客户名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="queryParams.projectName" placeholder="项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="子项目名称 " prop="projectSubName">
<el-input v-model="queryParams.projectSubName" placeholder="子项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="子项目编号 " prop="projectSubCode">
<el-input v-model="queryParams.projectSubCode" placeholder="子项目编号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="单据状态 " prop="status">
<el-select v-model="queryParams.status" placeholder="单据状态" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_BOM_STATUS)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item style="margin-left: 20px">
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column type="index" min-width="100" fixed label="序号" align="center" />
<el-table-column label="生产任务单号" align="center" prop="taskNo" min-width="200px" fixed >
<template #default="scope">
<el-button text type="primary" @click="openForm('detail', scope.row.id)">
{{scope.row.taskNo}}
</el-button>
</template>
</el-table-column>
<el-table-column label="生产计划单号" align="center" prop="planNo" min-width="200px" fixed />
<el-table-column label="项目编号" align="center" prop="projectCode" min-width="220px" fixed />
<el-table-column label="客户名称" align="center" prop="customerName" min-width="220px" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="220px" />
<el-table-column label="项目结束时间" align="center" prop="projectEndTime" min-width="260">
<template #default="scope">
{{
formatDate(scope.row.projectEndTime, 'YYYY-MM-DD')
}}
</template>
</el-table-column>
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="220px" />
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="220px" />
<el-table-column label="BOM清单号" align="center" prop="bomCode" min-width="220px" />
<el-table-column label="BOM版本号" align="center" prop="bomVersion" min-width="220px" />
<el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" min-width="220" />
<el-table-column label="备注" align="center" prop="description" min-width="220px" />
<el-table-column fixed="right" label="单据状态" align="center" prop="status" min-width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.BIZ_BOM_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" min-width="220px">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row.id)">
编辑
</el-button>
<el-button link type="primary" @click="openForm('detail', scope.row.id)">
查看详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" />
</ContentWrap>
</el-card>
</template>
<script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter, formatDate } from '@/utils/formatTime'
import download from '@/utils/download'
import * as PlanTaskApi from '@/api/biz/plantask'
defineOptions({ name: 'PlanTask' })
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
taskNo: undefined,
planNo: undefined,
projectName: undefined,
customerName: undefined,
projectCode: undefined,
projectSubCode: undefined,
projectSubName: undefined,
status: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await PlanTaskApi.getPlanTaskPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
router.push({ path: '/plan/plantaskedit', query: { type: type, id: id } })
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await PlanTaskApi.exportPlanTask(queryParams)
download.excel(data, '生产计划任务.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -71,3 +71,27 @@ ALTER TABLE project_sale_order MODIFY COLUMN `project_end_time` datetime COMMENT
ALTER TABLE project_sale_order_sub MODIFY COLUMN `composition_id` BIGINT ( 20 ) COMMENT '材质'; ALTER TABLE project_sale_order_sub MODIFY COLUMN `composition_id` BIGINT ( 20 ) COMMENT '材质';
ALTER TABLE infra_file ADD COLUMN `business_file_remark` VARCHAR(255) COMMENT '业务文件说明' AFTER `business_file_type`; ALTER TABLE infra_file ADD COLUMN `business_file_remark` VARCHAR(255) COMMENT '业务文件说明' AFTER `business_file_type`;
drop table if exists project_plan_task;
drop table if exists project_plan_task_bom;
drop table if exists `project_plan_workshop`;
CREATE TABLE `project_plan_workshop` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`project_plan_id` bigint(20) NOT NULL COMMENT '计划id',
`project_id` bigint(20) NOT NULL COMMENT '项目id',
`workshop_id` bigint(20) NOT NULL COMMENT '车间id',
`start_time` datetime COMMENT '预计开始时间',
`end_time` datetime COMMENT '预计结束时间',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_project_workshop` (`project_plan_id`, `workshop_id`,`tenant_id`) USING BTREE
) ENGINE=InnoDB COMMENT='生产计划车间计划';
ALTER TABLE pro_task_dispatch ADD COLUMN `workshop_id` BIGINT ( 20 ) NOT NULL COMMENT '车间id' AFTER `project_sub_id`;

Loading…
Cancel
Save