Bläddra i källkod

生产报工修改

yzc 1 år sedan
förälder
incheckning
32d4e0341e

+ 0 - 8
hx-mes/src/main/java/com/fjhx/mes/entity/production/dto/ProductionReportingDto.java

@@ -1,12 +1,9 @@
 package com.fjhx.mes.entity.production.dto;
 
 import com.fjhx.mes.entity.production.po.ProductionReporting;
-import com.fjhx.mes.entity.production.po.ProductionReportingDetail;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.List;
-
 /**
  * 生产报工新增编辑入参实体
  *
@@ -17,9 +14,4 @@ import java.util.List;
 @Setter
 public class ProductionReportingDto extends ProductionReporting {
 
-    /**
-     * 报工明细列表
-     */
-    List<ProductionReportingDetail> productionReportingDetailList;
-
 }

+ 21 - 3
hx-mes/src/main/java/com/fjhx/mes/entity/production/po/ProductionReporting.java

@@ -1,17 +1,18 @@
 package com.fjhx.mes.entity.production.po;
 
-import com.ruoyi.common.core.domain.BasePo;
 import com.baomidou.mybatisplus.annotation.TableName;
-import java.util.Date;
+import com.ruoyi.common.core.domain.BasePo;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 生产报工
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-30
  */
 @Getter
@@ -23,5 +24,22 @@ public class ProductionReporting extends BasePo {
      * 生产任务id
      */
     private Long productionTaskId;
+    /**
+     * 工序id
+     */
+    private Long productionProcessesId;
+    /**
+     * 报工数量
+     */
+    private BigDecimal quantity;
+    /**
+     * 报工用户列表
+     */
+    private String userSet;
+
+    /**
+     * 归属公司id
+     */
+    private Long companyId;
 
 }

+ 5 - 5
hx-mes/src/main/java/com/fjhx/mes/entity/production/po/ProductionReportingDetail.java

@@ -35,11 +35,6 @@ public class ProductionReportingDetail extends BasePo {
      */
     private Long productionProcessesId;
 
-//    /**
-//     * 报工姓名
-//     */
-//    private String name;
-
     /**
      * 报工数量
      */
@@ -50,4 +45,9 @@ public class ProductionReportingDetail extends BasePo {
      */
     private Long companyId;
 
+    /**
+     * 报工人Id
+     */
+    private Long userId;
+
 }

+ 5 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionReportingDetailVo.java

@@ -31,4 +31,9 @@ public class ProductionReportingDetailVo extends ProductionReportingDetail {
 
     private String companyName;
 
+    /**
+     * 报工人名称
+     */
+    private String userName;
+
 }

+ 68 - 75
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionReportingDetailServiceImpl.java

@@ -5,17 +5,11 @@ import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.common.utils.Assert;
-import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.production.dto.ProductionReportingDetailDto;
 import com.fjhx.mes.entity.production.dto.ProductionReportingDetailSelectDto;
-import com.fjhx.mes.entity.production.po.ProductionOrder;
-import com.fjhx.mes.entity.production.po.ProductionOrderDetail;
 import com.fjhx.mes.entity.production.po.ProductionReportingDetail;
-import com.fjhx.mes.entity.production.po.ProductionTaskProgress;
 import com.fjhx.mes.entity.production.vo.ProductionReportingDetailVo;
-import com.fjhx.mes.entity.technology.po.TechnologyProcessLine;
 import com.fjhx.mes.mapper.production.ProductionReportingDetailMapper;
 import com.fjhx.mes.service.production.ProduceOrderDetailService;
 import com.fjhx.mes.service.production.ProduceOrderService;
@@ -23,15 +17,12 @@ import com.fjhx.mes.service.production.ProductionReportingDetailService;
 import com.fjhx.mes.service.production.ProductionTaskProgressService;
 import com.fjhx.mes.service.technology.TechnologyProcessLineService;
 import com.fjhx.tenant.utils.DeptUstil;
-import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.system.utils.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -83,6 +74,8 @@ public class ProductionReportingDetailServiceImpl extends ServiceImpl<Production
         }
         //赋值创建人名称
         UserUtil.assignmentNickName(records, ProductionReportingDetail::getCreateUser, ProductionReportingDetailVo::setCreateUserName);
+        //赋值报工人名称
+        UserUtil.assignmentNickName(records, ProductionReportingDetail::getUserId, ProductionReportingDetailVo::setUserName);
 
         //获取生产公司信息
         List<Long> companyIds = records.stream().map(ProductionReportingDetail::getCompanyId).collect(Collectors.toList());
@@ -106,72 +99,72 @@ public class ProductionReportingDetailServiceImpl extends ServiceImpl<Production
     @Override
     @DSTransactional
     public synchronized void add(ProductionReportingDetailDto dto) {
-        Long productionTaskId = dto.getProductionTaskId();
-        Long productionProcessesId = dto.getProductionProcessesId();
-        BigDecimal reportingQuantity = dto.getQuantity();
-
-        Assert.notEmpty(productionTaskId, "生产任务id不能为空!");
-        Assert.notEmpty(productionProcessesId, "生产工序id不能为空!");
-        Assert.notEmpty(reportingQuantity, "报工数量不能为空!");
-
-
-        ProductionTaskProgress productionTaskProgress = productionTaskProgressService.getOne(q -> q
-                .eq(ProductionTaskProgress::getTaskId, productionTaskId)
-                .eq(ProductionTaskProgress::getProcessesId, productionProcessesId)
-        );
-
-        Assert.notEmpty(productionTaskProgress, "查询不到生产进度信息");
-
-        //更新生产进度信息
-        productionTaskProgressService.update(q -> q
-                .eq(ProductionTaskProgress::getId, productionTaskProgress.getId())
-                .setSql("finish_quantity = finish_quantity + " + dto.getQuantity())
-                .set(BasePo::getUpdateTime, new Date())
-                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
-        );
-
-        //更新完工数量
-        ProductionOrderDetail productionOrderDetail = produceOrderDetailService.getById(productionTaskId);
-        Assert.notEmpty(productionOrderDetail, "查询不到生产任务信息!");
-        ProductInfo productInfo = productInfoService.getById(productionOrderDetail.getProductId());
-        Assert.notEmpty(productInfo, "查询不到生产产品信息!");
-        Long technologyId = productInfo.getTechnologyId();
-        //判断报工工序是不是最后一道工序,是增加完工数量
-        long count = technologyProcessLineService.count(q -> q
-                .eq(TechnologyProcessLine::getTechnologyId, technologyId)
-                .eq(TechnologyProcessLine::getSourceProcessesId, productionProcessesId)
-                .eq(TechnologyProcessLine::getTargetProcessesId, 99)
-        );
-        if (count > 0) {
-            //是最后一道工序添加完工数量
-            BigDecimal quantity = productionOrderDetail.getQuantity();
-            BigDecimal finishQuantity = productionOrderDetail.getFinishQuantity();
-            //计算完工数量
-            BigDecimal add = finishQuantity.add(reportingQuantity);
-            productionOrderDetail.setFinishQuantity(add);
-            //全部完成赋值完工时间
-            if (add.compareTo(quantity) >= 0) {
-                productionOrderDetail.setFinishTime(new Date());
-                productionOrderDetail.setProduceStatus(2);
-            }
-            produceOrderDetailService.updateById(productionOrderDetail);
-        }
-        //检查订单下的任务是否完成,更改状态
-        Long produceOrderId = productionOrderDetail.getProduceOrderId();
-        long count1 = produceOrderDetailService.count(q -> q
-                .eq(ProductionOrderDetail::getProduceOrderId, produceOrderId)
-                .ne(ProductionOrderDetail::getProduceStatus, 2)
-        );
-        if (count1 == 0) {
-            produceOrderService.update(q -> q
-                    .eq(BasePo::getId, produceOrderId)
-                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
-                    .set(BasePo::getUpdateTime, new Date())
-                    .set(ProductionOrder::getProduceStatus, 2)
-            );
-        }
-
-        this.save(dto);
+//        Long productionTaskId = dto.getProductionTaskId();
+//        Long productionProcessesId = dto.getProductionProcessesId();
+//        BigDecimal reportingQuantity = dto.getQuantity();
+//
+//        Assert.notEmpty(productionTaskId, "生产任务id不能为空!");
+//        Assert.notEmpty(productionProcessesId, "生产工序id不能为空!");
+//        Assert.notEmpty(reportingQuantity, "报工数量不能为空!");
+//
+//
+//        ProductionTaskProgress productionTaskProgress = productionTaskProgressService.getOne(q -> q
+//                .eq(ProductionTaskProgress::getTaskId, productionTaskId)
+//                .eq(ProductionTaskProgress::getProcessesId, productionProcessesId)
+//        );
+//
+//        Assert.notEmpty(productionTaskProgress, "查询不到生产进度信息");
+//
+//        //更新生产进度信息
+//        productionTaskProgressService.update(q -> q
+//                .eq(ProductionTaskProgress::getId, productionTaskProgress.getId())
+//                .setSql("finish_quantity = finish_quantity + " + dto.getQuantity())
+//                .set(BasePo::getUpdateTime, new Date())
+//                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+//        );
+//
+//        //更新完工数量
+//        ProductionOrderDetail productionOrderDetail = produceOrderDetailService.getById(productionTaskId);
+//        Assert.notEmpty(productionOrderDetail, "查询不到生产任务信息!");
+//        ProductInfo productInfo = productInfoService.getById(productionOrderDetail.getProductId());
+//        Assert.notEmpty(productInfo, "查询不到生产产品信息!");
+//        Long technologyId = productInfo.getTechnologyId();
+//        //判断报工工序是不是最后一道工序,是增加完工数量
+//        long count = technologyProcessLineService.count(q -> q
+//                .eq(TechnologyProcessLine::getTechnologyId, technologyId)
+//                .eq(TechnologyProcessLine::getSourceProcessesId, productionProcessesId)
+//                .eq(TechnologyProcessLine::getTargetProcessesId, 99)
+//        );
+//        if (count > 0) {
+//            //是最后一道工序添加完工数量
+//            BigDecimal quantity = productionOrderDetail.getQuantity();
+//            BigDecimal finishQuantity = productionOrderDetail.getFinishQuantity();
+//            //计算完工数量
+//            BigDecimal add = finishQuantity.add(reportingQuantity);
+//            productionOrderDetail.setFinishQuantity(add);
+//            //全部完成赋值完工时间
+//            if (add.compareTo(quantity) >= 0) {
+//                productionOrderDetail.setFinishTime(new Date());
+//                productionOrderDetail.setProduceStatus(2);
+//            }
+//            produceOrderDetailService.updateById(productionOrderDetail);
+//        }
+//        //检查订单下的任务是否完成,更改状态
+//        Long produceOrderId = productionOrderDetail.getProduceOrderId();
+//        long count1 = produceOrderDetailService.count(q -> q
+//                .eq(ProductionOrderDetail::getProduceOrderId, produceOrderId)
+//                .ne(ProductionOrderDetail::getProduceStatus, 2)
+//        );
+//        if (count1 == 0) {
+//            produceOrderService.update(q -> q
+//                    .eq(BasePo::getId, produceOrderId)
+//                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+//                    .set(BasePo::getUpdateTime, new Date())
+//                    .set(ProductionOrder::getProduceStatus, 2)
+//            );
+//        }
+//
+//        this.save(dto);
     }
 
     @Override

+ 123 - 35
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionReportingServiceImpl.java

@@ -2,32 +2,32 @@ package com.fjhx.mes.service.production.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.production.dto.ProductionReportingDto;
 import com.fjhx.mes.entity.production.dto.ProductionReportingSelectDto;
-import com.fjhx.mes.entity.production.po.ProductionProcesses;
-import com.fjhx.mes.entity.production.po.ProductionReporting;
-import com.fjhx.mes.entity.production.po.ProductionReportingDetail;
-import com.fjhx.mes.entity.production.po.ProductionTask;
+import com.fjhx.mes.entity.production.po.*;
 import com.fjhx.mes.entity.production.vo.ProductionReportingDetailVo;
 import com.fjhx.mes.entity.production.vo.ProductionReportingVo;
+import com.fjhx.mes.entity.technology.po.TechnologyProcessLine;
 import com.fjhx.mes.mapper.production.ProductionReportingMapper;
-import com.fjhx.mes.service.production.ProductionProcessesService;
-import com.fjhx.mes.service.production.ProductionReportingDetailService;
-import com.fjhx.mes.service.production.ProductionReportingService;
-import com.fjhx.mes.service.production.ProductionTaskService;
+import com.fjhx.mes.service.production.*;
+import com.fjhx.mes.service.technology.TechnologyProcessLineService;
+import com.ruoyi.common.core.domain.BasePo;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.system.utils.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
  * 生产报工 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-30
  */
 @Service
@@ -49,15 +49,24 @@ public class ProductionReportingServiceImpl extends ServiceImpl<ProductionReport
     ProductionProcessesService productionProcessesService;
     @Autowired
     ProductionTaskService productionTaskService;
+    @Autowired
+    private ProductionTaskProgressService productionTaskProgressService;
+    @Autowired
+    private ProduceOrderDetailService produceOrderDetailService;
+    @Autowired
+    private TechnologyProcessLineService technologyProcessLineService;
+    @Autowired
+    private ProduceOrderService produceOrderService;
+
 
     @Override
     public Page<ProductionReportingVo> getPage(ProductionReportingSelectDto dto) {
         IWrapper<ProductionReporting> wrapper = getWrapper();
         wrapper.orderByDesc("pr", ProductionReporting::getId);
-        wrapper.like("pt.code",dto.getKeyword());
+        wrapper.like("pt.code", dto.getKeyword());
         Page<ProductionReportingVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<ProductionReportingVo> records = page.getRecords();
-        UserUtil.assignmentNickName(records,ProductionReporting::getCreateUser,ProductionReportingVo::setOperatorName);
+        UserUtil.assignmentNickName(records, ProductionReporting::getCreateUser, ProductionReportingVo::setOperatorName);
         return page;
     }
 
@@ -65,11 +74,11 @@ public class ProductionReportingServiceImpl extends ServiceImpl<ProductionReport
     public ProductionReportingVo detail(Long id) {
         ProductionReportingVo productionReporting = baseMapper.detail(id);
         ProductInfo productInfo = productInfoService.getById(productionReporting.getProductId());
-        if(ObjectUtil.isNotEmpty(productInfo)){
+        if (ObjectUtil.isNotEmpty(productInfo)) {
             productionReporting.setProductName(productInfo.getName());
         }
         Map<Long, String> nickNameMapByIds = UserUtil.getNickNameMapByIds(Arrays.asList(productionReporting.getPersonLiableId()));
-        if(ObjectUtil.isNotEmpty(nickNameMapByIds)) {
+        if (ObjectUtil.isNotEmpty(nickNameMapByIds)) {
             String name = nickNameMapByIds.get(productionReporting.getPersonLiableId());
             productionReporting.setPersonLiableName(name);
         }
@@ -95,38 +104,117 @@ public class ProductionReportingServiceImpl extends ServiceImpl<ProductionReport
         return productionReporting;
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @DSTransactional
     @Override
-    public void add(ProductionReportingDto productionReportingDto) {
-        this.save(productionReportingDto);
-        //保存报工明细
-        List<ProductionReportingDetail> productionReportingDetailList = productionReportingDto.getProductionReportingDetailList();
-        for (ProductionReportingDetail productionReportingDetail : productionReportingDetailList) {
-            productionReportingDetail.setProductionReportingId(productionReportingDto.getId());
+    public synchronized void add(ProductionReportingDto dto) {
+        Long productionTaskId = dto.getProductionTaskId();
+        Long productionProcessesId = dto.getProductionProcessesId();
+        BigDecimal reportingQuantity = dto.getQuantity();
+        String userSet = dto.getUserSet();
+
+        Assert.notEmpty(userSet, "报工人不能为空");
+        Assert.notEmpty(productionTaskId, "生产任务id不能为空!");
+        Assert.notEmpty(productionProcessesId, "生产工序id不能为空!");
+        Assert.notEmpty(reportingQuantity, "报工数量不能为空!");
+
+        //赋值归属公司
+        Long companyId = SecurityUtils.getCompanyId();
+        dto.setCompanyId(companyId);
+
+        //保存报工
+        this.save(dto);
+
+        //生成报工明细
+        long[] userIdList = Arrays.asList(userSet.split(",")).stream().mapToLong(Long::parseLong).toArray();
+        //报工数量所有人平分
+        BigDecimal divide = reportingQuantity.divide(BigDecimal.valueOf(userIdList.length), 4, RoundingMode.HALF_UP);
+        List<ProductionReportingDetail> productionReportingDetailList = new ArrayList<>();
+        for (long userId : userIdList) {
+            ProductionReportingDetail productionReportingDetail = new ProductionReportingDetail();
+            productionReportingDetail.setProductionReportingId(dto.getId());
+            productionReportingDetail.setProductionTaskId(productionTaskId);
+            productionReportingDetail.setProductionProcessesId(productionProcessesId);
+            productionReportingDetail.setQuantity(divide);
+            productionReportingDetail.setUserId(userId);
+            productionReportingDetail.setCompanyId(companyId);
+            productionReportingDetailList.add(productionReportingDetail);
         }
         productionReportingDetailService.saveBatch(productionReportingDetailList);
-        Long productionTaskId = productionReportingDto.getProductionTaskId();
-        //设置生产任务状态为进行中
-        ProductionTask byId = productionTaskService.getById(productionTaskId);
-        byId.setStatus(1);
-        productionTaskService.updateById(byId);
+
+        ProductionTaskProgress productionTaskProgress = productionTaskProgressService.getOne(q -> q
+                .eq(ProductionTaskProgress::getTaskId, productionTaskId)
+                .eq(ProductionTaskProgress::getProcessesId, productionProcessesId)
+        );
+
+        Assert.notEmpty(productionTaskProgress, "查询不到生产进度信息");
+
+        //更新生产进度信息
+        productionTaskProgressService.update(q -> q
+                .eq(ProductionTaskProgress::getId, productionTaskId)
+                .setSql("finish_quantity = finish_quantity + " + dto.getQuantity())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+
+        //更新完工数量
+        ProductionOrderDetail productionOrderDetail = produceOrderDetailService.getById(productionTaskId);
+        Assert.notEmpty(productionOrderDetail, "查询不到生产任务信息!");
+        ProductInfo productInfo = productInfoService.getById(productionOrderDetail.getProductId());
+        Assert.notEmpty(productInfo, "查询不到生产产品信息!");
+        Long technologyId = productInfo.getTechnologyId();
+        //判断报工工序是不是最后一道工序,是增加完工数量
+        long count = technologyProcessLineService.count(q -> q
+                .eq(TechnologyProcessLine::getTechnologyId, technologyId)
+                .eq(TechnologyProcessLine::getSourceProcessesId, productionProcessesId)
+                .eq(TechnologyProcessLine::getTargetProcessesId, 99)
+        );
+        if (count > 0) {
+            //是最后一道工序添加完工数量
+            BigDecimal quantity = productionOrderDetail.getQuantity();
+            BigDecimal finishQuantity = productionOrderDetail.getFinishQuantity();
+            //计算完工数量
+            BigDecimal add = finishQuantity.add(reportingQuantity);
+            productionOrderDetail.setFinishQuantity(add);
+            //全部完成赋值完工时间
+            if (add.compareTo(quantity) >= 0) {
+                productionOrderDetail.setFinishTime(new Date());
+                productionOrderDetail.setProduceStatus(2);
+            }
+            produceOrderDetailService.updateById(productionOrderDetail);
+        }
+        //检查订单下的任务是否完成,更改状态
+        Long produceOrderId = productionOrderDetail.getProduceOrderId();
+        long count1 = produceOrderDetailService.count(q -> q
+                .eq(ProductionOrderDetail::getProduceOrderId, produceOrderId)
+                .ne(ProductionOrderDetail::getProduceStatus, 2)
+        );
+        if (count1 == 0) {
+            produceOrderService.update(q -> q
+                    .eq(BasePo::getId, produceOrderId)
+                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    .set(BasePo::getUpdateTime, new Date())
+                    .set(ProductionOrder::getProduceStatus, 2)
+            );
+        }
+
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(ProductionReportingDto productionReportingDto) {
-        this.updateById(productionReportingDto);
-        //保存报工明细
-        List<ProductionReportingDetail> productionReportingDetailList = productionReportingDto.getProductionReportingDetailList();
-        for (ProductionReportingDetail productionReportingDetail : productionReportingDetailList) {
-            productionReportingDetail.setProductionReportingId(productionReportingDto.getId());
-        }
-        productionReportingDetailService.updateBatchById(productionReportingDetailList);
+//        this.updateById(productionReportingDto);
+//        //保存报工明细
+//        List<ProductionReportingDetail> productionReportingDetailList = productionReportingDto.getProductionReportingDetailList();
+//        for (ProductionReportingDetail productionReportingDetail : productionReportingDetailList) {
+//            productionReportingDetail.setProductionReportingId(productionReportingDto.getId());
+//        }
+//        productionReportingDetailService.updateBatchById(productionReportingDetailList);
     }
 
     @Override
     public void delete(Long id) {
         this.removeById(id);
+        productionReportingDetailService.remove(q -> q.eq(ProductionReportingDetail::getProductionReportingId, id));
     }
 
 }

+ 2 - 1
hx-mes/src/main/resources/mapper/production/ProductionReportingDetailMapper.xml

@@ -12,7 +12,8 @@
                prd.update_time,
                po.`code` AS orderCode,
                pp.`name` AS processesName,
-               prd.company_id
+               prd.company_id,
+               prd.user_id
         FROM production_reporting_detail prd
                  LEFT JOIN production_order_detail pod ON prd.production_task_id = pod.id
                  LEFT JOIN production_order po ON pod.produce_order_id = po.id