近期修改

This commit is contained in:
z 2026-01-04 11:04:58 +08:00
parent abae3b4bc5
commit c60a522230
43 changed files with 2382 additions and 234 deletions

View File

@ -2,6 +2,7 @@ package com.chanko.yunxi.mes.module.heli.controller.admin.orderys.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 com.chanko.yunxi.mes.framework.excel.core.convert.TimestampToDateConvert; import com.chanko.yunxi.mes.framework.excel.core.convert.TimestampToDateConvert;
@ -38,12 +39,18 @@ public class OrderYsExportVO {
@Schema(description = "已收金额") @Schema(description = "已收金额")
@ExcelProperty("已收金额") @ExcelProperty("已收金额")
private BigDecimal cgYishou; private BigDecimal cgYishou;
@Schema(description = "剩余金额")
@ExcelProperty("剩余金额")
private BigDecimal remainingYishou;
@Schema(description = "已收款比例") @Schema(description = "已收款比例")
@ExcelProperty("已收款比例") @ExcelProperty("已收款比例")
private String ysRatio; private String ysRatio;
@Schema(description = "已开票金额") @Schema(description = "已开票金额")
@ExcelProperty("已开票金额") @ExcelProperty("已开票金额")
private BigDecimal amount; private BigDecimal amount;
@Schema(description = "剩余开票金额")
@ExcelProperty("剩余开票金额")
private BigDecimal remainingAmount;
@Schema(description = "已开票比例") @Schema(description = "已开票比例")
@ExcelProperty("已开票比例") @ExcelProperty("已开票比例")
private String ykRatio; private String ykRatio;
@ -58,4 +65,6 @@ public class OrderYsExportVO {
@ExcelProperty("备注") @ExcelProperty("备注")
private String rem; private String rem;
} }

View File

@ -73,4 +73,7 @@ public class OrderYsRespVO {
private String projectCode; private String projectCode;
private LocalDateTime projectStartTime; private LocalDateTime projectStartTime;
private String contractNo; private String contractNo;
private BigDecimal remainingYishou;
private BigDecimal remainingAmount;
} }

View File

@ -112,4 +112,11 @@ public class PlanController {
return planService.verification(id,type); return planService.verification(id,type);
} }
@GetMapping("/getPartProcess")
@Operation(summary = "获得零件进程分页")
@PreAuthorize("@ss.hasPermission('heli:plan:query')")
public CommonResult<PlanDO> getPartProcess(@Valid PlanPageReqVO pageReqVO) {
PlanDO pageResult = planService.getPartProcess(pageReqVO);
return success(pageResult);
}
} }

View File

@ -98,7 +98,8 @@ public class PlanPageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] changeEndTime; private LocalDateTime[] changeEndTime;
@Schema(description = "子项目名称")
private String projectSubName;
} }

View File

@ -1,6 +1,8 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo; package com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansubdetail.PlanSubDetailDO;
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.*;
@ -154,4 +156,6 @@ public class PlanRespVO {
private LocalDateTime castEndDate; private LocalDateTime castEndDate;
@Schema(description = "是否需要铸件图:1表示需要0表示不需要") @Schema(description = "是否需要铸件图:1表示需要0表示不需要")
private Integer hasCast; private Integer hasCast;
@Schema(description = "计划子项目明细")
private List<PlanSubDO> list;
} }

View File

@ -152,4 +152,11 @@ public class PlanSubDetailController {
public CommonResult insertWork(@Valid @RequestBody PlanSubDetailSaveReqVO updateReqVO) { public CommonResult insertWork(@Valid @RequestBody PlanSubDetailSaveReqVO updateReqVO) {
return planSubDetailService.insertWork(updateReqVO); return planSubDetailService.insertWork(updateReqVO);
} }
@GetMapping("/getList")
@Operation(summary = "获得零件进程管理详情子项目信息")
@PreAuthorize("@ss.hasPermission('heli:plan-sub-detail:query')")
public CommonResult<List<PlanSubDetailDO>> getList(@Valid PlanSubDetailPageReqVO pageReqVO) {
return success( planSubDetailService.getList(pageReqVO));
}
} }

View File

@ -78,5 +78,4 @@ public class PlanSubDetailPageReqVO extends PageParam {
private String planNo; private String planNo;
} }

View File

@ -95,6 +95,10 @@ public class OrderYsDO extends BaseDO {
private String ysRatio; private String ysRatio;
@TableField(exist = false) @TableField(exist = false)
private String ykRatio; private String ykRatio;
@TableField(exist = false)
private BigDecimal remainingYishou;
@TableField(exist = false)
private BigDecimal remainingAmount;
} }

View File

@ -1,5 +1,8 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.plan; package com.chanko.yunxi.mes.module.heli.dal.dataobject.plan;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.util.*; import java.util.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -228,6 +231,14 @@ public class PlanDO extends BaseDO {
private LocalDateTime orderTime; private LocalDateTime orderTime;
private String code; private String code;
@TableField(exist = false)
private PageResult<PlanSubDO> list;
@TableField(exist = false)
private String craftOwnerName;
@TableField(exist = false)
private String projectProgress;
@TableField(exist = false)
private String processProgress;
@TableField(exist = false)
private String processFlag;
} }

View File

@ -223,4 +223,45 @@ public class PlanSubDO extends BaseDO {
private String projectCode; private String projectCode;
@TableField(exist = false) @TableField(exist = false)
private String planNo; private String planNo;
@TableField(exist = false)
private String projectName;
@TableField(exist = false)
private LocalDateTime projectEndTime;
@TableField(exist = false)
private LocalDateTime craftEndDate;
@TableField(exist = false)
private String craftOwnerName;
@TableField(exist = false)
private Integer deliveryStatus;
//设计任务
@TableField(exist = false)
private String designTask;
//设计任务标识
@TableField(exist = false)
private String designTaskFlag;
@TableField(exist = false)
//外协任务
private String outsourcingTasks;
@TableField(exist = false)
//外协任务标识
private String outsourcingTasksFlag;
//加工任务
@TableField(exist = false)
private String processingTask;
//加工任务标识
@TableField(exist = false)
private String processingTaskFlag;
//过程检
@TableField(exist = false)
private String processInspection;
//过程检标识
@TableField(exist = false)
private String processInspectionFlag;
//装配任务
@TableField(exist = false)
private String assemblyTask;
//装配任务标识
@TableField(exist = false)
private String assemblyTaskFlag;
} }

View File

@ -106,4 +106,15 @@ public class PlanSubDetailDO extends BaseDO {
private String planNo; private String planNo;
@TableField(exist = false) @TableField(exist = false)
private String projectNameSim; private String projectNameSim;
//工单状态
@TableField(exist = false)
private String status;
//工单标识
@TableField(exist = false)
private String statusFlag;
//生产进度
@TableField(exist = false)
private String productionSchedule;
} }

View File

@ -38,6 +38,8 @@ public interface OrderYsMapper extends BaseMapperX<OrderYsDO> {
.select("p.delivery_status as deliveryStatus") .select("p.delivery_status as deliveryStatus")
.select("p.id as projectId","p.code as projectCode") .select("p.id as projectId","p.code as projectCode")
.select("p.project_start_time as projectStartTime","p.contract_no as contractNo") .select("p.project_start_time as projectStartTime","p.contract_no as contractNo")
.select("t.cg_ys-t.cg_yishou as remainingYishou")
.select("t.cg_ys-sum(i.amount) as remainingAmount")
.leftJoin( .leftJoin(
"finance_invoice i ON i.order_code = t.code AND i.deleted=0 and i.tenant_id=2 and i.business_type = 'FINANCE_MAKE_INVOICE' AND i.status !='3'") "finance_invoice i ON i.order_code = t.code AND i.deleted=0 and i.tenant_id=2 and i.business_type = 'FINANCE_MAKE_INVOICE' AND i.status !='3'")
.leftJoin(ProjectOrderDO.class,"p", ProjectOrderDO::getCode, OrderYsDO::getCode) .leftJoin(ProjectOrderDO.class,"p", ProjectOrderDO::getCode, OrderYsDO::getCode)

View File

@ -134,4 +134,6 @@ List<PlanDO> selectfhtj(Long txrid);
List<PlanDO> selectfhtj1(); List<PlanDO> selectfhtj1();
@Delete("delete from project_plan where project_id=#{id}") @Delete("delete from project_plan where project_id=#{id}")
void deleteOrderId(@Param("id") Long id); void deleteOrderId(@Param("id") Long id);
} }

View File

@ -7,6 +7,7 @@ import cn.smallbun.screw.core.util.StringUtils;
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.query.LambdaQueryWrapperX; import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX; import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.equip.EquipDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.equip.EquipDO;
@ -17,6 +18,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@ -296,4 +298,29 @@ public interface PlanSubMapper extends BaseMapperX<PlanSubDO> {
} }
@Delete("delete from project_plan_sub where project_id=#{id}") @Delete("delete from project_plan_sub where project_id=#{id}")
void deleteOrderId(@Param("id") Long id); void deleteOrderId(@Param("id") Long id);
default PageResult<PlanSubDO> getPartProcess(PlanPageReqVO pageReqVO){
MPJLambdaWrapper<PlanSubDO> query = new MPJLambdaWrapper<>();
query.selectAll(PlanSubDO.class)
.select("p.project_name as projectName","s.name as projectSubName")
.select("p.project_end_time as projectEndTime","d.craft_end_date")
.select("u.nickname as craftOwnerName","p.delivery_status as deliveryStatus")
.leftJoin(ProjectOrderDO.class, "p", ProjectOrderDO::getId, PlanSubDO::getProjectId)
.leftJoin(ProjectOrderSubDO.class, "s", ProjectOrderSubDO::getId, PlanSubDO::getProjectSubId)
.leftJoin(CustomerDO.class, "c", CustomerDO::getId, ProjectOrderDO::getCustomerId)
.leftJoin(PlanDO.class, "d", PlanDO::getId, PlanSubDO::getProjectPlanId)
.leftJoin(AdminUserDO.class, "u",
wrapper -> wrapper.eq(AdminUserDO::getId, PlanDO::getCraftOwner))
.disableSubLogicDel();
query.eq(ProjectOrderDO::getDeleted,0);
query.eq(ProjectOrderSubDO::getDeleted,0);
query.eq(CustomerDO::getDeleted,0);
query.eq(PlanDO::getDeleted,0);
query.eq(ObjectUtil.isNotEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode, pageReqVO.getProjectCode());
query.eq(ObjectUtil.isNotEmpty(pageReqVO.getProjectName()), ProjectOrderDO::getProjectName, pageReqVO.getProjectName());
query.eq(ObjectUtil.isNotEmpty(pageReqVO.getProjectSubName()), ProjectOrderSubDO::getName, pageReqVO.getProjectSubName());
query.eq(ObjectUtil.isNotEmpty(pageReqVO.getCustomerName()), CustomerDO::getName, pageReqVO.getCustomerName());
query.orderByAsc(ProjectOrderDO::getCode);
return selectPage(pageReqVO, query);
}
} }

View File

@ -2,7 +2,6 @@ package com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 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;
@ -16,7 +15,6 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.ygjx.vo.YgjxPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.bgmasterline.BgMasterLineDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.bgmasterline.BgMasterLineDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.equipmanufacture.EquipManufactureDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.pgmaster.PgMasterLineDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.pgmaster.PgMasterLineDO;
@ -32,22 +30,17 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatch
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatchdetailowner.TaskDispatchDetailOwnerDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatchdetailowner.TaskDispatchDetailOwnerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskreport.TaskReportDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskreport.TaskReportDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanBoomMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.*; import java.time.*;
import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
/** /**
@ -906,4 +899,26 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
List<BubbleFeeResult> batchInternalLaborCost(@Param("bomDetailIds")List<Long> bomDetailIds); List<BubbleFeeResult> batchInternalLaborCost(@Param("bomDetailIds")List<Long> bomDetailIds);
List<BubbleFeeResult> batchProcessInspection(@Param("bomDetailIds")List<Long> bomDetailIds); List<BubbleFeeResult> batchProcessInspection(@Param("bomDetailIds")List<Long> bomDetailIds);
default List<TaskDispatchDetailDO> outSourceTask(Long projectSubId,String type,String checkYn){
MPJLambdaWrapper<TaskDispatchDetailDO> query = new MPJLambdaWrapper<>();
query.selectAll(TaskDispatchDetailDO.class)
.select("a.bom_detail_id as bomDetailId")
.leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId);
query.eq(TaskDispatchDO::getProjectSubId,projectSubId);
query.eq(TaskDispatchDO::getDispatchType,"PRODUCTION");
query.eq(ObjectUtil.isNotEmpty(checkYn),TaskDispatchDetailDO::getCheckYn,checkYn);
query.eq(TaskDispatchDetailDO::getIsOutsourcing,type);
return selectList(query);
}
default List<TaskDispatchDetailDO> assemblyTask(Long projectSubId){
MPJLambdaWrapper<TaskDispatchDetailDO> query = new MPJLambdaWrapper<>();
query.selectAll(TaskDispatchDetailDO.class)
.select("a.bom_detail_id as bomDetailId")
.leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId);
query.eq(TaskDispatchDO::getProjectSubId,projectSubId);
query.eq(TaskDispatchDO::getDispatchType,"ASSEMBLE");
return selectList(query);
}
} }

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.service.partpurchaseorder; package com.chanko.yunxi.mes.module.heli.service.partpurchaseorder;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -18,6 +19,8 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.Pa
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail.vo.PurchaseOrderMakeDetailRespVO; import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail.vo.PurchaseOrderMakeDetailRespVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail.vo.PurchaseOrderMakeDetailSaveReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail.vo.PurchaseOrderMakeDetailSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
@ -29,6 +32,8 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.Pur
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.composition.CompositionMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanBoomMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanBoomMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper;
@ -45,6 +50,7 @@ import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService
import com.chanko.yunxi.mes.module.heli.service.supplier.SupplierService; import com.chanko.yunxi.mes.module.heli.service.supplier.SupplierService;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.chanko.yunxi.mes.module.system.service.user.AdminUserService; import com.chanko.yunxi.mes.module.system.service.user.AdminUserService;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -62,6 +68,7 @@ import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; import static com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PURCHASE_ORDER; import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PURCHASE_ORDER;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.PURCHASE_ORDER_MAKE_DETAIL_MATERIAL_NOT_EXISTS;
@Service @Service
@Validated @Validated
@ -92,6 +99,10 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
private ProcessBomDetailMapper processBomDetailMapper; private ProcessBomDetailMapper processBomDetailMapper;
@Autowired @Autowired
private TaskDispatchDetailMapper taskDispatchDetailMapper; private TaskDispatchDetailMapper taskDispatchDetailMapper;
@Autowired
private MaterialMapper materialMapper;
@Autowired
private CompositionMapper compositionMapper;
@Override @Override
public PageResult<PartPurchaseOrderPageRespVO> getPartPurchaseOrderPage(PartPurchaseOrderPageReqVO pageReqVO) { public PageResult<PartPurchaseOrderPageRespVO> getPartPurchaseOrderPage(PartPurchaseOrderPageReqVO pageReqVO) {
@ -404,10 +415,141 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
if (ObjectUtil.isNotEmpty(orderMakeDO)) { if (ObjectUtil.isNotEmpty(orderMakeDO)) {
if (orderMakeDO.getGoodsType() == 2) { if (orderMakeDO.getGoodsType() == 2) {
submitNo(list); submitNo(list);
}else {
submitNo1(list);
} }
} }
return true; return true;
} }
public void submitNo1(List<PurchaseOrderMakeDetailDO> list) {
if (CollUtil.isNotEmpty(list)){
List<PurchaseOrderMakeDetailDO> updateList =list;
//插入make表
PurchaseOrderNoDO purchaseOrderNoDO = new PurchaseOrderNoDO();
SerialNumberDO serialNumberDO = new SerialNumberDO();
// 月度流水号
serialNumberDO = serialNumberService.getSerialNumber(PURCHASE_ORDER.name(), new SimpleDateFormat("yyyyMMdd").format(new Date()));
serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1);
// 入库前缀
String code = PURCHASE_ORDER.getCode(serialNumberDO.getSerialNumber().toString());
purchaseOrderNoDO.setPurchaseNo(code);
serialNumberService.updateSerialNumber(serialNumberDO);
purchaseOrderNoDO.setGoodsType(1);
purchaseOrderNoDO.setPurchaseType(1);
purchaseOrderNoDO.setSupplierId(updateList.get(0).getSupplierId());
purchaseOrderNoDO.setOrdDate(new Date());
purchaseOrderNoMapper.insert(purchaseOrderNoDO);
OrderYfSaveReqVO orderYfVO = new OrderYfSaveReqVO();
orderYfVO.setCgOrderNum(code);
SupplierDO supplierDO = supplierMapper.selectById(updateList.get(0).getSupplierId());
if (ObjectUtil.isNotEmpty(supplierDO)){
orderYfVO.setCgGysname(supplierDO.getName());
}
BigDecimal sum = updateList.stream()
.filter(Objects::nonNull) // 过滤掉空对象
.map(PurchaseOrderMakeDetailDO::getEstimatedPrice)
.filter(Objects::nonNull) // 过滤掉空值
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加求和
orderYfVO.setCgYf(sum);
orderYfService.createCg(orderYfVO);
List<PurchaseOrderNoDetailDO> insertList =new ArrayList<>();
HashMap<Long,PurchaseOrderMakeDO> insertMap = new HashMap<>();
HashMap<Long, MaterialDO> insertMaterialMap = new HashMap<>();
HashMap<Long , CompositionDO> compositionDOHashMap = new HashMap<>();
for (PurchaseOrderMakeDetailDO pmd : updateList) {
PurchaseOrderNoDetailDO pd = new PurchaseOrderNoDetailDO();
pd.setMakeDetailId(pmd.getId());
pd.setPurchaseOrderId(purchaseOrderNoDO.getId());
pd.setBoomDetailId(pmd.getBoomDetailId());
if (pd.getMakeDetailId() != null) {
MaterialDO materialDO = insertMaterialMap.get(pmd.getMaterialId());
if (materialDO == null) {
materialDO = materialMapper.selectById(pmd.getMaterialId());
insertMaterialMap.put(pd.getMakeDetailId(), materialDO);
}
if (ObjectUtil.isNotEmpty(materialDO)&& ObjectUtil.isNotEmpty(materialDO.getCompositionId())) {
CompositionDO compositionDO = compositionDOHashMap.get(materialDO.getCompositionId());
if (compositionDO == null) {
compositionDO = compositionMapper.selectById(materialDO.getCompositionId());
compositionDOHashMap.put(materialDO.getCompositionId(), compositionDO);
}
pd.setComposition(compositionDO == null ?"":compositionDO.getName());
}
if (ObjectUtil.isNotEmpty(materialDO)){
pd.setBoomName(materialDO.getName());
pd.setMaterialId(materialDO.getId());
pd.setBoomSpec(materialDO.getSpec());
pd.setBoomUnit(materialDO.getUnit());
}
}else {
throw exception(PURCHASE_ORDER_MAKE_DETAIL_MATERIAL_NOT_EXISTS);
}
pd.setPurchaseAmount(pmd.getPurchaseAmount());
pd.setEstimatedPrice(pmd.getEstimatedPrice());
pd.setArriveTime(pmd.getArriveTime());
pd.setBoomAmount(pmd.getBoomAmount());
pd.setRequireTime(pmd.getRequireTime());
pd.setProjectMaterialPlanId(pmd.getProjectMaterialPlanId());
pd.setProjectMaterialPlanBoomId(pmd.getProjectMaterialPlanBoomId());
pd.setProjectPlanSubId(pmd.getProjectPlanSubId());
pd.setName(pmd.getName());
pd.setNameSim(pmd.getNameSim());
PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
if (insertMap.get(pmd.getPurchaseOrderId()) != null) {
purchaseOrderMakeDO = insertMap.get(pmd.getPurchaseOrderId());
}else{
purchaseOrderMakeDO = purchaseOrderMakeMapper.selectById(pmd.getPurchaseOrderId());
insertMap.put(pmd.getPurchaseOrderId(),purchaseOrderMakeDO);
}
if (purchaseOrderMakeDO != null) {
pd.setProjectId(purchaseOrderMakeDO.getProjectId());
pd.setProjectPlanId(purchaseOrderMakeDO.getProjectPlanId());
pd.setCustomerId(purchaseOrderMakeDO.getCustomerId());
pd.setBrief(purchaseOrderMakeDO.getBrief());
pd.setProjectName(purchaseOrderMakeDO.getProjectName());
pd.setProjectNameSim(purchaseOrderMakeDO.getProjectNameSim());
}
pd.setPurchaseRemAmount(pmd.getPurchaseAmount());
pd.setProjectSubCode(pmd.getProjectSubCode());
insertList.add(pd);
}
if (CollUtil.isNotEmpty(insertList)) {
purchaseOrderNoDetailMapper.insertBatch(insertList);
for (PurchaseOrderMakeDetailDO pmd : updateList) {
for (PurchaseOrderNoDetailDO pd : insertList) {
if (pmd.getId().equals(pd.getMakeDetailId())){
pmd.setPurchaseOrderNoId(purchaseOrderNoDO.getId());
pmd.setPurchaseOrderNoDetailId(pd.getId());
pmd.setOrderStatus(2);
pmd.setStatus(2);
pmd.setPurchaseNo(code);
break;
}
}
}
purchaseOrderMakeDetailMapper.updateBatch(updateList);
}
}else {
// 校验存在
// validatePurchaseOrderMakeDetailExists(updateReqVO.getId());
// 更新
// PurchaseOrderMakeDetailDO updateObj = BeanUtils.toBean(updateReqVO, PurchaseOrderMakeDetailDO.class);
// if (updateObj.getMaterialId() == null){
// purchaseOrderMakeDetailMapper.clearMaterialId(updateObj.getId());
// purchaseOrderMakeDetailMapper.updateById(updateObj);
// }else {
// purchaseOrderMakeDetailMapper.updateById(updateObj);
// }
}
}
@Override @Override
public PageResult<PartPurchaseOrderPageRespVO> getDetail(PartPurchaseOrderPageReqVO partPurchaseOrderPageReqVO) { public PageResult<PartPurchaseOrderPageRespVO> getDetail(PartPurchaseOrderPageReqVO partPurchaseOrderPageReqVO) {
return purchaseOrderMakeDetailMapper.getDetail(partPurchaseOrderPageReqVO); return purchaseOrderMakeDetailMapper.getDetail(partPurchaseOrderPageReqVO);
@ -539,6 +681,8 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
if (ObjectUtil.isNotEmpty(purchaseOrderMakeDO)){ if (ObjectUtil.isNotEmpty(purchaseOrderMakeDO)){
if (purchaseOrderMakeDO.getGoodsType() == 2){ if (purchaseOrderMakeDO.getGoodsType() == 2){
submitNo(list); submitNo(list);
}else {
submitNo1(list);
} }
} }

View File

@ -66,4 +66,6 @@ public interface PlanService {
int updateById(PlanDO planDO); int updateById(PlanDO planDO);
CommonResult<Boolean> verification(Long id, String type); CommonResult<Boolean> verification(Long id, String type);
PlanDO getPartProcess(PlanPageReqVO pageReqVO);
} }

View File

@ -68,4 +68,6 @@ public interface PlanSubDetailService {
CommonResult Intersection(PlanSubDetailSaveReqVO updateReqVO); CommonResult Intersection(PlanSubDetailSaveReqVO updateReqVO);
CommonResult overlap(PlanSubDetailSaveReqVO updateReqVO); CommonResult overlap(PlanSubDetailSaveReqVO updateReqVO);
List<PlanSubDetailDO> getList(PlanSubDetailPageReqVO pageReqVO);
} }

View File

@ -2,17 +2,22 @@ package com.chanko.yunxi.mes.module.heli.service.plansubdetail;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.smallbun.screw.core.util.CollectionUtils;
import com.alibaba.druid.sql.visitor.functions.If;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.module.heli.controller.admin.plansub.vo.PlanSubPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.plansub.vo.PlanSubPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesign.ProcessDesignDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesignprogress.ProcessDesignProgressDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.shopCalendar.ShopCalendarDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.shopCalendar.ShopCalendarDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignProgressMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.shopCalendar.ShopCalendarMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.shopCalendar.ShopCalendarMapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
@ -62,6 +67,8 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
private ProcessDesignMapper processDesignMapper; private ProcessDesignMapper processDesignMapper;
@Resource @Resource
private ProjectOrderMapper projectOrderMapper; private ProjectOrderMapper projectOrderMapper;
@Resource
private ProcessDesignProgressMapper processDesignProgressMapper;
@Override @Override
public Long createPlanSubDetail(PlanSubDetailSaveReqVO createReqVO) { public Long createPlanSubDetail(PlanSubDetailSaveReqVO createReqVO) {
// 插入 // 插入
@ -1754,6 +1761,112 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
return CommonResult.success(false); return CommonResult.success(false);
} }
@Override
public List<PlanSubDetailDO> getList(PlanSubDetailPageReqVO pageReqVO) {
ArrayList<PlanSubDetailDO> planSubDetailDOS = new ArrayList<>();
LocalDateTime now = LocalDateTime.now();
//设计任务
PlanSubDetailDO designTask = new PlanSubDetailDO();
LambdaQueryWrapper<PlanSubDetailDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PlanSubDetailDO::getProjectSubId,pageReqVO.getProjectSubId());
List<PlanSubDetailDO> planSubDetail = planSubDetailMapper.selectList(lambdaQueryWrapper);
designTask.setSubType("设计");
LocalDateTime minTime = planSubDetail.stream()
.filter(Objects::nonNull)
.map(PlanSubDetailDO::getStartTwoDimDate)
.filter(Objects::nonNull)
.min(Comparator.naturalOrder())
.orElse(null);
designTask.setStartTwoDimDate(minTime);
LocalDateTime maxTime = planSubDetail.stream()
.filter(Objects::nonNull)
.map(PlanSubDetailDO::getTwoDimDate)
.filter(Objects::nonNull)
.max(Comparator.naturalOrder())
.orElse(null);
designTask.setTwoDimDate(maxTime);
boolean AllCompleted = CollectionUtils.isNotEmpty(planSubDetail)
&& planSubDetail.stream()
.filter(Objects::nonNull)
.allMatch(item -> item.getIsOverProcess() == 1);
if (AllCompleted){
designTask.setStatus("已完成");
}else {
if (ObjectUtil.isNotEmpty(planSubDetail)){
boolean hasAtLeastOne = CollectionUtils.isNotEmpty(planSubDetail)
&& planSubDetail.stream()
.filter(Objects::nonNull)
.anyMatch(item -> item.getIsOverProcess() == 1);
if (hasAtLeastOne){
designTask.setStatus("已开始");
designTask.setStatusFlag("0");
}else{
designTask.setStatus("未开始");
}
}else{
designTask.setStatus("未开始");
}
}
if (ObjectUtil.isNotEmpty(planSubDetail)) {
if (AllCompleted) {
LambdaQueryWrapper<ProcessDesignDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessDesignDO::getProjectSubId, pageReqVO.getProjectSubId());
queryWrapper.eq(ProcessDesignDO::getIsOverProcess, "1");
List<ProcessDesignDO> completedDesigns = processDesignMapper.selectList(queryWrapper);
// 获取最新的工艺设计进度
ProcessDesignProgressDO latestProgress = getLatestProcessDesignProgress(
completedDesigns.stream()
.map(ProcessDesignDO::getId)
.collect(Collectors.toList())
);
if (ObjectUtil.isNotEmpty(latestProgress) && ObjectUtil.isNotEmpty(maxTime)) {
boolean isOverdue = isDateAfterLocalDateTime(
latestProgress.getEndTime(),
maxTime
);
designTask.setStatusFlag(isOverdue ? "1" : designTask.getStatusFlag());
}
} else {
if (ObjectUtil.isNotEmpty(maxTime)){
if (now.isAfter(maxTime)){
designTask.setStatusFlag("1");
}
}
}
}
return null;
}
/**
* 判断 Date 是否在 LocalDateTime 之后
*/
private boolean isDateAfterLocalDateTime(Date date, LocalDateTime localDateTime) {
if (date == null || localDateTime == null) {
return false;
}
LocalDateTime dateAsLocalDateTime = date.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDateTime();
return dateAsLocalDateTime.isAfter(localDateTime);
}
/**
* 获取最新的工艺设计进度
*/
private ProcessDesignProgressDO getLatestProcessDesignProgress(List<Long> processDesignIds) {
if (ObjectUtil.isEmpty(processDesignIds)) {
return null;
}
LambdaQueryWrapper<ProcessDesignProgressDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(ProcessDesignProgressDO::getProcessDesignId, processDesignIds);
queryWrapper.orderByDesc(ProcessDesignProgressDO::getEndTime);
queryWrapper.last("limit 1");
return processDesignProgressMapper.selectOne(queryWrapper);
}
public Integer getSearchRlTs(LocalDateTime startDateTime) { public Integer getSearchRlTs(LocalDateTime startDateTime) {
List<ShopCalendarDO> shopCalendarDOS =shopCalendarMapper.getSearchRlTL(startDateTime); List<ShopCalendarDO> shopCalendarDOS =shopCalendarMapper.getSearchRlTL(startDateTime);
int a = shopCalendarDOS.size(); int a = shopCalendarDOS.size();

View File

@ -231,6 +231,8 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
} }
LambdaQueryWrapper<PlanSubDetailDO> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PlanSubDetailDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PlanSubDetailDO::getProjectSubId,id); lambdaQueryWrapper.eq(PlanSubDetailDO::getProjectSubId,id);
lambdaQueryWrapper.in(PlanSubDetailDO::getIsOverProcess,0,2);
lambdaQueryWrapper.eq(PlanSubDetailDO::getIsOverLab,"N");
lambdaQueryWrapper.orderByAsc(PlanSubDetailDO::getCreateTime); lambdaQueryWrapper.orderByAsc(PlanSubDetailDO::getCreateTime);
PlanSubDetailDO planSubDetailDO = planSubDetailMapper.selectOne(lambdaQueryWrapper); PlanSubDetailDO planSubDetailDO = planSubDetailMapper.selectOne(lambdaQueryWrapper);
if (ObjectUtil.isNotEmpty(planSubDetailDO)){ if (ObjectUtil.isNotEmpty(planSubDetailDO)){

View File

@ -131,7 +131,7 @@ public class PurchaseOrderMakeDetailServiceImpl implements PurchaseOrderMakeDeta
materialDO = materialMapper.selectById(pmd.getMaterialId()); materialDO = materialMapper.selectById(pmd.getMaterialId());
insertMaterialMap.put(pd.getMakeDetailId(), materialDO); insertMaterialMap.put(pd.getMakeDetailId(), materialDO);
} }
if (materialDO.getCompositionId() != null) { if (ObjectUtil.isNotEmpty(materialDO)&& ObjectUtil.isNotEmpty(materialDO.getCompositionId())) {
CompositionDO compositionDO = compositionDOHashMap.get(materialDO.getCompositionId()); CompositionDO compositionDO = compositionDOHashMap.get(materialDO.getCompositionId());
if (compositionDO == null) { if (compositionDO == null) {
compositionDO = compositionMapper.selectById(materialDO.getCompositionId()); compositionDO = compositionMapper.selectById(materialDO.getCompositionId());
@ -139,14 +139,12 @@ public class PurchaseOrderMakeDetailServiceImpl implements PurchaseOrderMakeDeta
} }
pd.setComposition(compositionDO == null ?"":compositionDO.getName()); pd.setComposition(compositionDO == null ?"":compositionDO.getName());
} }
if (ObjectUtil.isNotEmpty(materialDO)) {
pd.setBoomName(materialDO.getName()); pd.setBoomName(materialDO.getName());
pd.setMaterialId(materialDO.getId()); pd.setMaterialId(materialDO.getId());
pd.setBoomSpec(materialDO.getSpec()); pd.setBoomSpec(materialDO.getSpec());
pd.setBoomUnit(materialDO.getUnit()); pd.setBoomUnit(materialDO.getUnit());
}
}else {
throw exception(PURCHASE_ORDER_MAKE_DETAIL_MATERIAL_NOT_EXISTS);
} }
pd.setPurchaseAmount(pmd.getPurchaseAmount()); pd.setPurchaseAmount(pmd.getPurchaseAmount());
@ -186,6 +184,7 @@ public class PurchaseOrderMakeDetailServiceImpl implements PurchaseOrderMakeDeta
pmd.setPurchaseOrderNoId(purchaseOrderNoDO.getId()); pmd.setPurchaseOrderNoId(purchaseOrderNoDO.getId());
pmd.setPurchaseOrderNoDetailId(pd.getId()); pmd.setPurchaseOrderNoDetailId(pd.getId());
pmd.setOrderStatus(2); pmd.setOrderStatus(2);
pmd.setStatus(2);
pmd.setPurchaseNo(code); pmd.setPurchaseNo(code);
break; break;
} }

View File

@ -228,6 +228,26 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
throw exception(new ErrorCode(400,"BOM零件已删除不允许派工")); throw exception(new ErrorCode(400,"BOM零件已删除不允许派工"));
} }
// for (TaskDispatchDetailDO taskDispatchDetail : updateReqVO.getTaskDispatchDetails()) {
// LambdaQueryWrapper<MaterialPlanBoomDO> wrapper = new LambdaQueryWrapper<MaterialPlanBoomDO>().eq(MaterialPlanBoomDO::getBoomDetailId, taskDispatchDetail.getBomDetailId()).eq(MaterialPlanBoomDO::getProcedureId, taskDispatchDetail.getProcedureId());
// MaterialPlanBoomDO materialPlanBoomDO = materialPlanBoomMapper.selectOne(wrapper);
// if (ObjectUtil.isNotEmpty(materialPlanBoomDO)){
// if (materialPlanBoomDO.getMplanStatus()==1||materialPlanBoomDO.getMplanStatus()==2){
// if (materialPlanBoomDO.getBoomAmount().compareTo(new BigDecimal(taskDispatchDetail.getAmount()))!=0){
// ProcedureDO procedureDO = procedureMapper.selectById(taskDispatchDetail.getProcedureId());
// if (ObjectUtil.isNotEmpty(procedureDO)){
// throw exception(new ErrorCode(400,"该工序"+procedureDO.getName()+"已送审或已审批,不允许修改数量,请确认!"));
// }
// }
// if (!materialPlanBoomDO.getBoomArriveDate().isEqual(taskDispatchDetail.getEndTime())){
// ProcedureDO procedureDO = procedureMapper.selectById(taskDispatchDetail.getProcedureId());
// if (ObjectUtil.isNotEmpty(procedureDO)){
// throw exception(new ErrorCode(400,"该工序"+procedureDO.getName()+"已送审或已审批,不允许修改结束日期,请确认!"));
// }
// }
// }
// }
// }
} }
// 更新 // 更新
@ -267,7 +287,8 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
} }
if (operateTypeEnum == OperateTypeEnum.SUBMIT) { if (operateTypeEnum == OperateTypeEnum.SUBMIT) {
ArrayList<TaskDispatchDetailDO> taskDispatchDetailDOS = new ArrayList<>(); ArrayList<TaskDispatchDetailDO> taskDispatchDetailDOS = new ArrayList<>();
for (TaskDispatchDetailDO taskDispatchDetail : updateReqVO.getTaskDispatchDetails()) {
for (TaskDispatchDetailDO taskDispatchDetail : updateReqVO.getTaskDispatchDetails()) {
LambdaQueryWrapper<MaterialPlanBoomDO> wrapper = new LambdaQueryWrapper<MaterialPlanBoomDO>().eq(MaterialPlanBoomDO::getBoomDetailId, taskDispatchDetail.getBomDetailId()).eq(MaterialPlanBoomDO::getProcedureId, taskDispatchDetail.getProcedureId()); LambdaQueryWrapper<MaterialPlanBoomDO> wrapper = new LambdaQueryWrapper<MaterialPlanBoomDO>().eq(MaterialPlanBoomDO::getBoomDetailId, taskDispatchDetail.getBomDetailId()).eq(MaterialPlanBoomDO::getProcedureId, taskDispatchDetail.getProcedureId());
MaterialPlanBoomDO materialPlanBoomDO = materialPlanBoomMapper.selectOne(wrapper); MaterialPlanBoomDO materialPlanBoomDO = materialPlanBoomMapper.selectOne(wrapper);
if ("false".equals(taskDispatchDetail.getIsOutsourcing())) { if ("false".equals(taskDispatchDetail.getIsOutsourcing())) {
@ -282,6 +303,7 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
if (ObjectUtil.isEmpty(materialPlanBoomDO)) { if (ObjectUtil.isEmpty(materialPlanBoomDO)) {
taskDispatchDetailDOS.add(taskDispatchDetail); taskDispatchDetailDOS.add(taskDispatchDetail);
}else { }else {
materialPlanBoomDO.setBoomAmount(new BigDecimal(taskDispatchDetail.getAmount()));
materialPlanBoomDO.setBoomArriveDate(taskDispatchDetail.getEndTime()); materialPlanBoomDO.setBoomArriveDate(taskDispatchDetail.getEndTime());
materialPlanBoomDO.setDuEmpId(taskDispatchDetail.getOwner()); materialPlanBoomDO.setDuEmpId(taskDispatchDetail.getOwner());
materialPlanBoomMapper.updateById(materialPlanBoomDO); materialPlanBoomMapper.updateById(materialPlanBoomDO);

View File

@ -14,7 +14,7 @@
from wms_storage sto from wms_storage sto
left join wms_storage_mat mat on mat.stock_id=sto.id and mat.deleted=0 and mat.tenant_id=2 left join wms_storage_mat mat on mat.stock_id=sto.id and mat.deleted=0 and mat.tenant_id=2
left join base_material m on mat.mat_id=m.id and m.deleted=0 and m.tenant_id=2 left join base_material m on mat.mat_id=m.id and m.deleted=0 and m.tenant_id=2
where sto.stock_in_type=5 and m.material_type=5 and sto.status=4 and sto.project_no=#{projectSubId} where sto.stock_in_type=5 and sto.status=4 and sto.project_no=#{projectSubId}
</select> </select>
<select id="getList" resultType="com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO"> <select id="getList" resultType="com.chanko.yunxi.mes.module.heli.dal.dataobject.storage.StorageDO">
@ -70,7 +70,6 @@
AND m.tenant_id = 2 AND m.tenant_id = 2
WHERE WHERE
sto.stock_in_type = 5 sto.stock_in_type = 5
AND m.material_type = 5
AND sto.STATUS = 4 AND sto.STATUS = 4
AND sto.project_no = #{projectSubId} AND sto.project_no = #{projectSubId}
</select> </select>

View File

@ -1,7 +1,9 @@
package com.chanko.yunxi.mes.module.system.controller.admin.auth; package com.chanko.yunxi.mes.module.system.controller.admin.auth;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.framework.common.enums.CommonStatusEnum; import com.chanko.yunxi.mes.framework.common.enums.CommonStatusEnum;
import com.chanko.yunxi.mes.framework.common.enums.UserTypeEnum; import com.chanko.yunxi.mes.framework.common.enums.UserTypeEnum;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult; import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
@ -14,6 +16,7 @@ import com.chanko.yunxi.mes.module.system.dal.dataobject.dept.PostDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.permission.MenuDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.permission.MenuDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.permission.RoleDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.permission.RoleDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.chanko.yunxi.mes.module.system.dal.mysql.user.AdminUserMapper;
import com.chanko.yunxi.mes.module.system.enums.logger.LoginLogTypeEnum; import com.chanko.yunxi.mes.module.system.enums.logger.LoginLogTypeEnum;
import com.chanko.yunxi.mes.module.system.service.auth.AdminAuthService; import com.chanko.yunxi.mes.module.system.service.auth.AdminAuthService;
import com.chanko.yunxi.mes.module.system.service.dept.PostService; import com.chanko.yunxi.mes.module.system.service.dept.PostService;
@ -34,14 +37,18 @@ import javax.annotation.Resource;
import javax.annotation.security.PermitAll; import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid; import javax.validation.Valid;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.error;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success; import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
import static com.chanko.yunxi.mes.framework.common.util.collection.CollectionUtils.convertSet; import static com.chanko.yunxi.mes.framework.common.util.collection.CollectionUtils.convertSet;
import static com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
import static com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils.obtainAuthorization;
@Tag(name = "管理后台 - 认证") @Tag(name = "管理后台 - 认证")
@RestController @RestController
@ -66,12 +73,34 @@ public class AuthController {
private SecurityProperties securityProperties; private SecurityProperties securityProperties;
@Resource @Resource
private PostService postService; private PostService postService;
@Resource
private AdminUserMapper adminUserMapper;
@PostMapping("/login") @PostMapping("/login")
@PermitAll @PermitAll
@Operation(summary = "使用账号密码登录") @Operation(summary = "使用账号密码登录")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志 @OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<AuthLoginRespVO> login(@RequestBody @Valid AuthLoginReqVO reqVO) { public CommonResult<AuthLoginRespVO> login(@RequestBody @Valid AuthLoginReqVO reqVO) {
// if (ObjectUtil.isNotEmpty(reqVO.getUsername())&&!"admin".equals(reqVO.getUsername())){
// AdminUserDO adminUserDO = userService.getOne();
// if (ObjectUtil.isEmpty(adminUserDO)){
// LocalDateTime currentDate = LocalDateTime.now();
// LocalDateTime targetDate = LocalDateTime.of(2025, 12, 17,0,0,0);
// if (currentDate.isAfter(targetDate)) {
// return error(400,"当前账号已经过期,不允许使用");
// }
// }else{
// if ("1".equals(adminUserDO.getMobile())){
// if (ObjectUtil.isNotEmpty(adminUserDO.getCreateTime())){
// LocalDateTime currentDate = LocalDateTime.now();
// if (currentDate.isAfter(adminUserDO.getCreateTime())){
// return error(400,"当前账号已经过期,不允许使用");
// }
// }
// }
// }
// }
return success(authService.login(reqVO)); return success(authService.login(reqVO));
} }

View File

@ -1,5 +1,7 @@
package com.chanko.yunxi.mes.module.system.dal.mysql.user; package com.chanko.yunxi.mes.module.system.dal.mysql.user;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
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.framework.mybatis.core.query.LambdaQueryWrapperX; import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
@ -70,4 +72,9 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
"INNER JOIN DeptHierarchy dh ON a.dept_id = dh.id\n" + "INNER JOIN DeptHierarchy dh ON a.dept_id = dh.id\n" +
"WHERE a.status = '0';") "WHERE a.status = '0';")
List<AdminUserDO> getUserListByDeptName(@Param("name")String name); List<AdminUserDO> getUserListByDeptName(@Param("name")String name);
@InterceptorIgnore(tenantLine = "true") // 忽略租户条件
@Select("select * from system_users where username='admin' and deleted=0 ")
AdminUserDO getUserOne();
} }

View File

@ -208,4 +208,6 @@ public interface AdminUserService {
List<AdminUserDO> getList(); List<AdminUserDO> getList();
Boolean isAdministrator(); Boolean isAdministrator();
AdminUserDO getOne();
} }

View File

@ -474,6 +474,11 @@ public class AdminUserServiceImpl implements AdminUserService {
return userRoleMapper.selectCount(userRoleDOLambdaQueryWrapper)>0; return userRoleMapper.selectCount(userRoleDOLambdaQueryWrapper)>0;
} }
@Override
public AdminUserDO getOne() {
return userMapper.getUserOne();
}
/** /**
* 对密码进行加密 * 对密码进行加密
* *

View File

@ -62,3 +62,7 @@ export const exportPlan = async (params) => {
export const verification = async (id: number,type:string) => { export const verification = async (id: number,type:string) => {
return await request.get({ url: `/heli/plan/verification?id=` + id+`&type=`+type }) return await request.get({ url: `/heli/plan/verification?id=` + id+`&type=`+type })
} }
// 查询零件进程管理
export const getPartProcess = async (params) => {
return await request.get({ url: `/heli/plan/getPartProcess`, params })
}

View File

@ -78,3 +78,7 @@ export const Intersection = async (data: PlanSubDetailVO) => {
export const overlap = async (data: PlanSubDetailVO) => { export const overlap = async (data: PlanSubDetailVO) => {
return await request.post({ url: `/heli/plan-sub-detail/overlap`, data }) return await request.post({ url: `/heli/plan-sub-detail/overlap`, data })
} }
//获取子项目信息
export const getList = async (params) => {
return await request.get({ url: `/heli/plan-sub-detail/getList`, params })
}

View File

@ -19,11 +19,11 @@ const title = computed(() => appStore.getTitle)
:class="prefixCls" :class="prefixCls"
class="h-[var(--app-footer-height)] bg-[var(--app-content-bg-color)] text-center text-[var(--el-text-color-placeholder)] dark:bg-[var(--el-bg-color)]" class="h-[var(--app-footer-height)] bg-[var(--app-content-bg-color)] text-center text-[var(--el-text-color-placeholder)] dark:bg-[var(--el-bg-color)]"
> >
<el-row> <el-row>
<el-col> <el-col>
<span class="text-14px">Copyright ©上海长江云息数字科技有限公司,All Rights Reserved.</span> <span class="text-14px">Copyright ©上海云赛易数字技术有限公司,All Rights Reserved.</span>
</el-col> </el-col>
<el-col style="margin-top:10px"> <el-col style="margin-top:10px">
<span class="text-14px"> <span class="text-14px">

View File

@ -54,7 +54,7 @@
<!-- 三方登录 --> <!-- 三方登录 -->
<SSOLoginVue class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" /> <SSOLoginVue class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
</div> </div>
</Transition> </Transition>
<div <div
:class="prefixCls" :class="prefixCls"
@ -64,7 +64,7 @@
<el-row> <el-row>
<el-col> <el-col>
<span class="text-14px" <span class="text-14px"
>Copyright ©上海长江云息数字科技有限公司,All Rights Reserved.</span >Copyright ©上海云赛易数字技术有限公司,All Rights Reserved.</span
> >
</el-col> </el-col>
<el-col style="margin-top: 10px"> <el-col style="margin-top: 10px">

View File

@ -238,7 +238,7 @@
<el-table-column label="备注" min-width="180" align="center"> <el-table-column label="备注" min-width="180" align="center">
<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 || flag" v-model="row.remark" placeholder="请输入备注" /> <el-input :disabled="detailDisabled || formData.deliverStatus == 2" v-model="row.remark" placeholder="请输入备注" />
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
@ -987,7 +987,6 @@ const queryData = async (type: string, id?: number) => {
var subList = await getProjectOrderSubListByProjectOrderIdGt(saleOrderIdArr[i]); var subList = await getProjectOrderSubListByProjectOrderIdGt(saleOrderIdArr[i]);
subList.forEach((sub)=>{ subList.forEach((sub)=>{
sub.saleOrderId = saleOrderIdArr[i]; sub.saleOrderId = saleOrderIdArr[i];
sub.remark = ''
sub.saleOrderSubId = sub.id sub.saleOrderSubId = sub.id
sub.id = '' sub.id = ''
sub.saleOrderCode = sub.projectOrderCode sub.saleOrderCode = sub.projectOrderCode

View File

@ -358,7 +358,7 @@ const opearteForm = async(type) =>{
return return
} }
if(!row.materialId){ if(!row.materialId){
message.error('零件编码不能为空!') message.error('物料编码不能为空!')
loading.value = false loading.value = false
return return
} }

View File

@ -102,6 +102,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="物料编码" align="center" prop="materialName" min-width="180" > <el-table-column label="物料编码" align="center" prop="materialName" min-width="180" >
<template #header><span class="hl-table_header">*</span>物料编码</template>
<template #default="scope"> <template #default="scope">
<el-input v-model="scope.row.materialName" disabled> <el-input v-model="scope.row.materialName" disabled>
@ -450,6 +451,11 @@ const opearteForm = async(type) =>{
loading.value = false loading.value = false
return return
} }
if(!row.materialId){
message.error('物料编码不能为空!')
loading.value = false
return
}
if( !sets.has(row.projectId) || sets == null ){ if( !sets.has(row.projectId) || sets == null ){
sets.add(row.projectId) sets.add(row.projectId)
} }

View File

@ -106,7 +106,7 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" border show-summary :summary-method="getSummaries">
<el-table-column <el-table-column
label="启动日期" label="启动日期"
align="center" align="center"
@ -116,7 +116,7 @@
/> />
<el-table-column label="项目编号" align="center" prop="code" width="200px"/> <el-table-column label="项目编号" align="center" prop="code" width="200px"/>
<el-table-column label="合同编码" align="center" prop="contractNo" width="200px"/> <el-table-column label="合同编码" align="center" prop="contractNo" width="200px"/>
<el-table-column label="项目名称" align="center" prop="projectName" width="180"/> <el-table-column label="项目名称" align="center" prop="projectName" width="200px"/>
<el-table-column label="客户名称" align="center" prop="cgKhname" width="200px"/> <el-table-column label="客户名称" align="center" prop="cgKhname" width="200px"/>
<el-table-column <el-table-column
label="预计回款日期" label="预计回款日期"
@ -127,6 +127,7 @@
/> />
<el-table-column label="应收金额(元)" align="center" prop="cgYs" width="160px"/> <el-table-column label="应收金额(元)" align="center" prop="cgYs" width="160px"/>
<el-table-column label="已收金额(元)" align="center" prop="cgYishou" width="160px"/> <el-table-column label="已收金额(元)" align="center" prop="cgYishou" width="160px"/>
<el-table-column label="剩余金额" align="center" prop="remainingYishou" width="160px"/>
<el-table-column label="已收款比例" align="center" width="180px"> <el-table-column label="已收款比例" align="center" width="180px">
<template #default="scope"> <template #default="scope">
{{ {{
@ -137,6 +138,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="已开票金额(元)" align="center" prop="amount" width="160px"/> <el-table-column label="已开票金额(元)" align="center" prop="amount" width="160px"/>
<el-table-column label="剩余开票金额" align="center" prop="remainingAmount" width="160px"/>
<el-table-column label="已开票比例" align="center" width="160px"> <el-table-column label="已开票比例" align="center" width="160px">
<template #default="scope"> <template #default="scope">
{{ {{
@ -205,6 +207,7 @@ import OrderYsForm from './OrderYsForm.vue'
import {DICT_TYPE, getIntDictOptions} from "@/utils/dict"; import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
import Invoivce from "@/views/heli/orderys/invoivce.vue"; import Invoivce from "@/views/heli/orderys/invoivce.vue";
import {ref} from "vue"; import {ref} from "vue";
import {ElTable} from "element-plus";
defineOptions({ name: 'orderys' }) defineOptions({ name: 'orderys' })
@ -277,7 +280,72 @@ const handleDelete = async (id: number) => {
await getList() await getList()
} catch {} } catch {}
} }
const getSummaries = (param: SummaryMethodProps) => {
const summaryField = ["cgYishou","remainingYishou","amount","remainingAmount"];
const { columns, data } = param;
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (!summaryField.includes(column.property)) {
sums[index] = '';
return;
}
const values = data.map(item => Number(item[column.property]));
if (!values.every(value => isNaN(value))) {
sums[index] = values.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return floatAdd(prev, curr);
} else {
return prev;
}
}, 0);
const thousandsField = [];
if (thousandsField.includes(column.property)) {
sums[index] = thousandsFormat(sums[index]);
}
} else {
sums[index] = '';
}
});
// const sumValue = computed(() => {
// return list.value.reduce((sum, item) => sum + item.quantityLent, 0);
// });
// const sums = ['','','','','','','','',sumValue];
return sums;
}
const floatAdd = (a, b) => {
var c, d, e;
if (undefined === a || null === a || "" === a || isNaN(a)) { a = 0; }
if (undefined === b || null === b || "" === b || isNaN(b)) { b = 0; }
try {
c = a.toString().split(".")[1].length;
} catch (f) {
c = 0;
}
try {
d = b.toString().split(".")[1].length;
} catch (f) {
d = 0;
}
e = Math.pow(10, Math.max(c, d));
return (floatMul(a, e) + floatMul(b, e)) / e;
};
const floatMul = (a, b) => {
var c = 0,
d = a.toString(),
e = b.toString();
try {
c += d.split(".")[1].length;
} catch (f) {}
try {
c += e.split(".")[1].length;
} catch (f) {}
return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
}
/** 导出按钮操作 */ /** 导出按钮操作 */
const handleExport = async () => { const handleExport = async () => {
try { try {

View File

@ -0,0 +1,103 @@
<template>
<el-card class="hl-card" style="position: relative">
<template #header>
<span>详情页</span>
</template>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">子项目信息</span>
<label style="display: inline-flex; align-items: center; margin-left: 40px;">
<el-checkbox class="large-checkbox" v-model="formData.flag" style="order: 1;" />
<span style="order: 2; margin-left: 10px;">不显示已完成</span>
</label>
</template>
</el-card>
<ContentWrap>
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" height="300" border :cell-class-name="cellClassName">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" />
<el-table-column label="任务" align="center" prop="designTask" />
<el-table-column label="预计开始时间" align="center" prop="outsourcingTasks" :formatter="dateFormatter2" />
<el-table-column label="预计结束时间" align="center" prop="processingTask" :formatter="dateFormatter2" />
<el-table-column label="工单状态" align="center" prop="processInspection" />
<el-table-column label="生产进度" align="center" prop="assemblyTask" />
</el-table>
</ContentWrap>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">工单信息</span>
</template>
</el-card>
<ContentWrap v-if="type=='设计'">
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" height="500" border :cell-class-name="cellClassName">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" />
<el-table-column label="任务" align="center" prop="designTask" />
<el-table-column label="预计开始时间" align="center" prop="outsourcingTasks" />
<el-table-column label="预计结束时间" align="center" prop="processingTask" />
<el-table-column label="工单状态" align="center" prop="processInspection" />
<el-table-column label="生产进度" align="center" prop="assemblyTask" />
</el-table>
</ContentWrap>
<div class="text-center hl-footer">
<el-button @click="() => router.back()" size="large"> </el-button>
</div>
</el-card>
</template>
<script setup lang="ts">
import {inject, ref} from 'vue'
import {dateFormatter2} from "@/utils/formatTime";
import * as PlansubdetailApi from '@/api/heli/plansubdetail'
const loading = ref(false) //
const { t } = useI18n() //
const message = useMessage() //
const { query } = useRoute()
const router = useRouter()
const reload = inject('reload')
const formLoading = ref(false) // 12
const list = ref([]) //
const type = ref('sheji')
const formData = reactive({
id:undefined,
projectSubId:undefined,
flag:true
})
//
onMounted(async () => {
console.log(query)
formData.projectSubId = query.projectSubId
})
/** 查询设计列表 */
const getList = async () => {
loading.value = true
try {
const data = await PlansubdetailApi.getPartProcess(formData)
list.value = data
} finally {
loading.value = false
}
}
</script>
<style>
.hl-card .alter-class {
position: relative;
border: solid 1px orange;
outline: solid 1px orange;
}
.large-checkbox {
transform: scale(1.5); /* 方法1使用scale放大 */
/* 或者 */
/* 方法2通过调整字体大小 */
/* font-size: 18px; */
}
</style>

View File

@ -0,0 +1,253 @@
<template>
<el-card class="hl-card">
<template #header>
<span>零件进程管理</span>
</template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px">
<el-form-item label="项目编号" prop="projectCode">
<el-input v-model="queryParams.projectCode" placeholder="项目编号" clearable @keyup.enter="handleQuery" class="!w-250px" />
</el-form-item>
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="queryParams.projectName" placeholder="项目名称" clearable @keyup.enter="handleQuery" class="!w-250px" />
</el-form-item>
<el-form-item label="子项目名称" prop="projectSubName">
<el-input v-model="queryParams.projectSubName" placeholder="请输入子项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input
v-model="queryParams.customerName"
class="!w-240px"
clearable
placeholder="请输入客户名称"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item style="margin-left:15px">
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<el-form>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">项目信息</span>
</template>
<el-row :gutter="16">
<el-col :span="8">
<el-form-item label="项目名称" prop="projectName" label-width="150">
<el-input class="!w-265px" placeholder="项目名称" v-model="formData.projectName" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目结束日期" prop="projectEndTime">
<el-date-picker
disabled class="!w-265px" v-model="formData.projectEndTime" type="date" value-format="x"
placeholder="项目结束日期" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="项目进度" prop="projectProgress">
<el-input class="!w-265px" placeholder="项目进度" v-model="formData.projectProgress" disabled />
</el-form-item>
</el-col>
</el-row>
<!-- 第二行 -->
<el-row :gutter="16">
<el-col :span="8">
<el-form-item label="工艺负责人" prop="craftOwnerName" label-width="150">
<el-input class="!w-265px" placeholder="工艺负责人" v-model="formData.craftOwnerName" disabled />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工艺结束日期" prop="craftEndDate">
<el-date-picker
disabled class="!w-265px" v-model="formData.craftEndDate" type="date" value-format="x"
placeholder="工艺结束日期" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工艺进度" prop="processProgress">
<el-input class="!w-265px" placeholder="工艺进度" v-model="formData.processProgress" disabled />
</el-form-item>
</el-col>
</el-row>
</el-card>
</el-form>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">子项目信息</span>
</template>
</el-card>
<!-- 列表 -->
<ContentWrap >
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" height="500" border :cell-class-name="cellClassName">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="项目名称" align="center" prop="projectName" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" />
<el-table-column label="设计任务" align="center" prop="designTask" />
<el-table-column label="外协任务" align="center" prop="outsourcingTasks" />
<el-table-column label="加工任务" align="center" prop="processingTask" />
<el-table-column label="过程检任务" align="center" prop="processInspection" />
<el-table-column label="装配任务" align="center" prop="assemblyTask" />
<el-table-column fixed="right" label="操作" align="center" width="190">
<template #default="scope">
<el-row>
<el-col>
<el-button link type="primary" @click="openForm(scope.row)">
详情
</el-button>
</el-col>
</el-row>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" />
</ContentWrap>
</el-card>
</template>
<script setup lang="ts">
import {ref} from "vue";
import routeParamsCache from "@/utils/routeParamsCache";
import * as PlanApi from '@/api/heli/plan'
defineOptions({ name: 'partprocess' })
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const insert= ref()
const loading = ref(false) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
planNo: undefined,
projectCode: undefined,
customerName: undefined,
projectName: undefined,
businessManName: undefined,
businessLine: undefined,
property: undefined,
projectOwner: undefined,
projectSubName: undefined,
})
const formData = ref({
projectName: undefined,
projectTime: undefined,
endTime:undefined,
craftOwnerName:undefined,
projectEndTime:undefined,
projectProgress:undefined,
craftEndDate:undefined,
processProgress:undefined
})
const queryFormRef = ref() //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await PlanApi.getPartProcess(queryParams)
list.value = data.list.list
total.value = data.list.total
formData.value=data
} finally {
loading.value = false
}
}
const cellClassName = ({ row,column }) => {
if (column.label === '设计任务' && row.designTaskFlag) {
return row.designTaskFlag === '1' ? 'warning-row1' : 'warning-row2';
}
if (column.label === '外协任务' && row.outsourcingTasksFlag) {
return row.outsourcingTasksFlag === '1' ? 'warning-row1' : 'warning-row2';
}
if (column.label === '加工任务' && row.processingTaskFlag) {
return row.processingTaskFlag === '1' ? 'warning-row1' : 'warning-row2';
}
if (column.label === '过程检任务' && row.processInspectionFlag) {
return row.processInspectionFlag === '1' ? 'warning-row1' : 'warning-row2';
}
if (column.label === '装配任务' && row.assemblyTaskFlag) {
console.log(row.assemblyTaskFlag)
console.log(row.assemblyTaskFlag === '1')
console.log(row.assemblyTaskFlag === '1' ? 'warning-row1' : 'warning-row2')
return row.assemblyTaskFlag === '1' ? 'warning-row1' : 'warning-row2';
}
// return '';
}
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const openForm = (row) => {
router.push({ path: '/production/partprocessdetail', query: { ...row} })
}
const userInit = ref()
const route = useRoute()
const routeValue = ref('')
onMounted(async () => {
let params = routeParamsCache.get(route.path);
routeValue.value = route.path
if (params ) {
Object.assign(queryParams, params);
}
routeValue.value = route.path
// await getList()
});
onBeforeUnmount(() => {
console.log(route.path)
const plainParams = JSON.parse(JSON.stringify(queryParams));
routeParamsCache.set(routeValue.value, plainParams);
});
window.addEventListener('beforeunload', () => {
const plainParams = JSON.parse(JSON.stringify(queryParams));
routeParamsCache.set(routeValue.value, plainParams);
});
</script>
<style >
.el-dropdown-link {
cursor: pointer;
margin: 5px;
color: var(--el-color-primary);
display: flex;
align-items: center;
}
.warning-row1 {
background-color:#F08080 !important;
}
.warning-row2 {
background-color: #1E90FF !important; /* 道奇蓝 */
}
</style>

View File

@ -124,10 +124,40 @@
<el-table-column label="材质" prop="compositionName" min-width="180"/> <el-table-column label="材质" prop="compositionName" min-width="180"/>
<el-table-column label="规格型号" prop="spec" min-width="180"/> <el-table-column label="规格型号" prop="spec" min-width="180"/>
<el-table-column label="数量" prop="boomAmounts" min-width="145"/> <el-table-column label="数量" prop="boomAmounts" min-width="145"/>
<el-table-column v-if="activeIndex == 'first'" label="下料" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="泡沫" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '泡沫'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span class="left" v-if="!item.reportTime">{{ item.sort }}</span>
<span class="right">
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行 -->
<div class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
<span class="right">
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="下料1" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '下料'" class="custom-cell"> <div v-if="item.procedureName === '下料1'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span class="left" v-if="!item.reportTime">{{ item.sort }}</span> <span class="left" v-if="!item.reportTime">{{ item.sort }}</span>
@ -154,6 +184,36 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="下料2" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '下料2'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span class="left" v-if="!item.reportTime">{{ item.sort }}</span>
<span class="right">
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行 -->
<div class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
<span class="right">
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="电焊" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="电焊" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
@ -186,6 +246,102 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="车床1" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '车床1'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="车床2" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '车床2'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="定制" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '定制'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="编程" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="编程" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
@ -218,10 +374,138 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="开粗" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="磨床1" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '磨床1'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="磨床2" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '磨床2'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="线切割1" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '线切割1'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="线切割2" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '线切割2'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="开粗1" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '开粗'" class="custom-cell"> <div v-if="item.procedureName === '开粗1'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
@ -250,10 +534,42 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="铣床" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="开粗2" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '开粗2'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="铣床1" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '铣床'" class="custom-cell"> <div v-if="item.procedureName === '铣床1'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
@ -282,10 +598,43 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="车床" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="铣床2" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '铣床2'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="热处理1" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '车床'" class="custom-cell"> <div v-if="item.procedureName === '热处理1'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
@ -314,70 +663,70 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="热处理" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="热处理2" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '热处理'" class="custom-cell"> <div v-if="item.procedureName === '热处理2'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort --> <span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span> </span>
<span> <span>
<!-- isOutsourcing 图片 --> <!-- isOutsourcing 图片 -->
<img <img
v-if="item.isOutsourcing === 'Y'" v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png" src="/src/assets/imgs/out.png"
class="status-icon" class="status-icon"
/> />
<!-- checkYn 图片 --> <!-- checkYn 图片 -->
<img <img
v-if="item.checkYn === 0" v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png" src="/src/assets/imgs/checkstatusss.png"
class="status-icon" class="status-icon"
/> />
</span> </span>
</div> </div>
<!-- 第二行仅当 reportTime 有值时显示 --> <!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row"> <div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span> <span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div> </div>
</div> </div>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="磨床" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="热处理3" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '磨床'" class="custom-cell"> <div v-if="item.procedureName === '热处理3'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort --> <span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span> </span>
<span> <span>
<!-- isOutsourcing 图片 --> <!-- isOutsourcing 图片 -->
<img <img
v-if="item.isOutsourcing === 'Y'" v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png" src="/src/assets/imgs/out.png"
class="status-icon" class="status-icon"
/> />
<!-- checkYn 图片 --> <!-- checkYn 图片 -->
<img <img
v-if="item.checkYn === 0" v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png" src="/src/assets/imgs/checkstatusss.png"
class="status-icon" class="status-icon"
/> />
</span> </span>
</div> </div>
<!-- 第二行仅当 reportTime 有值时显示 --> <!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row"> <div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span> <span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div> </div>
</div> </div>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="数控1" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="数控1" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
@ -442,10 +791,74 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="火花" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="数控3" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '数控3'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="电极" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '电极'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="火花1" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '火花'" class="custom-cell"> <div v-if="item.procedureName === '火花1'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
@ -474,38 +887,38 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="线切割" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="火花2" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '线切割'" class="custom-cell"> <div v-if="item.procedureName === '火花2'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort --> <span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span> </span>
<span> <span>
<!-- isOutsourcing 图片 --> <!-- isOutsourcing 图片 -->
<img <img
v-if="item.isOutsourcing === 'Y'" v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png" src="/src/assets/imgs/out.png"
class="status-icon" class="status-icon"
/> />
<!-- checkYn 图片 --> <!-- checkYn 图片 -->
<img <img
v-if="item.checkYn === 0" v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png" src="/src/assets/imgs/checkstatusss.png"
class="status-icon" class="status-icon"
/> />
</span> </span>
</div> </div>
<!-- 第二行仅当 reportTime 有值时显示 --> <!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row"> <div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span> <span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div> </div>
</div> </div>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="刻字" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="刻字" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
@ -538,10 +951,10 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="网格" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="网格1" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '网格'" class="custom-cell"> <div v-if="item.procedureName === '网格1'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
@ -570,10 +983,42 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="深孔钻" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="网格2" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '网格2'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="深孔钻1" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '深孔钻'" class="custom-cell"> <div v-if="item.procedureName === '深孔钻1'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
@ -602,10 +1047,42 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="钻孔" min-width="145"> <el-table-column v-if="activeIndex == 'first'" label="深孔钻2" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '深孔钻2'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="钻孔1" min-width="145">
<template #default="{ row }"> <template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index"> <template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '钻孔'" class="custom-cell"> <div v-if="item.procedureName === '钻孔1'" class="custom-cell">
<!-- 第一行 --> <!-- 第一行 -->
<div class="first-row"> <div class="first-row">
<span > <span >
@ -634,7 +1111,38 @@
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="钻孔2" min-width="145">
<template #default="{ row }">
<template v-for="(item, index) in row.taskDispatchDetailDOList" :key="index">
<div v-if="item.procedureName === '钻孔2'" class="custom-cell">
<!-- 第一行 -->
<div class="first-row">
<span >
<span v-if="!item.reportTime">{{ item.sort }}</span> <!-- 仅当 reportTime 为空时显示 sort -->
</span>
<span>
<!-- isOutsourcing 图片 -->
<img
v-if="item.isOutsourcing === 'Y'"
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
<img
v-if="item.checkYn === 0"
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
</span>
</div>
<!-- 第二行仅当 reportTime 有值时显示 -->
<div v-if="item.reportTime" class="second-row">
<span class="left">{{ formatLongToDate(item.reportTime) }}</span>
</div>
</div>
</template>
</template>
</el-table-column>
<!--标准件--> <!--标准件-->
<!--加工件--> <!--加工件-->

View File

@ -189,7 +189,7 @@ class="!w-250px" v-model="formData.businessMan"
class="!w-250px" class="!w-250px"
:class="{ 'alter-class': fieldHasAlter('projectEndTime') }" :class="{ 'alter-class': fieldHasAlter('projectEndTime') }"
v-model="formData.projectEndTime" type="date" value-format="x" v-model="formData.projectEndTime" type="date" value-format="x"
placeholder="选择项目结束日期" :disabled="detailDisabled || priceDisabled" placeholder="选择项目结束日期" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3"
@change="changeTime"/> @change="changeTime"/>
<span <span
style="position: absolute; left: 0; top: 30px" style="position: absolute; left: 0; top: 30px"
@ -244,7 +244,7 @@ class="!w-250px" v-model="formData.fiveFuKuanTime"
<el-col :span="24"> <el-col :span="24">
<el-form-item label="可引用的原有技术" prop="referenceTechnology"> <el-form-item label="可引用的原有技术" prop="referenceTechnology">
<el-input <el-input
class="!w-703px" :disabled="detailDisabled || priceDisabled" class="!w-703px" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3"
v-model="formData.referenceTechnology" placeholder="请输入可引用的原有技术" v-model="formData.referenceTechnology" placeholder="请输入可引用的原有技术"
:class="{ 'alter-class': fieldHasAlter('referenceTechnology') }" /> :class="{ 'alter-class': fieldHasAlter('referenceTechnology') }" />
</el-form-item> </el-form-item>
@ -265,7 +265,7 @@ class="!w-703px" :disabled="detailDisabled || priceDisabled"
<el-form-item label="性质" prop="property"> <el-form-item label="性质" prop="property">
<el-select <el-select
class="!w-250px" :class="{ 'alter-class': fieldHasAlter('property') }" class="!w-250px" :class="{ 'alter-class': fieldHasAlter('property') }"
:disabled="detailDisabled || priceDisabled" v-model="formData.property" placeholder="请选择性质"> :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3" v-model="formData.property" placeholder="请选择性质">
<el-option <el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)"
:key="dict.value" :label="dict.label" :value="dict.value" /> :key="dict.value" :label="dict.label" :value="dict.value" />
@ -300,7 +300,7 @@ class="!w-703px" :disabled="detailDisabled || priceDisabled"
<el-col :span="24"> <el-col :span="24">
<el-form-item label="是否有价格" prop="hasPrice"> <el-form-item label="是否有价格" prop="hasPrice">
<el-radio-group <el-radio-group
v-model="formData.hasPrice" :disabled="detailDisabled || priceDisabled" v-model="formData.hasPrice" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3"
:class="{ 'alter-class': fieldHasAlter('hasPrice') }"> :class="{ 'alter-class': fieldHasAlter('hasPrice') }">
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
@ -375,7 +375,7 @@ v-model="formData.sixFuKuan"
<el-col :span="24"> <el-col :span="24">
<el-form-item label="是否紧急" prop="isUrgency"> <el-form-item label="是否紧急" prop="isUrgency">
<el-radio-group <el-radio-group
v-model="formData.isUrgency" :disabled="detailDisabled || priceDisabled" v-model="formData.isUrgency" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3"
:class="{ 'alter-class': fieldHasAlter('isUrgency') }"> :class="{ 'alter-class': fieldHasAlter('isUrgency') }">
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
@ -399,7 +399,7 @@ v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
<el-col :span="24"> <el-col :span="24">
<el-form-item label="合同号" prop="contractNo"> <el-form-item label="合同号" prop="contractNo">
<el-input <el-input
class="!w-250px" :disabled="detailDisabled || priceDisabled" class="!w-250px" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3"
v-model="formData.contractNo" placeholder="请输入合同号" /> v-model="formData.contractNo" placeholder="请输入合同号" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -486,7 +486,7 @@ v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
<el-col :span="12"> <el-col :span="12">
<el-form-item label="检验要求" prop="qualityRequirement"> <el-form-item label="检验要求" prop="qualityRequirement">
<el-input <el-input
class="!w-703px" :disabled="detailDisabled || priceDisabled " type="textarea" class="!w-703px" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3" type="textarea"
v-model="formData.qualityRequirement" placeholder="请输入检验要求" show-word-limit v-model="formData.qualityRequirement" placeholder="请输入检验要求" show-word-limit
maxlength="200" :class="{ 'alter-class': fieldHasAlter('qualityRequirement') }" /> maxlength="200" :class="{ 'alter-class': fieldHasAlter('qualityRequirement') }" />
</el-form-item> </el-form-item>
@ -494,7 +494,7 @@ class="!w-703px" :disabled="detailDisabled || priceDisabled " type="textarea"
<el-col :span="12"> <el-col :span="12">
<el-form-item label="备注" prop="remark" :disabled="detailDisabled"> <el-form-item label="备注" prop="remark" :disabled="detailDisabled">
<el-input <el-input
class="!w-703px" :disabled="detailDisabled || priceDisabled" type="textarea" class="!w-703px" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3" type="textarea"
v-model="formData.remark" placeholder="请输入检验备注" show-word-limit maxlength="200" v-model="formData.remark" placeholder="请输入检验备注" show-word-limit maxlength="200"
:class="{ 'alter-class': fieldHasAlter('remark') }" /> :class="{ 'alter-class': fieldHasAlter('remark') }" />
</el-form-item> </el-form-item>
@ -509,7 +509,7 @@ class="!w-703px" :disabled="detailDisabled || priceDisabled" type="textarea"
<el-col :span="6"> <el-col :span="6">
<el-form-item label="有无合同" prop="hasContract"> <el-form-item label="有无合同" prop="hasContract">
<el-radio-group <el-radio-group
:disabled="detailDisabled || priceDisabled" v-model="formData.hasContract" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3" v-model="formData.hasContract"
:class="{ 'alter-class': fieldHasAlter('hasContract') }"> :class="{ 'alter-class': fieldHasAlter('hasContract') }">
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
@ -522,7 +522,7 @@ v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
<el-col :span="6"> <el-col :span="6">
<el-form-item label="有无技术协议" prop="hasTechnologyProtocol"> <el-form-item label="有无技术协议" prop="hasTechnologyProtocol">
<el-radio-group <el-radio-group
:disabled="detailDisabled || priceDisabled" v-model="formData.hasTechnologyProtocol" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3" v-model="formData.hasTechnologyProtocol"
:class="{ 'alter-class': fieldHasAlter('hasTechnologyProtocol') }"> :class="{ 'alter-class': fieldHasAlter('hasTechnologyProtocol') }">
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
@ -535,7 +535,7 @@ v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
<el-col :span="5"> <el-col :span="5">
<el-form-item label="有无图纸/数模" prop="hasBlueprint"> <el-form-item label="有无图纸/数模" prop="hasBlueprint">
<el-radio-group <el-radio-group
:disabled="detailDisabled || priceDisabled" v-model="formData.hasBlueprint" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3" v-model="formData.hasBlueprint"
:class="{ 'alter-class': fieldHasAlter('hasBlueprint') }"> :class="{ 'alter-class': fieldHasAlter('hasBlueprint') }">
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
@ -549,7 +549,7 @@ v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
<el-form-item label="" label-width="0" prop="blueprintRemark"> <el-form-item label="" label-width="0" prop="blueprintRemark">
<el-input <el-input
v-model="formData.blueprintRemark" placeholder="请输入图纸/数模说明" :disabled=" v-model="formData.blueprintRemark" placeholder="请输入图纸/数模说明" :disabled="
detailDisabled || (formData.hasBlueprint == 0 && (formData.blueprintRemark = '')) || priceDisabled detailDisabled || (formData.hasBlueprint == 0 && (formData.blueprintRemark = '')) || priceDisabled || formData.deliveryStatus == 3
" :class="{ 'alter-class': fieldHasAlter('blueprintRemark') }" /> " :class="{ 'alter-class': fieldHasAlter('blueprintRemark') }" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -562,7 +562,7 @@ v-model="formData.blueprintRemark" placeholder="请输入图纸/数模说明" :d
<el-row> <el-row>
<el-col> <el-col>
<el-card class="hl-incard"> <el-card class="hl-incard">
<el-col v-if="'update,create,alter'.indexOf(query.active) > -1"> <el-col v-if="'update,create,alter'.indexOf(query.active) > -1&& formData.deliveryStatus != 3">
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增 <el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增
</el-button> </el-button>
</el-col> </el-col>
@ -621,7 +621,7 @@ v-model="row.deviceModel"
:prop="`${$index}.amount`" :rules="subFormRules.amount" :prop="`${$index}.amount`" :rules="subFormRules.amount"
class="mb-0px!"> class="mb-0px!">
<el-input-number <el-input-number
style="width: 100%" :disabled="auditDisabled&&(detailDisabled || priceDisabled)" style="width: 100%" :disabled="auditDisabled&&(detailDisabled || priceDisabled) || formData.deliveryStatus == 3"
v-model="row.amount" placeholder="请输入数量" :min="0" :precision="0" v-model="row.amount" placeholder="请输入数量" :min="0" :precision="0"
:class="{ 'alter-class': fieldHasAlterInRow('amount', row) }" /> :class="{ 'alter-class': fieldHasAlterInRow('amount', row) }" />
</el-form-item> </el-form-item>
@ -634,7 +634,7 @@ style="width: 100%" :disabled="auditDisabled&&(detailDisabled || priceDisabled)"
:prop="`${$index}.unit`" :rules="subFormRules.unit" :prop="`${$index}.unit`" :rules="subFormRules.unit"
class="mb-0px!"> class="mb-0px!">
<el-select <el-select
:disabled="detailDisabled || priceDisabled" v-model="row.unit" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3" v-model="row.unit"
placeholder="请选择单位" placeholder="请选择单位"
:class="{ 'alter-class': fieldHasAlterInRow('unit', row) }"> :class="{ 'alter-class': fieldHasAlterInRow('unit', row) }">
<el-option <el-option
@ -653,7 +653,7 @@ style="width: 100%" :disabled="auditDisabled&&(detailDisabled || priceDisabled)"
<CompositionSelect <CompositionSelect
v-model="row.compositionId" v-model="row.compositionId"
@update:new-value="handleSelectedcomposition($index, $event)" @update:new-value="handleSelectedcomposition($index, $event)"
:disabled="detailDisabled || priceDisabled" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3"
:class="{ 'alter-class': fieldHasAlterInRow('compositionId', row) }" /> :class="{ 'alter-class': fieldHasAlterInRow('compositionId', row) }" />
</el-form-item> </el-form-item>
</template> </template>
@ -664,7 +664,7 @@ v-model="row.compositionId"
:prop="`${$index}.remark`" :rules="subFormRules.remark" :prop="`${$index}.remark`" :rules="subFormRules.remark"
class="mb-0px!"> class="mb-0px!">
<el-input <el-input
:disabled="detailDisabled || priceDisabled" v-model="row.remark" :disabled="detailDisabled || priceDisabled || formData.deliveryStatus == 3" v-model="row.remark"
placeholder="请输入备注" placeholder="请输入备注"
:class="{ 'alter-class': fieldHasAlterInRow('remark', row) }" /> :class="{ 'alter-class': fieldHasAlterInRow('remark', row) }" />
</el-form-item> </el-form-item>
@ -673,7 +673,7 @@ v-model="row.compositionId"
<el-table-column label="操作" align="center" width="150"> <el-table-column label="操作" align="center" width="150">
<template #default="scope"> <template #default="scope">
<el-button <el-button
v-if="'update,create,alter'.indexOf(query.active) > -1" v-if="'update,create,alter'.indexOf(query.active) > -1 && formData.deliveryStatus != 3"
link type="danger" size="small" link type="danger" size="small"
@click.prevent="onDeleteItem(scope.$index)"> @click.prevent="onDeleteItem(scope.$index)">
删除 删除

View File

@ -146,9 +146,9 @@ ref="multipleTableRef"
> >
质保金 质保金
</el-button> </el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)" v-if="(scope.row.orderStatus == 4 && scope.row.hasAlter == 0) ||scope.row.orderStatus == 3 "> <!-- <el-button link type="danger" @click="handleDelete(scope.row.id)" v-if="(scope.row.orderStatus == 4 && scope.row.hasAlter == 0) ||scope.row.orderStatus == 3 ">-->
删除 <!-- 删除-->
</el-button> <!-- </el-button>-->
<!-- <el-button link type="primary" @click="openDetail('price',scope.row.id)" v-if="scope.row.orderStatus!=4&&scope.row.hasPrice==1">--> <!-- <el-button link type="primary" @click="openDetail('price',scope.row.id)" v-if="scope.row.orderStatus!=4&&scope.row.hasPrice==1">-->
<!-- 录入价格--> <!-- 录入价格-->
<!-- </el-button>--> <!-- </el-button>-->
@ -168,7 +168,7 @@ ref="multipleTableRef"
打印开发项目启动单 打印开发项目启动单
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item v-if="scope.row.orderStatus == 32 && scope.row.deliveryStatus != 3" command="alter">订单变更</el-dropdown-item> <el-dropdown-item v-if="scope.row.orderStatus == 32 " command="alter">订单变更</el-dropdown-item>
<el-dropdown-item command="viewArchive">查看归档日志</el-dropdown-item> <el-dropdown-item command="viewArchive">查看归档日志</el-dropdown-item>
<el-dropdown-item v-if="scope.row.orderStatus == 32 && scope.row.deliveryStatus != 3" command="delivery">去发货</el-dropdown-item> <el-dropdown-item v-if="scope.row.orderStatus == 32 && scope.row.deliveryStatus != 3" command="delivery">去发货</el-dropdown-item>
<!-- <el-dropdown-item v-if="scope.row.deliveryStatus == 3" command="trialReport">试模报告</el-dropdown-item>--> <!-- <el-dropdown-item v-if="scope.row.deliveryStatus == 3" command="trialReport">试模报告</el-dropdown-item>-->

View File

@ -1,7 +1,7 @@
<template> <template>
<el-card class="hl-card" style="position: relative"> <el-card class="hl-card" style="position: relative">
<template #header> <template #header>
<span>编辑</span> <span>详情</span>
</template> </template>
<el-form ref="formRef" :model="formData" label-width="160px" v-loading="formLoading"><!-- :rules="formRules" --> <el-form ref="formRef" :model="formData" label-width="160px" v-loading="formLoading"><!-- :rules="formRules" -->
<el-card class="hl-card-info"> <el-card class="hl-card-info">

View File

@ -838,7 +838,8 @@ const getList1 = async (arrMat) => {
const getProject = async (pro,scope) => { const getProject = async (pro,scope) => {
formData.value.matItemDOList.forEach( formData.value.matItemDOList.forEach(
(item) =>{ (item) =>{
if(item.matId == scope.value.row.matId && item.whId == scope.value.row.whId && item.rgId == scope.value.row.rgId && item.pnId == scope.value.row.pnId){
if(item.matId == scope.row.matId && item.whId == scope.row.whId && item.rgId == scope.row.rgId && item.pnId == scope.row.pnId){
item.projectNo = pro.projectSubId item.projectNo = pro.projectSubId
item.projectSubName = pro.projectSubName item.projectSubName = pro.projectSubName
} }