按文档修改

This commit is contained in:
Ledo 2025-06-03 23:43:01 +08:00
parent 44b2a30055
commit 009d9afbf4
54 changed files with 7589 additions and 15807 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -202,8 +202,8 @@
<version>${redisson.version}</version> <version>${redisson.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>spring-boot-starter-actuator</artifactId>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
@ -238,8 +238,8 @@
<version>${lock4j.version}</version> <version>${lock4j.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>redisson-spring-boot-starter</artifactId>
<groupId>org.redisson</groupId> <groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
@ -294,8 +294,8 @@
<version>${spring-boot-admin.version}</version> <version>${spring-boot-admin.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>spring-boot-admin-server-cloud</artifactId>
<groupId>de.codecentric</groupId> <groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-cloud</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
@ -315,12 +315,12 @@
<version>${spring.boot.version}</version> <version>${spring.boot.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>asm</artifactId>
<groupId>org.ow2.asm</groupId> <groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
</exclusion> </exclusion>
<exclusion> <exclusion>
<artifactId>mockito-core</artifactId>
<groupId>org.mockito</groupId> <groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
@ -415,12 +415,12 @@
<version>${screw.version}</version> <version>${screw.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>freemarker</artifactId>
<groupId>org.freemarker</groupId> <groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</exclusion> </exclusion>
<exclusion> <exclusion>
<artifactId>fastjson</artifactId>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
@ -490,12 +490,12 @@
<version>${aliyun-java-sdk-core.version}</version> <version>${aliyun-java-sdk-core.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>opentracing-api</artifactId>
<groupId>io.opentracing</groupId> <groupId>io.opentracing</groupId>
<artifactId>opentracing-api</artifactId>
</exclusion> </exclusion>
<exclusion> <exclusion>
<artifactId>opentracing-util</artifactId>
<groupId>io.opentracing</groupId> <groupId>io.opentracing</groupId>
<artifactId>opentracing-util</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
@ -515,8 +515,8 @@
<version>${justauth.version}</version> <version>${justauth.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>hutool-core</artifactId>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
@ -541,8 +541,8 @@
<version>${jimureport.version}</version> <version>${jimureport.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>druid</artifactId>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>

View File

@ -84,6 +84,7 @@ public interface ErrorCodeConstants {
ErrorCode PROCESS_BOM_DETAIL_UNSTANDARD_MATERIAL_NAME_IS_REPEAT= new ErrorCode(1_006_009, "非标准件工艺bom明细物料名称重复"); ErrorCode PROCESS_BOM_DETAIL_UNSTANDARD_MATERIAL_NAME_IS_REPEAT= new ErrorCode(1_006_009, "非标准件工艺bom明细物料名称重复");
ErrorCode PROCESS_BOM_DETAIL_UNSTANDARD_SPEC_IS_NULL= new ErrorCode(1_006_010, "非标准件工艺bom明细规格为空"); ErrorCode PROCESS_BOM_DETAIL_UNSTANDARD_SPEC_IS_NULL= new ErrorCode(1_006_010, "非标准件工艺bom明细规格为空");
ErrorCode PRICESS_UNIT_ERRPR = new ErrorCode(1_006_0011, "bom单位非法请在字典基础数据中维护"); ErrorCode PRICESS_UNIT_ERRPR = new ErrorCode(1_006_0011, "bom单位非法请在字典基础数据中维护");
/************生产计划管理***********/ /************生产计划管理***********/
ErrorCode PLAN_NOT_EXISTS = new ErrorCode(1_007_001, "生产计划不存在"); ErrorCode PLAN_NOT_EXISTS = new ErrorCode(1_007_001, "生产计划不存在");
ErrorCode PLAN_SUB_NOT_EXISTS = new ErrorCode(1_007_002, "生产计划子项目不存在"); ErrorCode PLAN_SUB_NOT_EXISTS = new ErrorCode(1_007_002, "生产计划子项目不存在");
@ -111,6 +112,7 @@ public interface ErrorCodeConstants {
ErrorCode TASK_DISPATCH_TASK_IS_OVER = new ErrorCode(1_009_007, "报工数量已完成"); ErrorCode TASK_DISPATCH_TASK_IS_OVER = new ErrorCode(1_009_007, "报工数量已完成");
ErrorCode TASK_DISPATCH_TASK_REPORT_AMOUNT_EXCESS = new ErrorCode(1_009_006, "无法超额报工"); ErrorCode TASK_DISPATCH_TASK_REPORT_AMOUNT_EXCESS = new ErrorCode(1_009_006, "无法超额报工");
ErrorCode TASK_REPORT_OTHER_PERSON_NO_SUBMIT = new ErrorCode(1_009_020, "其他人员尚未报工,无法结束生产"); ErrorCode TASK_REPORT_OTHER_PERSON_NO_SUBMIT = new ErrorCode(1_009_020, "其他人员尚未报工,无法结束生产");
//1_009_021已被使用
/*************质量管理***********/ /*************质量管理***********/
ErrorCode UNQUALIFIED_NOTIFICATION_NOT_EXISTS = new ErrorCode(1_010_001, "品质异常通知单审核不存在"); ErrorCode UNQUALIFIED_NOTIFICATION_NOT_EXISTS = new ErrorCode(1_010_001, "品质异常通知单审核不存在");
ErrorCode QUALITY_FEEDBACK_NOT_EXISTS = new ErrorCode(1_010_002, "客户反馈质量不存在"); ErrorCode QUALITY_FEEDBACK_NOT_EXISTS = new ErrorCode(1_010_002, "客户反馈质量不存在");

View File

@ -192,9 +192,10 @@ public class ProcessBomController {
@Parameters({@Parameter(name = "file", description = "Excel 文件", required = true)}) @Parameters({@Parameter(name = "file", description = "Excel 文件", required = true)})
@PreAuthorize("@ss.hasPermission('heli:process-bom:import')") @PreAuthorize("@ss.hasPermission('heli:process-bom:import')")
@OperateLog(type = IMPORT) @OperateLog(type = IMPORT)
public CommonResult<ProcessBomImportRespVO> importExcel(@RequestParam("file") MultipartFile file) { public CommonResult<ProcessBomImportRespVO> importExcel(HttpServletRequest request,@RequestParam("file") MultipartFile file) {
try { try {
processBomService.importExcel(file); String bomCode = request.getHeader("Bom-Code");
processBomService.importExcel(file,bomCode);
return success(null); return success(null);
} catch (Exception e) { } catch (Exception e) {
return error(500, "文件导入失败: " + e.getMessage()); return error(500, "文件导入失败: " + e.getMessage());

View File

@ -2,6 +2,7 @@ package com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat; import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat;
import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert; import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
@ -88,4 +89,9 @@ public class ProcessBomRespVO {
@Schema(description = "审核人") @Schema(description = "审核人")
private Long shenheUser; private Long shenheUser;
private String customerBrief;
private String projectNameSim;
private String subNameSim;
} }

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo; package com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
@ -64,6 +65,11 @@ public class ProcessBomSaveReqVO {
@Schema(description = "操作意见") @Schema(description = "操作意见")
private String activeOpinion; private String activeOpinion;
private String customerBrief;
private String projectNameSim;
private String subNameSim;
/** /**
* 审核人 * 审核人
*/ */

View File

@ -94,6 +94,12 @@ public class ProcessDesignRespVO {
@Schema(description = "毛坯负责人名称") @Schema(description = "毛坯负责人名称")
private String blankOwnerName; private String blankOwnerName;
@Schema(description = "是否延期", example = "0")
private Integer isDelay;
@Schema(description = "延期时间戳", example = "2023-01-02")
private Date delayTime;
@Schema(description = "延期原因", example = "28809")
private String delayReason;
@Schema(description = "毛坯最新进度") @Schema(description = "毛坯最新进度")
private BigDecimal progressBlank; private BigDecimal progressBlank;

View File

@ -35,7 +35,12 @@ public class ProcessDesignSaveReqVO {
@Schema(description = "子项目id", example = "28809") @Schema(description = "子项目id", example = "28809")
private Long projectSubId; private Long projectSubId;
@Schema(description = "是否延期", example = "0")
private Integer isDelay;
@Schema(description = "延期时间戳", example = "2023-01-02")
private Date delayTime;
@Schema(description = "延期原因", example = "28809")
private String delayReason;
@Schema(description = "工艺设计进度列表") @Schema(description = "工艺设计进度列表")
private List<ProcessDesignProgressDO> processDesignProgressList; private List<ProcessDesignProgressDO> processDesignProgressList;

View File

@ -35,4 +35,6 @@ public class TaskDispatchDetailPageReqVO extends PageParam {
@Schema(description = "bom明细id") @Schema(description = "bom明细id")
private Long bomDetailId; private Long bomDetailId;
@Schema(description = "项目或子项目id")
private String subOrDetailName;
} }

View File

@ -110,6 +110,7 @@ public class PgMasterLineDO extends BaseDO {
* 预计工时 * 预计工时
*/ */
private BigDecimal gongShi; private BigDecimal gongShi;
private Long procedureId;
/** /**
* 质量派工id * 质量派工id
*/ */

View File

@ -143,6 +143,12 @@ public class ProcessBomDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private String projectSubCode; private String projectSubCode;
@TableField(exist = false)
private String customerBrief;
@TableField(exist = false)
private String projectNameSim;
@TableField(exist = false)
private String subNameSim;
@TableField(exist = false) @TableField(exist = false)
private Integer property; private Integer property;

View File

@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date;
/** /**
* 工艺设计 DO * 工艺设计 DO
@ -52,6 +54,12 @@ public class ProcessDesignDO extends BaseDO {
* 项目id * 项目id
*/ */
private Long projectId; private Long projectId;
private Integer isDelay;
private Date delayTime;
private String delayReason;
/** /**
* 子项目id * 子项目id
*/ */

View File

@ -3,6 +3,7 @@ package com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesignprogress;
import lombok.*; import lombok.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
@ -53,4 +54,9 @@ public class ProcessDesignProgressDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private String creatorName; private String creatorName;
private Integer isOver;
private Date beginTime;
private Date endTime;
private BigDecimal workTime;
} }

View File

@ -85,6 +85,8 @@ public class TaskDispatchDetailDO extends BaseDO {
private LocalDateTime startTime; private LocalDateTime startTime;
private Long detailOwnerId; private Long detailOwnerId;
//是否过程检 -Y -N
private String testYn;
/** /**
* 预计结束日期 * 预计结束日期
*/ */

View File

@ -70,7 +70,7 @@ public interface FpUserDetailMapper extends BaseMapperX<FpUserDetailDO> {
throw exception(OWNER_NOT_EXISTS); throw exception(OWNER_NOT_EXISTS);
} }
if (id!=null &&fpUserDetailDOS.size()!=1) { if (id!=null && fpUserDetailDOS.size()!=1) {
throw exception(OWNER_NOT_EXISTS); throw exception(OWNER_NOT_EXISTS);
} }

View File

@ -1,7 +1,9 @@
package com.chanko.yunxi.mes.module.heli.dal.mysql.processbom; package com.chanko.yunxi.mes.module.heli.dal.mysql.processbom;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.ProcessBoomPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.ProcessBoomPageReqVO;
@ -53,7 +55,7 @@ public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO>
"LEFT JOIN v_storage_material_now s ON p.material_id = s.id " + "LEFT JOIN v_storage_material_now s ON p.material_id = s.id " +
"LEFT JOIN base_material m ON s.id=m.id "+ "LEFT JOIN base_material m ON s.id=m.id "+
"WHERE p.bom_id = #{bomId} and p.material_id is not null AND p.deleted IN (0, 1) " + "WHERE p.bom_id = #{bomId} and p.material_id is not null AND p.deleted IN (0, 1) " +
"GROUP BY p.material_code") "GROUP BY p.id") //2025 0601 因为bom明细页查询到结果 group by materialcode转换为 group by id
List<ProcessBomDetailDO> selectStandardListByBomId(@Param("bomId") Long bomId); List<ProcessBomDetailDO> selectStandardListByBomId(@Param("bomId") Long bomId);
default Long getBomDetailByBluePrintNoAndBomId(String bomCode,String bluePrintNo){ default Long getBomDetailByBluePrintNoAndBomId(String bomCode,String bluePrintNo){
@ -98,6 +100,17 @@ public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO>
List<ProcessBomDetailDO> selectListByBomIdbyid(Long id,Long bomId); List<ProcessBomDetailDO> selectListByBomIdbyid(Long id,Long bomId);
default int updateCompositionIdBatch(List<Long> ids){
if(CollUtil.isNotEmpty(ids)){
UpdateWrapper<ProcessBomDetailDO> updateSql = new UpdateWrapper<>();
updateSql.set("composition_id",null).in("id",ids);
return update(updateSql);
}else {
return 0;
}
}
// return selectList(ProcessBomDetailDO::getBomId, bomId); // return selectList(ProcessBomDetailDO::getBomId, bomId);
// } // }
default List<ProcessBomDetailDO> selectListByproid(Long bomId) { default List<ProcessBomDetailDO> selectListByproid(Long bomId) {

View File

@ -126,7 +126,7 @@ public interface ProcessBomMapper extends BaseMapperX<ProcessBomDO> {
query.selectAll(ProcessBomDO.class) query.selectAll(ProcessBomDO.class)
.select("concat('BOM-', e.project_sub_code) as bomCode", "e.project_sub_code as projectSubCode") .select("concat('BOM-', e.project_sub_code) as bomCode", "e.project_sub_code as projectSubCode")
.select("a.plan_no as planCode", "b.code as projectCode", "c.name as customerName", "b.project_name as projectName","b.property as property") .select("a.plan_no as planCode", "b.code as projectCode", "c.name as customerName", "b.project_name as projectName","b.property as property")
.select("c.brief as customerBrief,b.project_name_sim as projectNameSim,d.name_sim as subNameSim")
.select("d.name as projectSubName") .select("d.name as projectSubName")
.leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessBomDO::getPlanId) .leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessBomDO::getPlanId)
.leftJoin(PlanSubDO.class, "e", PlanSubDO::getProjectSubId, ProcessBomDO::getProjectSubId) .leftJoin(PlanSubDO.class, "e", PlanSubDO::getProjectSubId, ProcessBomDO::getProjectSubId)

View File

@ -305,6 +305,9 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
.ne(ProjectOrderDO::getStatus,6) .ne(ProjectOrderDO::getStatus,6)
.groupBy(TaskDispatchDetailDO::getId) .groupBy(TaskDispatchDetailDO::getId)
.disableSubLogicDel(); .disableSubLogicDel();
if (reqVO.getSubOrDetailName() != null && !reqVO.getSubOrDetailName().trim().equals("")){
query.apply("(b.project_name like '%" + reqVO.getSubOrDetailName() + "%' or c.name like '%" + reqVO.getSubOrDetailName() + "%')");
}
if (reqVO.getProcedureStatusList().size()==1 && reqVO.getProcedureStatusList().get(0)==2){ if (reqVO.getProcedureStatusList().size()==1 && reqVO.getProcedureStatusList().get(0)==2){
//完工降序 //完工降序
query.orderByDesc(TaskDispatchDetailDO::getDispatchId,TaskDispatchDetailDO::getSort); query.orderByDesc(TaskDispatchDetailDO::getDispatchId,TaskDispatchDetailDO::getSort);

View File

@ -79,7 +79,7 @@ public interface PgMasterService {
*/ */
List<PgMasterLineDO> getPgMasterLineListByZlPgId(Integer zlPgId); List<PgMasterLineDO> getPgMasterLineListByZlPgId(Integer zlPgId);
Boolean insertPgList(Long task_id,Long project_id,Long bomMxId); Boolean insertPgList(Long task_id,Long project_id,Long bomMxId,Long procedureId);
List<PgMasterLineDO> searchBomMx(Long task_id,Long project_id); List<PgMasterLineDO> searchBomMx(Long task_id,Long project_id);

View File

@ -59,7 +59,7 @@ public class PgMasterServiceImpl implements PgMasterService {
@Override @Override
public Boolean insertPgList(Long task_id,Long project_id,Long bomMxId){ public Boolean insertPgList(Long task_id,Long project_id,Long bomMxId,Long procedureId){
//213 605 //213 605
//查询BOM明细 //查询BOM明细
List<ProcessBomDO> processBomDOList = processBomMapper.selectBomMx(task_id,project_id,bomMxId); List<ProcessBomDO> processBomDOList = processBomMapper.selectBomMx(task_id,project_id,bomMxId);
@ -68,6 +68,8 @@ public class PgMasterServiceImpl implements PgMasterService {
PgMasterLineDO pgMasterLineDO = new PgMasterLineDO(); PgMasterLineDO pgMasterLineDO = new PgMasterLineDO();
//bomID //bomID
pgMasterLineDO.setBomId(o.getBomId()); pgMasterLineDO.setBomId(o.getBomId());
//工序id
pgMasterLineDO.setProcedureId(procedureId);
//bom名称 //bom名称
pgMasterLineDO.setBomName("BOM-"+o.getProjectSubShortName()); pgMasterLineDO.setBomName("BOM-"+o.getProjectSubShortName());
//bom编号 //bom编号

View File

@ -164,11 +164,13 @@ private TaskReportMapper taskReportMapper;
} }
@Override @Override
public PlanDO getPlanByProjectId(Long projectId){ public PlanDO getPlanByProjectId(Long projectId){
return planMapper.selectOne(new LambdaQueryWrapper<PlanDO>() {{ return planMapper.selectOne(new LambdaQueryWrapper<PlanDO>() {
{
eq(PlanDO::getProjectId, projectId); eq(PlanDO::getProjectId, projectId);
orderByDesc(PlanDO::getId); orderByDesc(PlanDO::getId);
last("LIMIT 1"); last("LIMIT 1");
}}); }
});
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -180,7 +182,8 @@ private TaskReportMapper taskReportMapper;
eq(PlanDO::getProjectId, projectId); eq(PlanDO::getProjectId, projectId);
orderByDesc(PlanDO::getId); orderByDesc(PlanDO::getId);
last("LIMIT 1"); last("LIMIT 1");
}}); }}
);
// 生成生产计划子项目信息 // 生成生产计划子项目信息
List<ProjectOrderSubDO> projectOrderSubDOs = projectOrderService.getProjectOrderSubListByProjectOrderId(projectId); List<ProjectOrderSubDO> projectOrderSubDOs = projectOrderService.getProjectOrderSubListByProjectOrderId(projectId);
if(planDO != null){ if(planDO != null){

View File

@ -36,7 +36,7 @@ public interface ProcessBomService {
* @param file 文件 * @param file 文件
* @return 编号 * @return 编号
*/ */
void importExcel(@Valid MultipartFile file) throws IOException; void importExcel(@Valid MultipartFile file,String bomCode) throws IOException;
/** /**
* 更新工艺bom * 更新工艺bom
* *

View File

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.generator.IFill; import com.baomidou.mybatisplus.generator.IFill;
import com.chanko.yunxi.mes.framework.common.enums.BomEditStatusEnum; import com.chanko.yunxi.mes.framework.common.enums.BomEditStatusEnum;
import com.chanko.yunxi.mes.framework.common.enums.StatusEnum; import com.chanko.yunxi.mes.framework.common.enums.StatusEnum;
import com.chanko.yunxi.mes.framework.common.exception.ErrorCode;
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;
@ -54,6 +55,7 @@ import org.springframework.validation.annotation.Validated;
import com.chanko.yunxi.mes.module.heli.service.shenhe.SerarchUser; import com.chanko.yunxi.mes.module.heli.service.shenhe.SerarchUser;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.thymeleaf.expression.Ids;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
@ -128,13 +130,16 @@ public class ProcessBomServiceImpl implements ProcessBomService {
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void importExcel(@Valid MultipartFile file) throws IOException { public void importExcel(@Valid MultipartFile file,String bomCode) throws IOException {
// 校验文件格式 // 校验文件格式
if (!file.getOriginalFilename().endsWith(".xlsx") && !file.getOriginalFilename().endsWith(".xls")) { if (!file.getOriginalFilename().endsWith(".xlsx") && !file.getOriginalFilename().endsWith(".xls")) {
throw exception(EXCEL_FILE_FORMAT_ERROR); throw exception(EXCEL_FILE_FORMAT_ERROR);
} }
// 读取Excel文件并转换为VO对象列表 // 读取Excel文件并转换为VO对象列表
List<ProcessBomImportExcelVO> list = ExcelUtils.read(file, ProcessBomImportExcelVO.class); List<ProcessBomImportExcelVO> list = ExcelUtils.read(file, ProcessBomImportExcelVO.class);
for (ProcessBomImportExcelVO processBomImportExcelVO : list) {
processBomImportExcelVO.setCode(bomCode);
}
HashSet<String> blueprintNoList = new HashSet<String>(); HashSet<String> blueprintNoList = new HashSet<String>();
Map<String, List<ProcessBomImportExcelVO>> groupedByCode = list.stream().collect(Collectors.groupingBy(vo -> vo.getCode() == null ? "NULL" : vo.getCode())); Map<String, List<ProcessBomImportExcelVO>> groupedByCode = list.stream().collect(Collectors.groupingBy(vo -> vo.getCode() == null ? "NULL" : vo.getCode()));
Map<String, List<ProcessBomImportExcelVO>> groupedByBluePrintfNo = list.stream().collect(Collectors.groupingBy(vo -> vo.getBlueprintNo() == null ? "NULL" : vo.getBlueprintNo())); Map<String, List<ProcessBomImportExcelVO>> groupedByBluePrintfNo = list.stream().collect(Collectors.groupingBy(vo -> vo.getBlueprintNo() == null ? "NULL" : vo.getBlueprintNo()));
@ -360,6 +365,37 @@ public class ProcessBomServiceImpl implements ProcessBomService {
throw exception(PROCESS_BOM_DETAIL_BLUE_PRINT_NO_REPEAT); throw exception(PROCESS_BOM_DETAIL_BLUE_PRINT_NO_REPEAT);
} }
}); });
for (ProcessBomDetailDO processBomDetail : processBomDetails) {
//标准件不管材质非标准件材质必填
if (processBomDetail.getType().equals("2")){
if (processBomDetail.getCompositionId() == null) {
throw exception(new ErrorCode(1_006_9999,processBomDetail.getMaterialName()+"材质不能为空,请确认!"));
}
if(processBomDetail.getId() == null){
if(updateReqVO.getCustomerBrief() != null && !updateReqVO.getCustomerBrief().equals("")){
processBomDetail.setMaterialCode(updateReqVO.getCustomerBrief()+'-' );
if(updateReqVO.getProjectNameSim() != null && !updateReqVO.getProjectNameSim().equals("")){
processBomDetail.setMaterialCode(processBomDetail.getMaterialCode() + updateReqVO.getProjectNameSim() +'-');
if(updateReqVO.getSubNameSim() != null && !updateReqVO.getSubNameSim().equals("")){
processBomDetail.setMaterialCode(processBomDetail.getMaterialCode() + updateReqVO.getSubNameSim() + '-' );
if(processBomDetail.getBlueprintNo() != null && ! processBomDetail.getBlueprintNo().equals("")){
processBomDetail.setMaterialCode(processBomDetail.getMaterialCode()+processBomDetail.getBlueprintNo()) ;
}else{
processBomDetail.setMaterialCode("");
}
}else{
processBomDetail.setMaterialCode("");
}
}else{
processBomDetail.setMaterialCode("");
}
}else{
processBomDetail.setMaterialCode("");
}
}
}
}
Map<String, List<ProcessBomDetailDO>> groupedByMaterialName = processBomDetails.stream().filter(o -> o.getType().equals("2")).collect(Collectors.groupingBy(vo -> vo.getMaterialName() == null ? "NULL" : vo.getMaterialName())); Map<String, List<ProcessBomDetailDO>> groupedByMaterialName = processBomDetails.stream().filter(o -> o.getType().equals("2")).collect(Collectors.groupingBy(vo -> vo.getMaterialName() == null ? "NULL" : vo.getMaterialName()));
groupedByMaterialName.forEach((matName,list)->{ groupedByMaterialName.forEach((matName,list)->{
if (matName.equals("NULL")){ if (matName.equals("NULL")){
@ -417,7 +453,7 @@ public class ProcessBomServiceImpl implements ProcessBomService {
changeContent += "→物料名称由"+po.getMaterialName()+"变为"+vo.getMaterialName(); changeContent += "→物料名称由"+po.getMaterialName()+"变为"+vo.getMaterialName();
// } // }
} }
if (!vo.getCompositionId().equals(po.getCompositionId())) { if (po.getCompositionId() != null && vo.getCompositionId() != null && (!vo.getCompositionId().equals(po.getCompositionId()))) {
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus()); vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
// if(vo.getMemo()!=null) { // if(vo.getMemo()!=null) {
// vo.setMemo(vo.getMemo() + "→材质由" + po.getCompositionId() + "变为" + vo.getCompositionId()); // vo.setMemo(vo.getMemo() + "→材质由" + po.getCompositionId() + "变为" + vo.getCompositionId());
@ -425,6 +461,15 @@ public class ProcessBomServiceImpl implements ProcessBomService {
change = true; change = true;
changeContent +="→材质由"+po.getCompositionId()+"变为"+vo.getCompositionId(); changeContent +="→材质由"+po.getCompositionId()+"变为"+vo.getCompositionId();
// } // }
}
if (po.getCompositionId() != null && vo.getCompositionId() == null) {
change = true;
changeContent +="→材质设置被为空";
}
if (vo.getCompositionId() != null && po.getCompositionId() ==null){
change = true;
changeContent +="→材质设置被为"+vo.getCompositionId();
} }
if (!vo.getBlueprintNo().equals(po.getBlueprintNo())) { if (!vo.getBlueprintNo().equals(po.getBlueprintNo())) {
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus()); vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
@ -936,7 +981,16 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<ProcessBomDetailDO> updateList = list.stream().filter(o -> o.getId() != null).collect(Collectors.toList()); List<ProcessBomDetailDO> updateList = list.stream().filter(o -> o.getId() != null).collect(Collectors.toList());
List<ProcessBomDetailDO> insertList = list.stream().filter(o -> o.getId() == null).collect(Collectors.toList()); List<ProcessBomDetailDO> insertList = list.stream().filter(o -> o.getId() == null).collect(Collectors.toList());
if(!updateList.isEmpty()) processBomDetailMapper.updateBatch(updateList); if(!updateList.isEmpty()) {
List<Long> ids = new ArrayList<>();
for (ProcessBomDetailDO processBomDetailDO : updateList) {
if (processBomDetailDO.getCompositionId() == null){
ids.add(processBomDetailDO.getId());
}
}
processBomDetailMapper.updateCompositionIdBatch(ids);
processBomDetailMapper.updateBatch(updateList);
}
if(!insertList.isEmpty()) { if(!insertList.isEmpty()) {
//如果新增的不为空就要看它有没有下发生产任务单了 //如果新增的不为空就要看它有没有下发生产任务单了
processBomDetailMapper.insertBatch(insertList); processBomDetailMapper.insertBatch(insertList);

View File

@ -603,6 +603,17 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
throw exception(TASK_DISPATCH_TASK_REPORT_AMOUNT_EXCESS); throw exception(TASK_DISPATCH_TASK_REPORT_AMOUNT_EXCESS);
} }
} }
//校验如果为完成添加逻辑1生产结束 增加管控 - 如果报工数量 = 派工数量 提示报工数量num1 != 派工数量num2不允许结束
if(operate == TaskReportOperateEnum.FINISH ){
List<TaskReportDO> historyReportList = taskReportMapper.selectList(new LambdaQueryWrapper<TaskReportDO>() {{
eq(TaskReportDO::getDispatchDetailId, taskDispatchDetailDO.getId())
.ne(TaskReportDO::getAmount, 0);
}});
int historyReportAmount = historyReportList.stream().mapToInt(TaskReportDO::getAmount).sum();
if ( taskDispatchDetailDO.getAmount() != historyReportAmount){
throw exception(new ErrorCode(1_009_021,"派工数量:"+taskDispatchDetailDO.getAmount()+"不等于总报工数量:"+historyReportAmount+",不允许结束!"));
}
}
} }
PlanDO planDO = planMapper.selectById(taskDispatchDO.getPlanId()); PlanDO planDO = planMapper.selectById(taskDispatchDO.getPlanId());
// 执行 // 执行
@ -742,10 +753,15 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
bdgzsomthingMapper.updateById(bdgzsomthingDO); bdgzsomthingMapper.updateById(bdgzsomthingDO);
} }
} }
if (taskDispatchDetailDO.getDispatchType().equals("PRODUCTION")){
if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && isBomDetailProductionOver){ pgMasterService.insertPgList(planDO.getId(),planDO.getProjectId(),taskDispatchDO.getBomDetailId(),taskDispatchDetailDO.getProcedureId());
pgMasterService.insertPgList(planDO.getId(),planDO.getProjectId(),taskDispatchDO.getBomDetailId()); }
}else if (taskDispatchDO.getDispatchType().equals("ASSEMBLE") && isProjectSubAssembleOver ){ // if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && isBomDetailProductionOver){
//
// //现在生产报工的过程检要重新写
// pgMasterService.insertPgList(planDO.getId(),planDO.getProjectId(),taskDispatchDO.getBomDetailId(),taskDispatchDetailDO.getProcedureId());
// }else
if (taskDispatchDO.getDispatchType().equals("ASSEMBLE") && isProjectSubAssembleOver ){
zjPgMasterService.insertZjList(planDO.getId(),planDO.getProjectId(),taskDispatchDO.getProjectSubId()); zjPgMasterService.insertZjList(planDO.getId(),planDO.getProjectId(),taskDispatchDO.getProjectSubId());
} }

View File

@ -1,6 +1,6 @@
server: server:
port: 33859 # port: 33859
#@ port:8080 port:8080
--- #################### 数据库相关配置 #################### --- #################### 数据库相关配置 ####################
spring: spring:
@ -50,10 +50,10 @@ spring:
# password: linus,.123 # password: linus,.123
# master: # master:
name: mes-heli-dev name: mes-heli-dev
url: jdbc:mysql://120.48.141.82:3306/mes-heli-dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&socketTimeout=30000&connectTimeout=30000 url: jdbc:mysql://localhost:33061/mes-heli-dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&socketTimeout=30000&connectTimeout=30000
driver-class-name: com.mysql.jdbc.Driver driver-class-name: com.mysql.jdbc.Driver
username: root username: root
password: qweasd,.123 password: 'root'
# slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 # slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
# name: ruoyi-vue-pro # name: ruoyi-vue-pro
# url: jdbc:mysql://localhost:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true # url: jdbc:mysql://localhost:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=CTT&allowPublicKeyRetrieval=true

File diff suppressed because it is too large Load Diff

View File

@ -5,9 +5,10 @@
// const proBaseURL = 'http://124.221.23.100:9003' // const proBaseURL = 'http://124.221.23.100:9003'
// const devBaseURL = 'http://118.195.155.9:9002/' // const devBaseURL = 'http://118.195.155.9:9002/'
// const proBaseURL = 'http://118.195.155.9:9002/' // const proBaseURL = 'http://118.195.155.9:9002/'
const devBaseURL = 'http://192.168.0.169:9002/' // const devBaseURL = 'http://192.168.0.169:9002/'
const proBaseURL = 'http://192.168.0.169:9002/' // const proBaseURL = 'http://192.168.0.169:9002/'
const devBaseURL = 'http://218.75.46.166:8889/'
const proBaseURL = 'http://218.75.46.166:8889/'
export const BASE_URL = process.env.NODE_ENV === 'development' ? devBaseURL : proBaseURL export const BASE_URL = process.env.NODE_ENV === 'development' ? devBaseURL : proBaseURL
export const TIMEOUT = 5000 export const TIMEOUT = 5000

View File

@ -1,7 +1,7 @@
# 开发环境 # 开发环境
NODE_ENV=development NODE_ENV=development
VITE_DEV=true 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://nxhs.cjyx.cc' VITE_BASE_URL='https://nxhs.cjyx.cc'
@ -23,7 +23,7 @@ VITE_API_URL=/admin-api
VITE_DROP_DEBUGGER=true VITE_DROP_DEBUGGER=true
# 是否删除console.log # 是否删除console.log
VITE_DROP_CONSOLE=true VITE_DROP_CONSOLE=false
# 是否sourcemap # 是否sourcemap
VITE_SOURCEMAP=false VITE_SOURCEMAP=false

View File

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

View File

@ -118,7 +118,12 @@ watch(valueName, (newValue: any) => {
}) })
const onSelectChange = (newValue: any) => { const onSelectChange = (newValue: any) => {
if(newValue != '' ) {
valueNameObject.value = compositionList.value.find((composition) => composition.id === newValue) // valueNameObject.value = compositionList.value.find((composition) => composition.id === newValue) //
emit('update:newValue', valueNameObject.value) emit('update:newValue', valueNameObject.value)
}else{
emit('update:newValue', '')
}
} }
</script> </script>

View File

@ -49,34 +49,34 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column fixed label="序号" type="index" width="60" align="center" /> <el-table-column fixed label="序号" type="index" width="60" align="center" />
<el-table-column fixed label="计划单号" align="center" prop="planCode" min-width="180">
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" /> <el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="150"> <el-table-column fixed label="生产状态" align="center" prop="status" width="150">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" /> <dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="客户名称" align="center" prop="customerName" min-width="240" /> <el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="240" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" /> <el-table-column label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" /> <el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" />
<el-table-column label="性质" align="center" prop="property" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" />
</template>
</el-table-column>
<el-table-column label="计划单号" align="center" prop="planCode" min-width="180">
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="350" /> <el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="350" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150"> <el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" /> <dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="性质" align="center" prop="property" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" />
</template>
</el-table-column>
<el-table-column fixed="right" label="2D负责人" align="center" prop="twoDimOwnerName" width="120" /> <el-table-column fixed="right" label="2D负责人" align="center" prop="twoDimOwnerName" width="120" />
<el-table-column fixed="right" label="2D截止日期" align="center" prop="twoDimDate" :formatter="dateFormatter2" min-width="140" /> <el-table-column fixed="right" label="2D截止日期" align="center" prop="twoDimDate" :formatter="dateFormatter2" min-width="140" />
<el-table-column fixed="right" label="最新进度" align="center" prop="progress" min-width="120"> <el-table-column fixed="right" label="最新进度" align="center" prop="progress" min-width="120">

View File

@ -87,33 +87,33 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column fixed label="序号" type="index" width="60" align="center" /> <el-table-column fixed label="序号" type="index" width="60" align="center" />
<el-table-column fixed label="计划单号" align="center" prop="planCode" min-width="180" >
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" /> <el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="150"> <el-table-column fixed label="生产状态" align="center" prop="status" width="150">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" /> <dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="客户名称" align="center" prop="customerName" min-width="240" /> <el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="240" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" /> <el-table-column label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" /> <el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" />
<el-table-column label="性质" align="center" prop="property" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" />
</template>
</el-table-column>
<el-table-column label="计划单号" align="center" prop="planCode" min-width="180" >
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="350" /> <el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="350" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150"> <el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" /> <dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="性质" align="center" prop="property" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" />
</template>
</el-table-column>
<el-table-column fixed="right" label="3D负责人" align="center" prop="threeDimOwnerName" min-width="120"/> <el-table-column fixed="right" label="3D负责人" align="center" prop="threeDimOwnerName" min-width="120"/>
<el-table-column fixed="right" label="3D截止日期" align="center" prop="threeDimDate" :formatter="dateFormatter2" min-width="140"/> <el-table-column fixed="right" label="3D截止日期" align="center" prop="threeDimDate" :formatter="dateFormatter2" min-width="140"/>
<el-table-column fixed="right" label="最新进度" align="center" prop="progress" min-width="120" > <el-table-column fixed="right" label="最新进度" align="center" prop="progress" min-width="120" >

View File

@ -36,14 +36,14 @@
<el-button @click="resetQuery"> <el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置 <Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button> </el-button>
<el-button <!-- <el-button
type="primary" type="primary"
plain plain
@click="handleImport" @click="handleImport"
v-hasPermi="['system:user:import']" v-hasPermi="['system:user:import']"
> >
<Icon icon="ep:upload" /> 导入BOM <Icon icon="ep:upload" /> 导入BOM
</el-button> </el-button> -->
<el-button <el-button
type="success" type="success"
plain plain
@ -183,7 +183,7 @@ const resetQuery = () => {
/** BOM导入 */ /** BOM导入 */
const importFormRef = ref() const importFormRef = ref()
const handleImport = () => { const handleImport = () => {
importFormRef.value.open() importFormRef.value.open(formData.value.bomCode)
} }
/** 添加/修改操作 */ /** 添加/修改操作 */

View File

@ -102,6 +102,15 @@
<el-row> <el-row>
<el-col v-if="!detailDisabled"> <el-col v-if="!detailDisabled">
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增</el-button> <el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增</el-button>
<el-button
type="success"
size="large"
@click="handleImport"
v-hasPermi="['system:user:import']"
>
<Icon icon="ep:upload" /> 导入BOM
</el-button>
</el-col> </el-col>
<el-col> <el-col>
<el-card class="hl-incard"> <el-card class="hl-incard">
@ -143,14 +152,14 @@
</el-table-column> </el-table-column>
<el-table-column label="零件编码" prop="materialCode" min-width="120" /> <el-table-column label="零件编码" prop="materialCode" min-width="120" />
<el-table-column label="材质" prop="compositionId" min-width="180"> <el-table-column label="材质" prop="compositionId" min-width="180">
<template #header><span class="hl-table_header">*</span>材质</template> <template #header><span class="hl-table_header">{{startTag}}</span>材质</template>
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item <el-form-item
:prop="`${$index}.compositionId`" :rules="subFormRules.compositionId" :prop="`${$index}.compositionId`"
class="mb-0px!"> class="mb-0px!">
<CompositionSelect <CompositionSelect
:disabled="getDisable(row.bomEditStatus)" v-model="row.compositionId" :disabled="getDisable(row.bomEditStatus)" v-model="row.compositionId"
@update:new-value="(val) => { row.compositionId = val.id; }" /> @update:new-value="(val) => { val == ''? row.compositionId = '': row.compositionId = val.id; }" />
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
@ -351,10 +360,12 @@
</el-card> </el-card>
</el-form> </el-form>
</el-card> </el-card>
<BomImportForm ref="importFormRef" @success="getList" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { DICT_TYPE, getDictLabel, getIntDictOptions, getStrDictOptions } from '@/utils/dict' import { DICT_TYPE, getDictLabel, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
import { dateFormatter, formatDate } from '@/utils/formatTime' import { dateFormatter, formatDate } from '@/utils/formatTime'
import BomImportForm from './bomImportForm.vue'
import { ref } from 'vue' import { ref } from 'vue'
import { inject } from 'vue' import { inject } from 'vue'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
@ -380,6 +391,7 @@ const commonStore = useCommonStore()
const userStore = useUserStore() const userStore = useUserStore()
const router = useRouter() const router = useRouter()
const { query } = useRoute() const { query } = useRoute()
const startTag = ref('*')
const active = toRef(commonStore.getStore('active')) const active = toRef(commonStore.getStore('active'))
const currentId = toRef(commonStore.getStore('id')) const currentId = toRef(commonStore.getStore('id'))
const formLoading = ref(false) const formLoading = ref(false)
@ -420,7 +432,11 @@ const heliBomStatusOptions = ref<bomEditStatusEnum[]>([
]); ]);
const formRef = ref() // Ref const formRef = ref() // Ref
const subFormRef = ref() const subFormRef = ref()
//20250601
const importFormRef = ref()
const handleImport = () => {
importFormRef.value.open(formData.value.bomCode)
}
// //
const fieldHasAlter = (fieldName) => { const fieldHasAlter = (fieldName) => {
@ -678,6 +694,9 @@ const submitForm = async (operate) => {
// //
formLoading.value = true formLoading.value = true
try { try {
// //
//formData.value.processBomDetails = formData.value.processBomDetails.filter((item) => item.isSelected); //formData.value.processBomDetails = formData.value.processBomDetails.filter((item) => item.isSelected);
const data = formData.value as unknown as ProcessBomApi.ProcessBomVO const data = formData.value as unknown as ProcessBomApi.ProcessBomVO
@ -740,8 +759,10 @@ const onDeleteItem = async (index) => {
const onChangeType = (row, val) => { const onChangeType = (row, val) => {
if (val==2){ if (val==2){
row.spec = "A" row.spec = "A"
startTag.value = '*'
}else{ }else{
row.spec =undefined row.spec =undefined
startTag.value = ''
} }
row.materialId = undefined row.materialId = undefined
row.materialName = undefined row.materialName = undefined

View File

@ -42,9 +42,10 @@ const importUrl =
import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/heli/process-bom/import' import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + '/heli/process-bom/import'
const uploadHeaders = ref() // Header const uploadHeaders = ref() // Header
const fileList = ref([]) // const fileList = ref([]) //
const bomCode = ref('')
/** 打开弹窗 */ /** 打开弹窗 */
const open = () => { const open = (bomcode :string) => {
bomCode.value = bomcode;
dialogVisible.value = true dialogVisible.value = true
resetForm() resetForm()
} }
@ -59,7 +60,8 @@ const submitForm = async () => {
// //
uploadHeaders.value = { uploadHeaders.value = {
Authorization: 'Bearer ' + getAccessToken(), Authorization: 'Bearer ' + getAccessToken(),
'tenant-id': getTenantId() 'tenant-id': getTenantId(),
'bom-code': bomCode.value
} }
formLoading.value = true formLoading.value = true
uploadRef.value!.submit() uploadRef.value!.submit()

View File

@ -178,13 +178,66 @@
<el-col :span="6"> <el-col :span="6">
<el-form-item label="生产状态" prop="planCode"> <el-form-item label="生产状态" prop="planCode">
<el-select v-model="formData.planStatus" placeholder="生产状态" clearable class="!w-260px" disabled> <el-select v-model="formData.planStatus" placeholder="生产状态" clearable class="!w-260px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PLAN_STATUS)" :key="dict.value" <el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PLAN_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" /> :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="6" v-if="(formData.isDelay == null || formData.isDelay == 0) ">
<el-button style="margin-left: 10%;" type="danger" @click="openDelay">延期</el-button>
</el-col> -->
<el-col :span="6" >
<el-form-item label="设计工时" prop="delayReason">
{{ getWorkTime(1)}}
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="设计工期" prop="delayReason">
{{ getWorkTime(2) }}
</el-form-item>
</el-col>
<el-col :span="6" >
<el-button style="margin-left: 10%;" type="danger" @click="openDelay">延期</el-button>
</el-col>
<el-col :span="12" v-if="formData.isDelay == 1">
<el-form-item label="延期原因" prop="delayReason">
<el-input
v-model="formData.delayReason"
:rows="2"
disabled
type="textarea"
placeholder="延期原因"
/>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-card> </el-card>
<!--延期弹框-->
<el-dialog
v-model="delayDialog"
title="延期信息填写"
:before-close="handleClose"
>
<span>
<el-input
v-model="formData.delayReason"
:rows="2"
type="textarea"
placeholder="延期原因"
/>
</span>
<template #footer>
<span class="dialog-footer">
<el-button @click="delayDialog = false">取消</el-button>
<el-button type="primary" @click="delaySubmit">
确认
</el-button>
</span>
</template>
</el-dialog>
<!-- 表格类信息 --> <!-- 表格类信息 -->
<el-card class="hl-card-info"> <el-card class="hl-card-info">
<template #header> <template #header>
@ -192,14 +245,37 @@
</template> </template>
<el-row> <el-row>
<el-col v-if="active != 'detail'"> <el-col v-if="active != 'detail'">
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增</el-button> <el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">开始</el-button>
<el-button style="margin-left: 30px;" type="warning" size="large" @click="sendItem()">推送</el-button>
<!-- <el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增</el-button> -->
</el-col> </el-col>
<el-col> <el-col>
<el-card class="hl-incard"> <el-card class="hl-incard">
<el-form ref="processDesignProgressFormRef" :model="formData.processDesignProgressList" :rules="subFormRules" v-loading="subFormLoading" label-width="0"> <el-form ref="processDesignProgressFormRef" :model="formData.processDesignProgressList" :rules="subFormRules" v-loading="subFormLoading" label-width="0">
<el-table :data="formData.processDesignProgressList" class="hl-table"> <el-table :data="formData.processDesignProgressList" class="hl-table">
<el-table-column label="序号" align="center" type="index" width="80" fixed /> <el-table-column label="序号" align="center" type="index" width="80" fixed />
<el-table-column label="上报时间" align="center" prop="createTime" :formatter="dateFormatter" min-width="200"/> <el-table-column label="开始时间" align="center" prop="beginTime" :formatter="dateFormatter" min-width="200"/>
<el-table-column label="结束时间" align="center" prop="endTime" :formatter="dateFormatter" min-width="200">
<template #header>结束时间</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.endTime`" class="mb-0px!">
<!-- <el-input-number min="0" max="100" class="!w-240px" :disabled="detailDisabled || row.id" v-model="row.progress" placeholder="请输入进度百分比" @change="verify1($index)"/>-->
<el-date-picker :disabled-date="(date) => disabledDate(date, row)" :disabled="row.hasNext" :formatter="dateFormatter" v-model="row.endTime" type="datetime" placeholder="选择结束日期"/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="已做时间(小时)" align="center" prop="workTime" width="280">
<template #header>已做时间(小时)</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.workTime`" class="mb-0px!">
<el-input-number :max="row.maxTime" :precision="2" class="!w-240px" :disabled="row.hasNext" v-model="row.workTime" placeholder="请输入已做时间"/>
</el-form-item>
</template>
</el-table-column>
<!--2025.06.01-->
<!-- <el-table-column label="上报时间" align="center" prop="createTime" :formatter="dateFormatter" min-width="200"/>
<el-table-column label="上报人" prop="creatorName" min-width="100"/> <el-table-column label="上报人" prop="creatorName" min-width="100"/>
<el-table-column label="进度百分比(%" align="center" prop="progress" width="280"> <el-table-column label="进度百分比(%" align="center" prop="progress" width="280">
<template #header> <span class="hl-table_header">*</span>进度百分比% </template> <template #header> <span class="hl-table_header">*</span>进度百分比% </template>
@ -216,14 +292,27 @@
<el-input :disabled="detailDisabled || row.id" v-model="row.blueprintLink" placeholder="请输入图纸链接" /> <el-input :disabled="detailDisabled || row.id" v-model="row.blueprintLink" placeholder="请输入图纸链接" />
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column> -->
<el-table-column label="备注" prop="remark" min-width="280"> <el-table-column label="备注" prop="remark" min-width="280">
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!"> <el-form-item :prop="`${$index}.remark`" class="mb-0px!">
<el-input :disabled="detailDisabled || row.id" v-model="row.remark" placeholder="请输入备注" /> <el-input :disabled="row.hasNext" v-model="row.remark" placeholder="请输入备注" />
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" align="center" min-width="160">
<template #default="scope">
<el-button
v-if="scope.row.isOver == 0 && active != 'detail'"
link
type="danger"
@click="overRow(scope.row)"
>
结束
</el-button>
</template>
</el-table-column>
</el-table> </el-table>
</el-form> </el-form>
</el-card> </el-card>
@ -231,21 +320,23 @@
</el-row> </el-row>
</el-card> </el-card>
</el-form> </el-form>
<div class="text-center hl-footer"> <!-- <div class="hl-footer text-center">
<el-button @click="goback" size="large"> </el-button> <el-button @click="goback" size="large"> </el-button>
<el-button v-if="active != 'detail'" @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"> </el-button> <el-button v-if="active != 'detail'" @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"> </el-button>
</div> </div> -->
</el-card> </el-card>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel } from '@/utils/dict' import { getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel } from '@/utils/dict'
import {dateFormatter, formatDate} from "@/utils/formatTime"; import {dateFormatter, formatDate,dateFormatter1} from "@/utils/formatTime";
import {ref} from "vue"; import {ref} from "vue";
import * as ProcessDesignApi from "@/api/heli/processdesign"; import * as ProcessDesignApi from "@/api/heli/processdesign";
import { inject } from 'vue' import { inject } from 'vue'
import {useUserStore} from "@/store/modules/user"; import {useUserStore} from "@/store/modules/user";
import {useCommonStore} from "@/store/modules/common"; import {useCommonStore} from "@/store/modules/common";
import {verify} from "node:crypto"; import {verify} from "node:crypto";
import { delay, now } from 'lodash-es';
import { FolderOpened } from '@element-plus/icons-vue/dist/types';
defineOptions({ name: 'ProcessDesignDetail' }) defineOptions({ name: 'ProcessDesignDetail' })
@ -264,7 +355,7 @@ const formLoading = ref(false)
const dialogTitle = ref('') const dialogTitle = ref('')
const detailDisabled = ref(false) const detailDisabled = ref(false)
const flag = ref(false) const flag = ref(false)
const delayDialog = ref(false)
const formData = ref({ const formData = ref({
id: undefined, id: undefined,
planId: undefined, planId: undefined,
@ -293,10 +384,165 @@ const resetForm = () => {
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }
const disabledDate = (time: Date,row : any) => {
const today = new Date();
const tomorrow = new Date(today);
tomorrow.setDate(tomorrow.getDate() + 1); //
tomorrow.setHours(23, 59, 59, 999);
const beginDate = new Date(row.beginTime);
return time.getTime() < beginDate.getTime() || time.getTime() > tomorrow.getTime();
}
const handleClose = (done: () => void) => {
ElMessageBox.confirm('是否退出?')
.then(() => {
delayDialog.value=false;
})
.catch(() => {
})
}
const getWorkTime = (type) =>{
if(formData.value.craftStartDate != null && formData.value.craftEndDate != null){
const start = new Date(formData.value.craftStartDate ).getTime();
const end = new Date( formData.value.craftEndDate).getTime();
const diffTime = Math.abs(end - start);
var day = Math.floor(diffTime / (1000 * 60 * 60 * 24));
if(type == 1){
return day * 8 + '小时';
}else{
return day +'天'
}
}else{return ''
}
}
const delaySubmit = async() =>{
if(formData.value.delayReason == null || formData.value.delayReason.replaceAll(' ','') == ''){
message.error("延期原因不得为空,请确认!")
return;
}
formData.value.isDelay = 1;
formData.value.delayTime = (new Date()).getTime()
await submitForm('SAVE');
}
const openDelay = () =>{
var date = new Date();
if(processDesignType.value == 'BLUEPRINT_WORKBLANK'){
if(formData.value.blankDate != null ){
if(formData.value.blankDate > date.getTime()){
message.error("当前日期为正常生产周期,未达到延期条件,请确认!")
return
}
}else{
message.error("毛坯结束时间为空!请确认!")
return
}
}
if(processDesignType.value == 'BLUEPRINT_2D'){
if(formData.value.twoDimDate != null ){
if(formData.value.twoDimDate > date.getTime()){
message.error("当前日期为正常生产周期,未达到延期条件,请确认!")
return
}
}else{
message.error("2D结束时间为空!请确认!")
return
}
}
if(processDesignType.value == 'BLUEPRINT_3D'){
if(formData.value.threeDimDate != null ){
if(formData.value.threeDimDate > date.getTime()){
message.error("当前日期为正常生产周期,未达到延期条件,请确认!")
return
}
}else{
message.error("3D结束时间为空!请确认!")
return
}
}
if(processDesignType.value == 'BLUEPRINT_FOUNDRY_TECHNOLOGY'){
console.log(formData.value.craftEndDate)
if(formData.value.craftEndDate != null ){
console.log(date.getTime())
console.log(formData.value.craftEndDate)
if(formData.value.craftEndDate > date.getTime()){
message.error("当前日期为正常生产周期,未达到延期条件,请确认!")
return
}
}else{
message.error("工艺结束时间为空!请确认!")
return
}
}
delayDialog.value = true;
}
const overRow = async( row :any) =>{
if(row.endTime == null || row.endTime == ''){
row.endTime = new Date().getTime()
var timeDiff = row.endTime -row.beginTime;
//
row.workTime = timeDiff / (1000 * 60 * 60);
row.maxTime = row.workTime;
// row.workTime = row.endTime - row.
}
if(row.endTime == null || row.endTime == ''){
message.error("结束时间不能为空!请确认!")
return
}
if(row.workTime == null || row.workTime == ''
){
message.error("已做时间不能为空!请确认")
return
}
row.isOver = 1;
// await submitForm('SAVE');
//
}
const sendItem = async() =>{
//,
if(formData.value.processDesignProgressList != null && formData.value.processDesignProgressList.length > 0){
var senIndex = 0;//,:
/**
* 推送最新一条数据内容为客户简称+项目名称+子项目名+备注内容
推送条件
报工后点击保存然后推送菜单有效
1要求先保证推送需要判断备注不能为空报警提示
*/
for (let index = 0; index < formData.value.processDesignProgressList.length; index++) {
var item = formData.value.processDesignProgressList[index];
if(!item.hasNext){
senIndex = index;
if(item.endTime == null || item.endTime == ''){
message.error("结束时间不能为空!请确认!")
return
}
if(item.workTime == null || item.workTime == ''){
message.error("已做时间不能为空!请确认")
return
}
if(item.remark == null || item.remark == ''){
message.error("推送备注不能为空!请确认")
return
}
}
}
//
await submitForm('SAVE');
//
}else{
message.error("至少添加一条数据后才能推送!请确认!")
}
}
const subFormLoading = ref(false) // const subFormLoading = ref(false) //
const subFormRules = reactive({ const subFormRules = reactive({
progress: [{ required: true, message: '进度百分比(%)不能为空', trigger: 'blur' }], // progress: [{ required: true, message: '(%)', trigger: 'blur' }],
blueprintLink: [{ required: true, message: '图纸链接不能为空', trigger: 'blur' }], // blueprintLink: [{ required: true, message: '', trigger: 'blur' }],
}) })
const queryData = async (id?: number) => { const queryData = async (id?: number) => {
@ -307,6 +553,37 @@ const queryData = async (id?: number) => {
try { try {
formData.value = await ProcessDesignApi.getProcessDesign(id) formData.value = await ProcessDesignApi.getProcessDesign(id)
formData.value.processDesignProgressList = await ProcessDesignApi.getProcessDesignProgressListByProcessDesignId(id) formData.value.processDesignProgressList = await ProcessDesignApi.getProcessDesignProgressListByProcessDesignId(id)
if( formData.value.processDesignProgressList != null && formData.value.processDesignProgressList.length > 0){
var maxTime = null;
if(formData.value.processDesignProgressList.length == 1){
formData.value.processDesignProgressList[0].hasNext = false;
if(formData.value.processDesignProgressList[0].endTime != null && formData.value.processDesignProgressList[0].endTime != ''){
formData.value.processDesignProgressList[0].maxTime = (formData.value.processDesignProgressList[0].endTime - formData.value.processDesignProgressList[0].beginTime)/ (1000 * 60 * 60);
}
} else{
var maxIndex = 0;
for (let index = 0; index < formData.value.processDesignProgressList.length; index++) {
var item = formData.value.processDesignProgressList[index];
if(item.endTime != null && item.endTime != ''){
item.maxTime = (item.endTime - item.beginTime)/ (1000 * 60 * 60);
}
if(maxTime == null){
maxIndex = index;
maxTime = item.createTime;
item.hasNext = false;
}else{
if(item.createTime > maxTime){
formData.value.processDesignProgressList[maxIndex].hasNext = true;
maxIndex = index;
item.hasNext = false;
}else{
item.hasNext = true;
}
}
}
}
}
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
@ -314,14 +591,14 @@ const queryData = async (id?: number) => {
} }
const submitForm = async (operate) => { const submitForm = async (operate) => {
if (formData.value.processDesignProgressList.length>1){ // if (formData.value.processDesignProgressList.length>1){
var Current = formData.value.processDesignProgressList[0].progress; // var Current = formData.value.processDesignProgressList[0].progress;
var previous = formData.value.processDesignProgressList[1].progress; // var previous = formData.value.processDesignProgressList[1].progress;
if (Current<previous){ // if (Current<previous){
message.error("本次上报进度"+Current+"%小于上次上报进度"+previous+"%,请确认") // message.error(""+Current+"%"+previous+"%,")
return // return
} // }
} // }
// //
@ -348,26 +625,100 @@ const submitForm = async (operate) => {
} }
/** 新增按钮操作 */ /** 新增按钮操作 */
const onAddItem = () => { const onAddItem = async() => {
if (formData.value.processDesignProgressList.length>0){ var date = new Date();
var element = formData.value.processDesignProgressList[0].progress; if(processDesignType.value == 'BLUEPRINT_WORKBLANK'){
if (element==100){ if(formData.value.blankDate != null ){
message.error("上报进度已100%,请确认") if(formData.value.blankDate < date.getTime()){
if(formData.value.isDelay == null || formData.value.isDelay == 0){
message.error("当前任务已超期,请延期后重试!")
return return
} }
} }
}else{
message.error("毛坯结束时间为空!请确认!")
return
}
}
if(processDesignType.value == 'BLUEPRINT_2D'){
if(formData.value.twoDimDate != null ){
if(formData.value.twoDimDate < date.getTime()){
if(formData.value.isDelay == null || formData.value.isDelay == 0){
message.error("当前任务已超期,请延期后重试!")
return
}
}
}else{
message.error("2D结束时间为空!请确认!")
return
}
}
if(processDesignType.value == 'BLUEPRINT_3D'){
if(formData.value.threeDimDate != null ){
if(formData.value.threeDimDate < date.getTime()){
if(formData.value.isDelay == null || formData.value.isDelay == 0){
message.error("当前任务已超期,请延期后重试!")
return
}
}
}else{
message.error("3D结束时间为空!请确认!")
return
}
}
if(processDesignType.value == 'BLUEPRINT_FOUNDRY_TECHNOLOGY'){
console.log(formData.value.craftEndDate)
if(formData.value.craftEndDate != null ){
console.log(date.getTime())
console.log(formData.value.craftEndDate)
if(formData.value.craftEndDate < date.getTime()){
if(formData.value.isDelay == null || formData.value.isDelay == 0){
message.error("当前任务已超期,请延期后重试!")
return
}
}
}else{
message.error("工艺结束时间为空!请确认!")
return
}
}
if (formData.value.processDesignProgressList.length>0){
for ( var i = 0 ; i < formData.value.processDesignProgressList.length ; i++){
var item = formData.value.processDesignProgressList[i];
if(item.endTime == null || item.endTime == ''){
message.error("结束时间不能为空!请确认!")
return
}
if(item.workTime == null || item.workTime == ''
){
message.error("已做时间不能为空!请确认")
return
}
}
}
const row = { const row = {
id: undefined, id: undefined,
processDesignId: undefined, processDesignId: undefined,
progress: undefined, progress: undefined,
blueprintLink: undefined, blueprintLink: undefined,
remark: undefined, remark: '',
createTime: new Date().getTime(), createTime: date.getTime(),
beginTime:date.getTime(),
endTime:'',
isOver:0,
workTime:undefined,
creatorName: userStore.getUser.nickname, creatorName: userStore.getUser.nickname,
status: 1, status: 1,
} }
row.processDesignId = formData.value.id row.processDesignId = formData.value.id
formData.value.processDesignProgressList.unshift(row) formData.value.processDesignProgressList.unshift(row)
await submitForm('SAVE');
} }
const goback = () => { const goback = () => {

View File

@ -78,20 +78,13 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column fixed label="序号" align="center" type="index" width="60" /> <el-table-column fixed label="序号" align="center" type="index" width="60" />
<el-table-column fixed label="计划单号" align="center" prop="planCode" min-width="180" >
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" /> <el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="150"> <el-table-column fixed label="生产状态" align="center" prop="status" width="150">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" /> <dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="客户名称" align="center" prop="customerName" min-width="240" /> <el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="240" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" /> <el-table-column label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150"> <el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150">
<template #default="scope"> <template #default="scope">
@ -103,6 +96,13 @@
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" /> <dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="计划单号" align="center" prop="planCode" min-width="180" >
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column fixed="right" label="项目负责人" align="center" prop="projectOwnerName" min-width="120" /> <el-table-column fixed="right" label="项目负责人" align="center" prop="projectOwnerName" min-width="120" />
<el-table-column fixed="right" label="工艺负责人" align="center" prop="craftOwnerName" min-width="120" /> <el-table-column fixed="right" label="工艺负责人" align="center" prop="craftOwnerName" min-width="120" />
<el-table-column fixed="right" label="工艺起止日期" align="center" prop="craftDate" min-width="240" > <el-table-column fixed="right" label="工艺起止日期" align="center" prop="craftDate" min-width="240" >

View File

@ -49,33 +49,33 @@
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column fixed label="序号" align="center" type="index" width="60" /> <el-table-column fixed label="序号" align="center" type="index" width="60" />
<el-table-column fixed label="计划单号" align="center" prop="planCode" min-width="180">
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" /> <el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="150"> <el-table-column fixed label="生产状态" align="center" prop="status" width="150">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" /> <dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="客户名称" align="center" prop="customerName" min-width="300" /> <el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="300" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" /> <el-table-column label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" /> <el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" />
<el-table-column label="性质" align="center" prop="property" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" />
</template>
</el-table-column>
<el-table-column label="计划单号" align="center" prop="planCode" min-width="180">
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="350" /> <el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="350" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150"> <el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" /> <dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="性质" align="center" prop="property" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" />
</template>
</el-table-column>
<el-table-column fixed="right" label="毛坯负责人" align="center" prop="blankOwnerName" min-width="120" /> <el-table-column fixed="right" label="毛坯负责人" align="center" prop="blankOwnerName" min-width="120" />
<el-table-column fixed="right" label="毛坯截止日期" align="center" prop="blankDate" :formatter="dateFormatter2" min-width="140" /> <el-table-column fixed="right" label="毛坯截止日期" align="center" prop="blankDate" :formatter="dateFormatter2" min-width="140" />
<el-table-column fixed="right" label="最新进度" align="center" prop="progress" min-width="120"> <el-table-column fixed="right" label="最新进度" align="center" prop="progress" min-width="120">

View File

@ -80,6 +80,7 @@ const handleSelectionChange = (val: []) => {
} }
const clickRow = (row: any) => { const clickRow = (row: any) => {
console.log(row)
if (chkboxEnable.value) { if (chkboxEnable.value) {
if (row) { if (row) {
multipleTable.value!.toggleRowSelection(row, undefined) multipleTable.value!.toggleRowSelection(row, undefined)
@ -90,12 +91,7 @@ const clickRow = (row: any) => {
} }
//key, //key,
const getRowKeys = (row) => { const getRowKeys = (row) => {
if (formType.value == 'out'){
return `${row.whId}_${row.matCode}_${row.pnId}`
}else {
return row.id return row.id
}
} }
const queryReqVo: any = reactive({ const queryReqVo: any = reactive({

View File

@ -180,19 +180,33 @@ class="!w-260px" v-model="formData.createTime" type="date" value-format="x"
<el-col> <el-col>
<el-checkbox-group v-if="active != 'detail' && formData.dispatchStatus == 1 " v-model="checkList" @change="onAddItem()"> <el-checkbox-group v-if="active != 'detail' && formData.dispatchStatus == 1 " v-model="checkList" @change="onAddItem()">
<el-checkbox label="下料" size="large" border /> <el-checkbox label="下料" size="large" border />
<el-checkbox label="电焊" size="large" border />
<el-checkbox label="开粗" size="large" border />
<el-checkbox label="铣床" size="large" border /> <el-checkbox label="铣床" size="large" border />
<el-checkbox label="车床" size="large" border /> <el-checkbox label="车床" size="large" border />
<el-checkbox label="热处理" size="large" border /> <el-checkbox label="热处理" size="large" border />
<el-checkbox label="磨床" size="large" border /> <el-checkbox label="磨床" size="large" border />
<el-checkbox label="数控1" size="large" border />
<el-checkbox label="数控2" size="large" border />
<el-checkbox label="火花" size="large" border />
<el-checkbox label="刻字" size="large" border />
<el-checkbox label="网格" size="large" border />
<el-checkbox label="深孔钻" size="large" border />
<el-checkbox label="钻孔" size="large" border />
<!-- 2025 06 01 以下工序关闭 更新为上面的-->
<!-- <el-checkbox label="铣床" size="large" border />
<el-checkbox label="车床" size="large" border />
<el-checkbox label="热处理" size="large" border />
<el-checkbox label="磨床" size="large" border />
<el-checkbox label="线切割" size="large" border /> <el-checkbox label="线切割" size="large" border />
<el-checkbox label="数控" size="large" border /> <el-checkbox label="数控" size="large" border />
<el-checkbox label="电火花" size="large" border /> <el-checkbox label="电火花" size="large" border />
<el-checkbox label="刻字" size="large" border /> <el-checkbox label="刻字" size="large" border />
<el-checkbox label="电焊" size="large" border /> <el-checkbox label="电焊" size="large" border />
<el-checkbox label="钻孔" size="large" border /> <el-checkbox label="钻孔" size="large" border /> -->
<!-- <el-checkbox label="装配" size="large" border />--> <!-- <el-checkbox label="编程" size="large" border />
<el-checkbox label="编程" size="large" border /> <el-checkbox label="开粗" size="large" border /> -->
<el-checkbox label="开粗" size="large" border />
</el-checkbox-group> </el-checkbox-group>
<!-- <el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增</el-button> --> <!-- <el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增</el-button> -->
</el-col> </el-col>
@ -247,6 +261,16 @@ class="!w-260px" v-model="formData.createTime" type="date" value-format="x"
<!-- </el-form-item> --> <!-- </el-form-item> -->
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed label="过程检" align="center" prop="testYn" width="120px" >
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.testYn`" class="mb-0px!">
<el-radio-group size="small" :disabled="detailDisabled||row.beginProduce != 0 || row.procedureStatus != 0" v-model="row.testYn" >
<el-radio-button label="N"></el-radio-button>
<el-radio-button label="Y"></el-radio-button>
</el-radio-group>
</el-form-item>
</template>
</el-table-column>
<el-table-column fixed label="派工类型" align="center" prop="dispatchType" width="145px"> <el-table-column fixed label="派工类型" align="center" prop="dispatchType" width="145px">
<template #header>派工类型</template> <template #header>派工类型</template>
<template #default="{ row }"> <template #default="{ row }">
@ -516,6 +540,7 @@ import EquipmentSelect from "@/views/heli/hlvuestyle/equipmentSelect.vue";
import ProductProcessPrint from "./ProductProcessPrint.vue"; import ProductProcessPrint from "./ProductProcessPrint.vue";
import * as EquipManufactureApi from '@/api/heli/equipmanufacture'; import * as EquipManufactureApi from '@/api/heli/equipmanufacture';
import * as TaskdispatchApi from '@/api/heli/taskdispatch'; import * as TaskdispatchApi from '@/api/heli/taskdispatch';
import * as PlanApi from '@/api/heli/plan'
import { import {
ElDialog, ElDialog,
ElTable, ElTable,
@ -1188,6 +1213,7 @@ const personList = ref([])
const ownerList1 = ref<OwnerListType[]>([]); const ownerList1 = ref<OwnerListType[]>([]);
const ownerList2 = ref<OwnerListPostType[]>([]); const ownerList2 = ref<OwnerListPostType[]>([]);
const dispatchListTemp = ref([]) const dispatchListTemp = ref([])
const craftInfos = ref([])
const queryData = async (id?: number) => { const queryData = async (id?: number) => {
resetForm() resetForm()
// //
@ -1196,6 +1222,8 @@ const queryData = async (id?: number) => {
try { try {
dispatchListTemp.value = [] dispatchListTemp.value = []
formData.value = await TaskDispatchApi.getTaskDispatch(id) formData.value = await TaskDispatchApi.getTaskDispatch(id)
var planData = await PlanApi.getPlan(formData.value.planId);
craftInfos.value = eval( planData.craftContent)
formData.value.taskDispatchDetails = await TaskDispatchApi.getTaskDispatchDetailListByDispatchId(id) formData.value.taskDispatchDetails = await TaskDispatchApi.getTaskDispatchDetailListByDispatchId(id)
checkList.value = []; checkList.value = [];
if(formData.value.taskDispatchDetails!=null){ if(formData.value.taskDispatchDetails!=null){
@ -1218,7 +1246,8 @@ const queryData = async (id?: number) => {
personList.value = await TaskDispatchApi.getOwnerList(formData.value.ownerId,1); personList.value = await TaskDispatchApi.getOwnerList(formData.value.ownerId,1);
postList.value = await TaskDispatchApi.getOwnerList(formData.value.ownerId,2); postList.value = await TaskDispatchApi.getOwnerList(formData.value.ownerId,2);
ownerList1.value = await getOwnerListThis (); ownerList1.value = await getOwnerListThis ();
ownerList2.value = await getOwnerPostListThis (); //20250601 2 ownerList2.value = await getOwnerPostListThis ();
ownerList2 .value.push({index:1,id:'2',label:'2'})
} }
formData.value.bomCode = 'BOM-' + formData.value.projectSubCode formData.value.bomCode = 'BOM-' + formData.value.projectSubCode
@ -1371,6 +1400,7 @@ const submitForm = async (operate) => {
const checkList = ref([]) const checkList = ref([])
const checkListTemp = ref([]) const checkListTemp = ref([])
/** 新增按钮操作 */ /** 新增按钮操作 */
const procedureArrary = ['下料','电焊','编程','开粗','铣床','车床','磨床','数控1','数控2','刻字','网格','深钻孔','钻孔','热处理','火花']
const onAddItem = () => { const onAddItem = () => {
// //
@ -1411,6 +1441,7 @@ const onAddItem = () => {
amount: undefined, amount: undefined,
summary: undefined, summary: undefined,
status: 1, status: 1,
testYn: 'N',
procedureStatus: 0, procedureStatus: 0,
beginProduce:0, beginProduce:0,
dispatchId: undefined, dispatchId: undefined,
@ -1428,7 +1459,6 @@ const onAddItem = () => {
if(items.name == element){ if(items.name == element){
row.procedureId = items.id; row.procedureId = items.id;
row.procedureCode = items.code row.procedureCode = items.code
console.log(items);
if(items.isReport!= null){ if(items.isReport!= null){
row.isReport = items.isReport; row.isReport = items.isReport;
} }
@ -1444,6 +1474,14 @@ const onAddItem = () => {
} }
} }
if(add){ if(add){
if(procedureArrary.includes(element)){
row.startTime = getStartTime(element);
}
row.isOutsourcing = true;
row.dispatchType = 2
row.postId = '2'
row.amount = formData.value.amount row.amount = formData.value.amount
row.dispatchId = formData.value.id row.dispatchId = formData.value.id
row.endTime = formData.value.requiredCompletedDate row.endTime = formData.value.requiredCompletedDate
@ -1459,6 +1497,35 @@ const onAddItem = () => {
} }
} }
const getStartTime = ( element : string) =>{
//20250601
// \ = /
// =/
// =
// =
// =
// :
/**
*
*
*
*/
if(element == '下料' || element == '电焊'){
return craftInfos.value[0].startDate;
}else if(element == '编程' || element == '开粗' || element == '铣床' || element == '车床' || element == '磨床' || element == '数控1' || element == '数控2' ||element == '刻字' ||
element == '网格' || element == '深钻孔' || element == '钻孔'
){
return craftInfos.value[1].startDate
}else if(element == '热处理'){
return craftInfos.value[2].startDate
}else if(element == '火花'){
return craftInfos.value[3].startDate
}else{
return ''
}
}
type OwnerListType = { type OwnerListType = {
index: number; index: number;
id: number; id: number;
@ -1527,6 +1594,14 @@ const onDeleteItem = async (row,index) => {
message.success(t('common.delSuccess')) message.success(t('common.delSuccess'))
} }
const handleOutsourcingChange= async (row: any) => { const handleOutsourcingChange= async (row: any) => {
if(row.isOutsourcing == true){
row.dispatchType = 1
row.postId = ''
}else{
row.dispatchType = 2
row.owner = ''
row.postId = '2'
}
} }
const handleSelectedProcedure = async (row: any) => { const handleSelectedProcedure = async (row: any) => {

View File

@ -1,38 +1,38 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, computed, ref } from 'vue' import { onMounted, computed, ref } from 'vue'
import { onLoad, onShow } from '@dcloudio/uni-app' import { onLoad, onShow } from '@dcloudio/uni-app'
import { getListAPI, getDictAPI,postOperateAPIZF,updateBaoGong } from '@/services/moJuSheJiReport' import { getListAPI, getTaskDetailAPI, postOperateAPIZF,getProcessDesignProgressListByProcessDesignId, updateBaoGong,type ProcessDesignVO ,createProcessDesign,updateProcessDesign} from '@/services/moJuSheJiReport'
import { useLoginStore } from '@/stores/modules/login' import { useLoginStore } from '@/stores/modules/login'
import { formatDate } from '@/utils/index' import { formatDate } from '@/utils/index'
// import popup from './popup.vue'; // import popup from './popup.vue';
import { nextTick } from 'vue'; import { nextTick } from 'vue';
const popup = ref<UniHelper.UniPopupInstance>() const popup = ref<UniHelper.UniPopupInstance>()
const userStore = useLoginStore() const userStore = useLoginStore()
const userId = userStore.userInfo.userId const userId = userStore.userInfo.userId
const nickName = userStore.userInfo.nickName
//
const isFinish = ref(false)
//
const isTriggered = ref(false)
const progress = ref(0)
const imageLink = ref(0)
const remark = ref('')
const selectedId = ref(null); // selectedId
// // porps
const isFinish = ref(false) const props = defineProps<{
// orderState : string
const isTriggered = ref(false) }>()
const progress = ref(0)
const imageLink = ref(0)
const remark = ref('')
const selectedId = ref(null); // selectedId
// porps const statusText = computed(() => {
const props = defineProps<{
orderState: string
}>()
const statusText = computed(() => {
const text = props.orderState == '0' ? '上报进度' : '查看' const text = props.orderState == '0' ? '上报进度' : '查看'
return text return text
}) })
// //
const isLoading = ref(false) const isLoading = ref(false)
// //
const queryParams: Required<any> = { const queryParams : Required<any> = {
pageNo: 1, pageNo: 1,
pageSize: 5, pageSize: 5,
owner: userId, owner: userId,
@ -43,18 +43,18 @@ const queryParams: Required<any> = {
// //
isReport: 1, isReport: 1,
pgType: 0, pgType: 0,
} }
const dataList = ref([]) const dataList = ref([])
const showPopup = ref(false); const showPopup = ref(false);
const onPopupClose = (progress, imageLink,remark) => { const onPopupClose = (progress, imageLink, remark) => {
// //
showPopup.value = false; showPopup.value = false;
console.log(remark) console.log(remark)
const zid = selectedId.value; const zid = selectedId.value;
callApi(zid,progress,imageLink,remark) callApi(zid, progress, imageLink, remark)
@ -62,24 +62,24 @@ const onPopupClose = (progress, imageLink,remark) => {
/* */ /* */
}; };
const submitDetail = async() =>{ const submitDetail = async () => {
const zid = selectedId.value; const zid = selectedId.value;
await callApi(zid,progress.value,imageLink.value,remark.value) await callApi(zid, progress.value, imageLink.value, remark.value)
popup.value.close() popup.value.close()
} }
const callApi = async (zid: Number,progress :Number,imageLink: String,remark:String) => { const callApi = async (zid : Number, progress : Number, imageLink : String, remark : String) => {
console.log(progress); console.log(progress);
if(progress>0){ if (progress > 0) {
//id //id
await updateBaoGong(zid,progress,imageLink,remark); await updateBaoGong(zid, progress, imageLink, remark);
isFinish.value = false; isFinish.value = false;
isLoading.value = false; isLoading.value = false;
queryParams.pageNo = 1; queryParams.pageNo = 1;
dataList.value = []; dataList.value = [];
await getListData(); await getListData();
}else{ } else {
uni.showToast({ uni.showToast({
title: '设计进度填写时不能为0%,请重新填写后提交!', title: '设计进度填写时不能为0%,请重新填写后提交!',
icon: 'none', // iconnone icon: 'none', // iconnone
@ -88,7 +88,7 @@ const submitDetail = async() =>{
} }
} }
const getListData = async () => { const getListData = async () => {
queryParams.pgType = props.orderState; queryParams.pgType = props.orderState;
// 退 // 退
if (isLoading.value) return if (isLoading.value) return
@ -120,53 +120,152 @@ const getListData = async () => {
// //
isFinish.value = true isFinish.value = true
} }
} }
const formData = ref({
id: undefined,
planId: undefined,
processDesignType: undefined,
remark: undefined,
status: 1,
projectId: undefined,
projectSubId: undefined,
processDesignProgressList: [],
})
onMounted(async () => { const formRef = ref() // Ref
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
planId: undefined,
processDesignType: undefined,
remark: undefined,
status: 1,
projectId: undefined,
projectSubId: undefined,
processDesignProgressList: [],
}
formRef.value?.resetFields()
}
const queryData = async (id?: number) => {
resetForm()
//
if (id) {
try {
formData.value = await getTaskDetailAPI(id)
formData.value.processDesignProgressList = await getProcessDesignProgressListByProcessDesignId(id)
dataListAdd.value = formData.value.processDesignProgressList;
if( formData.value.processDesignProgressList != null && formData.value.processDesignProgressList.length > 0){
var maxTime = null;
if(formData.value.processDesignProgressList.length == 1){
formData.value.processDesignProgressList[0].hasNext = false;
if(formData.value.processDesignProgressList[0].endTime != null && formData.value.processDesignProgressList[0].endTime != ''){
formData.value.processDesignProgressList[0].maxTime = parseFloat((formData.value.processDesignProgressList[0].endTime - formData.value.processDesignProgressList[0].beginTime)/ (1000 * 60 * 60)).toFixed(2);
}
} else{
var maxIndex = 0;
for (let index = 0; index < formData.value.processDesignProgressList.length; index++) {
var item = formData.value.processDesignProgressList[index];
if(item.endTime != null && item.endTime != ''){
item.maxTime = parseFloat((item.endTime - item.beginTime)/ (1000 * 60 * 60)).toFixed(2);;
}
if(maxTime == null){
maxIndex = index;
maxTime = item.createTime;
item.hasNext = false;
}else{
if(item.createTime > maxTime){
formData.value.processDesignProgressList[maxIndex].hasNext = true;
maxIndex = index;
item.hasNext = false;
}else{
item.hasNext = true;
}
}
}
}
}
} finally {
}
}
}
const submitForm = async (operate) => {
try {
formData.value.id = selectedId.value
formData.value.planId = updateItem.value.planId
formData.value.projectId = updateItem.value.projectId
formData.value.processDesignType = processDesignType.value
formData.value.processDesignProgressList = dataListAdd.value;
const data = formData.value as unknown as ProcessDesignVO
let processDesignId;
if (!formData.value.id) {
processDesignId = await createProcessDesign(data)
} else {
processDesignId = await updateProcessDesign(data)
}
await queryData(selectedId.value)
remark.value = ''
} finally {
}
}
onMounted(async () => {
await getListData() await getListData()
}) })
onShow(async () => { onShow(async () => {
isFinish.value = false isFinish.value = false
isLoading.value = false isLoading.value = false
queryParams.pageNo = 1 queryParams.pageNo = 1
dataList.value = [] dataList.value = []
await getListData() await getListData()
}) })
const processDesignType = ref('')
const handleDetail =async (item) => { const updateItem = ref()
if(props.orderState == 0){ const handleDetail = async (item) => {
updateItem.value = item;
processDesignType.value = item.processDesignType;
if (props.orderState == 0) {
progress.value = 0; progress.value = 0;
imageLink.value = item.blueprintLink; imageLink.value = item.blueprintLink;
remark.value = item.remark; remark.value = item.remark;
await queryData(updateItem.value.id)
await nextTick(); // DOM await nextTick(); // DOM
// showPopup.value = true; // showPopup.value = true;
popup.value?.open() popup.value?.open()
selectedId.value = item.id; selectedId.value = item.id;
}else{ } else {
const url = `/pages/moJuSheJiReport/moJuSheJiReport-detail?id=${item.id}&jd=${item.progress}` const url = `/pages/moJuSheJiReport/moJuSheJiReport-detail?id=${item.id}&jd=${item.progress}`
uni.navigateTo({ url }) uni.navigateTo({ url })
} }
// selectedId // selectedId
/* */ /* */
} }
/* const viewClick = (item) => { /* const viewClick = (item) => {
const params = { const params = {
id: item.id id: item.id
} }
const data = await postOperateAPIZF(params); const data = await postOperateAPIZF(params);
await getListData(); await getListData();
} */ } */
// //
const viewClick = async (item) => { const viewClick = async (item) => {
const params = { const params = {
id: item.id id: item.id
}; };
const data = await postOperateAPIZF(params); const data = await postOperateAPIZF(params);
if(data >0){ if (data > 0) {
const url = `/pages/zjPgMaster/zjPgMaster` const url = `/pages/zjPgMaster/zjPgMaster`
uni.navigateTo({ url }) uni.navigateTo({ url })
@ -174,8 +273,8 @@ const viewClick = async (item) => {
}; };
// //
const onRefresherrefresh = async () => { const onRefresherrefresh = async () => {
// //
isTriggered.value = true isTriggered.value = true
// //
@ -186,23 +285,246 @@ const onRefresherrefresh = async () => {
await getListData() await getListData()
// //
isTriggered.value = false isTriggered.value = false
} }
const handleClose = () =>{ const handleClose = () => {
popup.value.close(); popup.value.close();
} }
// const searchVal = ref('')
// const dataListDefault = ref([]) const dataListAdd = ref([])
// const handleSearch = async () => { /** 新增按钮操作 */
// const code = searchVal.value const onAddItem = async () => {
// if (code) {
// dataListDefault.value = dataList.value var date = new Date();
// dataList.value = dataList.value.filter((e) => { if (processDesignType.value == 'BLUEPRINT_WORKBLANK') {
// return e.code == code if (updateItem.value.blankDate != null) {
// }) if (updateItem.value.blankDate < date.getTime()) {
// } else { if (updateItem.value.isDelay == null || updateItem.value.isDelay == 0) {
// dataList.value = dataListDefault.value uni.showToast({ icon: 'none', title: '当前任务已超期,请延期后重试!' })
// } return
// } }
}
} else {
uni.showToast({ icon: 'none', title: '毛坯结束时间为空!请确认!' })
return
}
}
if (processDesignType.value == 'BLUEPRINT_2D') {
if (updateItem.value.twoDimDate != null) {
if (updateItem.value.twoDimDate < date.getTime()) {
if (updateItem.value.isDelay == null || updateItem.value.isDelay == 0) {
uni.showToast({ icon: 'none', title: '当前任务已超期,请延期后重试!' })
return
}
}
} else {
uni.showToast({ icon: 'none', title: '2D结束时间为空!请确认!' })
return
}
}
if (processDesignType.value == 'BLUEPRINT_3D') {
if (updateItem.value.threeDimDate != null) {
if (updateItem.value.threeDimDate < date.getTime()) {
if (updateItem.value.isDelay == null || updateItem.value.isDelay == 0) {
uni.showToast({ icon: 'none', title: '当前任务已超期,请延期后重试!' })
return
}
}
} else {
uni.showToast({ icon: 'none', title: '3D结束时间为空!请确认!' })
return
}
}
if (processDesignType.value == 'BLUEPRINT_FOUNDRY_TECHNOLOGY') {
console.log(updateItem.value.craftEndDate)
if (updateItem.value.craftEndDate != null) {
if (updateItem.value.craftEndDate < date.getTime()) {
if (updateItem.value.isDelay == null || updateItem.value.isDelay == 0) {
uni.showToast({ icon: 'none', title: '当前任务已超期,请延期后重试!' })
return
}
}
} else {
uni.showToast({ icon: 'none', title: '工艺结束时间为空!请确认!' })
return
}
}
if (dataListAdd.value.length > 0) {
var indexs = -1;
for (var i = 0; i < dataListAdd.value.length; i++) {
var item = dataListAdd.value[i];
if(item.isOver == 0 || item.isOver == undefined){
indexs = i;
}
if (item.endTime == null || item.endTime == '') {
uni.showToast({ icon: 'none', title: '结束时间不能为空!请确认!' })
return
}
if (item.workTime == null
) {
uni.showToast({ icon: 'none', title: '已做时间不能为空!请确认!' })
return
}
}
if(indexs != -1){
var s = changeDate2(dataListAdd.value[indexs])
if(!s){
uni.showToast({ icon: 'none', title: '日期不能小于开始日期及超过下一天!请确认!' })
return
}
}
}
const row = {
id: undefined,
processDesignId: undefined,
progress: undefined,
blueprintLink: undefined,
remark: '',
createTime: date.getTime(),
beginTime: date.getTime(),
endTime: '',
isOver: 0,
workTime: '',
beginTimeOpen: true,
creatorName: nickName,
status: 1,
}
row.remark = remark.value
row.processDesignId = updateItem.value.id
dataListAdd.value.unshift(row)
await submitForm('SAVE');
}
const overRow = async () => {
var indexs = -1;
if (dataListAdd.value.length > 0) {
for (var i = 0; i < dataListAdd.value.length; i++) {
var item = dataListAdd.value[i];
if (item.isOver == 0) {
indexs = i;
}
}
}
// if (indexs == -1) {
// uni.showToast({ icon: 'none', title: '' })
// return
// }
var row = dataListAdd.value[indexs];
if (row.endTime == null || row.endTime == '') {
row.endTime = new Date().getTime()
var timeDiff = row.endTime - row.beginTime;
//
row.workTime = parseFloat((timeDiff / (1000 * 60 * 60)).toFixed(2));
row.maxTime = row.workTime;
// row.workTime = row.endTime - row.
}
if (row.endTime == null || row.endTime == '') {
uni.showToast({ icon: 'none', title: '结束时间不能为空!请确认!' })
return
}
if (row.workTime == null ) {
console.log(row.workTime)
uni.showToast({ icon: 'none', title: '已做时间不能为空!请确认!' })
return
}
console.log(row.beginTime)
console.log(row.endTime)
row.isOver = 1;
// await submitForm('SAVE');
//
}
// const searchVal = ref('')
// const dataListDefault = ref([])
// const handleSearch = async () => {
// const code = searchVal.value
// if (code) {
// dataListDefault.value = dataList.value
// dataList.value = dataList.value.filter((e) => {
// return e.code == code
// })
// } else {
// dataList.value = dataListDefault.value
// }
// }
const changeDate1 = (e,item) => {
item.endTime = e
}
const oninput = (val, limit) => {
val = val.replace(/[^\d.]/g, ""); //
val = val.replace(/^00/, "0."); //0
val = val.replace(/^\./g, "0."); //0.
val = val.replace(/\.{2,}/g, "."); //
val = val.replace(".", "$#$").replace(/\./g, "").replace("$#$", "."); //
/^0\d+/.test(val) ? val = val.slice(1) : ''; //0
const str = '^(\\d+)\\.(\\d{' + limit + '}).*$'
const reg = new RegExp(str)
if (limit === 0) {
//
val = val.replace(reg, '$1')
} else {
//
val = val.replace(reg, '$1.$2')
}
return val
}
//
const column = ref([
{
title: '开始时间',// th
isSort: false, //
isFixed: false, //
key: 'beginTime',//
slot: 'beginTime',
width: 5, // width * 100 rpx,
},
{
title: '结束时间',// th
isSort: false, //
isFixed: false, //
key: 'endTime', //
slot: 'endTime',
width: 5, // width * 100 rpx,
},
{
title: '已做时间(小时)',// th
isSort: false, //
isFixed: false, //
key: 'workTime', //
slot: 'workTime'
},
{
title: '备注',// th
isSort: false, //
isFixed: false, //
key: 'remark',
slot: 'remark'
}
])
const changeDate2 = (item) => {
const today = new Date();
const tomorrow = new Date(today);
tomorrow.setDate(tomorrow.getDate() + 1); //
tomorrow.setHours(23, 59, 59, 999);
const beginDate = new Date(item.beginTime);
const endtT = new Date(item.endTime);
if (endtT.getTime() < beginDate.getTime() || endtT.getTime() > tomorrow.getTime()) {
uni.showToast({ icon: 'none', title: '日期不能小于开始日期及超过下一天!请确认!' })
return false;
}else{
return true
}
}
</script> </script>
<template> <template>
<view class="cont"> <view class="cont">
@ -212,24 +534,28 @@ const handleClose = () =>{
</view> --> </view> -->
<scroll-view enable-back-to-top scroll-y class="data-list" refresher-enabled :refresher-triggered="isTriggered" <scroll-view enable-back-to-top scroll-y class="data-list" refresher-enabled :refresher-triggered="isTriggered"
@refresherrefresh="onRefresherrefresh" @scrolltolower="getListData"> @refresherrefresh="onRefresherrefresh" @scrolltolower="getListData">
<view class="item" v-for="item in dataList" :key="item.id" > <view class="item" v-for="item in dataList" :key="item.id">
<view class="hd"> <view class="hd">
<view class="num">项目编号</view> <view class="num">项目编号</view>
<view class="statusLabel"> {{item.projectCode}} </view> <view class="statusLabel"> {{item.projectCode}} </view>
<view class="statusTexthd" v-if="item.processDesignType == 'BLUEPRINT_2D'"> 2D设计 </view> <view class="statusTexthd" v-if="item.processDesignType == 'BLUEPRINT_2D'"> 2D设计 </view>
<view class="statusTexthd" v-else-if ="item.processDesignType == 'BLUEPRINT_3D'"> 3D设计 </view> <view class="statusTexthd" v-else-if="item.processDesignType == 'BLUEPRINT_3D'"> 3D设计 </view>
<view class="statusTexthd" v-else-if="item.processDesignType == 'BLUEPRINT_WORKBLANK'"> 毛坯设计 </view> <view class="statusTexthd" v-else-if="item.processDesignType == 'BLUEPRINT_WORKBLANK'"> 毛坯设计 </view>
<view class="statusTexthd" v-else-if="item.processDesignType == 'BLUEPRINT_FOUNDRY_TECHNOLOGY'"> 铸造设计 </view> <view class="statusTexthd" v-else-if="item.processDesignType == 'BLUEPRINT_FOUNDRY_TECHNOLOGY'">
铸造设计 </view>
</view> </view>
<view class="md"> <view class="md">
<view class="product-item">项目{{ item.projectName }}</view> <view class="product-item">项目{{ item.projectName }}</view>
<view class="product-item">子项目{{ item.projectSubCode || "" }}</view> <view class="product-item">子项目{{ item.projectSubCode || "" }}</view>
<view class="product-item">客户名称{{ item.customerName }}</view> <view class="product-item">客户名称{{ item.customerName }}</view>
<view class="product-item" v-if="item.processDesignType == 'BLUEPRINT_2D'">工艺起止日期{{item.startTwoDimDate}} {{item.twoDimDate}} </view> <view class="product-item" v-if="item.processDesignType == 'BLUEPRINT_2D'">
<view class="product-item" v-else-if ="item.processDesignType == 'BLUEPRINT_3D'">工艺起止日期{{item.startThreeDimDate}} {{item.threeDimDate}} </view> 工艺起止日期{{item.startTwoDimDate}} {{item.twoDimDate}} </view>
<view class="product-item" v-else-if="item.processDesignType == 'BLUEPRINT_WORKBLANK'">工艺起止日期{{item.startBlankDate}} {{item.blankDate}} </view> <view class="product-item" v-else-if="item.processDesignType == 'BLUEPRINT_3D'">
<!-- <view class="product-item" v-else-if="item.processDesignType == 'BLUEPRINT_FOUNDRY_TECHNOLOGY'">工艺起止日期{{item.twoDimDate}} {{item.threeDimDate}} </view> --> 工艺起止日期{{item.startThreeDimDate}} {{item.threeDimDate}} </view>
<view class="product-item" v-else-if="item.processDesignType == 'BLUEPRINT_WORKBLANK'">
工艺起止日期{{item.startBlankDate}} {{item.blankDate}} </view>
<!-- <view class="product-item" v-else-if="item.processDesignType == 'BLUEPRINT_FOUNDRY_TECHNOLOGY'">工艺起止日期{{item.twoDimDate}} {{item.threeDimDate}} </view> -->
<view class="product-item">最新进度{{item.progress}}%</view> <view class="product-item">最新进度{{item.progress}}%</view>
@ -248,16 +574,38 @@ const handleClose = () =>{
<view class="text">填写信息</view> <view class="text">填写信息</view>
<view class="close" @click="handleClose">X</view> <view class="close" @click="handleClose">X</view>
</view> </view>
<view class="cont"> <view class="cont">
<!-- <view class="item"> <th-table :column="column" :listData="dataListAdd" height="0.2" :stripe="true" :border="true">
<view class="label">终检开始时间</view> <!-- 具名作用域插槽 #后面写column里slot的值 -->
<view class="val">{{ formObj.startTime }}</view> <template #beginTime="Props">
<!-- 子组件传递的参数 整个item -->
<uni-datetime-picker disabled type="datetime" style="text-align: center;" v-model="Props.item.beginTime"
/>
</template>
<template #endTime="Props">
<uni-datetime-picker :disabled="Props.item.hasNext" type="datetime" v-model="Props.item.endTime"
@change="(e) => changeDate1(e,Props.item)" />
</template>
<template #workTime="Props">
<uni-easyinput :disabled="Props.item.hasNext" @change="Props.item.workTime = oninput(Props.item.workTime,2)" class="val"
type="number" v-model="Props.item.workTime" placeholder="请输入本次报工工时"></uni-easyinput>
<!-- <p>{{Props.item.workTime}}</p> -->
</template>
<template #remark="Props">
<uni-easyinput type="text" :disabled="Props.item.hasNext" v-model="Props.item.remark" placeholder="请输入备注" />
</template>
</th-table>
<view class="item">
<view class="label"><span class="star"></span>备注</view>
</view> </view>
<view class="item">
<view class="label">终检结束时间</view> <uni-easyinput type="textarea" class="popup-input" v-model="remark" placeholder="请输入备注" />
<view class="val">{{ formObj.endTime }}</view> </view>
</view> --> <!-- <view class="cont"> -->
<view class="item"> <!-- <view class="item">
<view class="label"><span class="star">*</span>进度百分比</view> <view class="label"><span class="star">*</span>进度百分比</view>
<uni-easyinput class="val" type="number" v-model="progress" placeholder="请输入本次报工工时"></uni-easyinput> <uni-easyinput class="val" type="number" v-model="progress" placeholder="请输入本次报工工时"></uni-easyinput>
<view class="unit">%</view> <view class="unit">%</view>
@ -265,21 +613,101 @@ const handleClose = () =>{
<view class="item"> <view class="item">
<view class="label"><span class="star">*</span>图纸连接</view> <view class="label"><span class="star">*</span>图纸连接</view>
</view> </view>
<uni-easyinput type="textarea" v-model="imageLink" placeholder="请输入图纸链接"></uni-easyinput> <uni-easyinput type="textarea" v-model="imageLink" placeholder="请输入图纸链接"></uni-easyinput> -->
<view class="item"> <!-- <div class="container">
<div class="one-area">开始时间</div>
<div class="one-area">结束时间</div>
<div class="one-area">已做时间(小时)</div>
<div class="one-area">备注</div>
</div>
<div v-for="(item,index) in dataListAdd" :key="index">
<div class="container1">
<div class="one-area1">
<uni-datetime-picker type="datetime" v-model="item.beginTime" @change="changeDate1" />
</div>
<div class="one-area2">
<uv-datetime-picker :ref=datetimePicker2 v-model="item.endTimeOpen " mode="datetime"
:formatter="formatter1" @confirm="confirm2">
</uv-datetime-picker>
</div>
<div class="one-area1">
<uni-easyinput class="val" type="number" v-model="item.workTime"
placeholder="请输入已做时间"></uni-easyinput>
</div>
<div class="one-area1">
<uni-easyinput type="textarea" v-model="item.remark" placeholder="请输入备注"></uni-easyinput>
</div>
</div>
</div> -->
<!-- <view class="item">
<view class="label"><span class="star"></span>备注</view> <view class="label"><span class="star"></span>备注</view>
</view> </view>
<uni-easyinput type="textarea" class="popup-input" v-model="remark" placeholder="请输入备注"/>
</view> <uni-easyinput type="textarea" class="popup-input" v-model="remark" placeholder="请输入备注" /> -->
<view class="ok" @click="submitDetail()">确定</view> <!-- </view> -->
<div class="container1">
<div class="half1">
<view class="ok" @click="onAddItem()">开始</view>
</div>
<div class="half1">
<view class="over" @click="overRow()">结束</view>
</div>
</div>
</uni-popup> </uni-popup>
<!-- <popup :showPopup="showPopup" :progress="progress" :imageLink="imageLink" :remark="remark" @close="onPopupClose" /> --> <!-- <popup :showPopup="showPopup" :progress="progress" :imageLink="imageLink" :remark="remark" @close="onPopupClose" /> -->
</view> </view>
</template> </template>
<style lang="scss"> <style lang="scss">
// .container {
.search { display: flex;
width: 630rpx;
margin-top: -10%;
}
.container1 {
padding: 1%;
display: flex;
width: 100%;
}
.half1 {
flex: 1;
text-align: left;
font-size: 15px;
}
.one-area {
flex: 1;
text-align: center;
padding: 12px;
font-size: 15px;
font-weight: bold;
}
.one-area1 {
flex: 1;
text-align: center;
padding: 2px;
font-size: 15px;
font-weight: bold;
}
.one-area2 {
flex: 1.2;
text-align: center;
padding: 2px;
font-size: 15px;
font-weight: bold;
}
//
.search {
padding: 4rpx; padding: 4rpx;
width: 80%; width: 80%;
margin: 30rpx auto; margin: 30rpx auto;
@ -292,7 +720,8 @@ const handleClose = () =>{
font-size: 32rpx; font-size: 32rpx;
border-radius: 6rpx; border-radius: 6rpx;
} }
} }
.popup { .popup {
.title { .title {
line-height: 1; line-height: 1;
@ -329,6 +758,7 @@ const handleClose = () =>{
.label { .label {
font-size: 32rpx; font-size: 32rpx;
width: 260rpx; width: 260rpx;
.star { .star {
color: red color: red
} }
@ -338,6 +768,7 @@ const handleClose = () =>{
flex: 1; flex: 1;
font-size: 32rpx; font-size: 32rpx;
} }
.unit { .unit {
width: 100rpx; width: 100rpx;
margin-left: 4rpx; margin-left: 4rpx;
@ -356,9 +787,22 @@ const handleClose = () =>{
background-color: #3C8AF7; background-color: #3C8AF7;
color: #fff; color: #fff;
} }
.over {
font-size: 32rpx;
margin: 20rpx auto 80rpx;
text-align: center;
width: 200rpx;
border-radius: 10rpx;
padding: 8rpx 0;
background-color: orangered;
color: #fff;
} }
.data-list { }
.data-list {
height: 90vh; height: 90vh;
.item { .item {
position: relative; position: relative;
padding: 20rpx 0; padding: 20rpx 0;
@ -375,6 +819,7 @@ const handleClose = () =>{
font-size: 24rpx; font-size: 24rpx;
color: #737D88; color: #737D88;
} }
.statusLabelzf { .statusLabelzf {
font-size: 24rpx; font-size: 24rpx;
position: absolute; position: absolute;
@ -404,20 +849,24 @@ const handleClose = () =>{
align-items: left; align-items: left;
color: #737D88 color: #737D88
} }
.product-row { .product-row {
margin: 20rpx 0; margin: 20rpx 0;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
color: #737D88; color: #737D88;
.row-item { .row-item {
flex: 1; flex: 1;
.label { .label {
margin-bottom: 10rpx; margin-bottom: 10rpx;
} }
.val { .val {
color: #1D2129; color: #1D2129;
&.high-color { &.high-color {
color: #00B42A color: #00B42A
} }
@ -439,6 +888,7 @@ const handleClose = () =>{
background: linear-gradient(149deg, #d4e62d 4%, #c5ab1a 98%); background: linear-gradient(149deg, #d4e62d 4%, #c5ab1a 98%);
color: #fff; color: #fff;
} }
.statusTexthd { .statusTexthd {
position: absolute; position: absolute;
right: 30rpx; right: 30rpx;
@ -610,5 +1060,5 @@ const handleClose = () =>{
color: #666; color: #666;
padding: 20rpx 0; padding: 20rpx 0;
} }
} }
</style>import type { stringify } from 'querystring'; </style>import type { stringify } from 'querystring';

View File

@ -2,13 +2,42 @@
<view class="popup-container" v-if="showPopup"> <view class="popup-container" v-if="showPopup">
<view class="popup-mask" @click="onMaskClick"></view> <view class="popup-mask" @click="onMaskClick"></view>
<view class="popup-content"> <view class="popup-content">
<text class="popup-title">进度百分比%:</text> <!-- <text class="popup-title">进度百分比%:</text>
<input type="number" class="popup-input" v-model="progress" placeholder="请输入进度"> <input type="number" class="popup-input" v-model="progress" placeholder="请输入进度">
<view class="product-item">图纸链接</view> <view class="product-item">图纸链接</view>
<input type="text" class="popup-input" v-model="imageLink" placeholder="请输入图片链接"> <input type="text" class="popup-input" v-model="imageLink" placeholder="请输入图片链接"> -->
<view class="product-item">备注</view> <view class="product-item">备注</view>
<uni-easyinput type="textarea" class="popup-input" v-model="remark" placeholder="请输入备注"/> <uni-easyinput type="textarea" class="popup-input" v-model="remark" placeholder="请输入备注"/>
<button style="margin-top: 5%;" size="10px" type="primary" @click="onClose">确认上报</button> <button style="margin-top: 5%;" size="10px" type="primary" @click="onClose">确认上报</button>
<div class="container">
<div class="one-area">开始时间</div>
<div class="one-area">结束时间</div>
<div class="one-area">已做时间(小时)</div>
<div class="one-area">备注</div>
</div>
<div v-for="(item,index) in detailList" :key="index">
<div class="container1">
<div class="one-area1">
<uni-data-select v-model="item.procedureId" :localdata="procedureData"></uni-data-select>
</div>
<div class="one-area2">
<uni-data-select v-model="item.userId" :localdata="ownerData"
placeholder="请选择责任人"></uni-data-select>
<!-- <lfj-dropdown-box v-model="item.userId" :loadStatus="loadStatus" placeholder="请选择责任人"
dropDownLoading rightTextShow filterable :localdata="ownerData"
@lower="lower"></lfj-dropdown-box> -->
</div>
<div class="one-area1">
<uni-easyinput type="number" v-model="item.responsibilityRatio" placeholder="请输入比例" />
</div>
<div class="one-area1">
<button class="uni-button" size="mini" type="warn"
@click="deletedDetailList(item.index)">删除</button>
</div>
</div>
</div>
</view> </view>
</view> </view>
</template> </template>
@ -61,6 +90,40 @@ watchEffect(() => {
<style scoped> <style scoped>
.container {
display: flex;
width: 630rpx;
margin-top: -10%;
}
.container1 {
display: flex;
width: 100%;
}
.one-area {
flex: 1;
text-align: center;
padding: 12px;
font-size: 15px;
font-weight: bold;
}
.one-area1 {
flex: 1;
text-align: center;
padding: 2px;
font-size: 15px;
font-weight: bold;
}
.one-area2 {
flex: 1.2;
text-align: center;
padding: 2px;
font-size: 15px;
font-weight: bold;
}
.popup-title { .popup-title {
margin-bottom: 20px; margin-bottom: 20px;

View File

@ -1,50 +1,61 @@
<script setup lang="ts"> <script setup lang="ts">
import { onMounted, computed, ref } from 'vue' import { onMounted, computed, ref } from 'vue'
import { onLoad, onShow } from '@dcloudio/uni-app' import { onLoad, onShow } from '@dcloudio/uni-app'
import { getListAPI, getDictAPI,getListWxAPI,getTaskDetailAPI } from '@/services/productionReport' import { getListAPI, getDictAPI, getListWxAPI, getTaskDetailAPI } from '@/services/productionReport'
import { useLoginStore } from '@/stores/modules/login' import { useLoginStore } from '@/stores/modules/login'
import { formatDate } from '@/utils/index' import { formatDate } from '@/utils/index'
const userStore = useLoginStore() const userStore = useLoginStore()
const userId = userStore.userInfo.userId const userId = userStore.userInfo.userId
// //
const isFinish = ref(false) const isFinish = ref(false)
// //
const isTriggered = ref(false) const isTriggered = ref(false)
// porps // porps
const props = defineProps<{ const props = defineProps<{
orderState: string orderState : string
}>() }>()
const isOverBeforeProcedure = async(id:number) =>{ const noticeMsg = ref('')
const isOverBeforeProcedure = async (id : number) => {
const params = { const params = {
id, id,
} }
const data = await getTaskDetailAPI(params) const data = await getTaskDetailAPI(params)
if(data.beforeProcedureStatus == 0){ console.log(data.testYn)
if (data.beforeProcedureStatus == 0) {
// //
noticeMsg.value = '上一道工序尚未完成报工!';
return true; return true;
}else{ }else if(data.testYn != 'Y'){
noticeMsg.value = '上道工序过程检没有完成,请确认!';
return true;
}else {
return false; return false;
} }
} }
const statusText = computed(() => { const statusText = computed(() => {
const text = props.orderState == '0,1' ? '处理' : '查看' const text = props.orderState == '0,1' ? '处理' : '查看'
return text return text
}) })
// //
const isLoading = ref(false) const isLoading = ref(false)
// //
const queryParams: Required<any> = { const queryParams : Required<any> = {
pageNo: 1, pageNo: 1,
pageSize: 5, pageSize: 5,
owner: userId, // owner: userId, //
procedureStatusList: props.orderState, // procedureStatusList: props.orderState, //
dispatchType: 'PRODUCTION', // dispatchType: 'PRODUCTION', //
isReport: 1, // isReport: 1, //
} //20250601/
const dataList = ref([]) subOrDetailName:'',
const getListData = async () => { }
const dataList = ref([])
const getListData = async () => {
if(props.orderState == '2'){
queryParams.subOrDetailName = '';
}
// 退 // 退
if (isLoading.value) return if (isLoading.value) return
if (isFinish.value === true) { if (isFinish.value === true) {
@ -70,25 +81,31 @@ const getListData = async () => {
// //
isFinish.value = true isFinish.value = true
} }
} }
const todayStr = ref('');
onMounted(async () => {
const today = new Date();
const year = today.getFullYear();
const month = String(today.getMonth() + 1).padStart(2, '0');
const day = String(today.getDate()).padStart(2, '0');
onMounted(async () => { todayStr.value = `${year}-${month}-${day}`;
await getListData() await getListData()
}) })
onShow(async () => { onShow(async () => {
isFinish.value = false isFinish.value = false
isLoading.value = false isLoading.value = false
queryParams.pageNo = 1 queryParams.pageNo = 1
dataList.value = [] dataList.value = []
await getListData() await getListData()
}) })
const handleDetail = async(item) => { const handleDetail = async (item) => {
var isoverBefore= await isOverBeforeProcedure(item.id); var isoverBefore = await isOverBeforeProcedure(item.id);
if(isoverBefore == true){ if (isoverBefore == true) {
uni.showToast({ uni.showToast({
title: '上一道工序尚未完成报工!', title: noticeMsg.value,
icon: 'none', icon: 'none',
duration: 2000, duration: 2000,
}) })
@ -96,10 +113,10 @@ const handleDetail = async(item) => {
} }
const url = `/pages/productionReport/productionReport-detail?id=${item.id}` const url = `/pages/productionReport/productionReport-detail?id=${item.id}`
uni.navigateTo({ url }) uni.navigateTo({ url })
} }
// //
const onRefresherrefresh = async () => { const onRefresherrefresh = async () => {
// //
isTriggered.value = true isTriggered.value = true
// //
@ -110,35 +127,32 @@ const onRefresherrefresh = async () => {
await getListData() await getListData()
// //
isTriggered.value = false isTriggered.value = false
} }
// const searchVal = ref('') const searchVal = ref('')
// const dataListDefault = ref([]) // const dataListDefault = ref([])
// const handleSearch = async () => { const handleSearch = async () => {
// const code = searchVal.value queryParams.subOrDetailName = searchVal.value;
// if (code) { queryParams.pageNo = 1;
// dataListDefault.value = dataList.value isFinish.value = false;
// dataList.value = dataList.value.filter((e) => { dataList.value = []
// return e.code == code await getListData()
// })
// } else { }
// dataList.value = dataListDefault.value
// }
// }
</script> </script>
<template> <template>
<view class="cont"> <view class="cont">
<!-- <view class="search" v-if="dataList.length > 5"> <view class="search" v-if="props.orderState == '0,1' ">
<view class="title"></view> <input class="uni-input" v-model="searchVal" placeholder="请输入项目或子项目名称" />
<input class="uni-input" v-model="searchVal" @change="handleSearch" placeholder="根据编号搜索" /> <uni-icons type="search" size="30" class="icons" @click="handleSearch"></uni-icons>
</view> --> </view>
<scroll-view enable-back-to-top scroll-y class="data-list" refresher-enabled :refresher-triggered="isTriggered" <scroll-view enable-back-to-top scroll-y class="data-list" refresher-enabled :refresher-triggered="isTriggered"
@refresherrefresh="onRefresherrefresh" @scrolltolower="getListData"> @refresherrefresh="onRefresherrefresh" @scrolltolower="getListData">
<view class="item" v-for="item in dataList" :key="item.id" @click="handleDetail(item)"> <view class="item" v-for="item in dataList" :key="item.id" @click="handleDetail(item)">
<view class="hd"> <view class="hd">
<view class="num">派工单</view> <view class="num">派工单</view>
<view class="statusLabel">{{ '(单号:'+ item.dispatchCode+') '}}</view> <view class="statusLabel">{{ '(单号:'+ item.dispatchCode+') '}}</view>
<view class="num">下一道工序</view> <view class="num">{{ '下工序:'+ (item.nextProcedureName == null ? '无':item.nextProcedureName)}}</view>
<view class="statusLabel " >{{ item.nextProcedureName == null ? '无':item.nextProcedureName}}</view> <!-- <view class="statusLabel " ></view> -->
</view> </view>
<view class="md"> <view class="md">
<view class="product-item">项目名称{{ item.projectCode + ' ' + item.projectName }}</view> <view class="product-item">项目名称{{ item.projectCode + ' ' + item.projectName }}</view>
@ -171,7 +185,7 @@ const onRefresherrefresh = async () => {
<view class="val high-color">{{ item.totalWorkTime }}</view> <view class="val high-color">{{ item.totalWorkTime }}</view>
</view> </view>
</view> </view>
<view class="product-item">预计生产日期{{ item.startTime }} {{ item.endTime }}</view> <view class="product-item" :style=" item.endTime < todayStr ? 'color:red':null">预计生产日期{{ item.startTime }} {{ item.endTime }}</view>
</view> </view>
<view class="statusText">{{ statusText }}</view> <view class="statusText">{{ statusText }}</view>
</view> </view>
@ -184,24 +198,32 @@ const onRefresherrefresh = async () => {
</template> </template>
<style lang="scss"> <style lang="scss">
// //
.search { .search {
padding: 4rpx; padding: 0rpx;
width: 80%; width: 90%;
margin: 30rpx auto; margin: auto;
margin-top: 20rpx;
position: relative;
.uni-input { .uni-input {
border: 1px solid #D1D6DB; border: 1px solid #d1d6db;
height: 60rpx; height: 60rpx;
line-height: 60rpx; line-height: 60rpx;
padding: 4rpx 10rpx; padding: 4rpx 10rpx;
font-size: 32rpx; font-size: 32rpx;
border-radius: 6rpx; border-radius: 10rpx;
}
.icons {
width: 30rpx;
position: absolute;
right: 40rpx;
top: 0rpx;
} }
} }
.data-list { .data-list {
height: 90vh; height: 90vh;
.item { .item {
position: relative; position: relative;
padding: 20rpx 0; padding: 20rpx 0;
@ -233,20 +255,24 @@ const onRefresherrefresh = async () => {
align-items: center; align-items: center;
color: #737D88 color: #737D88
} }
.product-row { .product-row {
margin: 20rpx 0; margin: 20rpx 0;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
color: #737D88; color: #737D88;
.row-item { .row-item {
flex: 1; flex: 1;
.label { .label {
margin-bottom: 10rpx; margin-bottom: 10rpx;
} }
.val { .val {
color: #1D2129; color: #1D2129;
&.high-color { &.high-color {
color: #00B42A color: #00B42A
} }
@ -426,5 +452,5 @@ const onRefresherrefresh = async () => {
color: #666; color: #666;
padding: 20rpx 0; padding: 20rpx 0;
} }
} }
</style>import type { stringify } from 'querystring'; </style>import type { stringify } from 'querystring';

View File

@ -7,8 +7,7 @@
* @Description: ,`customMade`, koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: ,`customMade`, koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/ */
// export const serviceDomain = 'https://nxhs.cjyx.cc' // export const serviceDomain = 'https://nxhs.cjyx.cc'
// export const serviceDomain = 'https://star.hz-hl.com' export const serviceDomain = 'https://star.hz-hl.com'
// export const serviceDomain = 'http://222.71.165.187:9010' // export const serviceDomain = 'http://222.71.165.187:9010'
// export const serviceDomain = 'http://localhost:8080' // export const serviceDomain = 'http://localhost:8080'
export const serviceDomain = 'https://nxhs.cjyx.cc' // export const serviceDomain = 'https://nxhs.cjyx.cc'

View File

@ -15,6 +15,16 @@ export const getListAPI = (data: Object) => {
data, data,
}) })
} }
export interface ProcessDesignVO {
id: number
planId: number
processDesignType: string
remark: string
status: number
projectId: number
projectSubId: number
processDesignProgressList: any
}
/** /**
* /// * ///
@ -49,7 +59,13 @@ export const getTaskDetailAPI = (id: number) => {
//data, //data,
}) })
} }
export const getProcessDesignProgressListByProcessDesignId = (id: number) => {
return http<any[]>({
method: 'GET',
url: "/heli/process-design/process-design-progress/list-by-process-design-id?processDesignId="+id
//data,
})
}
/** /**
* *
*/ */
@ -70,6 +86,20 @@ export const postOperateAPIEnd = (data: Object) => {
data, data,
}) })
} }
export const createProcessDesign = (data: Object) => {
return http<any[]>({
method: 'POST',
url: '/heli/process-design/create',
data,
})
}
export const updateProcessDesign = (data: Object) => {
return http<any[]>({
method: 'PUT',
url: '/heli/process-design/update',
data,
})
}
/** /**
* - * -

View File

@ -5,7 +5,6 @@
<excludeFolder url="file://$MODULE_DIR$/heli-app/.idea" /> <excludeFolder url="file://$MODULE_DIR$/heli-app/.idea" />
<excludeFolder url="file://$MODULE_DIR$/mes-ui/mes-ui-admin-vue3/.idea" /> <excludeFolder url="file://$MODULE_DIR$/mes-ui/mes-ui-admin-vue3/.idea" />
<excludeFolder url="file://$MODULE_DIR$/mes-ui/mes-ui-admin-vue3/dist-pro" /> <excludeFolder url="file://$MODULE_DIR$/mes-ui/mes-ui-admin-vue3/dist-pro" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content> </content>
</component> </component>
</module> </module>