生产/装配修改,订单跟踪开发完成,盘库修改

This commit is contained in:
Ledo 2025-01-17 01:23:11 +08:00
parent fcde306cdd
commit a82995448c
24 changed files with 1253 additions and 54 deletions

View File

@ -138,4 +138,5 @@ public interface ErrorCodeConstants {
ErrorCode SALE_ORDER_COST_DETAIL_NOT_EXISTS = new ErrorCode(1_011_001, "项目订单成本汇算明细不存在"); ErrorCode SALE_ORDER_COST_DETAIL_NOT_EXISTS = new ErrorCode(1_011_001, "项目订单成本汇算明细不存在");
/************责任人管理***********/ /************责任人管理***********/
ErrorCode OWNER_NOT_EXISTS = new ErrorCode(1_013_001, "人员配置主数据维护错误,请确认!"); ErrorCode OWNER_NOT_EXISTS = new ErrorCode(1_013_001, "人员配置主数据维护错误,请确认!");
ErrorCode TRACK_NOT_EXISTS = new ErrorCode(1_013_002, "生产进度跟踪不存在");
} }

View File

@ -19,6 +19,8 @@ import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*; import javax.validation.constraints.*;
import javax.validation.*; import javax.validation.*;
import javax.servlet.http.*; import javax.servlet.http.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.io.IOException; import java.io.IOException;
@ -70,7 +72,10 @@ public class StorageCheckController {
double money = Double.parseDouble(item.getMoney().toString()); double money = Double.parseDouble(item.getMoney().toString());
if (money != 0) { if (money != 0) {
item.setOnemoney(String.valueOf(money /storageOkQty)); BigDecimal moneyBD = new BigDecimal(money);
BigDecimal storageOkQtyBD = new BigDecimal(storageOkQty);
BigDecimal result = moneyBD.divide(storageOkQtyBD, 1, RoundingMode.HALF_UP);
item.setOnemoney(result.toString());
} else { } else {
// 处理除数为零的情况例如设置一个默认值或返回一个错误 // 处理除数为零的情况例如设置一个默认值或返回一个错误
item.setOnemoney("0"); // 或者根据业务逻辑设置一个合适的值 item.setOnemoney("0"); // 或者根据业务逻辑设置一个合适的值

View File

@ -0,0 +1,95 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.track;
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.constraints.*;
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.heli.controller.admin.track.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.track.TrackDO;
import com.chanko.yunxi.mes.module.heli.service.track.TrackService;
@Tag(name = "管理后台 - 生产进度跟踪")
@RestController
@RequestMapping("/heli/track")
@Validated
public class TrackController {
@Resource
private TrackService trackService;
@PostMapping("/create")
@Operation(summary = "创建生产进度跟踪")
@PreAuthorize("@ss.hasPermission('heli:track:create')")
public CommonResult<Long> createTrack(@Valid @RequestBody TrackSaveReqVO createReqVO) {
return success(trackService.createTrack(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新生产进度跟踪")
@PreAuthorize("@ss.hasPermission('heli:track:update')")
public CommonResult<Boolean> updateTrack(@Valid @RequestBody TrackSaveReqVO updateReqVO) {
trackService.updateTrack(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除生产进度跟踪")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('heli:track:delete')")
public CommonResult<Boolean> deleteTrack(@RequestParam("id") Long id) {
trackService.deleteTrack(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得生产进度跟踪")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:track:query')")
public CommonResult<TrackRespVO> getTrack(@RequestParam("id") Long id) {
TrackDO track = trackService.getTrack(id);
return success(BeanUtils.toBean(track, TrackRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得生产进度跟踪分页")
@PreAuthorize("@ss.hasPermission('heli:track:query')")
public CommonResult<PageResult<TrackRespVO>> getTrackPage(@Valid TrackPageReqVO pageReqVO) {
PageResult<TrackDO> pageResult = trackService.getTrackPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, TrackRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出生产进度跟踪 Excel")
@PreAuthorize("@ss.hasPermission('heli:track:export')")
@OperateLog(type = EXPORT)
public void exportTrackExcel(@Valid TrackPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<TrackDO> list = trackService.getTrackPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "生产进度跟踪.xls", "数据", TrackRespVO.class,
BeanUtils.toBean(list, TrackRespVO.class));
}
}

View File

@ -0,0 +1,66 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.track.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
@Schema(description = "管理后台 - 生产进度跟踪分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TrackPageReqVO extends PageParam {
@Schema(description = "项目编号")
private String projectCode;
@Schema(description = "项目id", example = "5244")
private Integer projectId;
@Schema(description = "生产计划单号")
private String planCode;
@Schema(description = "生产计划id", example = "30184")
private Integer planId;
@Schema(description = "生产状态", example = "2")
private Integer planStatus;
@Schema(description = "子项目编号")
private String projectOrderSubCode;
@Schema(description = "子项目id", example = "28598")
private Integer projectOrderSubId;
@Schema(description = "子项目名称", example = "李四")
private String projectOrderSubName;
@Schema(description = "零件id", example = "26151")
private Integer bomDetailId;
@Schema(description = "零件名称", example = "王五")
private String bomDetailName;
@Schema(description = "工序名称", example = "赵六")
private String processName;
@Schema(description = "责任人", example = "赵六")
private Long owner;
@Schema(description = "工序id", example = "13795")
private Integer processId;
@Schema(description = "总派工数量")
private Integer dispatchAmount;
@Schema(description = "总报工时间")
private Integer reportAllHour;
@Schema(description = "总预计工时")
private Integer reportPreviewHour;
@Schema(description = "总报工数量")
private Integer reportAmount;
@Schema(description = "完成状态")
private Integer isover;
}

View File

@ -0,0 +1,90 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.track.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.math.BigDecimal;
import java.util.*;
import java.util.*;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 生产进度跟踪 Response VO")
@Data
@ExcelIgnoreUnannotated
public class TrackRespVO {
@Schema(description = "项目编号")
@ExcelProperty("项目编号")
private String projectCode;
@Schema(description = "项目id", example = "5244")
@ExcelProperty("项目id")
private Integer projectId;
@Schema(description = "项目名称", example = "5244")
@ExcelProperty("项目名称")
private String projectName;
@Schema(description = "id主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15401")
@ExcelProperty("id主键")
private Long id;
@Schema(description = "生产计划单号")
@ExcelProperty("生产计划单号")
private String planCode;
@Schema(description = "生产计划id", example = "30184")
@ExcelProperty("生产计划id")
private Integer planId;
@Schema(description = "生产状态", example = "2")
@ExcelProperty("生产状态")
private Integer planStatus;
@Schema(description = "子项目编号")
@ExcelProperty("子项目编号")
private String projectOrderSubCode;
@Schema(description = "子项目id", example = "28598")
@ExcelProperty("子项目id")
private Integer projectOrderSubId;
@Schema(description = "子项目名称", example = "李四")
@ExcelProperty("子项目名称")
private String projectOrderSubName;
@Schema(description = "零件id", example = "26151")
@ExcelProperty("零件id")
private Integer bomDetailId;
@Schema(description = "零件名称", example = "王五")
@ExcelProperty("零件名称")
private String bomDetailName;
@Schema(description = "工序名称", example = "赵六")
@ExcelProperty("工序名称")
private String processName;
@Schema(description = "工序id", example = "13795")
@ExcelProperty("工序id")
private Integer processId;
@Schema(description = "总派工数量")
@ExcelProperty("总派工数量")
private Integer dispatchAmount;
@Schema(description = "总报工时间")
@ExcelProperty("总报工时间")
private BigDecimal reportAllHour;
@Schema(description = "总预计工时")
@ExcelProperty("总预计工时")
private BigDecimal reportPreviewHour;
@Schema(description = "总报工数量")
@ExcelProperty("总报工数量")
private Integer reportAmount;
@Schema(description = "完成状态")
@ExcelProperty("完成状态")
private Integer isover;
}

View File

@ -0,0 +1,67 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.track.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
@Schema(description = "管理后台 - 生产进度跟踪新增/修改 Request VO")
@Data
public class TrackSaveReqVO {
@Schema(description = "项目编号")
private String projectCode;
@Schema(description = "项目id", example = "5244")
private Integer projectId;
@Schema(description = "id主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15401")
private Long id;
@Schema(description = "生产计划单号")
private String planCode;
@Schema(description = "生产计划id", example = "30184")
private Integer planId;
@Schema(description = "生产状态", example = "2")
private Integer planStatus;
@Schema(description = "子项目编号")
private String projectOrderSubCode;
@Schema(description = "子项目id", example = "28598")
private Integer projectOrderSubId;
@Schema(description = "子项目名称", example = "李四")
private String projectOrderSubName;
@Schema(description = "零件id", example = "26151")
private Integer bomDetailId;
@Schema(description = "零件名称", example = "王五")
private String bomDetailName;
@Schema(description = "工序名称", example = "赵六")
private String processName;
@Schema(description = "工序id", example = "13795")
private Integer processId;
@Schema(description = "总派工数量")
private Integer dispatchAmount;
@Schema(description = "总报工时间")
private Integer reportAllHour;
@Schema(description = "总预计工时")
private Integer reportPreviewHour;
@Schema(description = "总报工数量")
private Integer reportAmount;
@Schema(description = "完成状态")
private Integer isover;
}

View File

@ -48,6 +48,11 @@ public class TaskDispatchDetailDO extends BaseDO {
* 派工数量 * 派工数量
*/ */
private Integer amount; private Integer amount;
/**
* 派工数量
*/
@TableField(exist = false)
private Integer beforeAmount;
/** /**
* 工序要点 * 工序要点
*/ */
@ -65,6 +70,8 @@ public class TaskDispatchDetailDO extends BaseDO {
*/ */
@TableField(fill = FieldFill.UPDATE) @TableField(fill = FieldFill.UPDATE)
private Long deviceModel; private Long deviceModel;
@TableField(exist = false)
private Long bomDetailId;
/** /**
* 预计开始日期 * 预计开始日期
*/ */
@ -115,7 +122,8 @@ public class TaskDispatchDetailDO extends BaseDO {
private Integer beforeProcedureStatus; private Integer beforeProcedureStatus;
@TableField(exist = false) @TableField(exist = false)
private Integer planType; private Integer planType;
@TableField(exist = false)
private String planCode;
@TableField(exist = false) @TableField(exist = false)
private String procdureName; private String procdureName;
@ -142,4 +150,6 @@ public class TaskDispatchDetailDO extends BaseDO {
private Integer isReport; private Integer isReport;
@TableField(exist = false) @TableField(exist = false)
private Integer numAmount; private Integer numAmount;
@TableField(exist = false)
private Long beginProduce;
} }

View File

@ -0,0 +1,100 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.track;
import lombok.*;
import java.math.BigDecimal;
import java.util.*;
import com.baomidou.mybatisplus.annotation.*;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
/**
* 生产进度跟踪 DO
*
* @author 管理员
*/
@TableName("plan_track")
@KeySequence("plan_track_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TrackDO extends BaseDO {
/**
* 项目编号
*/
private String projectCode;
/**
* 项目id
*/
private Integer projectId;
private String projectName;
/**
* id主键
*/
@TableId
private Long id;
/**
* 生产计划单号
*/
private String planCode;
/**
* 生产计划id
*/
private Integer planId;
/**
* 生产状态
*/
private Integer planStatus;
/**
* 子项目编号
*/
private String projectOrderSubCode;
/**
* 子项目id
*/
private Integer projectOrderSubId;
/**
* 子项目名称
*/
private String projectOrderSubName;
/**
* 零件id
*/
private Integer bomDetailId;
/**
* 零件名称
*/
private String bomDetailName;
/**
* 工序名称
*/
private String processName;
/**
* 工序id
*/
private Long processId;
/**
* 总派工数量
*/
private Integer dispatchAmount;
/**
* 总报工时间
*/
private BigDecimal reportAllHour;
/**
* 总预计工时
*/
private BigDecimal reportPreviewHour;
/**
* 总报工数量
*/
private Integer reportAmount;
/**
* 完成状态
*/
private Integer isover;
}

View File

@ -15,6 +15,8 @@ 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;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List; import java.util.List;
/** /**
@ -55,5 +57,15 @@ public interface TaskReportMapper extends BaseMapperX<TaskReportDO> {
return selectPage(reqVO, query); return selectPage(reqVO, query);
} }
public int deleteByDispatchDetailIds(List<Long> dispatchDetailIds); public int deleteByDispatchDetailIds(List<Long> dispatchDetailIds);
default TaskReportDO getReprotSum(Long dispatchDetailId){
MPJLambdaWrapper<TaskReportDO> query1 = new MPJLambdaWrapper<>();
query1.selectSum(TaskReportDO::getAmount,"amount").selectSum(TaskReportDO::getWorkTime,"workTime").eq(TaskReportDO::getDispatchDetailId,dispatchDetailId).groupBy(TaskDispatchDetailDO::getDispatchId);
return selectOne(query1);
}
default Long hasReport(Long dispatchDetailId){
MPJLambdaWrapper<TaskReportDO> query1 = new MPJLambdaWrapper<>();
query1.eq(TaskReportDO::getDispatchDetailId,dispatchDetailId);
return selectCount(query1);
}
} }

View File

@ -0,0 +1,85 @@
package com.chanko.yunxi.mes.module.heli.dal.mysql.track;
import java.util.*;
import com.baomidou.mybatisplus.generator.IFill;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.TaskDispatchDetailPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.procedure.ProcedureDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskreport.TaskReportDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.track.TrackDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.track.vo.*;
/**
* 生产进度跟踪 Mapper
*
* @author 管理员
*/
@Mapper
public interface TrackMapper extends BaseMapperX<TrackDO> {
default PageResult<TaskDispatchDetailDO> selectPage(TrackPageReqVO reqVO, TaskDispatchDetailMapper taskDispatchDetailMapper) {
TaskDispatchDetailPageReqVO dispatchDetailPageReqVO = new TaskDispatchDetailPageReqVO();
dispatchDetailPageReqVO.setPageSize(reqVO.getPageSize()).setPageNo(reqVO.getPageNo());
MPJLambdaWrapper<TaskDispatchDetailDO> query = new MPJLambdaWrapper<>();
query.select(TaskDispatchDetailDO::getAmount)
.select(TaskDispatchDetailDO::getWorkTime)
.select(TaskDispatchDetailDO::getProcedureId)
.select(TaskDispatchDetailDO::getProcedureStatus)
.select("pod.code as projectCode,pod.project_name as projectName")
.select("pl.plan_no as planCode,pl.status as planType")
.select("tpd.bom_detail_id as bomDetailId")
.select("pos.name as projectSubName,ps.project_sub_code as projectSubCode")
.leftJoin(TaskDispatchDO.class,"tpd",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId)
.leftJoin(ProjectOrderSubDO.class,"pos",ProjectOrderSubDO::getId,TaskDispatchDO::getProjectSubId)
.leftJoin(ProjectOrderDO.class,"pod",ProjectOrderDO::getId,TaskDispatchDO::getProjectId)
.leftJoin(PlanDO.class,"pl",PlanDO::getId,TaskDispatchDO::getPlanId)
.leftJoin(PlanSubDO.class,"ps",PlanSubDO::getProjectSubId,TaskDispatchDO::getProjectSubId)
.leftJoin(TaskReportDO.class,"tr",TaskReportDO::getDispatchDetailId,TaskDispatchDetailDO::getId)
.leftJoin(AdminUserDO.class,"u",AdminUserDO::getId,TaskDispatchDetailDO::getOwner)
.leftJoin(ProcessBomDO.class,"pb",ProcessBomDO::getProjectSubId,TaskDispatchDO::getProjectSubId)
.ne(ProcessBomDO::getBomStatus,3)
.selectSum(TaskReportDO::getAmount,"totalReportAmount").selectSum(TaskReportDO::getWorkTime,"totalWorkTime")
.ne(ProjectOrderDO::getStatus,3)
.groupBy(TaskDispatchDetailDO::getId)
.getSelectDistinct();
if (reqVO.getProjectCode()!=null&&!reqVO.getProjectCode().trim().equals("")){
query.like(ProjectOrderDO::getCode,reqVO.getProjectCode());
}
if (reqVO.getPlanCode()!=null && !reqVO.getPlanCode().trim().equals("")){
query.like(PlanDO::getPlanNo,reqVO.getPlanCode());
}
if (reqVO.getProjectOrderSubCode()!=null && !reqVO.getProjectOrderSubCode().trim().equals("")){
query.like(PlanSubDO::getProjectSubCode,reqVO.getProjectOrderSubCode());
}
if (reqVO.getProjectOrderSubName()!=null && !reqVO.getProjectOrderSubName().trim().equals("")){
query.like(ProjectOrderSubDO::getName,reqVO.getProjectOrderSubName());
}
if (reqVO.getBomDetailName()!=null && !reqVO.getBomDetailName().trim().equals("")){
query .select("pbd.material_name as materialName")
.leftJoin(ProcessBomDetailDO.class,"pbd",ProcessBomDetailDO::getId,TaskDispatchDO::getBomDetailId)
.like(ProcessBomDetailDO::getMaterialName,reqVO.getBomDetailName());
}
if (reqVO.getOwner()!=null){
query.eq(AdminUserDO::getId,reqVO.getOwner());
}
return taskDispatchDetailMapper.selectPage(dispatchDetailPageReqVO, query);
}
}

View File

@ -136,7 +136,11 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
// 明细工序状态更新 // 明细工序状态更新
if(operateTypeEnum == OperateTypeEnum.SUBMIT){ if(operateTypeEnum == OperateTypeEnum.SUBMIT){
updateReqVO.getTaskDispatchDetails().forEach(taskDispatchDetailDO -> { updateReqVO.getTaskDispatchDetails().forEach(taskDispatchDetailDO -> {
if(taskDispatchDetailDO.getProcedureStatus().intValue() == 0){ if(taskDispatchDetailDO.getProcedureStatus().intValue() == 0 ||
(taskDispatchDetailDO.getBeforeAmount()!=null && taskDispatchDetailDO.getAmount()!=null && taskDispatchDetailDO.getAmount() != taskDispatchDetailDO.getBeforeAmount())
|| (taskDispatchDetailDO.getBeforeAmount() == null && taskDispatchDetailDO.getAmount() != null)
|| (taskDispatchDetailDO.getBeforeAmount() != null && taskDispatchDetailDO.getAmount() == null)
){
taskDispatchDetailDO.setProcedureStatus(TaskDispatchProcedureStatusEnum.SUBMITTED.getCode()); taskDispatchDetailDO.setProcedureStatus(TaskDispatchProcedureStatusEnum.SUBMITTED.getCode());
} }
}); });
@ -146,8 +150,12 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
throw exception(new ErrorCode(1_000_099,"计划已完成,不允许取消提交")); throw exception(new ErrorCode(1_000_099,"计划已完成,不允许取消提交"));
} }
updateReqVO.getTaskDispatchDetails().forEach(taskDispatchDetailDO -> { updateReqVO.getTaskDispatchDetails().forEach(taskDispatchDetailDO -> {
//2025-01-17 取消提交 - 如果已报工完成的工序报工状态还是已完成
if (taskDispatchDetailDO.getProcedureStatus() != 2){
taskDispatchDetailDO.setProcedureStatus(TaskDispatchProcedureStatusEnum.DEFAULT.getCode()); taskDispatchDetailDO.setProcedureStatus(TaskDispatchProcedureStatusEnum.DEFAULT.getCode());
});
}
});
} }
updateObj.setDispatchStatus(TaskDispatchStatusEnum.valueOf(updateReqVO.getActive()).getCode()); updateObj.setDispatchStatus(TaskDispatchStatusEnum.valueOf(updateReqVO.getActive()).getCode());
taskDispatchMapper.updateById(updateObj); taskDispatchMapper.updateById(updateObj);
@ -307,6 +315,13 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
@Override @Override
public List<TaskDispatchDetailDO> getTaskDispatchDetailListByDispatchId(Long dispatchId) { public List<TaskDispatchDetailDO> getTaskDispatchDetailListByDispatchId(Long dispatchId) {
List<TaskDispatchDetailDO> taskDispatchDetailDOS = taskDispatchDetailMapper.selectListByDispatchId(dispatchId); List<TaskDispatchDetailDO> taskDispatchDetailDOS = taskDispatchDetailMapper.selectListByDispatchId(dispatchId);
for (TaskDispatchDetailDO taskDispatchDetailDO : taskDispatchDetailDOS) {
taskDispatchDetailDO.setBeginProduce(taskReportMapper.hasReport(taskDispatchDetailDO.getId())) ;
if (taskDispatchDetailDO.getAmount()!=null){
taskDispatchDetailDO.setBeforeAmount(taskDispatchDetailDO.getAmount());
}
}
return taskDispatchDetailDOS; return taskDispatchDetailDOS;
} }

View File

@ -0,0 +1,55 @@
package com.chanko.yunxi.mes.module.heli.service.track;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.track.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.track.TrackDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
/**
* 生产进度跟踪 Service 接口
*
* @author 管理员
*/
public interface TrackService {
/**
* 创建生产进度跟踪
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createTrack(@Valid TrackSaveReqVO createReqVO);
/**
* 更新生产进度跟踪
*
* @param updateReqVO 更新信息
*/
void updateTrack(@Valid TrackSaveReqVO updateReqVO);
/**
* 删除生产进度跟踪
*
* @param id 编号
*/
void deleteTrack(Long id);
/**
* 获得生产进度跟踪
*
* @param id 编号
* @return 生产进度跟踪
*/
TrackDO getTrack(Long id);
/**
* 获得生产进度跟踪分页
*
* @param pageReqVO 分页查询
* @return 生产进度跟踪分页
*/
PageResult<TrackDO> getTrackPage(TrackPageReqVO pageReqVO);
}

View File

@ -0,0 +1,136 @@
package com.chanko.yunxi.mes.module.heli.service.track;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.procedure.ProcedureDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.procedure.ProcedureMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskreport.TaskReportMapper;
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 com.chanko.yunxi.mes.module.heli.controller.admin.track.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.track.TrackDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.dal.mysql.track.TrackMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
/**
* 生产进度跟踪 Service 实现类
*
* @author 管理员
*/
@Service
@Validated
public class TrackServiceImpl implements TrackService {
@Resource
private TrackMapper trackMapper;
@Resource
private TaskDispatchDetailMapper taskDispatchDetailMapper;
@Resource
private ProcessBomDetailMapper processBomDetailDO;
@Resource
private MaterialMapper materialMapper;
@Resource
private ProcedureMapper procedureMapper;
@Override
public Long createTrack(TrackSaveReqVO createReqVO) {
// 插入
TrackDO track = BeanUtils.toBean(createReqVO, TrackDO.class);
trackMapper.insert(track);
// 返回
return track.getId();
}
@Override
public void updateTrack(TrackSaveReqVO updateReqVO) {
// 校验存在
validateTrackExists(updateReqVO.getId());
// 更新
TrackDO updateObj = BeanUtils.toBean(updateReqVO, TrackDO.class);
trackMapper.updateById(updateObj);
}
@Override
public void deleteTrack(Long id) {
// 校验存在
validateTrackExists(id);
// 删除
trackMapper.deleteById(id);
}
private void validateTrackExists(Long id) {
if (trackMapper.selectById(id) == null) {
throw exception(TRACK_NOT_EXISTS);
}
}
@Override
public TrackDO getTrack(Long id) {
return trackMapper.selectById(id);
}
@Override
public PageResult<TrackDO> getTrackPage(TrackPageReqVO pageReqVO) {
PageResult<TaskDispatchDetailDO> taskDispatchDetailDOPageResult = trackMapper.selectPage(pageReqVO, taskDispatchDetailMapper);
PageResult<TrackDO> pageResult = new PageResult<>();
pageResult.setTotalPages(taskDispatchDetailDOPageResult.getTotalPages());
pageResult.setTotal(taskDispatchDetailDOPageResult.getTotal());
List<TaskDispatchDetailDO> list = taskDispatchDetailDOPageResult.getList();
List<TrackDO> trackDOS = new ArrayList<>();
pageResult.setList(trackDOS);
//如果零件名字为空就查一下零
for (TaskDispatchDetailDO to : list) {
TrackDO trackDO = new TrackDO();
trackDOS.add(trackDO);
trackDO.setProjectCode(to.getProjectCode())
.setProjectName(to.getProjectName())
.setPlanCode(to.getPlanCode())
.setPlanStatus(to.getPlanType())
.setProjectOrderSubName(to.getProjectSubName())
.setProjectOrderSubCode(to.getProjectSubCode())
.setProcessId(to.getProcedureId())
.setReportAmount(to.getTotalReportAmount())
.setDispatchAmount(to.getAmount())
.setReportPreviewHour(to.getWorkTime())
.setReportAllHour(to.getTotalWorkTime())
;
if (to.getProcedureStatus() == 2){
trackDO.setIsover(2);
}else {
trackDO.setIsover(1);
}
//1.零件名字if (reqVO.getBomDetailName()!=null && !reqVO.getBomDetailName().trim().equals(""))
if (to.getBomDetailId()!=null && (pageReqVO.getBomDetailName() == null || pageReqVO.getBomDetailName().trim().equals(""))){
ProcessBomDetailDO processBomDetailDO1 = processBomDetailDO.selectById(to.getBomDetailId());
if(processBomDetailDO1!=null&&processBomDetailDO1.getMaterialName()!=null){
trackDO.setBomDetailName(processBomDetailDO1.getMaterialName());
}
}
if (to.getProcedureId()!=null){
ProcedureDO procedureDO = procedureMapper.selectById(to.getProcedureId());
if (procedureDO!=null){
trackDO.setProcessName(procedureDO.getName());
}
}
}
return pageResult;
}
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chanko.yunxi.mes.module.heli.dal.mysql.track.TrackMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@ -1,7 +1,7 @@
# 开发环境 # 开发环境
NODE_ENV=development NODE_ENV=development
VITE_DEV=false VITE_DEV=true
# 请求路径https://star.hz-hl.com/admin-api http://192.168.1.87:8080 # 请求路径https://star.hz-hl.com/admin-api http://192.168.1.87:8080
VITE_BASE_URL='https://nxhs.cjyx.cc' VITE_BASE_URL='https://nxhs.cjyx.cc'

View File

@ -4,14 +4,14 @@ NODE_ENV=production
VITE_DEV=false VITE_DEV=false
# 请求路径https://star.hz-hl.com/admin-api http://192.168.1.87:8080 # 请求路径https://star.hz-hl.com/admin-api http://192.168.1.87:8080
VITE_BASE_URL='https://star.hz-hl.com' VITE_BASE_URL='https://nxhs.cjyx.cc'
# 上传路径 http://218.75.46.166:8080 # 上传路径 http://218.75.46.166:8080
VITE_UPLOAD_URL='https://star.hz-hl.com/admin-api/infra/file/upload' VITE_UPLOAD_URL='https://nxhs.cjyx.cc/admin-api/infra/file/upload'
# 上传路径 # 上传路径
VITE_UPLOAD_BATCH_URL='https://star.hz-hl.com/admin-api/infra/file/uploadBatch' VITE_UPLOAD_BATCH_URL='https://nxhs.cjyx.cc/admin-api/infra/file/uploadBatch'
# 接口前缀 # 接口前缀
VITE_API_BASEPATH= VITE_API_BASEPATH=

View File

@ -0,0 +1,52 @@
import request from '@/config/axios'
export interface TrackVO {
projectCode: string
projectId: number
id: number
planCode: string
planId: number
planStatus: number
projectOrderSubCode: string
projectOrderSubId: number
projectOrderSubName: string
bomDetailId: number
bomDetailName: string
processName: string
processId: number
dispatchAmount: number
reportAllHour: number
reportPreviewHour: number
reportAmount: number
isover: number
}
// 查询生产进度跟踪分页
export const getTrackPage = async (params) => {
return await request.get({ url: `/heli/track/page`, params })
}
// 查询生产进度跟踪详情
export const getTrack = async (id: number) => {
return await request.get({ url: `/heli/track/get?id=` + id })
}
// 新增生产进度跟踪
export const createTrack = async (data: TrackVO) => {
return await request.post({ url: `/heli/track/create`, data })
}
// 修改生产进度跟踪
export const updateTrack = async (data: TrackVO) => {
return await request.put({ url: `/heli/track/update`, data })
}
// 删除生产进度跟踪
export const deleteTrack = async (id: number) => {
return await request.delete({ url: `/heli/track/delete?id=` + id })
}
// 导出生产进度跟踪 Excel
export const exportTrack = async (params) => {
return await request.download({ url: `/heli/track/export-excel`, params })
}

View File

@ -0,0 +1,170 @@
<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="项目编号" prop="projectCode">
<el-input v-model="formData.projectCode" placeholder="请输入项目编号" />
</el-form-item>
<el-form-item label="项目id" prop="projectId">
<el-input v-model="formData.projectId" placeholder="请输入项目id" />
</el-form-item>
<el-form-item label="生产计划单号" prop="planCode">
<el-input v-model="formData.planCode" placeholder="请输入生产计划单号" />
</el-form-item>
<el-form-item label="生产计划id" prop="planId">
<el-input v-model="formData.planId" placeholder="请输入生产计划id" />
</el-form-item>
<el-form-item label="生产状态" prop="planStatus">
<el-radio-group v-model="formData.planStatus">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="子项目编号" prop="projectOrderSubCode">
<el-input v-model="formData.projectOrderSubCode" placeholder="请输入子项目编号" />
</el-form-item>
<el-form-item label="子项目id" prop="projectOrderSubId">
<el-input v-model="formData.projectOrderSubId" placeholder="请输入子项目id" />
</el-form-item>
<el-form-item label="子项目名称" prop="projectOrderSubName">
<el-input v-model="formData.projectOrderSubName" placeholder="请输入子项目名称" />
</el-form-item>
<el-form-item label="零件id" prop="bomDetailId">
<el-input v-model="formData.bomDetailId" placeholder="请输入零件id" />
</el-form-item>
<el-form-item label="零件名称" prop="bomDetailName">
<el-input v-model="formData.bomDetailName" placeholder="请输入零件名称" />
</el-form-item>
<el-form-item label="工序名称" prop="processName">
<el-input v-model="formData.processName" placeholder="请输入工序名称" />
</el-form-item>
<el-form-item label="工序id" prop="processId">
<el-input v-model="formData.processId" placeholder="请输入工序id" />
</el-form-item>
<el-form-item label="总派工数量" prop="dispatchAmount">
<el-input v-model="formData.dispatchAmount" placeholder="请输入总派工数量" />
</el-form-item>
<el-form-item label="总报工时间" prop="reportAllHour">
<el-input v-model="formData.reportAllHour" placeholder="请输入总报工时间" />
</el-form-item>
<el-form-item label="总预计工时" prop="reportPreviewHour">
<el-input v-model="formData.reportPreviewHour" placeholder="请输入总预计工时" />
</el-form-item>
<el-form-item label="总报工数量" prop="reportAmount">
<el-input v-model="formData.reportAmount" placeholder="请输入总报工数量" />
</el-form-item>
<el-form-item label="完成状态" prop="isover">
<el-input v-model="formData.isover" placeholder="请输入完成状态" />
</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 TrackApi from '@/api/heli/track'
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({
projectCode: undefined,
projectId: undefined,
id: undefined,
planCode: undefined,
planId: undefined,
planStatus: undefined,
projectOrderSubCode: undefined,
projectOrderSubId: undefined,
projectOrderSubName: undefined,
bomDetailId: undefined,
bomDetailName: undefined,
processName: undefined,
processId: undefined,
dispatchAmount: undefined,
reportAllHour: undefined,
reportPreviewHour: undefined,
reportAmount: undefined,
isover: undefined
})
const formRules = reactive({
})
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 TrackApi.getTrack(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 TrackApi.TrackVO
if (formType.value === 'create') {
await TrackApi.createTrack(data)
message.success(t('common.createSuccess'))
} else {
await TrackApi.updateTrack(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
projectCode: undefined,
projectId: undefined,
id: undefined,
planCode: undefined,
planId: undefined,
planStatus: undefined,
projectOrderSubCode: undefined,
projectOrderSubId: undefined,
projectOrderSubName: undefined,
bomDetailId: undefined,
bomDetailName: undefined,
processName: undefined,
processId: undefined,
dispatchAmount: undefined,
reportAllHour: undefined,
reportPreviewHour: undefined,
reportAmount: undefined,
isover: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,225 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px">
<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="planCode">
<el-input
v-model="queryParams.planCode"
placeholder="请输入生产计划单号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="子项目编号" prop="projectOrderSubCode">
<el-input
v-model="queryParams.projectOrderSubCode"
placeholder="请输入子项目编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="子项目名称" prop="projectOrderSubName">
<el-input
v-model="queryParams.projectOrderSubName"
placeholder="请输入子项目名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="零件名称" prop="bomDetailName">
<el-input
v-model="queryParams.bomDetailName"
placeholder="请输入零件名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="任务负责人" prop="owner">
<UserSelect v-model="queryParams.owner" @update:new-value="handleSelectedUser1" class="!w-265px"/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery"><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">
<el-table-column type="index" min-width="60" fixed label="序号" align="center" />
<el-table-column label="项目编号" align="center" prop="projectCode" width="180"/>
<el-table-column label="项目名称" align="center" prop="projectName" width="120"/>
<el-table-column label="生产计划单号" align="center" prop="planCode" />
<el-table-column label="生产状态" align="center" prop="planStatus" width="110">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template>
</el-table-column>
<el-table-column label="子项目编号" align="center" prop="projectOrderSubCode" />
<el-table-column label="子项目名称" align="center" prop="projectOrderSubName" width="120"/>
<el-table-column label="零件名称" align="center" prop="bomDetailName" width="120"/>
<el-table-column label="工序名称" align="center" prop="processName" width="110"/>
<el-table-column label="总派工数量" align="center" prop="dispatchAmount" width="120"/>
<el-table-column label="总报工时间" align="center" prop="reportAllHour" width="120"/>
<el-table-column label="总预计工时" align="center" prop="reportPreviewHour" width="120"/>
<el-table-column label="总报工数量" align="center" prop="reportAmount" width="120" />
<el-table-column label="完成标志" align="center" prop="isover" width="110">
<template #default="scope">
<el-tag v-if="scope.row.isover==2">完成</el-tag>
<el-tag v-else class="ml-2" type="danger">未完成</el-tag>
<!-- <dict-tag :type="DICT_TYPE.HELI_YINGFU_MONEY" :value="scope.row.isover" /> -->
</template>
</el-table-column>
<!-- <el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['heli:track:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['heli:track:delete']"
>
删除
</el-button>
</template>
</el-table-column> -->
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<TrackForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import download from '@/utils/download'
import * as TrackApi from '@/api/heli/track'
import TrackForm from './TrackForm.vue'
import { DICT_TYPE } from '@/utils/dict'
import UserSelect from '@/views/heli/hlvuestyle/userSelect.vue'
defineOptions({ name: 'Track' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
projectCode: undefined,
projectId: undefined,
planCode: undefined,
planId: undefined,
planStatus: undefined,
projectOrderSubCode: undefined,
projectOrderSubId: undefined,
projectOrderSubName: undefined,
bomDetailId: undefined,
bomDetailName: undefined,
processName: undefined,
processId: undefined,
dispatchAmount: undefined,
reportAllHour: undefined,
reportPreviewHour: undefined,
reportAmount: undefined,
isover: undefined,
owner:undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await TrackApi.getTrackPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
const handleSelectedUser1 = (newValue: any) => {
queryParams.owner = newValue?.id
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await TrackApi.deleteTrack(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await TrackApi.exportTrack(queryParams)
download.excel(data, '生产进度跟踪.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -374,10 +374,10 @@ link type="primary" size="small" :disabled="ctrView || ctrDelete"
</span> </span>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="centerDialogVisible = false">取消</el-button>
<el-button type="primary" @click="deleteStorage()"> <el-button type="primary" @click="deleteStorage()">
确认 确认
</el-button> </el-button>
<el-button @click="centerDialogVisible = false">取消</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>

View File

@ -374,10 +374,10 @@ link type="primary" size="small" :disabled="ctrView || ctrDelete"
</span> </span>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="centerDialogVisible = false">取消</el-button>
<el-button type="primary" @click="deleteStorage()"> <el-button type="primary" @click="deleteStorage()">
确认 确认
</el-button> </el-button>
<el-button @click="centerDialogVisible = false">取消</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>

View File

@ -140,15 +140,15 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="money" min-width="120" align="center"> <el-table-column prop="money" min-width="120" align="center" >
<template #header> <span class="hl-table_header">*</span>金额</template> <template #header> <span class="hl-table_header">*</span>金额</template>
<template #default="scope"> <template #default="scope">
<el-form-item :prop="`${scope.$index}.money`" :rules="subFormRules.money" class="mb-0px!"> <el-form-item :prop="`${scope.$index}.money`" :rules="subFormRules.money" class="mb-0px!" >
<el-input v-model="scope.row.money" /> <el-input v-model="scope.row.money" :disabled="ctrView || ctrSave" />
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="onemoney" label="单价" min-width="120" align="center" /> <el-table-column prop="onemoney" label="单价" min-width="120" align="center"/>
@ -273,10 +273,10 @@ ref="matUploadRef" :file-list="matUploadFiles" multiple :action="uploadUrl" :hea
</span> </span>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="centerDialogVisible = false">取消</el-button> <el-button type="primary" @click="sureToSubmit()">
<el-button type="primary" @click="sureToSubmit()">
确认 确认
</el-button> </el-button>
<el-button @click="centerDialogVisible = false">取消</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -286,10 +286,10 @@ ref="matUploadRef" :file-list="matUploadFiles" multiple :action="uploadUrl" :hea
</span> </span>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="deleteDialogVisible = false">取消</el-button> <el-button type="primary" @click="sureToDelete()">
<el-button type="primary" @click="sureToDelete()">
确认 确认
</el-button> </el-button>
<el-button @click="deleteDialogVisible = false">取消</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -417,13 +417,7 @@ const handleStatus = async (num) => {
return return
} }
formData.value.keeper = useUserStore().getUser.id formData.value.keeper = useUserStore().getUser.id
// centerDialogVisible.value = true;
await saveFormData()
await CheckApi.updateStorageCheckStatus(formData.value.id)
await initStatus(formData.value.status)
if (sumbefore.value == 0) {
reload()
}
} else { } else {
deleteDialogVisible.value = true; deleteDialogVisible.value = true;
} }
@ -624,15 +618,13 @@ const saveFormData = async () => {
} }
const sureToSubmit = async() =>{ const sureToSubmit = async() =>{
centerDialogVisible.value = false; centerDialogVisible.value = false;
// //
await saveFormData() await saveFormData()
await CheckApi.updateStorageCheckStatus(formData.value.id)
await initStatus(formData.value.status) await initStatus(formData.value.status)
if (sumbefore.value == 0) {
// reload()
if (sumbefore.value == 0) { }
reload()
}
} }
const submitForm = async () => { const submitForm = async () => {
@ -665,7 +657,15 @@ const submitForm = async () => {
} catch (e) { } catch (e) {
return return
} }
centerDialogVisible.value = true; //
await saveFormData()
await initStatus(formData.value.status)
//
if (sumbefore.value == 0) {
reload()
}
} }
var matCount = 1 var matCount = 1

View File

@ -260,7 +260,7 @@ ref="subFormRef" :model="formData.taskDispatchDetails" :rules="subFormRules"
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.procedureId`" :rules="subFormRules.procedureId" class="mb-0px!"> <el-form-item :prop="`${$index}.procedureId`" :rules="subFormRules.procedureId" class="mb-0px!">
<ProcedureSelect <ProcedureSelect
:disabled="detailDisabled || row.procedureStatus != 0" :disabled="detailDisabled || row.beginProduce != 0 || row.procedureStatus != 0"
v-model="row.procedureId" v-model="row.procedureId"
@update:new-value="(val) => { handleSelectedProcedure(row, val); }" /> @update:new-value="(val) => { handleSelectedProcedure(row, val); }" />
</el-form-item> </el-form-item>
@ -276,7 +276,7 @@ ref="subFormRef" :model="formData.taskDispatchDetails" :rules="subFormRules"
<el-form-item :prop="`${$index}.sort`" :rules="subFormRules.sort" class="mb-0px!"> <el-form-item :prop="`${$index}.sort`" :rules="subFormRules.sort" class="mb-0px!">
<el-input-number <el-input-number
min="0" :precision="0" class="!w-240px" min="0" :precision="0" class="!w-240px"
:disabled="detailDisabled || row.procedureStatus != 0" v-model="row.sort" :disabled="detailDisabled || row.beginProduce != 0 || row.procedureStatus != 0" v-model="row.sort"
placeholder="请输入顺序号" /> placeholder="请输入顺序号" />
</el-form-item> </el-form-item>
</template> </template>
@ -288,7 +288,7 @@ min="0" :precision="0" class="!w-240px"
<!-- <UserSelect--> <!-- <UserSelect-->
<!--v-model="row.owner" :disabled="detailDisabled || row.procedureStatus != 0"--> <!--v-model="row.owner" :disabled="detailDisabled || row.procedureStatus != 0"-->
<!-- @update:new-value="handleSelectedUser($index, $event)" />--> <!-- @update:new-value="handleSelectedUser($index, $event)" />-->
<el-select v-model="row.owner" :disabled="detailDisabled || row.procedureStatus != 0" @update:new-value="handleSelectedUser($index, $event)"> <el-select v-model="row.owner" :disabled="detailDisabled || row.beginProduce != 0 || row.procedureStatus != 0" @update:new-value="handleSelectedUser($index, $event)">
<el-option <el-option
v-for="dict in userInit" :key="dict.id" v-for="dict in userInit" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" /> :label="dict.username+' '+dict.nickname" :value="dict.id" />
@ -301,7 +301,7 @@ v-for="dict in userInit" :key="dict.id"
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.startTime`" :rules="subFormRules.startTime" class="mb-0px!"> <el-form-item :prop="`${$index}.startTime`" :rules="subFormRules.startTime" class="mb-0px!">
<el-date-picker <el-date-picker
:disabled="detailDisabled || row.procedureStatus != 0" v-model="row.startTime" :disabled="detailDisabled || row.beginProduce != 0 || row.procedureStatus != 0" v-model="row.startTime"
type="date" value-format="x" placeholder="选择预计开始日期" /> type="date" value-format="x" placeholder="选择预计开始日期" />
</el-form-item> </el-form-item>
</template> </template>
@ -311,7 +311,7 @@ v-for="dict in userInit" :key="dict.id"
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.endTime`" :rules="subFormRules.endTime" class="mb-0px!"> <el-form-item :prop="`${$index}.endTime`" :rules="subFormRules.endTime" class="mb-0px!">
<el-date-picker <el-date-picker
:disabled="detailDisabled || row.procedureStatus != 0" v-model="row.endTime" :disabled="detailDisabled || row.beginProduce != 0 || row.procedureStatus != 0" v-model="row.endTime"
type="date" value-format="x" placeholder="选择预计结束日期" /> type="date" value-format="x" placeholder="选择预计结束日期" />
</el-form-item> </el-form-item>
</template> </template>
@ -322,7 +322,7 @@ v-for="dict in userInit" :key="dict.id"
<el-form-item :prop="`${$index}.workTime`" :rules="subFormRules.workTime" class="mb-0px!"> <el-form-item :prop="`${$index}.workTime`" :rules="subFormRules.workTime" class="mb-0px!">
<el-input-number <el-input-number
min="0" :precision="2" class="!w-240px" min="0" :precision="2" class="!w-240px"
:disabled="detailDisabled || row.procedureStatus != 0" v-model="row.workTime" :disabled="detailDisabled|| row.beginProduce != 0 || row.procedureStatus != 0" v-model="row.workTime"
placeholder="请输入预计工时" /> placeholder="请输入预计工时" />
</el-form-item> </el-form-item>
</template> </template>
@ -333,7 +333,7 @@ min="0" :precision="2" class="!w-240px"
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!"> <el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!">
<el-input-number <el-input-number
min="0" :max="formData.amount" :precision="0" class="!w-240px" min="0" :max="formData.amount" :precision="0" class="!w-240px"
:disabled="detailDisabled || row.procedureStatus != 0" v-model="row.amount" :disabled="detailDisabled" v-model="row.amount"
placeholder="请输入派工数量" /> placeholder="请输入派工数量" />
</el-form-item> </el-form-item>
</template> </template>
@ -344,7 +344,7 @@ min="0" :precision="2" class="!w-240px"
<EquipmentSelect <EquipmentSelect
v-model="row.deviceModel" v-model="row.deviceModel"
@update:new-value="handleSelectedequip($index, $event)" @update:new-value="handleSelectedequip($index, $event)"
:disabled="detailDisabled || row.procedureStatus != 0" /> :disabled="detailDisabled || row.beginProduce != 0 || row.procedureStatus != 0" />
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
@ -352,7 +352,7 @@ min="0" :precision="2" class="!w-240px"
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.summary`" class="mb-0px!"> <el-form-item :prop="`${$index}.summary`" class="mb-0px!">
<el-input <el-input
:disabled="detailDisabled || row.procedureStatus != 0" v-model="row.summary" :disabled="detailDisabled || row.beginProduce != 0 || row.procedureStatus != 0" v-model="row.summary"
placeholder="请输入工序要点" /> placeholder="请输入工序要点" />
</el-form-item> </el-form-item>
</template> </template>
@ -454,10 +454,10 @@ v-if="formData.dispatchStatus == 2" @click="printHandle(formData.id)" :disabled=
</span> </span>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="centerDialogVisible = false">取消</el-button>
<el-button type="primary" @click="sureToCancle()"> <el-button type="primary" @click="sureToCancle()">
确认 确认
</el-button> </el-button>
<el-button @click="centerDialogVisible = false">取消</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
@ -880,6 +880,7 @@ const submitForm = async (operate) => {
} }
} }
} }
isSureCancle.value = false
// //
if (operate == 'SUBMIT') { if (operate == 'SUBMIT') {
if (!formData.value.taskDispatchDetails || formData.value.taskDispatchDetails.length == 0) { if (!formData.value.taskDispatchDetails || formData.value.taskDispatchDetails.length == 0) {

View File

@ -243,7 +243,7 @@ class="!w-260px" v-model="formData.createTime" type="date" value-format="x"
<el-table-column fixed label="派工类型" align="center" prop="dispatchType" width="145px"> <el-table-column fixed label="派工类型" align="center" prop="dispatchType" width="145px">
<template #header> <span class="hl-table_header">*</span>派工类型</template> <template #header> <span class="hl-table_header">*</span>派工类型</template>
<template #default="{ row }"> <template #default="{ row }">
<el-radio-group size="small" :disabled="detailDisabled || row.procedureStatus != 0" v-model="row.dispatchType" @change="()=>dispatchTypeHasChange(row)"> <el-radio-group size="small" :disabled="detailDisabled||row.beginProduce != 0 || row.procedureStatus != 0" v-model="row.dispatchType" @change="()=>dispatchTypeHasChange(row)">
<el-radio-button :label="1">人员</el-radio-button> <el-radio-button :label="1">人员</el-radio-button>
<el-radio-button :label="2">岗位</el-radio-button> <el-radio-button :label="2">岗位</el-radio-button>
</el-radio-group> </el-radio-group>
@ -259,7 +259,7 @@ class="!w-260px" v-model="formData.createTime" type="date" value-format="x"
<template #header> <span class="hl-table_header">*</span>负责人</template> <template #header> <span class="hl-table_header">*</span>负责人</template>
<template #default="{ row , $index}"> <template #default="{ row , $index}">
<el-form-item :prop="`${$index}.owner`" class="mb-0px!"> <el-form-item :prop="`${$index}.owner`" class="mb-0px!">
<el-select :disabled="detailDisabled || row.procedureStatus != 0" clearable filterable v-if="row.dispatchType==1 " v-model="row.owner" placeholder="请选择负责人" style="max-width: 110px"> <el-select :disabled="detailDisabled||row.beginProduce != 0 || row.procedureStatus != 0" clearable filterable v-if="row.dispatchType==1 " v-model="row.owner" placeholder="请选择负责人" style="max-width: 110px">
<el-option <el-option
v-for="item in ownerList1" v-for="item in ownerList1"
:key="item.index" :key="item.index"
@ -267,7 +267,7 @@ class="!w-260px" v-model="formData.createTime" type="date" value-format="x"
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
<el-select :disabled="detailDisabled || row.procedureStatus != 0" clearable filterable v-if="row.dispatchType==2 && (row.owner != '' && row.owner != null )" v-model="row.owner" placeholder="请选择岗位" style="max-width: 110px"> <el-select :disabled="detailDisabled ||row.beginProduce != 0|| row.procedureStatus != 0" clearable filterable v-if="row.dispatchType==2 && (row.owner != '' && row.owner != null )" v-model="row.owner" placeholder="请选择岗位" style="max-width: 110px">
<el-option <el-option
v-for="item in ownerList1" v-for="item in ownerList1"
:key="item.index" :key="item.index"
@ -275,7 +275,7 @@ class="!w-260px" v-model="formData.createTime" type="date" value-format="x"
:value="item.id" :value="item.id"
/> />
</el-select> </el-select>
<el-select :disabled="detailDisabled || row.procedureStatus != 0" clearable filterable v-if="row.dispatchType==2 && (row.owner == '' || row.owner == null)" v-model="row.postId" placeholder="请选择岗位" style="width: 110px"> <el-select :disabled="detailDisabled||row.beginProduce != 0 || row.procedureStatus != 0" clearable filterable v-if="row.dispatchType==2 && (row.owner == '' || row.owner == null)" v-model="row.postId" placeholder="请选择岗位" style="width: 110px">
<el-option <el-option
v-for="item in ownerList2" v-for="item in ownerList2"
:key="item.index" :key="item.index"
@ -317,7 +317,7 @@ v-model="row.owner" :disabled="detailDisabled || row.procedureStatus != 0"
<el-form-item :prop="`${$index}.workTime`" :rules="subFormRules.workTime" class="mb-0px!"> <el-form-item :prop="`${$index}.workTime`" :rules="subFormRules.workTime" class="mb-0px!">
<el-input-number <el-input-number
min="0" :precision="2" class="!w-240px" min="0" :precision="2" class="!w-240px"
:disabled="detailDisabled || row.procedureStatus != 0" v-model="row.workTime" :disabled="detailDisabled || row.beginProduce != 0 || row.procedureStatus != 0" v-model="row.workTime"
placeholder="请输入预计工时" /> placeholder="请输入预计工时" />
</el-form-item> </el-form-item>
</template> </template>
@ -328,7 +328,7 @@ min="0" :precision="2" class="!w-240px"
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!"> <el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!">
<el-input-number <el-input-number
min="0" :max="formData.amount" :precision="0" class="!w-240px" min="0" :max="formData.amount" :precision="0" class="!w-240px"
:disabled="detailDisabled || row.procedureStatus != 0" v-model="row.amount" :disabled="detailDisabled" v-model="row.amount"
placeholder="请输入派工数量" /> placeholder="请输入派工数量" />
</el-form-item> </el-form-item>
</template> </template>
@ -339,7 +339,7 @@ min="0" :max="formData.amount" :precision="0" class="!w-240px"
<EquipmentSelect <EquipmentSelect
v-model="row.deviceModel" v-model="row.deviceModel"
@update:new-value="handleSelectedequip($index, $event)" @update:new-value="handleSelectedequip($index, $event)"
:disabled="detailDisabled || row.procedureStatus != 0" /> :disabled="detailDisabled ||row.beginProduce != 0 || row.procedureStatus != 0" />
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
@ -347,7 +347,7 @@ v-model="row.deviceModel"
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.summary`" class="mb-0px!"> <el-form-item :prop="`${$index}.summary`" class="mb-0px!">
<el-input <el-input
:disabled="detailDisabled || row.procedureStatus != 0" v-model="row.summary" :disabled="detailDisabled ||row.beginProduce != 0 || row.procedureStatus != 0" v-model="row.summary"
placeholder="请输入工序要点" /> placeholder="请输入工序要点" />
</el-form-item> </el-form-item>
</template> </template>
@ -1008,7 +1008,7 @@ const queryData = async (id?: number) => {
ownerList1.value = await getOwnerListThis (); ownerList1.value = await getOwnerListThis ();
ownerList2.value = await getOwnerPostListThis (); ownerList2.value = await getOwnerPostListThis ();
formData.value.bomCode = 'BOM-' + formData.value.projectSubCode formData.value.bomCode = 'BOM-' + formData.value.projectSubCode
if (formData.value.dispatchStatus == 2) { if (formData.value.dispatchStatus == 2 ) {
detailDisabled.value = true detailDisabled.value = true
}else{ }else{
detailDisabled.value = false detailDisabled.value = false
@ -1058,6 +1058,7 @@ const submitForm = async (operate) => {
} }
} }
} }
isSureCancle.value = false
if(operate == 'SUBMIT'||operate == 'SAVE'){ if(operate == 'SUBMIT'||operate == 'SAVE'){
if (!formData.value.taskDispatchDetails || formData.value.taskDispatchDetails.length == 0) { if (!formData.value.taskDispatchDetails || formData.value.taskDispatchDetails.length == 0) {
message.error('派工明细不能为空') message.error('派工明细不能为空')
@ -1085,6 +1086,7 @@ const submitForm = async (operate) => {
} }
} }
const data = formData.value as unknown as TaskDispatchApi.TaskDispatchVO const data = formData.value as unknown as TaskDispatchApi.TaskDispatchVO
console.log(data);
let dataId = await TaskDispatchApi.operateTaskDispatch(data) let dataId = await TaskDispatchApi.operateTaskDispatch(data)
message.success(t('common.operationSuccess')) message.success(t('common.operationSuccess'))