发货单打印还原
This commit is contained in:
parent
ed4f521faa
commit
edee20587b
@ -76,6 +76,6 @@ public class PlanSubDetailPageReqVO extends PageParam {
|
||||
private String customerBrief;
|
||||
private String projectName;
|
||||
private String planNo;
|
||||
|
||||
private Boolean statusflag;
|
||||
|
||||
}
|
||||
|
||||
@ -292,4 +292,11 @@ public class TaskDispatchController {
|
||||
public CommonResult<PageResult<TaskDispatchDetailDO>> taskPage(@Valid TaskPlanJDBaoBiaoPageReqVO pageReqVO) {
|
||||
return success(taskDispatchService.taskPage(pageReqVO));
|
||||
}
|
||||
@GetMapping("/task-dispatch-detail/pagexl")
|
||||
@Operation(summary = "小程序获得派工明细分页")
|
||||
@PreAuthorize("@ss.hasPermission('heli:task-dispatch:query')")
|
||||
public CommonResult<PageResult<TaskDispatchDetailDO>> getTaskDispatchPageDetailXl(@Valid TaskDispatchDetailPageReqVO pageReqVO) {
|
||||
PageResult<TaskDispatchDetailDO> pageResult = taskDispatchService.getTaskDispatchPageDetailXl(pageReqVO);
|
||||
return success(pageResult);
|
||||
}
|
||||
}
|
||||
|
||||
@ -105,8 +105,6 @@ public class TaskDispatchDetailDO extends BaseDO {
|
||||
private Integer planStatus;
|
||||
private Integer isReport;
|
||||
|
||||
private Integer inReportProcess;
|
||||
private String returnRemark;
|
||||
|
||||
/**
|
||||
* 工序状态 默认 已提交 已完成 0 1 2
|
||||
@ -115,6 +113,22 @@ public class TaskDispatchDetailDO extends BaseDO {
|
||||
private Integer reportProcess;
|
||||
private String matPlanProcess;
|
||||
|
||||
/**
|
||||
* 下料报工进度0 未报工 1 已报工 2 报工完成
|
||||
*/
|
||||
private Integer inReportProcess;
|
||||
/**
|
||||
* 下料是否报工(Y\N)
|
||||
*/
|
||||
private String isInProcess;
|
||||
/**
|
||||
* 返工原因
|
||||
*/
|
||||
private String returnRemark;
|
||||
/**
|
||||
* 返工原因
|
||||
*/
|
||||
private String returnWRematk;
|
||||
@TableField(exist = false)
|
||||
private String projectName;
|
||||
|
||||
@ -282,4 +296,16 @@ public class TaskDispatchDetailDO extends BaseDO {
|
||||
private String reportFlag;
|
||||
@TableField(exist = false)
|
||||
private String finishedProduct;
|
||||
/**
|
||||
* 密度
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private BigDecimal density;
|
||||
/**
|
||||
* 重量
|
||||
*/
|
||||
@TableField(exist = false)
|
||||
private BigDecimal weight;
|
||||
@TableField(exist = false)
|
||||
private BigDecimal purchaseAmounts;
|
||||
}
|
||||
|
||||
@ -320,6 +320,9 @@ public interface PlanSubMapper extends BaseMapperX<PlanSubDO> {
|
||||
query.like(ObjectUtil.isNotEmpty(pageReqVO.getProjectName()), ProjectOrderDO::getProjectName, pageReqVO.getProjectName());
|
||||
query.like(ObjectUtil.isNotEmpty(pageReqVO.getProjectSubName()), ProjectOrderSubDO::getName, pageReqVO.getProjectSubName());
|
||||
query.like(ObjectUtil.isNotEmpty(pageReqVO.getCustomerName()), CustomerDO::getName, pageReqVO.getCustomerName());
|
||||
if (ObjectUtil.isNotEmpty(pageReqVO.getCustomerName())&&ObjectUtil.isEmpty(pageReqVO.getProjectCode())&&ObjectUtil.isEmpty(pageReqVO.getProjectName())&&ObjectUtil.isEmpty(pageReqVO.getProjectSubName())){
|
||||
query.ne(ProjectOrderDO::getDeliveryStatus,3);
|
||||
}
|
||||
query.orderByAsc(ProjectOrderDO::getCode);
|
||||
return selectPage(pageReqVO, query);
|
||||
}
|
||||
|
||||
@ -398,10 +398,16 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> {
|
||||
@Delete("delete from pro_process_design where project_id = #{id}")
|
||||
void deleteOrderId(@Param("id") Long id);
|
||||
|
||||
@Select("SELECT pd.* FROM pro_process_design pd " +
|
||||
"INNER JOIN project_plan_sub_detail psd ON psd.project_sub_id = pd.project_sub_id " +
|
||||
"AND psd.sub_type = pd.process_design_type " +
|
||||
"WHERE pd.project_sub_id = #{projectSubId} " +
|
||||
"AND pd.process_design_type IN ('BLUEPRINT_3D', 'BLUEPRINT_2D', 'BLUEPRINT_WORKBLANK')")
|
||||
// @Select("SELECT pd.* FROM pro_process_design pd " +
|
||||
// "INNER JOIN project_plan_sub_detail psd ON psd.project_sub_id = pd.project_sub_id " +
|
||||
// "AND psd.sub_type = pd.process_design_type " +
|
||||
// "WHERE pd.project_sub_id = #{projectSubId} " +
|
||||
// "AND pd.process_design_type IN ('BLUEPRINT_3D', 'BLUEPRINT_2D', 'BLUEPRINT_WORKBLANK')")
|
||||
@Select("SELECT DISTINCT pd.* \n" +
|
||||
"FROM pro_process_design pd \n" +
|
||||
"INNER JOIN project_plan_sub_detail psd ON psd.project_sub_id = pd.project_sub_id \n" +
|
||||
" AND psd.sub_type = pd.process_design_type \n" +
|
||||
"WHERE pd.project_sub_id = #{projectSubId} \n" +
|
||||
" AND pd.process_design_type IN ('BLUEPRINT_3D', 'BLUEPRINT_2D', 'BLUEPRINT_WORKBLANK')")
|
||||
List<ProcessDesignDO> selectWithDetailExists(@Param("projectSubId") Long projectSubId);
|
||||
}
|
||||
|
||||
@ -18,6 +18,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
|
||||
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.pgmaster.PgMasterLineDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.procedure.ProcedureDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
|
||||
@ -29,6 +30,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.Pur
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatchdetailowner.TaskDispatchDetailOwnerDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskinreport.TaskInReportDO;
|
||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskreport.TaskReportDO;
|
||||
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
|
||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||
@ -906,11 +908,20 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
|
||||
.select("a.bom_detail_id as bomDetailId")
|
||||
.select("b.material_name as materialName","c.name as projectSubName")
|
||||
.select("d.name as procedureName","u.nickname as ownerName")
|
||||
.select("COALESCE(f.purchase_amount, e.boom_amount) AS purchaseAmounts")
|
||||
.leftJoin(TaskDispatchDO.class,"a",TaskDispatchDO::getId,TaskDispatchDetailDO::getDispatchId)
|
||||
.leftJoin(ProcessBomDetailDO.class,"b",ProcessBomDetailDO::getId,TaskDispatchDO::getBomDetailId)
|
||||
.leftJoin(ProjectOrderSubDO.class,"c",ProjectOrderSubDO::getId,TaskDispatchDO::getProjectSubId)
|
||||
.leftJoin(ProcedureDO.class,"d",ProcedureDO::getId,TaskDispatchDetailDO::getProcedureId)
|
||||
.leftJoin(AdminUserDO.class,"u",AdminUserDO::getId,TaskDispatchDetailDO::getOwner)
|
||||
// .leftJoin(MaterialPlanBoomDO.class,"e",MaterialPlanBoomDO::getId,TaskDispatchDetailDO::getProjectMaterialPlanDetailId)
|
||||
// .leftJoin(PurchaseOrderMakeDetailDO.class,"f",PurchaseOrderMakeDetailDO::getId,MaterialPlanBoomDO::getProjectPurchaseOrderMakeDetailId)
|
||||
|
||||
.leftJoin(MaterialPlanBoomDO.class, "e",
|
||||
wrapper -> wrapper.eq(MaterialPlanBoomDO::getId,TaskDispatchDetailDO::getProjectMaterialPlanDetailId))
|
||||
.leftJoin(PurchaseOrderMakeDetailDO.class, "f",
|
||||
wrapper -> wrapper.eq(PurchaseOrderMakeDetailDO::getId,MaterialPlanBoomDO::getProjectPurchaseOrderMakeDetailId))
|
||||
.disableSubLogicDel()
|
||||
.orderByAsc(ProcessBomDetailDO::getMaterialName)
|
||||
.orderByAsc(TaskDispatchDO::getCode);
|
||||
query.eq(TaskDispatchDO::getProjectSubId,projectSubId);
|
||||
@ -935,4 +946,71 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
|
||||
query.eq(TaskDispatchDO::getDispatchType,"ASSEMBLE");
|
||||
return selectList(query);
|
||||
}
|
||||
default PageResult<TaskDispatchDetailDO> selectPageXl(TaskDispatchDetailPageReqVO reqVO , Map<String, Set<Long>> postIds) {
|
||||
// 假设reqVO中包含了页码(page)和每页数量(limit)
|
||||
MPJLambdaWrapper<TaskDispatchDetailDO> query = new MPJLambdaWrapper<>();
|
||||
query.selectAll(TaskDispatchDetailDO.class)
|
||||
.select("a.code as dispatchCode")
|
||||
.select("b.code as projectCode", "b.project_name as projectName", "c.name as projectSubName")
|
||||
.select("d.material_name as materialName")
|
||||
.select("e.name as procedureName")
|
||||
.select("g.name as compositionName","g.density as density")
|
||||
.selectSum(TaskInReportDO::getWeight, "weight")
|
||||
.leftJoin(TaskDispatchDO.class, "a", TaskDispatchDO::getId, TaskDispatchDetailDO::getDispatchId)
|
||||
.leftJoin(ProjectOrderDO.class, "b", ProjectOrderDO::getId, TaskDispatchDO::getProjectId)
|
||||
.leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, TaskDispatchDO::getProjectSubId)
|
||||
.leftJoin(ProcessBomDetailDO.class, "d", ProcessBomDetailDO::getId, TaskDispatchDO::getBomDetailId)
|
||||
.leftJoin(ProcedureDO.class, "e", ProcedureDO::getId, TaskDispatchDetailDO::getProcedureId)
|
||||
.leftJoin(TaskInReportDO.class, "f", TaskInReportDO::getDispatchDetailId, TaskDispatchDetailDO::getId)
|
||||
.leftJoin(PlanSubDO.class,"plan", PlanSubDO::getProjectSubId, TaskDispatchDO::getProjectSubId)
|
||||
.leftJoin(CompositionDO.class, "g", CompositionDO::getId, ProcessBomDetailDO::getCompositionId)
|
||||
.groupBy(TaskDispatchDetailDO::getId)
|
||||
.disableSubLogicDel();;
|
||||
if (reqVO.getProcedureStatusList().size() == 1 && reqVO.getProcedureStatusList().get(0) == 2) {
|
||||
// 完工降序
|
||||
query.orderByDesc(TaskDispatchDetailDO::getDispatchId, TaskDispatchDetailDO::getSort);
|
||||
} else {
|
||||
// 未完工升序
|
||||
query
|
||||
.orderByAsc(TaskDispatchDetailDO::getDispatchId, TaskDispatchDetailDO::getSort);
|
||||
}
|
||||
|
||||
if (reqVO.getSubOrDetailName() != null && !reqVO.getSubOrDetailName().trim().equals("")){
|
||||
query.and( e ->e.eq(ProjectOrderDO::getProjectName, reqVO.getSubOrDetailName()).or().eq(
|
||||
ProjectOrderSubDO::getName, reqVO.getSubOrDetailName()
|
||||
).or().eq(ProcessBomDetailDO::getMaterialName, reqVO.getSubOrDetailName()).or().eq(ProcessBomDetailDO::getBomBlueprintNo, reqVO.getSubOrDetailName())
|
||||
.or().eq(PlanSubDO::getProjectSubCode, reqVO.getSubOrDetailName()));
|
||||
|
||||
// query.eq(" (b.project_name like '%" + reqVO.getSubOrDetailName() + "%' or c.name like '%" + reqVO.getSubOrDetailName() + "%')");
|
||||
}
|
||||
query.and(wrapper -> {
|
||||
wrapper.ne(ProjectOrderDO::getStatus,6);
|
||||
|
||||
if (CollUtil.isNotEmpty(postIds)) {
|
||||
wrapper.and(i -> {
|
||||
// 为每个岗位创建对应的工序查询条件
|
||||
for (String postId : postIds.keySet()) {
|
||||
Set<Long> processId = postIds.get(postId);
|
||||
if (ObjectUtil.isNotEmpty(processId)) {
|
||||
i.or(j -> j.eq(TaskDispatchDetailDO::getPostId, postId)
|
||||
.in(TaskDispatchDetailDO::getProcedureId, processId)
|
||||
.isNull(TaskDispatchDetailDO::getOwner));
|
||||
} else {
|
||||
i.or(j -> j.eq(TaskDispatchDetailDO::getPostId, postId)
|
||||
.isNull(TaskDispatchDetailDO::getOwner));
|
||||
}
|
||||
}
|
||||
});
|
||||
// 添加所有者查询条件
|
||||
wrapper.or(k -> k.eq(reqVO.getOwner() != null, TaskDispatchDetailDO::getOwner, reqVO.getOwner()));
|
||||
} else {
|
||||
wrapper.eq(reqVO.getOwner() != null, TaskDispatchDetailDO::getOwner, reqVO.getOwner());
|
||||
}
|
||||
|
||||
});
|
||||
query.in(CollUtil.isNotEmpty(reqVO.getProcedureStatusList()), TaskDispatchDetailDO::getInReportProcess, reqVO.getProcedureStatusList())
|
||||
.eq(TaskDispatchDetailDO::getIsInProcess,"Y");
|
||||
|
||||
return selectPage(reqVO, query);
|
||||
}
|
||||
}
|
||||
|
||||
@ -412,7 +412,7 @@ public class PlanServiceImpl implements PlanService {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
if (planSubDO.getDeliveryStatus() == 3) {
|
||||
planDO.setProjectProgress("已发货");
|
||||
} else if (now.isAfter(planSubDO.getProjectEndTime())) {
|
||||
} else if (now.toLocalDate().isAfter(planSubDO.getProjectEndTime().toLocalDate())) {
|
||||
long overdueDays = ChronoUnit.DAYS.between(
|
||||
planSubDO.getProjectEndTime().toLocalDate(), now.toLocalDate());
|
||||
planDO.setProjectProgress("已延迟" + overdueDays + "天");
|
||||
@ -438,21 +438,21 @@ public class PlanServiceImpl implements PlanService {
|
||||
LocalDateTime dateAsLocalDateTime = processDesignProgressDO.getEndTime().toInstant()
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDateTime();
|
||||
if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())){
|
||||
if (dateAsLocalDateTime.isAfter(planSubDO.getCraftEndDate())) {
|
||||
if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())) {
|
||||
if (dateAsLocalDateTime.toLocalDate().isAfter(planSubDO.getCraftEndDate().toLocalDate())) {
|
||||
planDO.setProcessFlag("1");
|
||||
} else {
|
||||
planDO.setProcessFlag("0");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())) {
|
||||
if (now.toLocalDate().isAfter(planSubDO.getCraftEndDate().toLocalDate())) {
|
||||
planDO.setProcessFlag("1");
|
||||
} else {
|
||||
planDO.setProcessFlag("0");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())){
|
||||
if (now.isAfter(planSubDO.getCraftEndDate())) {
|
||||
planDO.setProcessFlag("1");
|
||||
} else {
|
||||
planDO.setProcessFlag("0");
|
||||
}
|
||||
}
|
||||
Long l = processDesignProgressMapper.selectCount(new LambdaQueryWrapper<ProcessDesignProgressDO>().eq(ProcessDesignProgressDO::getProcessDesignId, processDesignDO.getId()));
|
||||
if (l > 0) {
|
||||
@ -462,7 +462,7 @@ public class PlanServiceImpl implements PlanService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
for (PlanSubDO subDO : list) {
|
||||
//设计计划
|
||||
// 1. 查询已完成的工艺设计
|
||||
@ -475,7 +475,7 @@ public class PlanServiceImpl implements PlanService {
|
||||
handleCompletedDesigns(subDO, completedProcessDesigns, latestTwoDimPlan);
|
||||
} else {
|
||||
// 情况2:未完成或部分完成
|
||||
handleIncompleteDesigns(subDO, completedProcessDesigns, latestTwoDimPlan, now);
|
||||
handleIncompleteDesigns(subDO, completedProcessDesigns, latestTwoDimPlan, LocalDateTime.now());
|
||||
}
|
||||
//外协任务
|
||||
// 1.查询外协的派工单
|
||||
@ -528,7 +528,7 @@ public class PlanServiceImpl implements PlanService {
|
||||
}
|
||||
|
||||
// 4. 处理时间相关逻辑
|
||||
processProcessingTimeLogic(subDO, dispatchDetailDOS, taskReportDOS, allCompleted1, now);
|
||||
processProcessingTimeLogic(subDO, dispatchDetailDOS, taskReportDOS, allCompleted1, LocalDateTime.now());
|
||||
|
||||
//过程检
|
||||
//1.查询非外协需要过程检的数据
|
||||
@ -558,10 +558,9 @@ public class PlanServiceImpl implements PlanService {
|
||||
processAssemblyTask(subDO, assemblyTask, taskReportDOList);
|
||||
}
|
||||
// 4. 处理时间相关逻辑
|
||||
processAssemblyTaskTimeLogic(subDO, assemblyTask, taskReportDOList, allCompleted2, now);
|
||||
processAssemblyTaskTimeLogic(subDO, assemblyTask, taskReportDOList, allCompleted2, LocalDateTime.now());
|
||||
}
|
||||
planDO.setList( pageResult);
|
||||
}
|
||||
return planDO;
|
||||
}
|
||||
|
||||
@ -578,11 +577,32 @@ public class PlanServiceImpl implements PlanService {
|
||||
subDO.setAssemblyTask(TASK_NOT_STARTED);
|
||||
}
|
||||
}else {
|
||||
BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS);
|
||||
BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS);
|
||||
int percentage = calculatePercentage(reportedAmount, dispatchAmount);
|
||||
subDO.setAssemblyTask(String.format(TASK_STARTED_FORMAT, percentage));
|
||||
subDO.setAssemblyTaskFlag(TASK_FLAG_NORMAL);
|
||||
List<TaskDispatchDetailDO> collect = dispatchDetailDOS.stream().filter(detailDO -> detailDO.getProcedureStatus() == 2).collect(Collectors.toList());
|
||||
//已报工完的工时
|
||||
if (ObjectUtil.isNotEmpty(collect)){
|
||||
BigDecimal workTime = calculateDispatchTime(collect);
|
||||
Set<Long> dispatchDetailIdSet = collect.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(TaskDispatchDetailDO::getId)
|
||||
.collect(Collectors.toSet());
|
||||
// 过滤 taskReportDOS
|
||||
List<TaskReportDO> filteredReports = taskReportDOS.stream()
|
||||
.filter(report -> !dispatchDetailIdSet.contains(report.getDispatchDetailId()))
|
||||
.collect(Collectors.toList());
|
||||
BigDecimal bigDecimal = calculateReportedTime(filteredReports);
|
||||
bigDecimal = bigDecimal.add(workTime);
|
||||
BigDecimal dispatchAmount = calculateDispatchTime(dispatchDetailDOS);
|
||||
int percentage = calculatePercentage(bigDecimal, dispatchAmount);
|
||||
subDO.setAssemblyTask(String.format(TASK_STARTED_FORMAT, percentage));
|
||||
subDO.setAssemblyTaskFlag(TASK_FLAG_NORMAL);
|
||||
}else{
|
||||
BigDecimal dispatchAmount = calculateDispatchTime(dispatchDetailDOS);
|
||||
BigDecimal reportedAmount = calculateReportedTime(taskReportDOS);
|
||||
int percentage = calculatePercentage(reportedAmount, dispatchAmount);
|
||||
subDO.setAssemblyTask(String.format(TASK_STARTED_FORMAT, percentage));
|
||||
subDO.setAssemblyTaskFlag(TASK_FLAG_NORMAL);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
/**
|
||||
@ -660,7 +680,7 @@ public boolean isSameSizeAndNotEmpty(Collection<?> list1, Collection<?> list2)
|
||||
return taskReportMapper.selectList(
|
||||
new LambdaQueryWrapper<TaskReportDO>()
|
||||
.in(TaskReportDO::getDispatchDetailId, dispatchDetailIds)
|
||||
.eq(TaskReportDO::getHasReport, 1)
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
@ -731,12 +751,12 @@ public boolean isSameSizeAndNotEmpty(Collection<?> list1, Collection<?> list2)
|
||||
.orElse(null);
|
||||
|
||||
// 如果报工结束时间晚于派工结束时间,标记为延迟
|
||||
if (maxReportEndTime != null && maxReportEndTime.isAfter(maxDispatchEndTime)) {
|
||||
if (maxReportEndTime != null && maxReportEndTime.toLocalDate().isAfter(maxDispatchEndTime.toLocalDate())) {
|
||||
subDO.setAssemblyTaskFlag(TASK_FLAG_DELAYED);
|
||||
}
|
||||
} else {
|
||||
// 当前时间晚于派工结束时间,标记为延迟
|
||||
if (now.isAfter(maxDispatchEndTime)) {
|
||||
if (now.toLocalDate().isAfter(maxDispatchEndTime.toLocalDate())) {
|
||||
subDO.setAssemblyTaskFlag(TASK_FLAG_DELAYED);
|
||||
}
|
||||
}
|
||||
@ -778,12 +798,12 @@ public boolean isSameSizeAndNotEmpty(Collection<?> list1, Collection<?> list2)
|
||||
.orElse(null);
|
||||
|
||||
// 如果报工结束时间晚于派工结束时间,标记为延迟
|
||||
if (maxReportEndTime != null && maxReportEndTime.isAfter(maxDispatchEndTime)) {
|
||||
if (maxReportEndTime != null && maxReportEndTime.toLocalDate().isAfter(maxDispatchEndTime.toLocalDate())) {
|
||||
subDO.setProcessingTaskFlag(TASK_FLAG_DELAYED);
|
||||
}
|
||||
} else {
|
||||
// 当前时间晚于派工结束时间,标记为延迟
|
||||
if (now.isAfter(maxDispatchEndTime)) {
|
||||
if (now.toLocalDate().isAfter(maxDispatchEndTime.toLocalDate())) {
|
||||
subDO.setProcessingTaskFlag(TASK_FLAG_DELAYED);
|
||||
}
|
||||
}
|
||||
@ -801,6 +821,18 @@ public boolean isSameSizeAndNotEmpty(Collection<?> list1, Collection<?> list2)
|
||||
.map(BigDecimal::new)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
/**
|
||||
* 计算已报工数量
|
||||
*/
|
||||
private BigDecimal calculateReportedTime(List<TaskReportDO> taskReportDOS) {
|
||||
return Optional.ofNullable(taskReportDOS)
|
||||
.orElse(Collections.emptyList())
|
||||
.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(TaskReportDO::getWorkTime)
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
/**
|
||||
* 计算已报工数量
|
||||
*/
|
||||
@ -853,7 +885,16 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
|
||||
// 计算派工数量
|
||||
private BigDecimal calculateDispatchTime(List<TaskDispatchDetailDO> detailDOS) {
|
||||
return Optional.ofNullable(detailDOS)
|
||||
.orElse(Collections.emptyList())
|
||||
.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(TaskDispatchDetailDO::getWorkTime)
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
// 计算派工数量
|
||||
private BigDecimal calculateDispatchAmount(List<TaskDispatchDetailDO> detailDOS) {
|
||||
return Optional.ofNullable(detailDOS)
|
||||
@ -899,12 +940,12 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
|
||||
.orElse(null);
|
||||
|
||||
// 如果到货时间晚于要求时间,标记为延迟
|
||||
if (maxArriveTime != null && maxArriveTime.isAfter(maxRequireTime)) {
|
||||
if (maxArriveTime != null && maxArriveTime.toLocalDate().isAfter(maxRequireTime.toLocalDate())) {
|
||||
subDO.setOutsourcingTasksFlag(TASK_FLAG_DELAYED);
|
||||
}
|
||||
} else {
|
||||
// 当前时间晚于最大要求时间,标记为延迟
|
||||
if (LocalDateTime.now().isAfter(maxRequireTime)) {
|
||||
if (LocalDateTime.now().toLocalDate().isAfter(maxRequireTime.toLocalDate())) {
|
||||
subDO.setOutsourcingTasksFlag(TASK_FLAG_DELAYED);
|
||||
}
|
||||
}
|
||||
@ -974,21 +1015,49 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
|
||||
subDO.setDesignTask("");
|
||||
|
||||
}
|
||||
|
||||
List<ProcessDesignDO> collect = processDesigns.stream()
|
||||
.filter(processDesignDO -> processDesignDO.getIsOverProcess() != 1).collect(Collectors.toList());
|
||||
List<ProcessDesignDO> collect1 = processDesigns.stream()
|
||||
.filter(processDesignDO -> processDesignDO.getIsOverProcess() == 1).collect(Collectors.toList());
|
||||
List<Long> processDesignIds = processDesigns.stream()
|
||||
.filter(processDesignDO -> processDesignDO.getIsOverProcess() !=1)
|
||||
.map(ProcessDesignDO::getId)
|
||||
.collect(Collectors.toList());
|
||||
List<Long> ids = processDesigns.stream()
|
||||
.map(ProcessDesignDO::getId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 获取工艺设计进度列表
|
||||
List<ProcessDesignProgressDO> progressList = getProcessDesignProgressList(processDesignIds);
|
||||
List<ProcessDesignProgressDO> processDesignProgressDOS = getProcessDesignProgressList(ids);
|
||||
|
||||
if (ObjectUtil.isEmpty(progressList)&&ObjectUtil.isNotEmpty(latestTwoDimPlan)) {
|
||||
if (ObjectUtil.isEmpty(processDesignProgressDOS)&&ObjectUtil.isNotEmpty(latestTwoDimPlan)) {
|
||||
subDO.setDesignTask("未开始");
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(progressList)) {
|
||||
if (ObjectUtil.isNotEmpty(processDesignProgressDOS)) {
|
||||
// 计算总工时和当前工时
|
||||
BigDecimal totalWorkTime = calculateTotalWorkTime(progressList);
|
||||
BigDecimal currentTime = calculateCurrentTime(subDO);
|
||||
BigDecimal currentTime = calculateCurrentTime(subDO,collect);
|
||||
for (ProcessDesignDO processDesignDO : collect1) {
|
||||
if ("BLUEPRINT_3D".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getThreeDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getThreeDimNum().toString()));
|
||||
totalWorkTime = totalWorkTime.add(new BigDecimal(subDO.getThreeDimNum().toString()).multiply(new BigDecimal("8")));
|
||||
}
|
||||
}
|
||||
if ("BLUEPRINT_WORKBLANK".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getBlankNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getBlankNum().toString()));
|
||||
totalWorkTime = totalWorkTime.add(new BigDecimal(subDO.getBlankNum().toString()).multiply(new BigDecimal("8")));
|
||||
}
|
||||
}
|
||||
if ("BLUEPRINT_2D".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getTwoDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getTwoDimNum().toString()));
|
||||
totalWorkTime = totalWorkTime.add(new BigDecimal(subDO.getTwoDimNum().toString()).multiply(new BigDecimal("8")));
|
||||
}
|
||||
}
|
||||
}
|
||||
currentTime = currentTime.multiply(new BigDecimal("8"));
|
||||
// 计算完成百分比
|
||||
Integer percentage = calculatePercentage(totalWorkTime, currentTime);
|
||||
@ -1000,7 +1069,7 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
|
||||
// 检查是否超期
|
||||
if (
|
||||
ObjectUtil.isNotEmpty(latestTwoDimPlan) &&
|
||||
now.isAfter(latestTwoDimPlan.getTwoDimDate())) {
|
||||
now.toLocalDate().isAfter(latestTwoDimPlan.getTwoDimDate().toLocalDate())) {
|
||||
subDO.setDesignTaskFlag("1");
|
||||
}
|
||||
}
|
||||
@ -1047,21 +1116,25 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
|
||||
/**
|
||||
* 计算当前工时(将三个数值相加)
|
||||
*/
|
||||
private BigDecimal calculateCurrentTime(PlanSubDO subDO) {
|
||||
private BigDecimal calculateCurrentTime(PlanSubDO subDO,List<ProcessDesignDO> collect) {
|
||||
BigDecimal currentTime = BigDecimal.ZERO;
|
||||
|
||||
if (ObjectUtil.isNotEmpty(subDO.getBlankNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getBlankNum().toString()));
|
||||
for (ProcessDesignDO processDesignDO : collect) {
|
||||
if ("BLUEPRINT_3D".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getThreeDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getThreeDimNum().toString()));
|
||||
}
|
||||
}
|
||||
if ("BLUEPRINT_WORKBLANK".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getBlankNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getBlankNum().toString()));
|
||||
}
|
||||
}
|
||||
if ("BLUEPRINT_2D".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getTwoDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getTwoDimNum().toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ObjectUtil.isNotEmpty(subDO.getThreeDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getThreeDimNum().toString()));
|
||||
}
|
||||
|
||||
if (ObjectUtil.isNotEmpty(subDO.getTwoDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getTwoDimNum().toString()));
|
||||
}
|
||||
|
||||
return currentTime;
|
||||
}
|
||||
|
||||
@ -1090,7 +1163,7 @@ private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(PlanSubDO subDO)
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDateTime();
|
||||
|
||||
return dateAsLocalDateTime.isAfter(localDateTime);
|
||||
return dateAsLocalDateTime.toLocalDate().isAfter(localDateTime.toLocalDate());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -1829,7 +1829,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
// 设置日期字段
|
||||
setDateFields(designTask, planSubDetail);
|
||||
// 设置状态和进度
|
||||
setTaskStatus(designTask, planSubDetail);
|
||||
setTaskStatus(designTask, planSubDetail,pageReqVO.getProjectSubId());
|
||||
if ( !"已完成".equals(designTask.getStatus()) ||
|
||||
pageReqVO.getFlag()==1){
|
||||
// 如果未完成且有数据,计算进度
|
||||
@ -1853,8 +1853,11 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
setOutsourcedTaskDateFields(outsourcedTask, dispatchDetailDOS);
|
||||
|
||||
List<PurchaseOrderNoDetailDO> orderNoDetailDOS = queryPurchaseOrderDetails(pageReqVO.getProjectSubId());
|
||||
|
||||
// 3.查询是否送审
|
||||
List<PurchaseOrderMakeDetailDO> purchaseOrderMakeDetailDOS = queryPurchaseOrderMakeDetails(pageReqVO.getProjectSubId());
|
||||
// 设置状态和进度
|
||||
setOutsourcedTaskStatus(outsourcedTask,orderNoDetailDOS,dispatchDetailDOS);
|
||||
setOutsourcedTaskStatus(outsourcedTask,orderNoDetailDOS,dispatchDetailDOS,purchaseOrderMakeDetailDOS);
|
||||
if ( !"已完成".equals(outsourcedTask.getStatus()) ||
|
||||
pageReqVO.getFlag()==1){
|
||||
// 如果未完成且有数据,计算进度
|
||||
@ -1881,7 +1884,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
// 2. 查询报工数据
|
||||
List<TaskReportDO> taskReportDOS = queryTaskReports(dispatchDetailDOList);
|
||||
//设置状态
|
||||
setProcessingPlanStatus(processingPlan, dispatchDetailDOList);
|
||||
setProcessingPlanStatus(processingPlan, dispatchDetailDOList,taskReportDOS);
|
||||
if ( !"已完成".equals(processingPlan.getStatus()) ||
|
||||
pageReqVO.getFlag()==1){
|
||||
processTime(processingPlan, dispatchDetailDOList,taskReportDOS);
|
||||
@ -1929,11 +1932,11 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
List<TaskReportDO> taskReportDOList = queryTaskReports(taskDispatchDetailDOList);
|
||||
setOutsourcedTaskDateFields(assemblyTask, taskDispatchDetailDOList);
|
||||
// 设置状态和进度
|
||||
setProcessingPlanStatus(assemblyTask, taskDispatchDetailDOList);
|
||||
setProcessingPlanStatus(assemblyTask, taskDispatchDetailDOList,taskReportDOList);
|
||||
if ( !"已完成".equals(assemblyTask.getStatus()) ||
|
||||
pageReqVO.getFlag()==1){
|
||||
processTime(assemblyTask, taskDispatchDetailDOList,taskReportDOList);
|
||||
processInProgressTask(assemblyTask, taskDispatchDetailDOList, taskReportDOList);
|
||||
processInProgressAssemblyTask(assemblyTask, taskDispatchDetailDOList, taskReportDOList);
|
||||
planSubDetailDOS.add(assemblyTask);
|
||||
}
|
||||
return planSubDetailDOS;
|
||||
@ -2035,6 +2038,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
planSubDetailDO.setPercentage("0%");
|
||||
}
|
||||
}
|
||||
if (pageReqVO.getStatusflag()){
|
||||
return planSubDetailDOS.stream().filter(planSubDetailDO -> !"100%".equals(planSubDetailDO.getPercentage())).collect(Collectors.toList());
|
||||
}
|
||||
return planSubDetailDOS;
|
||||
}
|
||||
|
||||
@ -2122,12 +2128,14 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
processPurchaseOrderNoDetail(dispatchDetailDO, noDetail, now);
|
||||
} else {
|
||||
// 如果没有采购订单号详情,检查是否超期
|
||||
if (now.isAfter(dispatchDetailDO.getEndTime())) {
|
||||
if (now.toLocalDate().isAfter(dispatchDetailDO.getEndTime().toLocalDate())) {
|
||||
dispatchDetailDO.setReceivingFlag("1");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pageReqVO.getStatusflag()){
|
||||
return dispatchDetailDOS.stream().filter(taskDispatchDetailDO -> !"已收货".equals(taskDispatchDetailDO.getReceiving())).collect(Collectors.toList());
|
||||
}
|
||||
return dispatchDetailDOS;
|
||||
}
|
||||
|
||||
@ -2151,8 +2159,6 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
if (!dispatchDetailIds.isEmpty()) {
|
||||
LambdaQueryWrapper<TaskReportDO> taskReportWrapper = new LambdaQueryWrapper<>();
|
||||
taskReportWrapper.in(TaskReportDO::getDispatchDetailId, dispatchDetailIds);
|
||||
taskReportWrapper.eq(TaskReportDO::getHasReport, "1");
|
||||
|
||||
List<TaskReportDO> allTaskReports = taskReportMapper.selectList(taskReportWrapper);
|
||||
taskReportMap = allTaskReports.stream()
|
||||
.collect(Collectors.groupingBy(TaskReportDO::getDispatchDetailId));
|
||||
@ -2203,6 +2209,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
processReportStatus(dispatchDetailDO, taskReportDOS, now);
|
||||
}
|
||||
|
||||
if (pageReqVO.getStatusflag()){
|
||||
return dispatchDetailDOS.stream().filter(taskDispatchDetailDO -> !"已完成".equals(taskDispatchDetailDO.getReport())).collect(Collectors.toList());
|
||||
}
|
||||
return dispatchDetailDOS;
|
||||
|
||||
}
|
||||
@ -2261,7 +2270,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
|
||||
// 模拟 limit 1 的效果:取第一条记录
|
||||
PgMasterLineDO pgMasterLineDO = pgMasterLines.get(0);
|
||||
|
||||
dispatchDetailDO.setEndTime(pgMasterLineDO.getEntTime());
|
||||
if ("END".equals(pgMasterLineDO.getActive())) {
|
||||
dispatchDetailDO.setReport("已完成");
|
||||
|
||||
@ -2277,7 +2286,9 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
dispatchDetailDO.setReport("已生成");
|
||||
}
|
||||
}
|
||||
|
||||
if (pageReqVO.getStatusflag()){
|
||||
return dispatchDetailDOS.stream().filter(taskDispatchDetailDO -> !"已完成".equals(taskDispatchDetailDO.getReport())).collect(Collectors.toList());
|
||||
}
|
||||
return dispatchDetailDOS;
|
||||
}
|
||||
|
||||
@ -2308,8 +2319,6 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
if (!dispatchDetailIds.isEmpty()) {
|
||||
LambdaQueryWrapper<TaskReportDO> taskReportWrapper = new LambdaQueryWrapper<>();
|
||||
taskReportWrapper.in(TaskReportDO::getDispatchDetailId, dispatchDetailIds);
|
||||
taskReportWrapper.eq(TaskReportDO::getHasReport, "1");
|
||||
|
||||
List<TaskReportDO> allTaskReports = taskReportMapper.selectList(taskReportWrapper);
|
||||
taskReportMap = allTaskReports.stream()
|
||||
.collect(Collectors.groupingBy(TaskReportDO::getDispatchDetailId));
|
||||
@ -2327,7 +2336,6 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
if (zjPgMasterLineDO != null && !"1".equals(zjPgMasterLineDO.getPgType())) {
|
||||
LambdaQueryWrapper<ZjBgMasterLineDO> zjBgMasterLineWrapper = new LambdaQueryWrapper<>();
|
||||
zjBgMasterLineWrapper.eq(ZjBgMasterLineDO::getZjMxId, zjPgMasterLineDO.getId());
|
||||
zjBgMasterLineWrapper.isNotNull(ZjBgMasterLineDO::getEntTime);
|
||||
|
||||
List<ZjBgMasterLineDO> zjBgMasterLineDOList = zjBgMasterLineMapper.selectList(zjBgMasterLineWrapper);
|
||||
zjBgMasterLineMap = zjBgMasterLineDOList.stream()
|
||||
@ -2359,12 +2367,13 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
if (totalReported != null) {
|
||||
BigDecimal workingHour = totalReported.divide(DIVISOR, 2, RoundingMode.HALF_UP);
|
||||
taskDispatchDetailDO.setWorkingHour(workingHour);
|
||||
taskDispatchDetailDO.setBgWorkTime(taskDispatchDetailDO.getWorkTime());
|
||||
}
|
||||
BigDecimal amount = calculateTotalAmount(allTaskReports);
|
||||
taskDispatchDetailDO.setNumAmount(Integer.parseInt(amount.toString()));
|
||||
if (CollectionUtils.isNotEmpty(allTaskReports)) {
|
||||
LocalDateTime maxEndTime = findMaxEndTime(allTaskReports);
|
||||
if (maxEndTime != null && maxEndTime.isAfter(taskDispatchDetailDO.getEndTime())) {
|
||||
if (maxEndTime != null && maxEndTime.toLocalDate().isAfter(taskDispatchDetailDO.getEndTime().toLocalDate())) {
|
||||
taskDispatchDetailDO.setReportFlag("1");
|
||||
}
|
||||
}
|
||||
@ -2376,6 +2385,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
if (totalReported != null) {
|
||||
BigDecimal workingHour = totalReported.divide(DIVISOR, 2, RoundingMode.HALF_UP);
|
||||
taskDispatchDetailDO.setWorkingHour(workingHour);
|
||||
taskDispatchDetailDO.setBgWorkTime(workingHour);
|
||||
}
|
||||
BigDecimal amount = calculateTotalAmount(allTaskReports);
|
||||
taskDispatchDetailDO.setNumAmount(Integer.parseInt(amount.toString()));
|
||||
@ -2384,7 +2394,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
taskDispatchDetailDO.setPercentage("0%");
|
||||
}
|
||||
|
||||
if (now.isAfter(taskDispatchDetailDO.getEndTime())) {
|
||||
if (now.toLocalDate().isAfter(taskDispatchDetailDO.getEndTime().toLocalDate())) {
|
||||
taskDispatchDetailDO.setReportFlag("1");
|
||||
}
|
||||
}
|
||||
@ -2408,9 +2418,13 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
.collect(Collectors.groupingBy(TaskDispatchDetailDO::getDetailOwnerId));
|
||||
|
||||
// 2. 对每个分组进行合并计算,生成新的合并后的对象
|
||||
return groupedMap.entrySet().stream()
|
||||
List<TaskDispatchDetailDO> collect = groupedMap.entrySet().stream()
|
||||
.map(entry -> mergeGroup(entry.getKey(), entry.getValue()))
|
||||
.collect(Collectors.toList());
|
||||
if (pageReqVO.getStatusflag()){
|
||||
return collect.stream().filter(taskDispatchDetailDO -> !"已完成".equals(taskDispatchDetailDO.getReport())).collect(Collectors.toList());
|
||||
}
|
||||
return collect;
|
||||
|
||||
}
|
||||
private TaskDispatchDetailDO mergeGroup(Long detailOwnerId, List<TaskDispatchDetailDO> groupList) {
|
||||
@ -2423,7 +2437,7 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
merged.setWorkingHour(totalWorkTime);
|
||||
|
||||
merged.setBgAmount(groupList.size());
|
||||
// 2. reportFlag 进行或运算(只要有一个是1就是1)
|
||||
boolean hasReportFlagOne = groupList.stream()
|
||||
.anyMatch(item -> item.getReportFlag() != null && "1".equals(item.getReportFlag()));
|
||||
@ -2451,14 +2465,12 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
merged.setPercentage("0%"); // 0%
|
||||
} else {
|
||||
BigDecimal totalAmount = groupList.stream()
|
||||
.map(TaskDispatchDetailDO::getAmount)
|
||||
.map(TaskDispatchDetailDO::getWorkTime)
|
||||
.filter(Objects::nonNull)
|
||||
.map(BigDecimal::new) // 将 Integer 转换为 BigDecimal
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
BigDecimal numAmount = groupList.stream()
|
||||
.map(TaskDispatchDetailDO::getNumAmount)
|
||||
.map(TaskDispatchDetailDO::getBgWorkTime)
|
||||
.filter(Objects::nonNull)
|
||||
.map(BigDecimal::new) // 将 Integer 转换为 BigDecimal
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
|
||||
int percentage = calculatePercentage(numAmount,
|
||||
@ -2502,16 +2514,21 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
List<TaskReportDO> taskReportDOS,
|
||||
LocalDateTime now) {
|
||||
if (Integer.valueOf(2).equals(dispatchDetailDO.getProcedureStatus())) {
|
||||
dispatchDetailDO.setReport("已报工");
|
||||
dispatchDetailDO.setReport("已完成");
|
||||
|
||||
if (taskReportDOS != null) {
|
||||
LocalDateTime maxEndTime = findMaxEndTime(taskReportDOS);
|
||||
if (maxEndTime != null && maxEndTime.isAfter(dispatchDetailDO.getEndTime())) {
|
||||
if (maxEndTime != null && maxEndTime.toLocalDate().isAfter(dispatchDetailDO.getEndTime().toLocalDate())) {
|
||||
dispatchDetailDO.setReportFlag("1");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (now.isAfter(dispatchDetailDO.getEndTime())) {
|
||||
if (ObjectUtil.isNotEmpty(taskReportDOS)){
|
||||
dispatchDetailDO.setReport("已报工");
|
||||
}else {
|
||||
dispatchDetailDO.setReport("未报工");
|
||||
}
|
||||
if (now.toLocalDate().isAfter(dispatchDetailDO.getEndTime().toLocalDate())) {
|
||||
dispatchDetailDO.setReportFlag("1");
|
||||
}
|
||||
}
|
||||
@ -2549,12 +2566,12 @@ public class PlanSubDetailServiceImpl implements PlanSubDetailService {
|
||||
dispatchDetailDO.setReceivingTime(arriveTime);
|
||||
|
||||
// 检查是否超期
|
||||
if (arriveTime != null && arriveTime.isAfter(dispatchDetailDO.getEndTime())) {
|
||||
if (arriveTime != null && arriveTime.toLocalDate().isAfter(dispatchDetailDO.getEndTime().toLocalDate())) {
|
||||
dispatchDetailDO.setReceivingFlag("1");
|
||||
}
|
||||
} else {
|
||||
// 未收货或状态不是3,检查是否超期
|
||||
if (now.isAfter(dispatchDetailDO.getEndTime())) {
|
||||
if (now.toLocalDate().isAfter(dispatchDetailDO.getEndTime().toLocalDate())) {
|
||||
dispatchDetailDO.setReceivingFlag("1");
|
||||
}
|
||||
}
|
||||
@ -2610,7 +2627,7 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDateTime();
|
||||
|
||||
if (endLocalDateTime.isAfter(planSubDetailDO.getTwoDimDate())) {
|
||||
if (endLocalDateTime.toLocalDate().isAfter(planSubDetailDO.getTwoDimDate().toLocalDate())) {
|
||||
planSubDetailDO.setStatus("已延期");
|
||||
planSubDetailDO.setStatusFlag("1");
|
||||
}
|
||||
@ -2627,7 +2644,7 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
new BigDecimal(planSubDetailDO.getDesignNum()));
|
||||
planSubDetailDO.setPercentage(calculatePercentage + "%");
|
||||
|
||||
if (LocalDateTime.now().isAfter(planSubDetailDO.getTwoDimDate())) {
|
||||
if (LocalDateTime.now().toLocalDate().isAfter(planSubDetailDO.getTwoDimDate().toLocalDate())) {
|
||||
planSubDetailDO.setStatus("已延期");
|
||||
planSubDetailDO.setStatusFlag("1");
|
||||
}
|
||||
@ -2664,12 +2681,12 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
.orElse(null);
|
||||
|
||||
// 如果到货时间晚于要求时间,标记为延迟
|
||||
if (maxRequireTime != null && maxRequireTime.isAfter(maxArriveTime)) {
|
||||
if (maxRequireTime != null && maxRequireTime.toLocalDate().isAfter(maxArriveTime.toLocalDate())) {
|
||||
outsourcedTask.setStatusFlag("1");
|
||||
}
|
||||
} else {
|
||||
// 当前时间晚于最大要求时间,标记为延迟
|
||||
if (LocalDateTime.now().isAfter(maxArriveTime)) {
|
||||
if (LocalDateTime.now().toLocalDate().isAfter(maxArriveTime.toLocalDate())) {
|
||||
outsourcedTask.setStatusFlag("1");
|
||||
}
|
||||
}
|
||||
@ -2736,7 +2753,7 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
.eq(PgMasterLineDO::getActive, "END")
|
||||
);
|
||||
}
|
||||
private void setProcessingPlanStatus(PlanSubDetailDO processingPlan, List<TaskDispatchDetailDO> dispatchDetailDOList) {
|
||||
private void setProcessingPlanStatus(PlanSubDetailDO processingPlan, List<TaskDispatchDetailDO> dispatchDetailDOList,List<TaskReportDO> taskReportDOS) {
|
||||
if (CollectionUtils.isEmpty(dispatchDetailDOList)) {
|
||||
return;
|
||||
}
|
||||
@ -2746,7 +2763,7 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
if (allCompleted) {
|
||||
processingPlan.setStatus("已完成");
|
||||
} else {
|
||||
if (hasThree(dispatchDetailDOList)) {
|
||||
if (ObjectUtil.isNotEmpty(taskReportDOS)) {
|
||||
processingPlan.setStatus("已开始");
|
||||
processingPlan.setStatusFlag("0");
|
||||
} else {
|
||||
@ -2762,6 +2779,51 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
.filter(Objects::nonNull)
|
||||
.anyMatch(detail -> detail.getProcedureStatus() == 2);
|
||||
}
|
||||
/**
|
||||
* 处理进行中的任务状态
|
||||
*/
|
||||
private void processInProgressAssemblyTask(PlanSubDetailDO processingPlan,
|
||||
List<TaskDispatchDetailDO> dispatchDetailDOS,
|
||||
List<TaskReportDO> taskReportDOS) {
|
||||
|
||||
if (CollectionUtils.isEmpty(taskReportDOS)) {
|
||||
processingPlan.setProductionSchedule("0");
|
||||
return;
|
||||
}
|
||||
if (CollectionUtils.isEmpty(dispatchDetailDOS)){
|
||||
processingPlan.setProductionSchedule("0");
|
||||
return;
|
||||
}
|
||||
List<TaskDispatchDetailDO> collect = dispatchDetailDOS.stream().filter(detailDO -> detailDO.getProcedureStatus() == 2).collect(Collectors.toList());
|
||||
//已报工完的工时
|
||||
if (ObjectUtil.isNotEmpty(collect)){
|
||||
BigDecimal workTime = calculateDispatchTime(collect);
|
||||
Set<Long> dispatchDetailIdSet = collect.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(TaskDispatchDetailDO::getId)
|
||||
.collect(Collectors.toSet());
|
||||
// 过滤 taskReportDOS
|
||||
List<TaskReportDO> filteredReports = taskReportDOS.stream()
|
||||
.filter(report -> !dispatchDetailIdSet.contains(report.getDispatchDetailId()))
|
||||
.collect(Collectors.toList());
|
||||
BigDecimal bigDecimal = calculateReportedTime(filteredReports);
|
||||
bigDecimal = bigDecimal.add(workTime);
|
||||
BigDecimal dispatchAmount = calculateDispatchTime(dispatchDetailDOS);
|
||||
Integer percentage = calculatePercentage(bigDecimal, dispatchAmount);
|
||||
processingPlan.setProductionSchedule(percentage.toString());
|
||||
}else{
|
||||
BigDecimal dispatchAmount = calculateDispatchTime(dispatchDetailDOS);
|
||||
BigDecimal reportedAmount = calculateReportedTime(taskReportDOS);
|
||||
Integer percentage = calculatePercentage(reportedAmount, dispatchAmount);
|
||||
processingPlan.setProductionSchedule(percentage.toString());
|
||||
}
|
||||
|
||||
// BigDecimal dispatchAmount = calculateDispatchTime(dispatchDetailDOS);
|
||||
// BigDecimal reportedAmount = calculateReportedTime(taskReportDOS);
|
||||
// Integer percentage = calculatePercentage(reportedAmount, dispatchAmount);
|
||||
//
|
||||
// processingPlan.setProductionSchedule(percentage.toString());
|
||||
}
|
||||
/**
|
||||
* 处理进行中的任务状态
|
||||
*/
|
||||
@ -2796,6 +2858,18 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
/**
|
||||
* 计算已报工工时
|
||||
*/
|
||||
private BigDecimal calculateReportedTime(List<TaskReportDO> taskReportDOS) {
|
||||
return Optional.ofNullable(taskReportDOS)
|
||||
.orElse(Collections.emptyList())
|
||||
.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(TaskReportDO::getWorkTime)
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
/**
|
||||
* 计算已报工数量
|
||||
*/
|
||||
@ -2838,7 +2912,7 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
return taskReportMapper.selectList(
|
||||
new LambdaQueryWrapper<TaskReportDO>()
|
||||
.in(TaskReportDO::getDispatchDetailId, dispatchDetailIds)
|
||||
.eq(TaskReportDO::getHasReport, 1)
|
||||
|
||||
);
|
||||
}
|
||||
// 处理时间相关逻辑
|
||||
@ -2875,18 +2949,18 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
.orElse(null);
|
||||
|
||||
// 如果到货时间晚于要求时间,标记为延迟
|
||||
if (maxArriveTime != null && maxArriveTime.isAfter(maxRequireTime)) {
|
||||
if (maxArriveTime != null && maxArriveTime.toLocalDate().isAfter(maxRequireTime.toLocalDate())) {
|
||||
outsourcedTask.setStatusFlag("1");
|
||||
}
|
||||
} else {
|
||||
// 当前时间晚于最大要求时间,标记为延迟
|
||||
if (LocalDateTime.now().isAfter(maxRequireTime)) {
|
||||
if (LocalDateTime.now().toLocalDate().isAfter(maxRequireTime.toLocalDate())) {
|
||||
outsourcedTask.setStatusFlag("1");
|
||||
}
|
||||
}
|
||||
}
|
||||
private void setOutsourcedTaskStatus(PlanSubDetailDO outsourcedTask, List<PurchaseOrderNoDetailDO> orderNoDetailDOS,List<TaskDispatchDetailDO> dispatchDetailDOS) {
|
||||
if (CollectionUtils.isEmpty(orderNoDetailDOS)||CollectionUtils.isEmpty(dispatchDetailDOS)) {
|
||||
private void setOutsourcedTaskStatus(PlanSubDetailDO outsourcedTask, List<PurchaseOrderNoDetailDO> orderNoDetailDOS,List<TaskDispatchDetailDO> dispatchDetailDOS,List<PurchaseOrderMakeDetailDO> purchaseOrderMakeDetailDOS) {
|
||||
if (CollectionUtils.isEmpty(dispatchDetailDOS)) {
|
||||
return;
|
||||
}
|
||||
// 判断所有采购订单是否都已收货
|
||||
@ -2894,15 +2968,30 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
if (allCompleted) {
|
||||
outsourcedTask.setStatus("已完成");
|
||||
} else {
|
||||
if (hasStatusThree(orderNoDetailDOS)) {
|
||||
outsourcedTask.setStatus("已开始");
|
||||
outsourcedTask.setStatusFlag("0");
|
||||
} else {
|
||||
if (ObjectUtil.isNotEmpty(dispatchDetailDOS)){
|
||||
if (ObjectUtil.isNotEmpty(purchaseOrderMakeDetailDOS)) {
|
||||
outsourcedTask.setStatus("已开始");
|
||||
outsourcedTask.setStatusFlag("0");
|
||||
} else {
|
||||
outsourcedTask.setStatus("未开始");
|
||||
}
|
||||
}else{
|
||||
outsourcedTask.setStatus("未开始");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
// 计算派工数量
|
||||
private BigDecimal calculateDispatchTime(List<TaskDispatchDetailDO> detailDOS) {
|
||||
return Optional.ofNullable(detailDOS)
|
||||
.orElse(Collections.emptyList())
|
||||
.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.map(TaskDispatchDetailDO::getWorkTime)
|
||||
.filter(Objects::nonNull)
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
// 计算派工数量
|
||||
private BigDecimal calculateDispatchAmount(List<TaskDispatchDetailDO> detailDOS) {
|
||||
return Optional.ofNullable(detailDOS)
|
||||
.orElse(Collections.emptyList())
|
||||
@ -2941,6 +3030,14 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
.filter(Objects::nonNull)
|
||||
.allMatch(item -> item.getReceivingStatus() == 3)&&purchaseOrderNoDetailDOS.size()==dispatchDetailDOS.size();
|
||||
}
|
||||
// 查询采购订单送审详情
|
||||
private List<PurchaseOrderMakeDetailDO> queryPurchaseOrderMakeDetails(Long projectSubId) {
|
||||
return purchaseOrderMakeDetailMapper.selectList(
|
||||
new LambdaQueryWrapper<PurchaseOrderMakeDetailDO>()
|
||||
.eq(PurchaseOrderMakeDetailDO::getProjectPlanSubId, projectSubId)
|
||||
.isNotNull(PurchaseOrderMakeDetailDO::getBoomDetailId)
|
||||
);
|
||||
}
|
||||
|
||||
private List<PurchaseOrderNoDetailDO> queryPurchaseOrderDetails(Long projectSubId) {
|
||||
return purchaseOrderNoDetailMapper.selectList(
|
||||
@ -2992,7 +3089,7 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
}
|
||||
|
||||
// 3. 提取状态判断逻辑
|
||||
private void setTaskStatus(PlanSubDetailDO designTask, List<PlanSubDetailDO> planSubDetail) {
|
||||
private void setTaskStatus(PlanSubDetailDO designTask, List<PlanSubDetailDO> planSubDetail,Long projectSubId) {
|
||||
if (CollectionUtils.isEmpty(planSubDetail)) {
|
||||
return;
|
||||
}
|
||||
@ -3005,17 +3102,33 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
designTask.setStatus("已完成");
|
||||
designTask.setProductionSchedule("100");
|
||||
} else {
|
||||
boolean hasStarted = planSubDetail.stream()
|
||||
.filter(Objects::nonNull)
|
||||
.anyMatch(item -> item.getIsOverProcess() == 1);
|
||||
// boolean hasStarted = planSubDetail.stream()
|
||||
// .filter(Objects::nonNull)
|
||||
// .anyMatch(item -> item.getIsOverProcess() == 1);
|
||||
LambdaQueryWrapper<ProcessDesignDO> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(ProcessDesignDO::getProjectSubId, projectSubId);
|
||||
List<ProcessDesignDO> processDesigns = processDesignMapper.selectList(queryWrapper);
|
||||
List<Long> processDesignIds = processDesigns.stream()
|
||||
.map(ProcessDesignDO::getId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
designTask.setStatus(hasStarted ? "已开始" : "未开始");
|
||||
if (hasStarted) {
|
||||
designTask.setStatusFlag("0");
|
||||
}
|
||||
// 获取工艺设计进度列表
|
||||
List<ProcessDesignProgressDO> progressList = getProcessDesignProgressList(processDesignIds);
|
||||
designTask.setStatus(ObjectUtil.isNotEmpty(progressList) ? "已开始" : "未开始");
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 获取工艺设计进度列表
|
||||
*/
|
||||
private List<ProcessDesignProgressDO> getProcessDesignProgressList(List<Long> processDesignIds) {
|
||||
if (ObjectUtil.isEmpty(processDesignIds)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
LambdaQueryWrapper<ProcessDesignProgressDO> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.in(ProcessDesignProgressDO::getProcessDesignId, processDesignIds);
|
||||
return processDesignProgressMapper.selectList(queryWrapper);
|
||||
}
|
||||
// 4. 提取进度计算逻辑
|
||||
private void calculateAndSetProgress(PlanSubDetailDO designTask, Long projectSubId) {
|
||||
if (projectSubId == null) return;
|
||||
@ -3031,7 +3144,12 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
designTask.setProductionSchedule("0");
|
||||
return;
|
||||
}
|
||||
List<ProcessDesignDO> collect = processDesigns.stream()
|
||||
.filter(processDesignDO -> processDesignDO.getIsOverProcess() != 1).collect(Collectors.toList());
|
||||
List<ProcessDesignDO> collect1 = processDesigns.stream()
|
||||
.filter(processDesignDO -> processDesignDO.getIsOverProcess() == 1).collect(Collectors.toList());
|
||||
List<Long> ids = processDesigns.stream()
|
||||
.filter(processDesignDO -> processDesignDO.getIsOverProcess() != 1)
|
||||
.map(ProcessDesignDO::getId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
@ -3048,7 +3166,28 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
wrapper1.last("limit 1");
|
||||
PlanSubDO subDO = planSubMapper.selectOne(wrapper1);
|
||||
|
||||
BigDecimal currentTime = calculateCurrentTime(subDO).multiply(new BigDecimal("8"));
|
||||
BigDecimal currentTime = calculateCurrentTime(subDO,collect);
|
||||
for (ProcessDesignDO processDesignDO : collect1) {
|
||||
if ("BLUEPRINT_3D".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getThreeDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getThreeDimNum().toString()));
|
||||
totalWorkTime = totalWorkTime.add(new BigDecimal(subDO.getThreeDimNum().toString()).multiply(new BigDecimal("8")));
|
||||
}
|
||||
}
|
||||
if ("BLUEPRINT_WORKBLANK".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getBlankNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getBlankNum().toString()));
|
||||
totalWorkTime = totalWorkTime.add(new BigDecimal(subDO.getBlankNum().toString()).multiply(new BigDecimal("8")));
|
||||
}
|
||||
}
|
||||
if ("BLUEPRINT_2D".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getTwoDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getTwoDimNum().toString()));
|
||||
totalWorkTime = totalWorkTime.add(new BigDecimal(subDO.getTwoDimNum().toString()).multiply(new BigDecimal("8")));
|
||||
}
|
||||
}
|
||||
}
|
||||
currentTime = currentTime.multiply(new BigDecimal("8"));
|
||||
Integer percentage = calculatePercentage(totalWorkTime, currentTime);
|
||||
|
||||
designTask.setProductionSchedule(percentage.toString());
|
||||
@ -3093,7 +3232,7 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
designTask.setStatusFlag(isOverdue ? "1" : "");
|
||||
}
|
||||
}
|
||||
} else if (maxTime != null && now.isAfter(maxTime)) {
|
||||
} else if (maxTime != null && now.toLocalDate().isAfter(maxTime.toLocalDate())) {
|
||||
designTask.setStatusFlag("1");
|
||||
}
|
||||
}
|
||||
@ -3119,26 +3258,31 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||
}
|
||||
/**
|
||||
* 计算总工时(将三个数值相加)
|
||||
* 计算当前工时(将三个数值相加)
|
||||
*/
|
||||
private BigDecimal calculateCurrentTime(PlanSubDO subDO) {
|
||||
private BigDecimal calculateCurrentTime(PlanSubDO subDO,List<ProcessDesignDO> collect) {
|
||||
BigDecimal currentTime = BigDecimal.ZERO;
|
||||
|
||||
if (ObjectUtil.isNotEmpty(subDO.getBlankNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getBlankNum().toString()));
|
||||
for (ProcessDesignDO processDesignDO : collect) {
|
||||
if ("BLUEPRINT_3D".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getThreeDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getThreeDimNum().toString()));
|
||||
}
|
||||
}
|
||||
if ("BLUEPRINT_WORKBLANK".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getBlankNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getBlankNum().toString()));
|
||||
}
|
||||
}
|
||||
if ("BLUEPRINT_2D".equals(processDesignDO.getProcessDesignType())){
|
||||
if (ObjectUtil.isNotEmpty(subDO.getTwoDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getTwoDimNum().toString()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ObjectUtil.isNotEmpty(subDO.getThreeDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getThreeDimNum().toString()));
|
||||
}
|
||||
|
||||
if (ObjectUtil.isNotEmpty(subDO.getTwoDimNum())) {
|
||||
currentTime = currentTime.add(new BigDecimal(subDO.getTwoDimNum().toString()));
|
||||
}
|
||||
|
||||
return currentTime;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 判断 Date 是否在 LocalDateTime 之后
|
||||
*/
|
||||
@ -3151,7 +3295,7 @@ if (ObjectUtil.isNotEmpty(progressList)){
|
||||
.atZone(ZoneId.systemDefault())
|
||||
.toLocalDateTime();
|
||||
|
||||
return dateAsLocalDateTime.isAfter(localDateTime);
|
||||
return dateAsLocalDateTime.toLocalDate().isAfter(localDateTime.toLocalDate());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -112,4 +112,6 @@ public interface TaskDispatchService {
|
||||
PageResult<TaskDispatchDetailDO> taskPage( TaskPlanJDBaoBiaoPageReqVO pageReqVO);
|
||||
|
||||
PageResult<TaskDispatchDetailDO> taskBbPage(TaskPlanJDBaoBiaoPageReqVO pageReqVO);
|
||||
|
||||
PageResult<TaskDispatchDetailDO> getTaskDispatchPageDetailXl(TaskDispatchDetailPageReqVO pageReqVO);
|
||||
}
|
||||
|
||||
@ -264,13 +264,19 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
|
||||
for (TaskDispatchDetailDO dispatchDetailDO : list) {
|
||||
TaskDispatchDetailDO taskDispatchDetailDO = taskDispatchDetailMapper.selectById(dispatchDetailDO.getId());
|
||||
if (ObjectUtil.isNotEmpty(taskDispatchDetailDO)){
|
||||
ProcedureDO procedureDO = procedureMapper.selectById(dispatchDetailDO.getProcedureId());
|
||||
if ("false".equals(dispatchDetailDO.getIsOutsourcing())){
|
||||
if (ObjectUtil.isNotEmpty(taskDispatchDetailDO.getPurchaseNo())){
|
||||
ProcedureDO procedureDO = procedureMapper.selectById(dispatchDetailDO.getProcedureId());
|
||||
if (ObjectUtil.isNotEmpty(procedureDO)){
|
||||
throw exception(new ErrorCode(400,"该工序"+procedureDO.getName()+"已做零件采购,不允许去掉外协,请确认!"));
|
||||
}
|
||||
}
|
||||
}else{
|
||||
// if (taskDispatchDetailDO.getInReportProcess()!=0){
|
||||
// if (ObjectUtil.isNotEmpty(procedureDO)) {
|
||||
// throw exception(new ErrorCode(400, "该工序" + procedureDO.getName() + "已做下料,不允许修改外协!"));
|
||||
// }
|
||||
// }
|
||||
}
|
||||
// if (isDetailChanged(taskDispatchDetailDO, dispatchDetailDO)) {
|
||||
// if (taskDispatchDetailDO.getPlanStatus()==1){
|
||||
@ -688,6 +694,9 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
|
||||
}
|
||||
}
|
||||
}
|
||||
// if (ObjectUtil.isNotEmpty(taskDispatchDetailDO)&&taskDispatchDetailDO.getReportProcess()!=0){
|
||||
// throw exception(new ErrorCode(400,"该工序已做下料报工,不允许删除"));
|
||||
// }
|
||||
LambdaQueryWrapper<TaskDispatchDO> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(TaskDispatchDO::getId, taskDispatchDetailDO.getDispatchId());
|
||||
TaskDispatchDO taskDispatchDO = taskDispatchMapper.selectOne(queryWrapper);
|
||||
@ -1054,7 +1063,7 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
|
||||
// bdgzsomthingMapper.updateById(bdgzsomthingDO);
|
||||
// }
|
||||
// }
|
||||
if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && taskDispatchDetailDO.getTestYn().equals("N")&&taskDispatchDetailDO.getCheckYn().equals("0")){
|
||||
if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && taskDispatchDetailDO.getTestYn().equals("N")&&taskDispatchDetailDO.getCheckYn()==0){
|
||||
pgMasterService.insertPgList(planDO.getId(),planDO.getProjectId(),taskDispatchDO.getBomDetailId(),taskDispatchDetailDO);
|
||||
}
|
||||
// if (taskDispatchDO.getDispatchType().equals("PRODUCTION") && isBomDetailProductionOver){
|
||||
@ -1571,6 +1580,22 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
|
||||
return taskDispatchDetailMapper.taskBbPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<TaskDispatchDetailDO> getTaskDispatchPageDetailXl(TaskDispatchDetailPageReqVO pageReqVO) {
|
||||
List<FpUserDetailDO> fpUserDetailDOS = fpUserDetailMapper.selectList(new LambdaQueryWrapper<FpUserDetailDO>().eq(FpUserDetailDO::getBusyId, pageReqVO.getOwner()));
|
||||
// Set<String> postIds = new HashSet<>();
|
||||
// Set<String> procedureIds = new HashSet<>();
|
||||
Map<String,Set<Long>> postIds = new HashMap<>();
|
||||
for (FpUserDetailDO fpUserDetailDO : fpUserDetailDOS) {
|
||||
if (ObjectUtil.isNotEmpty(fpUserDetailDO.getPostId())&&ObjectUtil.isNotEmpty(fpUserDetailDO.getProcCd())){
|
||||
postIds.put(fpUserDetailDO.getPostId(), fpUserDetailDO.getProcCd());
|
||||
}else if (ObjectUtil.isNotEmpty(fpUserDetailDO.getPostId())){
|
||||
postIds.put(fpUserDetailDO.getPostId(), null);
|
||||
}
|
||||
}
|
||||
return taskDispatchDetailMapper.selectPageXl(pageReqVO, postIds);
|
||||
}
|
||||
|
||||
private void updateAssembleDetail(OperateTypeEnum operateTypeEnum,Long dispatchId, List<TaskDispatchDetailOwnerDO> list) {
|
||||
list.forEach(o -> o.setDispatchId(dispatchId));
|
||||
|
||||
@ -1685,15 +1710,23 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
|
||||
list = list.stream()
|
||||
.peek(item -> {
|
||||
item.setDispatchId(dispatchId);
|
||||
ProcedureDO procedureDO = procedureMapper.selectById(item.getProcedureId());
|
||||
if ("true".equals(item.getIsOutsourcing())) {
|
||||
// 外协处理逻辑
|
||||
item.setIsOutsourcing("Y");
|
||||
item.setIsReport(0);
|
||||
}else {
|
||||
// if (ObjectUtil.isNotEmpty(procedureDO)) {
|
||||
// if ("下料1".equals(procedureDO.getName())||"下料2".equals(procedureDO.getName())) {
|
||||
// item.setIsInProcess("N");
|
||||
// }
|
||||
// }
|
||||
}else {
|
||||
item.setIsOutsourcing("N");
|
||||
ProcedureDO procedureDO = procedureMapper.selectById(item.getProcedureId());
|
||||
if (ObjectUtil.isNotEmpty(procedureDO)){
|
||||
item.setIsReport(procedureDO.getIsReport());
|
||||
// if ("下料1".equals(procedureDO.getName())||"下料2".equals(procedureDO.getName())) {
|
||||
// item.setIsInProcess("Y");
|
||||
// }
|
||||
}
|
||||
}
|
||||
if ("true".equals(item.getIsFoam())) {
|
||||
|
||||
@ -18,78 +18,78 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2"> 发货编号 </td>
|
||||
<td colspan="7">
|
||||
<td colspan="3">
|
||||
<span>{{ formData.code }}</span>
|
||||
</td>
|
||||
<td colspan="2">合同号</td>
|
||||
<td>合同号</td>
|
||||
<td colspan="2">{{ formData.contractNo }}</td>
|
||||
<td colspan="2"> 性质: </td>
|
||||
<td colspan="4">{{ formData.property }} </td>
|
||||
<td> 性质: </td>
|
||||
<td>{{ formData.property }} </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tr>
|
||||
<td colspan="2"> 发货日期 </td>
|
||||
<td colspan="7">
|
||||
<td colspan="3">
|
||||
{{ formatDate(new Date(formData.deliverDate), 'YYYY-MM-DD') }}
|
||||
</td>
|
||||
<td colspan="2"> 联系人</td>
|
||||
<td colspan="2">{{ formData.receivePersonName }} </td>
|
||||
<td colspan="2"> 电话 </td>
|
||||
<td colspan="4">{{ formData.receivePersonMobile }} </td>
|
||||
<td> 联系人</td>
|
||||
<td>{{ formData.receivePersonName }} </td>
|
||||
<td> 电话 </td>
|
||||
<td colspan="2">{{ formData.receivePersonMobile }} </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"> 收货单位 </td>
|
||||
<td colspan="17">{{ formData.customerName }}</td>
|
||||
<td colspan="8">{{ formData.customerName }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"> 收货地址 </td>
|
||||
<td colspan="17">{{ formData.receiveAddress }}</td>
|
||||
<td colspan="8">{{ formData.receiveAddress }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"> 项目名称</td>
|
||||
<td colspan="9" :style="fontSizeStyle">{{ formData.projectName }}</td>
|
||||
<td colspan="2">重量(T)</td>
|
||||
<td colspan="2">{{ formData.transportWeight }}</td>
|
||||
<td colspan="2">位置(米)</td>
|
||||
<td colspan="2">{{ formData.transportSize }}</td>
|
||||
<td colspan="4">{{ formData.projectName }}</td>
|
||||
<td>重量(T)</td>
|
||||
<td>{{ formData.transportWeight }}</td>
|
||||
<td>位置(米)</td>
|
||||
<td>{{ formData.transportSize }}</td>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="7"> 内容清单 </td>
|
||||
<td colspan="2"> 单位 </td>
|
||||
<td colspan="2"> 数量 </td>
|
||||
<td colspan="2">重量(T)</td>
|
||||
<td colspan="2">尺寸(米)</td>
|
||||
<td colspan="4"> 备注 </td>
|
||||
<td colspan="4"> 内容清单 </td>
|
||||
<td> 单位 </td>
|
||||
<td> 数量 </td>
|
||||
<td>重量(T)</td>
|
||||
<td>尺寸(米)</td>
|
||||
<td colspan="2"> 备注 </td>
|
||||
</tr>
|
||||
<tr v-show="subTotalAmount <= splitThreshold" v-for="(item, index) in formData.deliverOrderSubs" :key="index">
|
||||
<td colspan="7" v-if="item.category == 'DELIVER_LIST'">{{ item.name }}</td>
|
||||
<td colspan="7" v-if="item.category== 'OTHER_LIST' && item.subType == 1">备件:{{ item.name }}</td>
|
||||
<td colspan="7" v-if="item.category== 'OTHER_LIST' && item.subType == 2">刀具:{{ item.name }}</td>
|
||||
<td colspan="2">{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, item.unit) }}</td>
|
||||
<td colspan="2">{{ item.amount }}</td>
|
||||
<td colspan="2">{{ item.weight }}</td>
|
||||
<td colspan="2">{{ item.size }}</td>
|
||||
<td colspan="4">{{ item.remark }}</td>
|
||||
<td colspan="4" v-if="item.category == 'DELIVER_LIST'">{{ item.name }}</td>
|
||||
<td colspan="4" v-if="item.category== 'OTHER_LIST' && item.subType == 1">备件:{{ item.name }}</td>
|
||||
<td colspan="4" v-if="item.category== 'OTHER_LIST' && item.subType == 2">刀具:{{ item.name }}</td>
|
||||
<td>{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, item.unit) }}</td>
|
||||
<td>{{ item.amount }}</td>
|
||||
<td>{{ item.weight }}</td>
|
||||
<td>{{ item.size }}</td>
|
||||
<td colspan="2">{{ item.remark }}</td>
|
||||
</tr>
|
||||
<tr v-if="subTotalAmount > splitThreshold">
|
||||
<td colspan="7">详见清单附件</td>
|
||||
<td colspan="4">详见清单附件</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<tr v-for="item in num" :key="item">
|
||||
<td colspan="7"> </td>
|
||||
<td colspan="4"> </td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="19">{{formData.remark?formData.remark:' '}}</td>
|
||||
<td colspan="10">{{formData.remark?formData.remark:' '}}</td>
|
||||
<!-- <td></td>-->
|
||||
<!-- <td></td>-->
|
||||
<!-- <td></td>-->
|
||||
@ -99,33 +99,33 @@
|
||||
</tbody>
|
||||
<tr>
|
||||
<td colspan="2"> 发货单位 </td>
|
||||
<td colspan="7">
|
||||
<td colspan="3">
|
||||
{{ formData.deliverCompany }}
|
||||
</td>
|
||||
<td colspan="2"> 联系人</td>
|
||||
<td colspan="2">{{ formData.deliverPersonName }} </td>
|
||||
<td colspan="2"> 电话 </td>
|
||||
<td colspan="4">{{ formData.deliverPersonMobile }} </td>
|
||||
<td> 联系人</td>
|
||||
<td>{{ formData.deliverPersonName }} </td>
|
||||
<td> 电话 </td>
|
||||
<td colspan="2">{{ formData.deliverPersonMobile }} </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"> 司机姓名 </td>
|
||||
<td colspan="5" v-if="formData.transportDriverName">
|
||||
<td colspan="2" v-if="formData.transportDriverName">
|
||||
{{ formData.transportDriverName }}
|
||||
</td>
|
||||
<td colspan="5" v-else style="width: 60px"></td>
|
||||
<td colspan="2">车牌号</td>
|
||||
<td colspan="4" v-if="formData.transportBusNumber">{{ formData.transportBusNumber }}</td>
|
||||
<td colspan="4" v-else style="width: 50px"></td>
|
||||
<td colspan="2"> 电话 </td>
|
||||
<td colspan="4" v-if="formData.transportDriverMobile">{{ formData.transportDriverMobile }}
|
||||
<td colspan="2" v-else style="width: 60px"></td>
|
||||
<td>车牌号</td>
|
||||
<td colspan="2" v-if="formData.transportBusNumber">{{ formData.transportBusNumber }}</td>
|
||||
<td colspan="2" v-else style="width: 50px"></td>
|
||||
<td> 电话 </td>
|
||||
<td colspan="2" v-if="formData.transportDriverMobile">{{ formData.transportDriverMobile }}
|
||||
</td>
|
||||
<td colspan="4" v-else style="width: 50px"></td>
|
||||
<td colspan="2" v-else style="width: 50px"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="9">
|
||||
<td colspan="5">
|
||||
<div style="text-align: left">内部货物门点人签名:</div>
|
||||
</td>
|
||||
<td colspan="10">
|
||||
<td colspan="5">
|
||||
<div style="text-align: left">收货人签名:</div>
|
||||
</td>
|
||||
</tr>
|
||||
@ -151,77 +151,77 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="2"> 发货编号 </td>
|
||||
<td colspan="7">
|
||||
<td colspan="3">
|
||||
<span>{{ formData.code }}</span>
|
||||
</td>
|
||||
<td colspan="2">合同号</td>
|
||||
<td>合同号</td>
|
||||
<td colspan="2">{{ formData.contractNo }}</td>
|
||||
<td colspan="2"> 性质: </td>
|
||||
<td colspan="4">{{ formData.property }} </td>
|
||||
<td> 性质: </td>
|
||||
<td>{{ formData.property }} </td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tr>
|
||||
<td colspan="2"> 发货日期 </td>
|
||||
<td colspan="7">
|
||||
<td colspan="3">
|
||||
{{ formatDate(new Date(formData.deliverDate), 'YYYY-MM-DD') }}
|
||||
</td>
|
||||
<td colspan="2 "> 联系人</td>
|
||||
<td colspan="2">{{ formData.receivePersonName }} </td>
|
||||
<td colspan="2"> 电话 </td>
|
||||
<td colspan="4">{{ formData.receivePersonMobile }} </td>
|
||||
<td> 联系人</td>
|
||||
<td>{{ formData.receivePersonName }} </td>
|
||||
<td> 电话 </td>
|
||||
<td colspan="2">{{ formData.receivePersonMobile }} </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"> 收货单位 </td>
|
||||
<td colspan="17">{{ formData.customerName }}</td>
|
||||
<td colspan="8">{{ formData.customerName }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"> 收货地址 </td>
|
||||
<td colspan="17">{{ formData.receiveAddress }}</td>
|
||||
<td colspan="8">{{ formData.receiveAddress }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"> 项目名称</td>
|
||||
<td colspan="9" :style="fontSizeStyle">{{ formData.projectName }}</td>
|
||||
<td colspan="2">重量(T)</td>
|
||||
<td colspan="2">{{ formData.transportWeight }}</td>
|
||||
<td colspan="2">位置(米)</td>
|
||||
<td colspan="2">{{ formData.transportSize }}</td>
|
||||
<td colspan="2"> 项目名称 收货单位</td>
|
||||
<td colspan="4" >{{ formData.projectName }}</td>
|
||||
<td>重量(T)</td>
|
||||
<td>{{ formData.transportWeight }}</td>
|
||||
<td>位置(米)</td>
|
||||
<td>{{ formData.transportSize }}</td>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td colspan="7"> 内容清单 </td>
|
||||
<td colspan="2"> 单位 </td>
|
||||
<td colspan="2"> 数量 </td>
|
||||
<td colspan="2">重量(T)</td>
|
||||
<td colspan="2">尺寸(米)</td>
|
||||
<td colspan="4"> 备注 </td>
|
||||
<td colspan="4"> 内容清单 </td>
|
||||
<td> 单位 </td>
|
||||
<td> 数量 </td>
|
||||
<td>重量(T)</td>
|
||||
<td>尺寸(米)</td>
|
||||
<td colspan="2"> 备注 </td>
|
||||
</tr>
|
||||
<tr v-show="subTotalAmount <= splitThreshold" v-for="(item, index) in formData.deliverOrderSubs" :key="index">
|
||||
<td colspan="7">{{ item.name }}</td>
|
||||
<td colspan="2">{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, item.unit) }}</td>
|
||||
<td colspan="2">{{ item.amount }}</td>
|
||||
<td colspan="2">{{ item.weight }}</td>
|
||||
<td colspan="2">{{ item.size }}</td>
|
||||
<td colspan="4">{{ item.remark }}</td>
|
||||
<td colspan="4">{{ item.name }}</td>
|
||||
<td>{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, item.unit) }}</td>
|
||||
<td>{{ item.amount }}</td>
|
||||
<td>{{ item.weight }}</td>
|
||||
<td>{{ item.size }}</td>
|
||||
<td colspan="2">{{ item.remark }}</td>
|
||||
</tr>
|
||||
<tr v-if="subTotalAmount > splitThreshold">
|
||||
<td colspan="7">详见清单附件</td>
|
||||
<td colspan="4">详见清单附件</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
|
||||
<tr v-for="item in num" :key="item">
|
||||
<td colspan="7"> </td>
|
||||
<td colspan="4"> </td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="2"></td>
|
||||
<td colspan="4"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="19">{{formData.remark?formData.remark:' '}}</td>
|
||||
<td colspan="10">{{formData.remark?formData.remark:' '}}</td>
|
||||
<!-- <td></td>-->
|
||||
<!-- <td></td>-->
|
||||
<!-- <td></td>-->
|
||||
@ -232,33 +232,33 @@
|
||||
|
||||
<tr>
|
||||
<td colspan="2"> 发货单位 </td>
|
||||
<td colspan="7">
|
||||
<td colspan="3">
|
||||
{{ formData.deliverCompany }}
|
||||
</td>
|
||||
<td colspan="2"> 联系人</td>
|
||||
<td colspan="2">{{ formData.deliverPersonName }} </td>
|
||||
<td colspan="2"> 电话 </td>
|
||||
<td colspan="4">{{ formData.deliverPersonMobile }} </td>
|
||||
<td> 联系人</td>
|
||||
<td>{{ formData.deliverPersonName }} </td>
|
||||
<td> 电话 </td>
|
||||
<td colspan="2">{{ formData.deliverPersonMobile }} </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"> 司机姓名 </td>
|
||||
<td colspan="5" v-if="formData.transportDriverName">
|
||||
<td colspan="2" v-if="formData.transportDriverName">
|
||||
{{ formData.transportDriverName }}
|
||||
</td>
|
||||
<td colspan="5" v-else style="width: 60px"></td>
|
||||
<td colspan="2">车牌号</td>
|
||||
<td colspan="4" v-if="formData.transportBusNumber">{{ formData.transportBusNumber }}</td>
|
||||
<td colspan="4" v-else style="width: 50px"></td>
|
||||
<td colspan="2"> 电话 </td>
|
||||
<td colspan="4" v-if="formData.transportDriverMobile">{{ formData.transportDriverMobile }}
|
||||
<td colspan="2" v-else style="width: 60px"></td>
|
||||
<td>车牌号</td>
|
||||
<td colspan="2" v-if="formData.transportBusNumber">{{ formData.transportBusNumber }}</td>
|
||||
<td colspan="2" v-else style="width: 50px"></td>
|
||||
<td> 电话 </td>
|
||||
<td colspan="2" v-if="formData.transportDriverMobile">{{ formData.transportDriverMobile }}
|
||||
</td>
|
||||
<td colspan="4" v-else style="width: 50px"></td>
|
||||
<td colspan="2" v-else style="width: 50px"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="9">
|
||||
<td colspan="5">
|
||||
<div style="text-align: left">内部货物门点人签名:</div>
|
||||
</td>
|
||||
<td colspan="10">
|
||||
<td colspan="5">
|
||||
<div style="text-align: left">收货人签名:</div>
|
||||
</td>
|
||||
</tr>
|
||||
@ -504,7 +504,6 @@ const onPrint = () => {
|
||||
}
|
||||
}
|
||||
table {
|
||||
table-layout: fixed;
|
||||
width: 100%; /* 让表格宽度100%占满其父元素宽度 */
|
||||
height: auto; /* 高度根据内容自适应 */
|
||||
font-size: 14px;
|
||||
@ -591,16 +590,7 @@ const subTotalAmount = ref(0)
|
||||
const num = ref(0)
|
||||
const splitThreshold = 6
|
||||
const logoDataUrl = ref('') // 存储Logo的Base64编码数据URL
|
||||
const fontSizeStyle = computed(() => {
|
||||
const projectName = formData.value?.projectName ?? ''
|
||||
return {
|
||||
textAlign: 'left',
|
||||
width: '100%',
|
||||
fontSize: projectName.length > 20
|
||||
? '13px !important'
|
||||
: '14px !important'
|
||||
}
|
||||
})
|
||||
|
||||
/** 打开弹窗 */
|
||||
const open = async (id: number) => {
|
||||
dialogVisible.value = true
|
||||
@ -692,7 +682,6 @@ onMounted(() => {})
|
||||
}
|
||||
}
|
||||
table {
|
||||
table-layout: fixed;
|
||||
width: 100%; /* 让表格宽度100%占满其父元素宽度 */
|
||||
height: auto; /* 高度根据内容自适应 */
|
||||
font-size: 14px;
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
</template>
|
||||
</el-card>
|
||||
<ContentWrap>
|
||||
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" height="250" border @row-click="rowClick" :cell-class-name="cellClassName5">
|
||||
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table custom-hover-table" height="250" border @row-click="rowClick" :cell-class-name="cellClassName5">
|
||||
<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="subType" />
|
||||
@ -34,6 +34,10 @@
|
||||
<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.statusflag" style="order: 1;" @change="change1"/>
|
||||
<span style="order: 2; margin-left: 10px;">不显示已完成</span>
|
||||
</label>
|
||||
</template>
|
||||
</el-card>
|
||||
<ContentWrap v-if="type=='sheji'">
|
||||
@ -59,6 +63,7 @@
|
||||
<el-table-column label="工序" align="center" prop="procedureName" />
|
||||
<el-table-column label="要求完成日期" align="center" prop="endTime" :formatter="dateFormatter2"/>
|
||||
<el-table-column label="负责人" align="center" prop="ownerName" />
|
||||
<el-table-column label="采购数量" align="center" prop="purchaseAmounts" />
|
||||
<el-table-column label="收货日期" align="center" prop="receivingTime" :formatter="dateFormatter2"/>
|
||||
<el-table-column label="零件采购" align="center" prop="partsProcurement" />
|
||||
<el-table-column label="派工单状态" align="center" prop="receiving" />
|
||||
@ -73,6 +78,7 @@
|
||||
<el-table-column label="预计开始时间" align="center" prop="startTime" :formatter="dateFormatter2"/>
|
||||
<el-table-column label="预计结束时间" align="center" prop="endTime" :formatter="dateFormatter2"/>
|
||||
<el-table-column label="负责人" align="center" prop="ownerName" />
|
||||
<el-table-column label="派工数量" align="center" prop="amount" />
|
||||
<el-table-column label="预计工时(天)" align="center" prop="workTime" />
|
||||
<el-table-column label="实际工时(天)" align="center" prop="workingHour" />
|
||||
<el-table-column label="报工进度(%)" align="center" prop="percentage" />
|
||||
@ -97,7 +103,7 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="过程检状态" align="center" prop="report" />
|
||||
<el-table-column label="负责人" align="center" prop="ownerName" />
|
||||
|
||||
<el-table-column label="报工时间" align="center" prop="endTime" :formatter="dateFormatter2"/>
|
||||
</el-table>
|
||||
</ContentWrap>
|
||||
<ContentWrap v-if="type=='zhuangpei'">
|
||||
@ -108,7 +114,9 @@
|
||||
<el-table-column label="预计开始时间" align="center" prop="startTime" :formatter="dateFormatter2"/>
|
||||
<el-table-column label="预计结束时间" align="center" prop="endTime" :formatter="dateFormatter2"/>
|
||||
<el-table-column label="负责人" align="center" prop="ownerName" />
|
||||
<el-table-column label="派工数量" align="center" prop="amount" />
|
||||
<el-table-column label="预计工时(天)" align="center" prop="workTime" />
|
||||
<el-table-column label="派工人数" align="center" prop="bgAmount" />
|
||||
<el-table-column label="实际工时(天)" align="center" prop="workingHour" />
|
||||
<el-table-column label="报工进度(%)" align="center" prop="percentage" />
|
||||
<el-table-column label="派工单状态" align="center" prop="report" />
|
||||
@ -141,24 +149,28 @@ const list3 = ref([]) // 加工数据
|
||||
const list4 = ref([]) // 过程检数据
|
||||
const list5 = ref([]) // 装配任务数据
|
||||
const type = ref('')
|
||||
const type1 = ref('')
|
||||
const formData = reactive({
|
||||
id:undefined,
|
||||
projectSubId:undefined,
|
||||
flag:true
|
||||
flag:true,
|
||||
statusflag:true
|
||||
})
|
||||
//初始化方法
|
||||
onMounted(async () => {
|
||||
console.log(query)
|
||||
formData.projectSubId = query.projectSubId
|
||||
getList()
|
||||
await getList()
|
||||
const queryParams = reactive({
|
||||
projectSubId:formData.projectSubId
|
||||
projectSubId:formData.projectSubId,
|
||||
statusflag:formData.statusflag
|
||||
})
|
||||
if (list.value){
|
||||
const hasDesignTask = list.value.some(item => item.subType === "设计任务");
|
||||
const hasDesignTask = list.value.some(item => item.subType == "设计任务");
|
||||
if (hasDesignTask){
|
||||
list1.value= await PlansubdetailApi.getList1(queryParams)
|
||||
type.value='sheji'
|
||||
type1.value='sheji'
|
||||
}
|
||||
}
|
||||
|
||||
@ -166,43 +178,90 @@ const formData = reactive({
|
||||
const change = (val) => {
|
||||
getList()
|
||||
}
|
||||
/** 处理某一行的点击 */
|
||||
const rowClick = async (row) => {
|
||||
console.log(row);
|
||||
const change1 =async (val) => {
|
||||
const queryParams = reactive({
|
||||
projectSubId:formData.projectSubId,
|
||||
statusflag:formData.statusflag
|
||||
})
|
||||
type.value=type1.value
|
||||
if (type.value=='sheji'){
|
||||
list1.value= await PlansubdetailApi.getList1(queryParams)
|
||||
if (list1.value.length<=0){
|
||||
type1.value=type.value
|
||||
type.value=''
|
||||
}
|
||||
|
||||
}else if (type.value=='waixei'){
|
||||
list2.value= await PlansubdetailApi.getList2(queryParams)
|
||||
if (list2.value.length<=0){
|
||||
type1.value=type.value
|
||||
type.value=''
|
||||
}
|
||||
}else if (type.value=='jiagong'){
|
||||
list3.value= await PlansubdetailApi.getList3(queryParams)
|
||||
if (list3.value.length<=0){
|
||||
type1.value=type.value
|
||||
type.value=''
|
||||
}
|
||||
}else if (type.value=='guochengjian'){
|
||||
list4.value= await PlansubdetailApi.getList4(queryParams)
|
||||
if (list4.value.length<=0){
|
||||
type1.value=type.value
|
||||
type.value=''
|
||||
}
|
||||
}else if (type.value=='zhuangpei'){
|
||||
list5.value= await PlansubdetailApi.getList5(queryParams)
|
||||
console.log(list5.value.length)
|
||||
if (list5.value.length<=0){
|
||||
type1.value=type.value
|
||||
type.value=''
|
||||
}
|
||||
}
|
||||
}
|
||||
/** 处理某一行的点击 */
|
||||
const rowClick = async (row) => {
|
||||
console.log(type1.value);
|
||||
const queryParams = reactive({
|
||||
projectSubId:formData.projectSubId,
|
||||
statusflag:formData.statusflag
|
||||
})
|
||||
type.value=''
|
||||
|
||||
if (row.subType=='设计任务'){
|
||||
list1.value= await PlansubdetailApi.getList1(queryParams)
|
||||
if (list1.value.length>0){
|
||||
type.value='sheji'
|
||||
}
|
||||
type1.value='sheji'
|
||||
}else if (row.subType=='外协任务'){
|
||||
list2.value= await PlansubdetailApi.getList2(queryParams)
|
||||
if (list2.value.length>0){
|
||||
type.value='waixei'
|
||||
}
|
||||
type1.value='waixei'
|
||||
}else if (row.subType=='加工任务'){
|
||||
list3.value= await PlansubdetailApi.getList3(queryParams)
|
||||
if (list3.value.length>0){
|
||||
type.value='jiagong'
|
||||
}
|
||||
type1.value='jiagong'
|
||||
}else if (row.subType=='过程检任务'){
|
||||
list4.value= await PlansubdetailApi.getList4(queryParams)
|
||||
if (list4.value.length>0){
|
||||
type.value='guochengjian'
|
||||
}
|
||||
type1.value='guochengjian'
|
||||
}else{
|
||||
list5.value= await PlansubdetailApi.getList5(queryParams)
|
||||
if (list5.value.length>0){
|
||||
type.value='zhuangpei'
|
||||
}
|
||||
type1.value='zhuangpei'
|
||||
}
|
||||
}
|
||||
const cellClassName = ({ row,column }) => {
|
||||
if (column.label === '任务状态' && row.statusFlag) {
|
||||
return row.statusFlag === '1' ? 'warning-row1' : row.statusFlag === '0' ?'warning-row2':"";
|
||||
return row.statusFlag === '1' ? 'warning-row1' :"";
|
||||
}
|
||||
|
||||
}
|
||||
@ -228,7 +287,7 @@ const cellClassName4 = ({ row,column }) => {
|
||||
}
|
||||
const cellClassName5 = ({ row,column }) => {
|
||||
if (column.label === '工单状态' && row.statusFlag) {
|
||||
return row.statusFlag === '1' ? 'warning-row1' : row.statusFlag === '0' ?'warning-row2':"";
|
||||
return row.statusFlag === '1' ? 'warning-row1' :"";
|
||||
}
|
||||
|
||||
}
|
||||
@ -249,22 +308,32 @@ const getList = async () => {
|
||||
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.hl-card .alter-class {
|
||||
position: relative;
|
||||
border: solid 1px orange;
|
||||
outline: solid 1px orange;
|
||||
}
|
||||
.warning-row1 {
|
||||
background-color:#F08080 !important;
|
||||
}
|
||||
.warning-row2 {
|
||||
background-color: #1E90FF !important; /* 道奇蓝 */
|
||||
}
|
||||
<style scoped>
|
||||
|
||||
:deep(.warning-row1) {
|
||||
background-color:#d9001b !important;
|
||||
}
|
||||
|
||||
.large-checkbox {
|
||||
transform: scale(1.5); /* 方法1:使用scale放大 */
|
||||
/* 或者 */
|
||||
/* 方法2:通过调整字体大小 */
|
||||
/* font-size: 18px; */
|
||||
}
|
||||
/* 添加 hover 效果 */
|
||||
.custom-hover-table ::v-deep .el-table__body tr:hover>td {
|
||||
background-color: #e8e8e8 !important;
|
||||
cursor: pointer; /* 如果需要鼠标变为手型 */
|
||||
}
|
||||
|
||||
/* 如果表格有固定列,也需要设置 hover 效果 */
|
||||
.custom-hover-table ::v-deep .el-table__fixed,
|
||||
.custom-hover-table ::v-deep .el-table__fixed-right {
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.custom-hover-table ::v-deep .el-table__fixed tr:hover>td,
|
||||
.custom-hover-table ::v-deep .el-table__fixed-right tr:hover>td {
|
||||
background-color: #e8e8e8 !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -42,19 +42,19 @@
|
||||
<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-input class="!w-265px" placeholder="项目名称" v-model="formData.projectName" readonly />
|
||||
</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"
|
||||
readonly 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-input class="!w-265px" placeholder="项目进度" v-model="formData.projectProgress" readonly />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
@ -63,19 +63,19 @@
|
||||
<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-input class="!w-265px" placeholder="工艺负责人" v-model="formData.craftOwnerName" readonly />
|
||||
</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"
|
||||
readonly 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" :class="{ 'red-background': formData.processFlag == '1' }" placeholder="工艺进度" v-model="formData.processProgress" disabled
|
||||
<el-input class=" !w-265px" :class="{ 'red-background': formData.processFlag == '1' }" placeholder="工艺进度" v-model="formData.processProgress" readonly
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -162,7 +162,7 @@ const formData = ref({
|
||||
const queryFormRef = ref() // 搜索的表单
|
||||
/** 查询列表 */
|
||||
const getList = async () => {
|
||||
if ((queryParams.projectCode==null||queryParams.projectCode=='')&&(queryParams.projectSubName==null||queryParams.projectSubName=='')&&(queryParams.projectName==null ||queryParams.projectName=='')) {
|
||||
if ((queryParams.projectCode==null||queryParams.projectCode=='')&&(queryParams.projectSubName==null||queryParams.projectSubName=='')&&(queryParams.projectName==null ||queryParams.projectName=='')&&(queryParams.customerName==null ||queryParams.customerName=='')) {
|
||||
message.error("必须输入查询条件查询")
|
||||
return
|
||||
}
|
||||
@ -179,19 +179,19 @@ const getList = async () => {
|
||||
|
||||
const cellClassName = ({ row,column }) => {
|
||||
if (column.label === '设计任务' && row.designTaskFlag) {
|
||||
return row.designTaskFlag === '1' ? 'warning-row1' :row.designTaskFlag === '0' ? 'warning-row2':"";
|
||||
return row.designTaskFlag === '1' ? 'warning-row1' :"";
|
||||
}
|
||||
if (column.label === '外协任务' && row.outsourcingTasksFlag) {
|
||||
return row.outsourcingTasksFlag === '1' ? 'warning-row1' :row.outsourcingTasksFlag === '0' ? 'warning-row2':"";
|
||||
return row.outsourcingTasksFlag === '1' ? 'warning-row1' :"";
|
||||
}
|
||||
if (column.label === '加工任务' && row.processingTaskFlag) {
|
||||
return row.processingTaskFlag === '1' ? 'warning-row1' : row.processingTaskFlag === '0' ?'warning-row2':"";
|
||||
return row.processingTaskFlag === '1' ? 'warning-row1' :"";
|
||||
}
|
||||
if (column.label === '过程检任务' && row.processInspectionFlag) {
|
||||
return row.processInspectionFlag === '1' ? 'warning-row1' : row.processInspectionFlag === '0' ? 'warning-row2':"";
|
||||
return row.processInspectionFlag === '1' ? 'warning-row1' :"";
|
||||
}
|
||||
if (column.label === '装配任务' && row.assemblyTaskFlag) {
|
||||
return row.assemblyTaskFlag === '1' ? 'warning-row1' : row.assemblyTaskFlag === '0' ?'warning-row2':"";
|
||||
return row.assemblyTaskFlag === '1' ? 'warning-row1' :"";
|
||||
}
|
||||
// return '';
|
||||
}
|
||||
@ -242,13 +242,13 @@ window.addEventListener('beforeunload', () => {
|
||||
<style scoped>
|
||||
|
||||
:deep(.warning-row1) {
|
||||
background-color:#F08080 !important;
|
||||
background-color:#d9001b !important;
|
||||
}
|
||||
:deep(.warning-row2) {
|
||||
background-color: #1E90FF !important; /* 道奇蓝 */
|
||||
}
|
||||
|
||||
.red-background :deep(.el-input__wrapper) {
|
||||
background-color: #F08080 !important;
|
||||
background-color: #d9001b !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -164,7 +164,7 @@ ref="multipleTableRef"
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item command="detail">查看详情</el-dropdown-item>
|
||||
<el-dropdown-item v-if="scope.row.orderStatus == 32" command="printProject">
|
||||
<el-dropdown-item v-if="scope.row.orderStatus == 32||scope.row.orderStatus == 16" command="printProject">
|
||||
打印开发项目启动单
|
||||
</el-dropdown-item>
|
||||
|
||||
|
||||
@ -145,18 +145,18 @@
|
||||
<tbody style="height: 50px;">
|
||||
<tr>
|
||||
<td style="width: 3.33%;font-weight: bolder;font-size: 16.5px !important;">序号</td>
|
||||
<td colspan="3" style="max-width: 120px;min-width: 200px;font-weight: bolder;font-size: 16.5px !important;">子项目名称</td>
|
||||
<td colspan="1" style="font-weight: bolder;font-size: 16.5px !important;">主要材料</td>
|
||||
<td colspan="2" style="font-weight: bolder;font-size: 16.5px !important;" >设备</td>
|
||||
<td colspan="1" style="height: 50px;font-weight: bolder;font-size: 16.5px !important;">数量<br/>(套)</td>
|
||||
<td colspan="1" style="font-weight: bolder;font-size: 16.5px !important;">备注</td>
|
||||
<td colspan="3" style="max-width: 120px;min-width: 200px;font-weight: bolder;font-size: 12px !important;">子项目名称</td>
|
||||
<td colspan="1" style="font-weight: bolder;font-size: 12px !important;">主要材料</td>
|
||||
<td colspan="2" style="font-weight: bolder;font-size: 12px !important;" >设备</td>
|
||||
<td colspan="1" style="height: 50px;font-weight: bolder;font-size:12px !important;">数量<br/>(套)</td>
|
||||
<td colspan="1" style="font-weight: bolder;font-size: 12px !important;">备注</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tbody style="height: 28px;">
|
||||
|
||||
<tr v-for="(item,idx) in formData.projectOrderSubs" :key="idx">
|
||||
<td colspan="1" style="max-width: 40px;min-width: 40px"> {{item.name ==null?' ': idx+1 }} </td>
|
||||
<td colspan="3" style="max-width: 120px;min-width: 200px;font-weight: bolder;text-align: left;font-size: 16.5px !important;">
|
||||
<td colspan="3" style="max-width: 120px;min-width: 200px;font-weight: bolder;text-align: left;font-size: 11.5px !important;">
|
||||
<!-- <div style="display: flex; flex-direction: column; justify-content: space-between"> -->
|
||||
{{item.name}}
|
||||
<!-- <span v-if="!item.projectSubShortName"> </span>
|
||||
@ -530,7 +530,7 @@ const onPrint = () => {
|
||||
background: white;
|
||||
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
|
||||
position: relative;
|
||||
font-size: 14px !important;
|
||||
font-size: 11.5px !important;
|
||||
}
|
||||
|
||||
@page {
|
||||
@ -578,7 +578,7 @@ const onPrint = () => {
|
||||
table {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
font-size: 14px;
|
||||
font-size: 11.5px;
|
||||
text-align: center;
|
||||
border-collapse: collapse;
|
||||
border: 2px solid #333;
|
||||
@ -862,9 +862,9 @@ const handleInitPlanSub = async (id) => {
|
||||
item.threeDimOwner = subTemp.threeDimOwner
|
||||
}
|
||||
})
|
||||
if(formData.value.projectOrderSubs.length < 20) {
|
||||
if(formData.value.projectOrderSubs.length < 18) {
|
||||
// 计算需要添加的空对象数量
|
||||
var numberOfItemsToAdd = 20 - formData.value.projectOrderSubs.length;
|
||||
var numberOfItemsToAdd = 18 - formData.value.projectOrderSubs.length;
|
||||
|
||||
// 循环并添加空对象到数组中
|
||||
for(var i = 0; i < numberOfItemsToAdd; i++) {
|
||||
@ -959,7 +959,7 @@ const resetForm = () => {
|
||||
background: white;
|
||||
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
|
||||
position: relative;
|
||||
font-size: 14px !important;
|
||||
font-size: 11.5px !important;
|
||||
}
|
||||
|
||||
@page {
|
||||
@ -982,7 +982,7 @@ const resetForm = () => {
|
||||
table {
|
||||
width: 100%; /* 让表格宽度100%占满其父元素宽度 */
|
||||
height: auto; /* 高度根据内容自适应 */
|
||||
font-size: 16px;
|
||||
font-size: 13.5px;
|
||||
text-align: center;
|
||||
border-collapse: collapse;
|
||||
margin-top: 5mm; /* 添加顶部外边距,替代原先的页内边距 */
|
||||
|
||||
@ -200,7 +200,7 @@ class="!w-260px" v-model="formData.requiredCompletedDate" type="date" value-form
|
||||
<el-checkbox label="电焊" size="default" border :disabled="disabledLabels.includes('电焊')"/>
|
||||
<el-checkbox label="编程" size="default" border :disabled="disabledLabels.includes('编程')"/>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-row>
|
||||
<el-checkbox label="下料1" size="default" border :disabled="disabledLabels.includes('下料1')"/>
|
||||
<el-checkbox label="车床1" size="default" border :disabled="disabledLabels.includes('车床1')"/>
|
||||
<el-checkbox label="磨床1" size="default" border :disabled="disabledLabels.includes('磨床1')" />
|
||||
@ -240,7 +240,7 @@ class="!w-260px" v-model="formData.requiredCompletedDate" type="date" value-form
|
||||
<el-checkbox label="热处理3" size="default" border :disabled="disabledLabels.includes('热处理3')" />
|
||||
<el-checkbox label="数控3" size="default" border :disabled="disabledLabels.includes('数控3')"/>
|
||||
<el-checkbox label="火花2" size="default" border :disabled="disabledLabels.includes('火花2')"/>
|
||||
|
||||
|
||||
|
||||
<!-- 2025 06 01 以下工序关闭 更新为上面的-->
|
||||
<!-- <el-checkbox label="铣床" size="large" border />
|
||||
@ -267,6 +267,7 @@ class="!w-260px" v-model="formData.requiredCompletedDate" type="date" value-form
|
||||
|
||||
<el-table-column fixed label="外协" align="center" width="60">
|
||||
<template #default="{ row }">
|
||||
<!-- <el-checkbox class="large-checkbox" v-model="row.isOutsourcing" @change="handleOutsourcingChange(row)" :disabled="getDisabledState2(row)||flag"/>-->
|
||||
<el-checkbox class="large-checkbox" v-model="row.isOutsourcing" @change="handleOutsourcingChange(row)" :disabled="getDisabledState2(row)"/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -478,7 +479,9 @@ v-model="row.deviceModel"
|
||||
|
||||
<el-table-column fixed="right" label="操作" align="center" min-width="90">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
<!-- v-if="'detail' != active && ((scope.row.purchaseNo ==null || scope.row.purchaseNo=='') && scope.row.reportProcess == 0&&formData.dispatchStatus != 2)&&!flag" link type="danger"-->
|
||||
|
||||
<el-button
|
||||
v-if="'detail' != active && ((scope.row.purchaseNo ==null || scope.row.purchaseNo=='') && scope.row.reportProcess == 0&&formData.dispatchStatus != 2)" link type="danger"
|
||||
size="small" @click.prevent="onDeleteItem(scope.row,scope.$index)">
|
||||
删除
|
||||
@ -1315,6 +1318,7 @@ const resetForm = () => {
|
||||
}
|
||||
|
||||
const subFormLoading = ref(false) // 子表单的加载中
|
||||
const flag = ref(false) // 是否下料报工
|
||||
const subFormRules = reactive({
|
||||
procedureName: [{
|
||||
required: true,
|
||||
@ -1394,6 +1398,9 @@ const queryData = async (id?: number) => {
|
||||
if(items.id == item.procedureId){
|
||||
checkList.value.push(items.name)
|
||||
disabledLabels.value.push(items.name)
|
||||
// if ((items.name=='下料1'||items.name=='下料2')&&item.inReportProcess!=0&& !item.isOutsourcing){
|
||||
// flag.value=true
|
||||
// }
|
||||
}
|
||||
})
|
||||
dispatchListTemp.value.push(JSON.parse(JSON.stringify(item)));
|
||||
@ -1987,7 +1994,7 @@ const printHandle = (id) => {
|
||||
top: 3px;
|
||||
width: 5px;
|
||||
} */
|
||||
.checkGroup{
|
||||
.checkGroup{
|
||||
white-space: nowrap;
|
||||
overflow: auto;
|
||||
.el-row{
|
||||
|
||||
@ -43,9 +43,9 @@
|
||||
</view>
|
||||
</view>
|
||||
<view is="pages/index/components/footRight">
|
||||
<view class="copy-right footRight--copy-right sk-transparent sk-text-14-2857-199 sk-text">Copyright ©上海长江云息数字科技有限公司,All Rights Reserved. 专注工业信息化-供应链解决方案</view>
|
||||
<view class="copy-right footRight--copy-right sk-transparent sk-text-14-2857-199 sk-text">Copyright ©上海云赛易数字技术有限公司,All Rights Reserved. 专注工业信息化-供应链解决方案</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
//
|
||||
</script>
|
||||
<template>
|
||||
<view class="copy-right">Copyright ©上海长江云息数字科技有限公司,All Rights Reserved. 专注工业信息化-供应链解决方案</view>
|
||||
<view class="copy-right">Copyright ©上海云赛易数字技术有限公司,All Rights Reserved. 专注工业信息化-供应链解决方案</view>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
@ -94,6 +94,13 @@ const categoryList = ref([
|
||||
imgUrl: "/static/images/pic_cgsh.png",
|
||||
defaultImgUrl: "/static/images/approveOrder-default.png",
|
||||
},
|
||||
{
|
||||
path: "productionInReport",
|
||||
name: "下料报工",
|
||||
auth: false,
|
||||
imgUrl: "/static/images/productionReport.png",
|
||||
defaultImgUrl: "/static/images/approveOrder-default.png",
|
||||
},
|
||||
]);
|
||||
const categoryList1 = ref([
|
||||
|
||||
|
||||
@ -125,7 +125,7 @@ const handleForget = () => {
|
||||
</view>
|
||||
<view class="foot">
|
||||
<view class="desc"> 请联系管理员获取工号和密码 </view>
|
||||
<view class="copy-right">Copyright ©上海长江云息数字科技有限公司,All Rights Reserved. 专注工业信息化-供应链解决方案</view>
|
||||
<view class="copy-right">Copyright ©上海云赛易数字技术有限公司,All Rights Reserved. 专注工业信息化-供应链解决方案</view>
|
||||
<view class="login" @tap="onSubmit"> 登录 </view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@ -90,7 +90,7 @@ const getUserInfoData = async () => {
|
||||
<view class="logout" @click="handleLogut">退出登录</view>
|
||||
</view>
|
||||
<view class="foot">
|
||||
<view class="copy-right">Copyright ©上海长江云息数字科技有限公司,All Rights Reserved. 专注工业信息化-供应链解决方案</view>
|
||||
<view class="copy-right">Copyright ©上海云赛易数字技术有限公司,All Rights Reserved. 专注工业信息化-供应链解决方案</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
@ -0,0 +1,559 @@
|
||||
<script setup lang="ts">
|
||||
import {onMounted, computed, ref, onUnmounted} from "vue";
|
||||
import {
|
||||
getListWxAPI,
|
||||
getTaskDetailAPI,
|
||||
} from "@/services/productionReport";
|
||||
import { useLoginStore } from "@/stores/modules/login";
|
||||
import { formatDate } from "@/utils/index";
|
||||
const userStore = useLoginStore();
|
||||
const userId = userStore.userInfo.userId;
|
||||
|
||||
// 是否分页结束
|
||||
const isFinish = ref(false);
|
||||
// 是否触发下拉刷新
|
||||
const isTriggered = ref(false);
|
||||
// 定义 porps
|
||||
const props = defineProps<{
|
||||
orderState: string;
|
||||
}>();
|
||||
const statusText = computed(() => {
|
||||
const text = props.orderState == "0,1" ? "去报工" : "查看";
|
||||
return text;
|
||||
});
|
||||
// 是否加载中标记,用于防止滚动触底触发多次请求
|
||||
const isLoading = ref(false);
|
||||
// 从本地存储获取搜索条件
|
||||
const getStoredSearchValue = () => {
|
||||
try {
|
||||
const stored = uni.getStorageSync(`search_${props.orderState}_${userId}`);
|
||||
return stored || "";
|
||||
} catch (error) {
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
// 保存搜索条件到本地存储
|
||||
const saveSearchValue = (value: string) => {
|
||||
try {
|
||||
uni.setStorageSync(`search_${props.orderState}_${userId}`, value);
|
||||
} catch (error) {
|
||||
console.error('保存搜索条件失败:', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 请求参数
|
||||
const queryParams: Required<any> = {
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
owner: userId, //
|
||||
procedureStatusList: props.orderState, // 工序完成状态列表
|
||||
dispatchType: "PRODUCTION", // 派工类型
|
||||
isReport: 1, // 是否需要报工
|
||||
//20250601新增,项目名称/子项目名称
|
||||
subOrDetailName: getStoredSearchValue(),
|
||||
};
|
||||
const dataList = ref([]);
|
||||
const getListData = async () => {
|
||||
if (props.orderState == "2") {
|
||||
queryParams.subOrDetailName = "";
|
||||
}
|
||||
// 如果数据出于加载中,退出函数
|
||||
if (isLoading.value) return;
|
||||
if (isFinish.value === true) {
|
||||
return uni.showToast({ icon: "none", title: "没有更多数据~" });
|
||||
}
|
||||
isLoading.value = true;
|
||||
// 发送请求
|
||||
const data = await getListWxAPI(queryParams);
|
||||
isLoading.value = false;
|
||||
// 数组追加
|
||||
dataList.value.push(...data.list);
|
||||
// 分页条件
|
||||
if (queryParams.pageNo < data.total) {
|
||||
// 页码累加
|
||||
queryParams.pageNo++;
|
||||
} else {
|
||||
// 分页已结束
|
||||
isFinish.value = true;
|
||||
}
|
||||
};
|
||||
const todayStr = ref("");
|
||||
const searchVal = ref("");
|
||||
onMounted(async () => {
|
||||
const today = new Date();
|
||||
const year = today.getFullYear();
|
||||
const month = String(today.getMonth() + 1).padStart(2, "0");
|
||||
const day = String(today.getDate()).padStart(2, "0");
|
||||
isFinish.value = false;
|
||||
isLoading.value = false;
|
||||
queryParams.pageNo = 1;
|
||||
todayStr.value = `${year}-${month}-${day}`;
|
||||
searchVal.value=getStoredSearchValue()
|
||||
queryParams.subOrDetailName=getStoredSearchValue()
|
||||
await getListData();
|
||||
});
|
||||
|
||||
const isScanning = ref(false)
|
||||
|
||||
const handleDetail = async (item) => {
|
||||
|
||||
const url = `/pages/productionReport/productionReport-detail?id=${item.id}`;
|
||||
uni.navigateTo({ url });
|
||||
};
|
||||
|
||||
// 自定义下拉刷新被触发
|
||||
const onRefresherrefresh = async () => {
|
||||
// 开始动画
|
||||
isTriggered.value = true;
|
||||
// 重置数据
|
||||
queryParams.pageNo = 1;
|
||||
dataList.value = [];
|
||||
isFinish.value = false;
|
||||
// 加载数据
|
||||
await getListData();
|
||||
// 关闭动画
|
||||
isTriggered.value = false;
|
||||
};
|
||||
|
||||
const handleScan = async () => {
|
||||
if (isScanning.value) return;
|
||||
|
||||
isScanning.value = true;
|
||||
try {
|
||||
console.log('触发扫码')
|
||||
const res = await uni.scanCode();
|
||||
searchVal.value = res.result;
|
||||
// 使用 setTimeout 确保 UI 更新
|
||||
await new Promise(resolve => setTimeout(resolve, 0));
|
||||
await handleSearch({ inputValue: res.result });
|
||||
} catch (error) {
|
||||
uni.showToast({ title: '扫码失败', icon: 'none' });
|
||||
} finally {
|
||||
isScanning.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
const handleSearch = async (e) => {
|
||||
console.log('触发搜索')
|
||||
console.log(e)
|
||||
// 重置状态
|
||||
queryParams.pageNo = 1;
|
||||
isFinish.value = false;
|
||||
dataList.value = [];
|
||||
|
||||
// 设置搜索词
|
||||
queryParams.subOrDetailName = e.inputValue;
|
||||
searchVal.value = e.inputValue; // 同步输入框值
|
||||
saveSearchValue(searchVal.value)
|
||||
|
||||
try {
|
||||
await getListData();
|
||||
} catch (error) {
|
||||
console.error('搜索请求失败:', error);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<template>
|
||||
<view class="cont">
|
||||
<!-- <view class="search" v-if="props.orderState == '0,1' ">
|
||||
<spring-search-box :showScan="true" :showReset="true" bgColor="#E2F3FF" @input="(e) => handleSearch(e)" placeholderColor="#28A0F8" searchColor="#28A0F8" v-model="searchVal" :mode="3" @change="(e) => handleSearch(e)" placeholder="请输入项目或子项目名称" clearable></spring-search-box>
|
||||
|
||||
</view> -->
|
||||
<view class="search" v-if="props.orderState == '0,1'">
|
||||
<view
|
||||
style="
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background: #e2f3ff;
|
||||
border-radius: 20rpx;
|
||||
padding: 0 8rpx;
|
||||
height: 50px;
|
||||
"
|
||||
>
|
||||
<input
|
||||
class="uni-input"
|
||||
v-model="searchVal"
|
||||
placeholder="请输入项目或子项目名称"
|
||||
:placeholder-style="'color:#28A0F8;'"
|
||||
style="
|
||||
flex: 1;
|
||||
background: transparent;
|
||||
border: none;
|
||||
outline: none;
|
||||
font-size: 25rpx;
|
||||
color: #28a0f8;
|
||||
height: 50px;
|
||||
line-height: 50px;
|
||||
"
|
||||
@input="handleSearch({ inputValue: searchVal })"
|
||||
clearable
|
||||
/>
|
||||
<view
|
||||
style="
|
||||
background: none;
|
||||
border: none;
|
||||
padding: 0 10rpx;
|
||||
height: 50px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
"
|
||||
@click="handleScan"
|
||||
>
|
||||
<uni-icons type="scan" size="28" color="#28A0F8"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<scroll-view
|
||||
enable-back-to-top
|
||||
scroll-y
|
||||
class="data-list"
|
||||
refresher-enabled
|
||||
:refresher-triggered="isTriggered"
|
||||
@refresherrefresh="onRefresherrefresh"
|
||||
@scrolltolower="getListData"
|
||||
>
|
||||
<view
|
||||
class="item"
|
||||
v-for="item in dataList"
|
||||
:key="item.id"
|
||||
@click="handleDetail(item)"
|
||||
>
|
||||
<view class="hd">
|
||||
<view class="num">派工单:</view>
|
||||
<view class="statusLabel">{{
|
||||
item.dispatchCode
|
||||
}}</view>
|
||||
|
||||
<view class="status-right" v-if="props.orderState == '0,1'" :style="
|
||||
item.inReportProcess == 0
|
||||
? 'color:red'
|
||||
: 'color:blue'
|
||||
">{{
|
||||
item.inReportProcess == 0 ? "未开始" : "已报工"
|
||||
}}</view>
|
||||
<!-- <view class="statusLabel " ></view> -->
|
||||
</view>
|
||||
<view class="md">
|
||||
<view class="product-item"
|
||||
>项目名称:{{ item.projectName }}</view
|
||||
>
|
||||
<view class="product-item"
|
||||
>子项目名称:{{ item.projectSubCode || "" }}
|
||||
{{ " " + item.projectSubName }}</view
|
||||
>
|
||||
<view class="product-row">
|
||||
<view class="row-item">
|
||||
<view class="label">零件名称: {{ item.materialName }}</view>
|
||||
</view>
|
||||
<view class="row-item">
|
||||
<view class="label" >派工工序: <span style="font-weight: bold;">{{ item.procedureName }}</span></view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
<view class="product-row">
|
||||
<view class="row-item">
|
||||
<view class="label">材质:{{ item.compositionName }}</view>
|
||||
<!-- <view class="val">{{ item.compositionName }}</view>-->
|
||||
</view>
|
||||
<view class="row-item">
|
||||
<view class="label">密度:{{ item.density }}t/m³</view>
|
||||
<!-- <view class="val high-color">{{ item.density }}t/m³</view>-->
|
||||
</view>
|
||||
</view>
|
||||
<view class="product-row">
|
||||
<view class="row-item">
|
||||
<view class="label">派工数量:{{ item.amount }}</view>
|
||||
<!-- <view class="val">{{ item.amount }}</view>-->
|
||||
</view>
|
||||
<view class="row-item">
|
||||
<view class="label">报工重量:{{ item.weight }}Kg</view>
|
||||
<!-- <view class="val high-color">{{ item.weight }}Kg</view>-->
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
class="product-item"
|
||||
:style="
|
||||
item.endTime < todayStr
|
||||
? 'color:red'
|
||||
: null
|
||||
"
|
||||
>预计生产日期:{{ item.startTime }} ~ {{ item.endTime }}</view
|
||||
>
|
||||
</view>
|
||||
|
||||
<!-- <view class="statusText">{{ statusText }}</view>-->
|
||||
<view class="statusText">{{ statusText }}</view>
|
||||
</view>
|
||||
<!-- 底部提示文字 -->
|
||||
<view
|
||||
class="loading-text"
|
||||
:style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }"
|
||||
>
|
||||
{{ isFinish ? "没有更多数据~" : "正在加载..." }}
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
// 订单列表
|
||||
.search {
|
||||
padding: 0rpx;
|
||||
width: 90%;
|
||||
margin: auto;
|
||||
margin-top: 20rpx;
|
||||
position: relative;
|
||||
.uni-input {
|
||||
border: 1px solid #d1d6db;
|
||||
height: 60rpx;
|
||||
line-height: 60rpx;
|
||||
padding: 4rpx 10rpx;
|
||||
font-size: 32rpx;
|
||||
border-radius: 10rpx;
|
||||
}
|
||||
.icons {
|
||||
width: 30rpx;
|
||||
position: absolute;
|
||||
right: 40rpx;
|
||||
top: 0rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.data-list {
|
||||
height: 90vh;
|
||||
|
||||
.item {
|
||||
position: relative;
|
||||
padding: 20rpx 0;
|
||||
margin: 20rpx 20rpx;
|
||||
border-radius: 10rpx;
|
||||
background-color: #fff;
|
||||
|
||||
.hd {
|
||||
padding: 10rpx;
|
||||
font-size: 28rpx;
|
||||
display: flex;
|
||||
|
||||
.statusLabel {
|
||||
font-size: 24rpx;
|
||||
color: #737d88;
|
||||
}
|
||||
.status-right{
|
||||
margin-left: auto;
|
||||
margin-right: 10rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.md {
|
||||
position: relative;
|
||||
padding: 10rpx;
|
||||
min-height: 100rpx;
|
||||
font-size: 28rpx;
|
||||
border-top: 2rpx solid #f2f2f2;
|
||||
|
||||
.product-item {
|
||||
margin: 20rpx 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: #737d88;
|
||||
}
|
||||
|
||||
.product-row {
|
||||
margin: 20rpx 0;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
color: #737d88;
|
||||
|
||||
.row-item {
|
||||
flex: 1;
|
||||
|
||||
.label {
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
|
||||
.val {
|
||||
color: #1d2129;
|
||||
|
||||
&.high-color {
|
||||
color: #00b42a;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.statusText {
|
||||
position: absolute;
|
||||
right: 20rpx;
|
||||
top: 400rpx;
|
||||
border-radius: 10rpx;
|
||||
font-size: 24rpx;
|
||||
padding: 10rpx 30rpx;
|
||||
background: linear-gradient(149deg, #2dace6 4%, #356899 98%);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
|
||||
&:last-child {
|
||||
padding-bottom: 40rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
font-size: 28rpx;
|
||||
color: #999;
|
||||
margin-bottom: 15rpx;
|
||||
|
||||
.date {
|
||||
color: #666;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.primary {
|
||||
color: #ff9240;
|
||||
}
|
||||
|
||||
.icon-delete {
|
||||
line-height: 1;
|
||||
margin-left: 10rpx;
|
||||
padding-left: 10rpx;
|
||||
border-left: 1rpx solid #e3e3e3;
|
||||
}
|
||||
}
|
||||
|
||||
.goods {
|
||||
display: flex;
|
||||
margin-bottom: 20rpx;
|
||||
|
||||
.cover {
|
||||
width: 170rpx;
|
||||
height: 170rpx;
|
||||
margin-right: 20rpx;
|
||||
border-radius: 10rpx;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
.image {
|
||||
width: 170rpx;
|
||||
height: 170rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.quantity {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
line-height: 1;
|
||||
padding: 6rpx 4rpx 6rpx 8rpx;
|
||||
font-size: 24rpx;
|
||||
color: #fff;
|
||||
border-radius: 10rpx 0 0 0;
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
|
||||
.meta {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.name {
|
||||
height: 80rpx;
|
||||
font-size: 26rpx;
|
||||
color: #444;
|
||||
}
|
||||
|
||||
.type {
|
||||
line-height: 1.8;
|
||||
padding: 0 15rpx;
|
||||
margin-top: 10rpx;
|
||||
font-size: 24rpx;
|
||||
align-self: flex-start;
|
||||
border-radius: 4rpx;
|
||||
color: #888;
|
||||
background-color: #f7f7f8;
|
||||
}
|
||||
|
||||
.more {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 22rpx;
|
||||
color: #333;
|
||||
}
|
||||
}
|
||||
|
||||
.payment {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
line-height: 1;
|
||||
padding: 20rpx 0;
|
||||
text-align: right;
|
||||
color: #999;
|
||||
font-size: 28rpx;
|
||||
border-bottom: 1rpx solid #eee;
|
||||
|
||||
.quantity {
|
||||
font-size: 24rpx;
|
||||
margin-right: 16rpx;
|
||||
}
|
||||
|
||||
.amount {
|
||||
color: #444;
|
||||
margin-left: 6rpx;
|
||||
}
|
||||
|
||||
.symbol {
|
||||
font-size: 20rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.action {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
padding-top: 20rpx;
|
||||
|
||||
.button {
|
||||
width: 180rpx;
|
||||
height: 60rpx;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-left: 20rpx;
|
||||
border-radius: 60rpx;
|
||||
border: 1rpx solid #ccc;
|
||||
font-size: 26rpx;
|
||||
color: #444;
|
||||
}
|
||||
|
||||
.secondary {
|
||||
color: #3775f6;
|
||||
border-color: #3775f6;
|
||||
}
|
||||
|
||||
.primary {
|
||||
color: #fff;
|
||||
background-color: #3775f6;
|
||||
border-color: #3775f6;
|
||||
}
|
||||
}
|
||||
|
||||
.loading-text {
|
||||
text-align: center;
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
}
|
||||
|
||||
</style>import type { stringify } from 'querystring';
|
||||
@ -0,0 +1,710 @@
|
||||
<script setup lang="ts">
|
||||
import { toRaw, ref, computed } from 'vue'
|
||||
import { formatDate } from '@/utils/index'
|
||||
import { onLoad, onShow } from '@dcloudio/uni-app'
|
||||
import { useLoginStore } from '@/stores/modules/login'
|
||||
import { getTaskRepotPageAPI, getTaskDetailAPI, postOperateAPI, getListWxAPI } from '@/services/productionReport'
|
||||
const popup = ref<UniHelper.UniPopupInstance>()
|
||||
const userStore = useLoginStore()
|
||||
const dictInfo = userStore?.dictInfo || []
|
||||
const unitDictData = dictInfo.filter(e => e.dictType == 'heli_material_unit') || []
|
||||
const userId = userStore.userInfo.userId
|
||||
|
||||
const isShowStart = ref(false)
|
||||
const isCancel = ref(true)
|
||||
|
||||
|
||||
const isShowEnd = ref(false)
|
||||
// const isShowStart = computed(() => {
|
||||
// let flag = true
|
||||
// if (historyList.value.length) {
|
||||
// const obj = historyList.value[0]
|
||||
// if (!obj?.endTime) {
|
||||
// flag = false
|
||||
// }
|
||||
// }
|
||||
// // // 派工数量和总报工数量相等了就不展示开始生产
|
||||
// // if (detailInfo.value.amount == detailInfo.value.totalReportAmount) {
|
||||
// // flag = false
|
||||
// // }
|
||||
// return flag
|
||||
// })
|
||||
// const isShowEnd = computed(() => {
|
||||
// let flag = true
|
||||
// if (historyList.value.length) {
|
||||
// const obj = historyList.value[0]
|
||||
// if (obj?.endTime) {
|
||||
// flag = false
|
||||
// }
|
||||
// } else {
|
||||
// flag = false
|
||||
// }
|
||||
// return flag
|
||||
// })
|
||||
const amount = ref('')
|
||||
const workTime = ref('')
|
||||
// 详情数据
|
||||
const detailInfo = ref({})
|
||||
let isLoading = ref(false)
|
||||
const historyList = ref([])
|
||||
const formObj = ref({})
|
||||
// 历史明细
|
||||
const getData = async () => {
|
||||
// 发送请求
|
||||
isLoading.value = true
|
||||
const params = {
|
||||
pageNo: 1,
|
||||
integerpageSize: 5,
|
||||
owner: userId,
|
||||
dispatchDetailId: detailInfo.value.id,
|
||||
}
|
||||
const data = await getTaskRepotPageAPI(params)
|
||||
data.list.forEach((e) => {
|
||||
e.startTimeStr = e.startTime && formatDate(e.startTime, 'YYYY-MM-DD HH:mm')
|
||||
e.endTimeStr = e.endTime && formatDate(e.endTime, 'YYYY-MM-DD HH:mm')
|
||||
// e.endTimeStr = '2025-01-13 00:00'
|
||||
})
|
||||
if (data.list[0]) {
|
||||
// 将字符串转换为Date对象
|
||||
formObj.value = data.list[0]
|
||||
const endTime = new Date(formObj.value.endTimeStr);
|
||||
const startTime = new Date(formObj.value.startTimeStr);
|
||||
// 计算两个日期之间的毫秒差
|
||||
const timeDifferenceInMs = endTime - startTime;
|
||||
|
||||
// 将毫秒差转换为小时
|
||||
const timeDifferenceInHours = timeDifferenceInMs / (3600 * 1000);
|
||||
const roundedTimeDifference = parseFloat(timeDifferenceInHours.toFixed(2));
|
||||
if ("Y" == detailInfo.value.isOutsourcing) {
|
||||
|
||||
} else {
|
||||
workTime.value = roundedTimeDifference;
|
||||
}
|
||||
|
||||
}
|
||||
historyList.value = data.list
|
||||
isShowEnd.value = true;
|
||||
isShowStart.value = true
|
||||
if (historyList.value.length) {
|
||||
const obj = historyList.value[0]
|
||||
if (obj.amount !=null && obj.amount >= 0 ) {
|
||||
isShowStart.value = true
|
||||
}else{
|
||||
isShowStart.value = false
|
||||
}
|
||||
}
|
||||
if (historyList.value.length) {
|
||||
const obj = historyList.value[0]
|
||||
if (obj.amount !=null && obj.amount >= 0 ) {
|
||||
isShowEnd.value = false
|
||||
}else{
|
||||
isShowEnd.value = true
|
||||
}
|
||||
} else {
|
||||
isShowEnd.value = false
|
||||
}
|
||||
if (historyList.value != null && historyList.value.length > 0) {
|
||||
var totalAmount = detailInfo.value.amount;
|
||||
var beforeAmount = detailInfo.value.totalReportAmount
|
||||
if (totalAmount >= beforeAmount) {
|
||||
amount.value = totalAmount - beforeAmount
|
||||
} else {
|
||||
amount.value = 0
|
||||
}
|
||||
|
||||
}
|
||||
isLoading.value = false
|
||||
}
|
||||
const isOverBeforeProcedure = ref(true)
|
||||
// 详情
|
||||
const getDetailData = async (id) => {
|
||||
// 发送请求
|
||||
// isLoading.value = true
|
||||
const params = {
|
||||
id,
|
||||
}
|
||||
const data = await getTaskDetailAPI(params)
|
||||
// if (data.beforeProcedureStatus == 0) {
|
||||
// //如果上一道工序没结束
|
||||
// isOverBeforeProcedure.value = true;
|
||||
// }
|
||||
if ("Y"==data.isOutsourcing){
|
||||
workTime.value=data.estimatedPrice
|
||||
}
|
||||
data.startTime = formatDate(data.startTime, 'YYYY-MM-DD')
|
||||
data.endTime = formatDate(data.endTime, 'YYYY-MM-DD')
|
||||
// 单位枚举
|
||||
const lineObj = unitDictData.find((q) => q.value == data.unit) || {}
|
||||
data.unit = lineObj.label
|
||||
|
||||
detailInfo.value = data || {}
|
||||
isLoading.value = false
|
||||
}
|
||||
onLoad(async (options : any) => {
|
||||
await getDetailData(options.id)
|
||||
await getData()
|
||||
const obj = historyList.value[0]
|
||||
// 最新的报工是否完成
|
||||
if (obj && obj?.workTime == null && obj.endTime) {
|
||||
popupShow.value = true
|
||||
}
|
||||
})
|
||||
|
||||
// 生产完成
|
||||
const handleComplate = async () => {
|
||||
isLoading.value = true;
|
||||
const params = {
|
||||
id: detailInfo.value?.id,
|
||||
active: 'FINISH',
|
||||
}
|
||||
try {
|
||||
const data = await postOperateAPI(params);
|
||||
} catch (error) {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
duration: 3000,
|
||||
title: error.data.msg,
|
||||
})
|
||||
} finally {
|
||||
await getDetailData(detailInfo.value.id)
|
||||
await getData()
|
||||
const obj = historyList.value[0]
|
||||
// 最新的报工是否完成
|
||||
if (obj && obj?.workTime == null && obj.endTime) {
|
||||
popupShow.value = true
|
||||
}
|
||||
isLoading.value = false;
|
||||
}
|
||||
// const url = `/pages/productionReport/productionReport-detail?id=${detailInfo.value.id}`
|
||||
// uni.redirectTo({
|
||||
// url,
|
||||
// })
|
||||
}
|
||||
// 提交报工
|
||||
const handleOk = async (active) => {
|
||||
const params = {
|
||||
id: detailInfo.value?.id,
|
||||
active: 'SUBMIT',
|
||||
amount: amount.value,
|
||||
workTime: workTime.value,
|
||||
}
|
||||
const data = await postOperateAPI(params)
|
||||
const pages = getCurrentPages(); // 获取当前页面栈
|
||||
const currentPage = pages[pages.length - 1]; // 当前页面
|
||||
const url = `/${currentPage.route}?${Object.entries(currentPage.options).map(([key, val]) => `${key}=${val}`).join('&')}`;
|
||||
uni.reLaunch({ url }); // 重新加载当前页面
|
||||
|
||||
// const url = `/pages/productionReport/productionReport-detail?id=${detailInfo.value.id}`
|
||||
// uni.redirectTo({
|
||||
// url,
|
||||
// })
|
||||
}
|
||||
// 开始生产
|
||||
const handleStart = async () => {
|
||||
const params = {
|
||||
id: detailInfo.value.id,
|
||||
active: 'START',
|
||||
ownerId: userId
|
||||
}
|
||||
productionTitle.value = '生产中';
|
||||
const data = await postOperateAPI(params)
|
||||
const pages = getCurrentPages(); // 获取当前页面栈
|
||||
const currentPage = pages[pages.length - 1]; // 当前页面
|
||||
const url = `/${currentPage.route}?${Object.entries(currentPage.options).map(([key, val]) => `${key}=${val}`).join('&')}`;
|
||||
uni.reLaunch({ url }); // 重新加载当前页面
|
||||
// const url = `/pages/productionReport/productionReport-detail?id=${detailInfo.value.id}`
|
||||
// uni.redirectTo({
|
||||
// url,
|
||||
// })
|
||||
}
|
||||
const popupShow = ref(false)
|
||||
const productionTitle = ref('开始生产')
|
||||
const cancel = () => {
|
||||
isLoading.value = false;
|
||||
const pages = getCurrentPages(); // 获取当前页面栈
|
||||
if (pages.length>1){
|
||||
uni.navigateBack({
|
||||
delta: 1 // 返回的页面数,这里1表示返回上一页
|
||||
});
|
||||
}else {
|
||||
const url = `/pages/productionReport/productionReport`
|
||||
uni.redirectTo({
|
||||
url,
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 结束生产
|
||||
const handleStop = async () => {
|
||||
const params = {
|
||||
id: detailInfo.value?.id,
|
||||
active: 'END',
|
||||
}
|
||||
console.log(detailInfo.value)
|
||||
const data = await postOperateAPI(params)
|
||||
await getData()
|
||||
// const url = `/pages/productionReport/productionReport-detail?id=${detailInfo.value.id}`
|
||||
// uni.redirectTo({
|
||||
// url,
|
||||
// })
|
||||
popup.value?.open()
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<view>
|
||||
<view class="data-detail">
|
||||
<template v-if="!isLoading">
|
||||
<view class="module">
|
||||
<view class="module-info">
|
||||
<view class="product-item product-name">项目:{{ detailInfo.projectCode }}
|
||||
{{ detailInfo.projectName }}</view>
|
||||
<image src="/static/images/productionReport-page.png" class="product-img" mode="scaleToFill">
|
||||
</image>
|
||||
<view :class="[detailInfo.procedureStatus == 2 ? 'had' : 'unhad', 'product-status']">{{
|
||||
detailInfo.procedureStatus == 2 ? '已完成' : '未完成' }}</view>
|
||||
<view class="product-item">子项目:{{ detailInfo.projectSubCode || '' }}
|
||||
{{' ' + detailInfo.projectSubName }}
|
||||
</view>
|
||||
<view class="product-row">
|
||||
<view class="row-item">
|
||||
<view class="label">零件名称: {{ detailInfo.materialName }}</view>
|
||||
</view>
|
||||
<view class="row-item">
|
||||
<view class="label">派工工序: {{ detailInfo.procedureName }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="product-row">
|
||||
<view class="row-item">
|
||||
<view class="label">派工数量</view>
|
||||
<view class="val">{{ detailInfo.amount }}</view>
|
||||
</view>
|
||||
<view class="row-item">
|
||||
<view class="label">总报工数量</view>
|
||||
<view class="val high-color">{{ detailInfo.totalReportAmount }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="product-row">
|
||||
<view class="row-item">
|
||||
<view class="label">预计工时</view>
|
||||
<view class="val">{{ detailInfo.workTime }}</view>
|
||||
</view>
|
||||
<view class="row-item">
|
||||
<view class="label">总报工工时</view>
|
||||
<view class="val high-color">{{ detailInfo.totalWorkTime }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="product-item">预计生产日期:{{ detailInfo.startTime }} ~ {{ detailInfo.endTime }}</view>
|
||||
<view class="finish"
|
||||
v-if="isShowStart && detailInfo.procedureStatus !== 2 && detailInfo.totalWorkTime"
|
||||
@click="handleComplate">
|
||||
<image class="complate-img" src="/static/images/productionReport-detail-complate.png"
|
||||
mode="scaleToFill" />
|
||||
生产结束
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="module-list">
|
||||
<view class="module-title">历史报工明细</view>
|
||||
<view class="history-list">
|
||||
<view class="no-data" v-if="!historyList.length">
|
||||
无数据...
|
||||
</view>
|
||||
<template v-else>
|
||||
<view class="item" v-for="(item, index) in historyList" :key="item.id">
|
||||
<view class="product-item">生产开始时间:{{ item.startTimeStr }}</view>
|
||||
<view class="product-item">生产结束时间:{{ item.endTimeStr }}</view>
|
||||
|
||||
<view class="product-row">
|
||||
<view class="row-item">
|
||||
<view class="label">报工工时:</view>
|
||||
<view class="val high-color">{{ item.workTime }}</view>
|
||||
</view>
|
||||
<view class="row-item">
|
||||
<view class="label">报工数量:</view>
|
||||
<view class="val high-color">{{ item.amount }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="tip-index">
|
||||
<image src="/static/images/productionReport-detail-index.png" class="icon-status"
|
||||
mode="scaleToFit">
|
||||
</image>
|
||||
<view class="text">{{historyList.length - index}}</view>
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</template>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="action" v-if="detailInfo.procedureStatus !== 2">
|
||||
<view class="action-item info" v-if="isCancel" @click="cancel()">取消</view>
|
||||
<view class="action-item start" v-if="isShowStart" @click="handleStart">开始生产</view>
|
||||
<view class="action-item stop" v-if="isShowEnd" @click="handleStop">结束生产</view>
|
||||
</view>
|
||||
<view class="action" v-if="detailInfo.procedureStatus == 2">
|
||||
<view class="action-item info" v-if="isCancel" @click="cancel()">取消</view>
|
||||
</view>
|
||||
|
||||
|
||||
</template>
|
||||
<view class="loading-text" v-else>加载中..</view>
|
||||
<uni-popup class="popup" ref="popup" :mask-click="false" type="bottom" background-color="#fff">
|
||||
<view class="title">
|
||||
<view class="text">填写信息</view>
|
||||
<!-- <view class="close" @click="handleClose">X</view> -->
|
||||
</view>
|
||||
<view class="cont">
|
||||
<view class="item">
|
||||
<view class="label">开始生产时间:</view>
|
||||
<view class="val">{{ formObj.startTimeStr }}</view>
|
||||
</view>
|
||||
<view class="item">
|
||||
<view class="label">结束生产时间:</view>
|
||||
<view class="val">{{ formObj.endTimeStr }}</view>
|
||||
</view>
|
||||
<view class="item">
|
||||
<view class="label"><span class="star">*</span>本次报工工时:</view>
|
||||
<uni-easyinput class="val" type="digit" v-model="workTime" disabled
|
||||
placeholder="请输入本次报工工时"></uni-easyinput>
|
||||
<view class="unit" >{{ detailInfo.isOutsourcing=='Y'?"元":"小时" }}</view>
|
||||
</view>
|
||||
<view class="item">
|
||||
<view class="label"><span class="star">*</span>本次报工数量:</view>
|
||||
<uni-easyinput class="val" type="number" v-model="amount"
|
||||
placeholder="请输入本次报工数量"></uni-easyinput>
|
||||
<view class="unit"> {{ detailInfo.unit }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="ok" @click="handleOk">确定</view>
|
||||
</uni-popup>
|
||||
</view>
|
||||
<view v-if="isOverBeforeProcedure==false">
|
||||
<p>上一道工序尚未完工,请等待上一道工序完工后进行报工!</p>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
</template>
|
||||
<style lang="scss">
|
||||
// 订单列表
|
||||
.data-detail {
|
||||
border-radius: 10rpx;
|
||||
padding-bottom: 200rpx;
|
||||
|
||||
.module {
|
||||
background: linear-gradient(178deg, #356899 7%, #356899 57%, #F4F6F9 94%);
|
||||
padding: 20rpx;
|
||||
|
||||
.module-info {
|
||||
padding: 20rpx 20rpx 80rpx;
|
||||
border-radius: 10rpx;
|
||||
min-height: 100rpx;
|
||||
font-size: 28rpx;
|
||||
border-bottom: 2rpx solid #F2F2F2;
|
||||
background: linear-gradient(215deg, #C7D3E5 8%, rgba(222, 228, 236, 0) 13%), linear-gradient(162deg, #FFFFFF 25%, #E4EFFD 106%);
|
||||
position: relative;
|
||||
border-top-right-radius: 100rpx;
|
||||
|
||||
.product-img {
|
||||
position: absolute;
|
||||
right: 0rpx;
|
||||
top: 0;
|
||||
width: 100rpx;
|
||||
height: 100rpx;
|
||||
}
|
||||
|
||||
.product-status {
|
||||
|
||||
width: 140rpx;
|
||||
border-raduis: 10rpx;
|
||||
text-align: center;
|
||||
padding: 8rpx 12rpx;
|
||||
|
||||
&.had {
|
||||
background: #E8FFEA;
|
||||
color: #00B42A;
|
||||
}
|
||||
|
||||
&.unhad {
|
||||
background: #FFF7E8;
|
||||
color: #FF7D00;
|
||||
}
|
||||
}
|
||||
|
||||
.product-item {
|
||||
margin: 20rpx 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: #737D88
|
||||
}
|
||||
|
||||
.product-row {
|
||||
margin: 20rpx 0;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
color: #737D88;
|
||||
|
||||
.row-item {
|
||||
flex: 1;
|
||||
|
||||
.label {
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
|
||||
.val {
|
||||
color: #1D2129;
|
||||
|
||||
&.high-color {
|
||||
color: #00B42A
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.finish {
|
||||
position: absolute;
|
||||
right: 40rpx;
|
||||
bottom: 30rpx;
|
||||
background: linear-gradient(142deg, #FEB34A 14%, #FE9B12 83%);
|
||||
color: #fff;
|
||||
width: 200rpx;
|
||||
text-align: center;
|
||||
padding: 10rpx;
|
||||
border-radius: 31rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
.complate-img {
|
||||
width: 30rpx;
|
||||
height: 30rpx;
|
||||
margin-right: 10rpx;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.module-list {
|
||||
padding: 20rpx 20rpx;
|
||||
// box-shadow: 0px 0px 8px 0px rgba(161, 161, 177, 0.12);
|
||||
|
||||
.module-title {
|
||||
color: #0D0D26;
|
||||
font-size: 36rpx;
|
||||
margin: 20rpx 0;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.history-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
min-height: 200rpx;
|
||||
justify-content: center;
|
||||
padding: 0rpx 10rpx;
|
||||
|
||||
.item {
|
||||
margin: 10rpx 0;
|
||||
background: #EAEEF4;
|
||||
font-size: 28rpx;
|
||||
padding: 20rpx;
|
||||
width: 100%;
|
||||
border-radius: 10rpx;
|
||||
color: #737D88;
|
||||
position: relative;
|
||||
|
||||
.product-item {
|
||||
margin: 10rpx 0;
|
||||
|
||||
.hight-color {
|
||||
color: #00B42A;
|
||||
}
|
||||
}
|
||||
|
||||
.product-row {
|
||||
margin: 20rpx 0;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
color: #737D88;
|
||||
|
||||
.row-item {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
.label {
|
||||
margin-bottom: 10rpx;
|
||||
|
||||
&.high-color {
|
||||
color: #00B42A
|
||||
}
|
||||
}
|
||||
|
||||
.val {
|
||||
color: #1D2129;
|
||||
|
||||
&.high-color {
|
||||
color: #00B42A
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.tip-index {
|
||||
position: absolute;
|
||||
top: 0rpx;
|
||||
right: 0rpx;
|
||||
|
||||
.icon-status {
|
||||
width: 100rpx;
|
||||
height: 72rpx;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.text {
|
||||
color: #fff;
|
||||
position: absolute;
|
||||
top: 4rpx;
|
||||
right: 30rpx;
|
||||
z-index: 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.no-data {
|
||||
font-size: 28rpx;
|
||||
color: #444;
|
||||
}
|
||||
}
|
||||
|
||||
.table-cont {
|
||||
font-size: 24rpx;
|
||||
}
|
||||
|
||||
.button {
|
||||
color: #356899;
|
||||
}
|
||||
}
|
||||
|
||||
.action {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: fixed;
|
||||
bottom: 0rpx;
|
||||
border-radius: 18rpx;
|
||||
padding: 30rpx 30rpx;
|
||||
background: #FFFFFF;
|
||||
margin: 0 auto;
|
||||
width: 100vw;
|
||||
box-shadow: 0px -4px 10px 0px rgba(121, 153, 183, 0.2);
|
||||
|
||||
.action-item {
|
||||
width: 272rpx;
|
||||
height: 86rpx;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 0 20rpx;
|
||||
font-size: 40rpx;
|
||||
color: #fff;
|
||||
width: 272rpx;
|
||||
height: 86rpx;
|
||||
border-radius: 24rpx;
|
||||
&.info {
|
||||
background: linear-gradient(157deg, #A9A9A9 -3%, #A9A9A9 90%);
|
||||
}
|
||||
&.start {
|
||||
background: linear-gradient(157deg, #2EACE6 -3%, #356899 90%);
|
||||
}
|
||||
|
||||
&.stop {
|
||||
background: linear-gradient(167deg, #FEA97B -2%, #F75E40 87%);
|
||||
}
|
||||
|
||||
&.finish {
|
||||
background: linear-gradient(142deg, #FEB34A 14%, #FE9B12 83%);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.loading-text {
|
||||
text-align: center;
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
|
||||
.popup {
|
||||
.title {
|
||||
line-height: 1;
|
||||
padding: 40rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: normal;
|
||||
border-bottom: 1rpx solid #ddd;
|
||||
color: #444;
|
||||
|
||||
.close {
|
||||
position: absolute;
|
||||
right: 24rpx;
|
||||
top: 40rpx;
|
||||
height: 60rpx;
|
||||
width: 60rpx;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.cont {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin: 40rpx;
|
||||
height: 50vh;
|
||||
|
||||
.item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 20rpx 0;
|
||||
color: #737D88;
|
||||
width: 94%;
|
||||
|
||||
.label {
|
||||
font-size: 32rpx;
|
||||
width: 260rpx;
|
||||
|
||||
.star {
|
||||
color: red
|
||||
}
|
||||
}
|
||||
|
||||
.val {
|
||||
flex: 1;
|
||||
font-size: 32rpx;
|
||||
}
|
||||
|
||||
.unit {
|
||||
width: 100rpx;
|
||||
margin-left: 4rpx;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.ok {
|
||||
font-size: 32rpx;
|
||||
margin: 20rpx auto 80rpx;
|
||||
text-align: center;
|
||||
width: 200rpx;
|
||||
border-radius: 10rpx;
|
||||
padding: 8rpx 0;
|
||||
background-color: #3C8AF7;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,151 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import dataItem from './components/dataItem.vue'
|
||||
// 定义 porps
|
||||
const props = defineProps<{
|
||||
state: string
|
||||
}>()
|
||||
// tabs 数据
|
||||
const orderTabs = ref([
|
||||
{ orderState: '0,1', title: '未完成', isRender: false },
|
||||
{ orderState: '2', title: '已完成', isRender: false },
|
||||
])
|
||||
// 高亮下标
|
||||
const activeIndex = ref(0)
|
||||
const handleIndexChange = (index: any) => {
|
||||
orderTabs.value.forEach((e) => {
|
||||
e.isRender = false
|
||||
})
|
||||
activeIndex.value = index
|
||||
orderTabs.value[index].isRender = true
|
||||
}
|
||||
onLoad(async (options) => {
|
||||
if (options.state) {
|
||||
// 高亮下标
|
||||
orderTabs.value.forEach((e, index) => {
|
||||
e.isRender = e.orderState == options.state
|
||||
if (e.isRender) {
|
||||
activeIndex.value = index
|
||||
}
|
||||
})
|
||||
} else {
|
||||
orderTabs.value.forEach((e, index) => {
|
||||
e.isRender = e.orderState == '0,1'
|
||||
if (e.isRender) {
|
||||
activeIndex.value = index
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<view class="viewport">
|
||||
<view class="tabs">
|
||||
<text class="item" :class="{ active: activeIndex == index }" v-for="(item, index) in orderTabs" :key="item.title"
|
||||
@tap="handleIndexChange(index)">
|
||||
{{ item.title }}
|
||||
</text>
|
||||
<!-- 游标 -->
|
||||
<view class="cursor" :style="{ left: activeIndex ? '65%' : '14%' }"></view>
|
||||
</view>
|
||||
<!-- 滑动容器 -->
|
||||
<swiper class="swiper" :current="activeIndex" @change="handleIndexChange($event.detail.current)">
|
||||
<!-- 滑动项 -->
|
||||
<swiper-item v-for="item in orderTabs" :key="item.title">
|
||||
<dataItem v-if="item.isRender" :order-state="item.orderState" />
|
||||
</swiper-item>
|
||||
</swiper>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
page {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.viewport {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
// background-color: #3775F6;
|
||||
.navbar {
|
||||
width: 750rpx;
|
||||
color: #000;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 9;
|
||||
/* background-color: #f8f8f8; */
|
||||
background-color: #3775f6;
|
||||
|
||||
.wrap {
|
||||
position: relative;
|
||||
background-color: #3775f6;
|
||||
|
||||
.title {
|
||||
height: 44px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 32rpx;
|
||||
/* color: #000; */
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.back {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
height: 44px;
|
||||
width: 44px;
|
||||
font-size: 44rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
/* color: #000; */
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.tabs {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
line-height: 60rpx;
|
||||
position: relative;
|
||||
z-index: 9;
|
||||
width: 100%;
|
||||
|
||||
.item {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
padding: 20rpx;
|
||||
font-size: 28rpx;
|
||||
color: #1D2129;
|
||||
|
||||
&.active {
|
||||
color: #356899;
|
||||
}
|
||||
}
|
||||
|
||||
.cursor {
|
||||
position: absolute;
|
||||
left: 13%;
|
||||
bottom: 0;
|
||||
width: 20%;
|
||||
height: 6rpx;
|
||||
padding: 0 50rpx;
|
||||
background-color: #356899;
|
||||
/* 过渡效果 */
|
||||
transition: all 0.4s;
|
||||
}
|
||||
}
|
||||
|
||||
// swiper
|
||||
.swiper {
|
||||
background-color: #f7f7f8;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
Loading…
Reference in New Issue
Block a user