发货单打印还原

This commit is contained in:
z 2026-01-11 16:00:17 +08:00
parent ed4f521faa
commit edee20587b
24 changed files with 2174 additions and 310 deletions

View File

@ -76,6 +76,6 @@ public class PlanSubDetailPageReqVO extends PageParam {
private String customerBrief;
private String projectName;
private String planNo;
private Boolean statusflag;
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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,8 +438,8 @@ 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");
@ -447,8 +447,8 @@ public class PlanServiceImpl implements PlanService {
}
}
} else {
if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())){
if (now.isAfter(planSubDO.getCraftEndDate())) {
if (ObjectUtil.isNotEmpty(planSubDO.getCraftEndDate())) {
if (now.toLocalDate().isAfter(planSubDO.getCraftEndDate().toLocalDate())) {
planDO.setProcessFlag("1");
} else {
planDO.setProcessFlag("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,12 +577,33 @@ public class PlanServiceImpl implements PlanService {
subDO.setAssemblyTask(TASK_NOT_STARTED);
}
}else {
BigDecimal dispatchAmount = calculateDispatchAmount(dispatchDetailDOS);
BigDecimal reportedAmount = calculateReportedAmount(taskReportDOS);
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()));
}
}
}
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());
}
/**

View File

@ -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,13 +2968,28 @@ if (ObjectUtil.isNotEmpty(progressList)){
if (allCompleted) {
outsourcedTask.setStatus("已完成");
} else {
if (hasStatusThree(orderNoDetailDOS)) {
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) {
@ -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()));
}
}
}
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());
}
/**

View File

@ -112,4 +112,6 @@ public interface TaskDispatchService {
PageResult<TaskDispatchDetailDO> taskPage( TaskPlanJDBaoBiaoPageReqVO pageReqVO);
PageResult<TaskDispatchDetailDO> taskBbPage(TaskPlanJDBaoBiaoPageReqVO pageReqVO);
PageResult<TaskDispatchDetailDO> getTaskDispatchPageDetailXl(TaskDispatchDetailPageReqVO pageReqVO);
}

View File

@ -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);
// 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())) {

View File

@ -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"> &nbsp;</td>
<td colspan="4"> &nbsp;</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:'&nbsp;'}}</td>
<td colspan="10">{{formData.remark?formData.remark:'&nbsp;'}}</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"> &nbsp;</td>
<td colspan="4"> &nbsp;</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:'&nbsp;'}}</td>
<td colspan="10">{{formData.remark?formData.remark:'&nbsp;'}}</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('') // LogoBase64URL
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;

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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">&nbsp;</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; /* 添加顶部外边距,替代原先的页内边距 */

View File

@ -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,6 +479,8 @@ v-model="row.deviceModel"
<el-table-column fixed="right" label="操作" align="center" min-width="90">
<template #default="scope">
<!-- 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)));

View File

@ -43,7 +43,7 @@
</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 File

@ -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">

View File

@ -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([

View File

@ -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>

View File

@ -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>

View File

@ -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/</view>
<!-- <view class="val high-color">{{ item.density }}t/</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';

View File

@ -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>

View File

@ -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>