Merge remote-tracking branch 'origin/main'

This commit is contained in:
wb_zhanghaoyuan 2025-06-26 20:38:32 +08:00
commit e2fc1967b8
25 changed files with 376 additions and 49 deletions

View File

@ -124,9 +124,8 @@ public class MaterialController {
} }
@GetMapping({"/getbzjList"}) @GetMapping({"/getbzjList"})
@Operation(summary = "TODO:获取物料标准件信息列表", description = "只包含被开启的物料,主要用于前端的下拉选项") @Operation(summary = "TODO:获取物料标准件信息列表", description = "只包含被开启的物料,主要用于前端的下拉选项")
public CommonResult<List<Map<String, Object>> > getbzjList() { public CommonResult<PageResult<MaterialRespVO> > getbzjList(@Valid MaterialPageReqVO pageReqVO) {
List<Map<String, Object>> list = materialService.getbzjList(); PageResult<MaterialDO> pageResult = materialService.getbzjList(pageReqVO);
// 拼接数据 return success(BeanUtils.toBean(pageResult, MaterialRespVO.class));
return success(list);
} }
} }

View File

@ -86,7 +86,6 @@ public class MaterialPlanBoomDO extends BaseDO {
/** /**
* 物料id * 物料id
*/ */
@TableField(exist = false)
private Long materialId; private Long materialId;
/** /**
* 零件重量 * 零件重量

View File

@ -136,6 +136,8 @@ public class PurchaseOrderNoDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private String username; private String username;
@TableField(exist = false) @TableField(exist = false)
private String auditorName;
@TableField(exist = false)
private String userMobile; private String userMobile;
@TableField(exist = false) @TableField(exist = false)
private String contactName; private String contactName;
@ -150,6 +152,10 @@ public class PurchaseOrderNoDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private Integer receivingStatus1; private Integer receivingStatus1;
@TableField(exist = false) @TableField(exist = false)
private BigDecimal estimatedPriceSum;
@TableField(exist = false)
private BigDecimal purchaseAmountSum;
@TableField(exist = false)
private List<PurchaseOrderNoDetailDO> PurchaseOrderNoDetailList; private List<PurchaseOrderNoDetailDO> PurchaseOrderNoDetailList;
/** /**
* 是否打印 * 是否打印

View File

@ -170,6 +170,8 @@ public class PurchaseOrderNoDetailDO extends BaseDO {
*/ */
private Long procedureId; private Long procedureId;
@TableField(exist = false) @TableField(exist = false)
private String blueprintNo;
@TableField(exist = false)
private Long matId; private Long matId;
@TableField(exist = false) @TableField(exist = false)
private String matName; private String matName;
@ -184,6 +186,8 @@ public class PurchaseOrderNoDetailDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private BigDecimal matRest; private BigDecimal matRest;
@TableField(exist = false) @TableField(exist = false)
private BigDecimal unitPrice;
@TableField(exist = false)
private BigDecimal requireAmount; private BigDecimal requireAmount;
@TableField(exist = false) @TableField(exist = false)
private LocalDateTime requireArriveTime; private LocalDateTime requireArriveTime;

View File

@ -66,6 +66,7 @@ public interface MaterialMapper extends BaseMapperX<MaterialDO> {
.orderByDesc(MaterialDO::getId); .orderByDesc(MaterialDO::getId);
query.like(!StringUtils.isEmpty(reqVO.getName()), MaterialDO::getName, reqVO.getName()) query.like(!StringUtils.isEmpty(reqVO.getName()), MaterialDO::getName, reqVO.getName())
.like(!StringUtils.isEmpty(reqVO.getCode()), MaterialDO::getCode, reqVO.getCode()) .like(!StringUtils.isEmpty(reqVO.getCode()), MaterialDO::getCode, reqVO.getCode())
.like(!StringUtils.isEmpty(reqVO.getShortName()), MaterialDO::getShortName, reqVO.getShortName())
.eq(!StringUtils.isEmpty(reqVO.getMaterialType()), MaterialDO::getMaterialType, reqVO.getMaterialType()) .eq(!StringUtils.isEmpty(reqVO.getMaterialType()), MaterialDO::getMaterialType, reqVO.getMaterialType())
.eq(reqVO.getStatus() != null, MaterialDO::getStatus, reqVO.getStatus()) .eq(reqVO.getStatus() != null, MaterialDO::getStatus, reqVO.getStatus())
.eq(true,MaterialDO::getVirtualPart, YesOrNoEnum.N.name()) .eq(true,MaterialDO::getVirtualPart, YesOrNoEnum.N.name())
@ -98,8 +99,35 @@ public interface MaterialMapper extends BaseMapperX<MaterialDO> {
} }
default List<Map<String, Object>> getbzjList(){ default PageResult<MaterialDO> getbzjList(MaterialPageReqVO reqVO){
return selectMaps(new QueryWrapper<MaterialDO>().select("id", "name","short_name","code","material_type","spec","unit","brand").eq("material_type", 5)); MPJLambdaWrapper<MaterialDO> query = new MPJLambdaWrapper<>();
query.selectAll(MaterialDO.class)
.select("s.name as mainSupplierName")
.leftJoin(SupplierDO.class, "s", SupplierDO::getId, MaterialDO::getMainSupplierId)
.disableSubLogicDel()
.orderByDesc(MaterialDO::getId);
query.like(!StringUtils.isEmpty(reqVO.getName()), MaterialDO::getName, reqVO.getName())
.like(!StringUtils.isEmpty(reqVO.getSpec()), MaterialDO::getSpec, reqVO.getSpec())
.like(!StringUtils.isEmpty(reqVO.getCode()), MaterialDO::getCode, reqVO.getCode())
.like(!StringUtils.isEmpty(reqVO.getShortName()), MaterialDO::getShortName, reqVO.getShortName())
.eq(!StringUtils.isEmpty(reqVO.getMaterialType()), MaterialDO::getMaterialType, reqVO.getMaterialType())
.eq(reqVO.getStatus() != null, MaterialDO::getStatus, reqVO.getStatus())
.eq(true,MaterialDO::getVirtualPart, YesOrNoEnum.N.name())
.apply(!StringUtils.isEmpty(reqVO.getCodeAndName()), " (t.name like {0} or t.code like {0})", "%"+reqVO.getCodeAndName()+"%");
query.eq(MaterialDO::getTenantId,2);
if (!StringUtils.isEmpty(reqVO.getInventoryName())) {
query.and(qw ->
qw.like("t.name", reqVO.getInventoryName())
.or()
.like("t.code", reqVO.getInventoryName())
);
}
// if(!StringUtils.isEmpty(reqVO.getCodeAndName())){
// query.like(MaterialDO::getName, reqVO.getCodeAndName()).or().like(MaterialDO::getCode, reqVO.getCodeAndName());
//
// }
return selectPage(reqVO, query);
} }
} }

View File

@ -65,7 +65,7 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
query.selectAll(MaterialPlanBoomDO.class) query.selectAll(MaterialPlanBoomDO.class)
// .select("mat.id as matId","mat.name as matName","mat.code as matCode","mat.spec as matSpec","mat.unit as matUnit","mat.material_type as matType") // .select("mat.id as matId","mat.name as matName","mat.code as matCode","mat.spec as matSpec","mat.unit as matUnit","mat.material_type as matType")
// .select("b.material_name as matName","m.code as matCode","b.spec as matSpec","b.unit as matUnit","b.blueprint_no as blueprintNo") // .select("b.material_name as matName","m.code as matCode","b.spec as matSpec","b.unit as matUnit","b.blueprint_no as blueprintNo")
.select("b.material_name as matName","b.spec as matSpec","b.unit as matUnit","b.blueprint_no as blueprintNo") .select("b.spec as matSpec","b.unit as matUnit","b.blueprint_no as blueprintNo")
.select("bc.`name` as compositionName","b.`composition_id` as compositionId") .select("bc.`name` as compositionName","b.`composition_id` as compositionId")
.select("ma.brief as customerBriefName,ma.project_name as projectName,ma.name as projectSubName,ma.project_id as projectId") .select("ma.brief as customerBriefName,ma.project_name as projectName,ma.name as projectSubName,ma.project_id as projectId")
@ -172,13 +172,13 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
default PageResult<MaterialPlanBoomDO> getStandardPartsPages(MaterialPlanPageReqVO pageReqVO){ default PageResult<MaterialPlanBoomDO> getStandardPartsPages(MaterialPlanPageReqVO pageReqVO){
MPJLambdaWrapper<MaterialPlanBoomDO> query = new MPJLambdaWrapper<>(); MPJLambdaWrapper<MaterialPlanBoomDO> query = new MPJLambdaWrapper<>();
query.selectAll(MaterialPlanBoomDO.class) query.selectAll(MaterialPlanBoomDO.class)
.select("p.project_name as projectName","p.project_id as projectId","p.name as projectSubName","mat.material_id as matId","m.code as materialName") .select("p.project_name as projectName","p.project_id as projectId","p.name as projectSubName","mat.material_id as matId","m.code as materialName","m.code as matCode")
.select("d.spec as boomSpec","d.blueprint_no as blueprintNo","d.unit as boomUnit","DATE_FORMAT(t.boom_arrive_date, '%Y-%m-%d') AS boomArriveDates") .select("d.spec as boomSpec","d.blueprint_no as blueprintNo","d.unit as boomUnit","DATE_FORMAT(t.boom_arrive_date, '%Y-%m-%d') AS boomArriveDates")
.leftJoin(MaterialPlanDO.class, "p", MaterialPlanDO::getId,MaterialPlanBoomDO::getProjectMaterialPlanId) .leftJoin(MaterialPlanDO.class, "p", MaterialPlanDO::getId,MaterialPlanBoomDO::getProjectMaterialPlanId)
.leftJoin(ProjectOrderDO.class,"b",ProjectOrderDO::getId,MaterialPlanDO::getProjectId) .leftJoin(ProjectOrderDO.class,"b",ProjectOrderDO::getId,MaterialPlanDO::getProjectId)
.leftJoin(ProcessBomDetailDO.class,"d",ProcessBomDetailDO::getId,MaterialPlanBoomDO::getBoomDetailId) .leftJoin(ProcessBomDetailDO.class,"d",ProcessBomDetailDO::getId,MaterialPlanBoomDO::getBoomDetailId)
.leftJoin("project_mat_req_detail mat on (t.id=mat.project_material_plan_detail_id and mat.deleted=0)") .leftJoin("project_mat_req_detail mat on (t.id=mat.project_material_plan_detail_id and mat.deleted=0 and mat.tenant_id = 2)")
.leftJoin(MaterialDO.class,"m",MaterialDO::getId,MatReqDetailDO::getMaterialId) .leftJoin("base_material m ON (m.id = mat.material_id and m.tenant_id = 2) ")
.disableSubLogicDel() .disableSubLogicDel()
.groupBy(MaterialPlanBoomDO::getId) .groupBy(MaterialPlanBoomDO::getId)
.orderByDesc(MaterialPlanBoomDO::getCreateTime); .orderByDesc(MaterialPlanBoomDO::getCreateTime);

View File

@ -58,7 +58,7 @@ public interface PurchaseOrderNoDetailMapper extends BaseMapperX<PurchaseOrderNo
MPJLambdaWrapper<PurchaseOrderNoDetailDO> query = new MPJLambdaWrapper<>(); MPJLambdaWrapper<PurchaseOrderNoDetailDO> query = new MPJLambdaWrapper<>();
query.selectAll(PurchaseOrderNoDetailDO.class) query.selectAll(PurchaseOrderNoDetailDO.class)
.select("t.composition as compositionName","t.purchase_rem_amount as purchaseRemAmounts","mat.code as matCode","pro.name as procedureName") .select("t.composition as compositionName","t.purchase_rem_amount as purchaseRemAmounts","mat.code as matCode","pro.name as procedureName","bom.blueprint_no as blueprintNo")
.leftJoin(PurchaseOrderNoDO.class, "pb", PurchaseOrderNoDO::getId, PurchaseOrderBoomDO::getPurchaseOrderId) .leftJoin(PurchaseOrderNoDO.class, "pb", PurchaseOrderNoDO::getId, PurchaseOrderBoomDO::getPurchaseOrderId)
.leftJoin(ProcessBomDetailDO.class,"bom", ProcessBomDetailDO::getId, PurchaseOrderNoDetailDO::getBoomDetailId) .leftJoin(ProcessBomDetailDO.class,"bom", ProcessBomDetailDO::getId, PurchaseOrderNoDetailDO::getBoomDetailId)
.leftJoin(MaterialPlanBoomDO.class,"plan", MaterialPlanBoomDO::getId, PurchaseOrderNoDetailDO::getProjectMaterialPlanBoomId) .leftJoin(MaterialPlanBoomDO.class,"plan", MaterialPlanBoomDO::getId, PurchaseOrderNoDetailDO::getProjectMaterialPlanBoomId)

View File

@ -59,5 +59,7 @@ public interface MaterialService {
void importExcel(List<MaterialExcelVO> materialExcelVOList, Boolean updateSupport); void importExcel(List<MaterialExcelVO> materialExcelVOList, Boolean updateSupport);
List<Map<String, Object>> getbzjList();
PageResult<MaterialDO> getbzjList(MaterialPageReqVO pageReqVO);
} }

View File

@ -205,8 +205,9 @@ public class MaterialServiceImpl implements MaterialService {
} }
@Override @Override
public List<Map<String, Object>> getbzjList() { public PageResult<MaterialDO> getbzjList(MaterialPageReqVO pageReqVO) {
return materialMapper.getbzjList(); } return materialMapper.getbzjList( pageReqVO);
}
private void checkData(List<MaterialExcelVO> materialExcelVOList) { private void checkData(List<MaterialExcelVO> materialExcelVOList) {
// 基础校验 // 基础校验

View File

@ -422,7 +422,7 @@ public class MaterialPlanServiceImpl implements MaterialPlanService {
queryWrapper.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, id); queryWrapper.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, id);
materialPlanBoomMapper.delete(queryWrapper); materialPlanBoomMapper.delete(queryWrapper);
materialPlanMapper.deleteById(id); materialPlanMapper.deleteById(id);
return null; return CommonResult.success( true);
} }
@Override @Override

View File

@ -402,6 +402,11 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<ProcessBomDetailDO> processBomDetails = updateReqVO.getProcessBomDetails(); List<ProcessBomDetailDO> processBomDetails = updateReqVO.getProcessBomDetails();
//不论怎么样都要校验这次的数据它图号是否唯一非标准件的名称是否重复规格是否为空 //不论怎么样都要校验这次的数据它图号是否唯一非标准件的名称是否重复规格是否为空
if (CollUtil.isNotEmpty(processBomDetails)){ if (CollUtil.isNotEmpty(processBomDetails)){
for (ProcessBomDetailDO processBomDetail : processBomDetails) {
if (processBomDetail.getId() == null){
processBomDetail.setDeleted(false);
}
}
//校验这次的数据它图号是否唯一 //校验这次的数据它图号是否唯一
Map<String, List<ProcessBomDetailDO>> groupedByBluePrintfNo = processBomDetails.stream().filter(e -> e.getDeleted() == false).collect(Collectors.groupingBy(vo -> vo.getBlueprintNo() == null ? "NULL" : vo.getBlueprintNo())); Map<String, List<ProcessBomDetailDO>> groupedByBluePrintfNo = processBomDetails.stream().filter(e -> e.getDeleted() == false).collect(Collectors.groupingBy(vo -> vo.getBlueprintNo() == null ? "NULL" : vo.getBlueprintNo()));
groupedByBluePrintfNo.forEach((printNo,list)->{ groupedByBluePrintfNo.forEach((printNo,list)->{

View File

@ -39,6 +39,8 @@ import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@ -315,6 +317,49 @@ public class PurchaseOrderNoServiceImpl implements PurchaseOrderNoService {
purchaseOrderNoDO.setDeliveryAddress("浙江省杭州市余杭区良渚街道刘林圩路5号"); purchaseOrderNoDO.setDeliveryAddress("浙江省杭州市余杭区良渚街道刘林圩路5号");
purchaseOrderNoDO.setBuyer("杭州合立机械有限公司"); purchaseOrderNoDO.setBuyer("杭州合立机械有限公司");
List<PurchaseOrderNoDetailDO> detailList = purchaseOrderNoDetailMapper.getPurchaseOrderNoDetailById(id); List<PurchaseOrderNoDetailDO> detailList = purchaseOrderNoDetailMapper.getPurchaseOrderNoDetailById(id);
// if ("1".equals(purchaseOrderNoDO.getGoodsType())){
if (detailList != null && !detailList.isEmpty()) {
detailList.forEach(detail -> {
// 跳过对象本身为null的情况
if (detail == null) return;
BigDecimal estimatedPrice = detail.getEstimatedPrice();
BigDecimal purchaseAmount = detail.getPurchaseAmount();
if (estimatedPrice != null &&
purchaseAmount != null &&
purchaseAmount.compareTo(BigDecimal.ZERO) != 0) {
// 计算并保留1位小数
BigDecimal result = estimatedPrice
.divide(purchaseAmount, 1, RoundingMode.HALF_UP);
detail.setUnitPrice(result);
} else {
// 设置默认值根据业务需求选择
detail.setUnitPrice(BigDecimal.ZERO);
}
});
// 计算 purchaseAmount 的总和
BigDecimal purchaseAmountSum = detailList.stream()
.filter(Objects::nonNull) // 过滤掉空对象
.map(PurchaseOrderNoDetailDO::getPurchaseAmount)
.filter(Objects::nonNull) // 过滤掉空值
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加求和
// 计算 estimatedPrice 的总和
BigDecimal estimatedPriceSum = detailList.stream()
.filter(Objects::nonNull) // 过滤掉空对象
.map(PurchaseOrderNoDetailDO::getEstimatedPrice)
.filter(Objects::nonNull) // 过滤掉空值
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加求和
purchaseOrderNoDO.setPurchaseAmountSum(purchaseAmountSum);
purchaseOrderNoDO.setEstimatedPriceSum(estimatedPriceSum);
}
AdminUserDO users = adminUserService.getUser(purchaseOrderNoDO.getAuditor());
if (ObjectUtil.isNotEmpty(users)){
purchaseOrderNoDO.setAuditorName(users.getNickname());
}
// }
purchaseOrderNoDO.setPurchaseOrderNoDetailList(detailList); purchaseOrderNoDO.setPurchaseOrderNoDetailList(detailList);
} }
return CommonResult.success(purchaseOrderNoDO); return CommonResult.success(purchaseOrderNoDO);
@ -339,6 +384,7 @@ public class PurchaseOrderNoServiceImpl implements PurchaseOrderNoService {
lambdaUpdateWrapper.set(PurchaseOrderMakeDetailDO::getPurchaseOrderNoId, null); lambdaUpdateWrapper.set(PurchaseOrderMakeDetailDO::getPurchaseOrderNoId, null);
lambdaUpdateWrapper.set(PurchaseOrderMakeDetailDO::getPurchaseOrderNoDetailId,null); lambdaUpdateWrapper.set(PurchaseOrderMakeDetailDO::getPurchaseOrderNoDetailId,null);
lambdaUpdateWrapper.set(PurchaseOrderMakeDetailDO::getOrderStatus,1); lambdaUpdateWrapper.set(PurchaseOrderMakeDetailDO::getOrderStatus,1);
lambdaUpdateWrapper.set(PurchaseOrderMakeDetailDO::getPurchaseNo,null);
purchaseOrderMakeDetailMapper.update(lambdaUpdateWrapper); purchaseOrderMakeDetailMapper.update(lambdaUpdateWrapper);
return CommonResult.success(true); return CommonResult.success(true);
} }

View File

@ -71,7 +71,7 @@ public class StorageInServiceImpl implements StorageInService {
for (StorageInDetailDO storageInDetailDO : storageInDetailDOS) { for (StorageInDetailDO storageInDetailDO : storageInDetailDOS) {
LambdaQueryWrapper<PurchaseOrderNoDetailDO> wrapper1 = new LambdaQueryWrapper<>(); LambdaQueryWrapper<PurchaseOrderNoDetailDO> wrapper1 = new LambdaQueryWrapper<>();
wrapper1.eq(PurchaseOrderNoDetailDO::getStorageId,storageInDetailDO.getStorageNoId()); wrapper1.eq(PurchaseOrderNoDetailDO::getStorageId,storageInDetailDO.getStorageNoId());
wrapper1.eq(PurchaseOrderNoDetailDO::getStorageMatId,storageInDetailDO.getMaterialId()); wrapper1.eq(PurchaseOrderNoDetailDO::getStorageMatId,storageInDetailDO.getId());
PurchaseOrderNoDetailDO purchaseOrderNoDetailDO = purchaseOrderNoDetailMapper.selectOne(wrapper1); PurchaseOrderNoDetailDO purchaseOrderNoDetailDO = purchaseOrderNoDetailMapper.selectOne(wrapper1);
if (ObjectUtil.isNotEmpty(purchaseOrderNoDetailDO)){ if (ObjectUtil.isNotEmpty(purchaseOrderNoDetailDO)){
LambdaUpdateWrapper<PurchaseOrderNoDetailDO> updateWrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<PurchaseOrderNoDetailDO> updateWrapper = new LambdaUpdateWrapper<>();

View File

@ -1,15 +1,18 @@
package com.chanko.yunxi.mes.module.heli.service.taskdispatch; package com.chanko.yunxi.mes.module.heli.service.taskdispatch;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.generator.IFill; import com.baomidou.mybatisplus.generator.IFill;
import com.chanko.yunxi.mes.framework.common.exception.ErrorCode; import com.chanko.yunxi.mes.framework.common.exception.ErrorCode;
import com.chanko.yunxi.mes.framework.common.exception.ServiceException;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils; import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX; import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum; import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.ProcessBoomRespVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.ygjx.vo.YgjxPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.ygjx.vo.YgjxPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO;
@ -17,6 +20,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.equipmanufacture.EquipMan
import com.chanko.yunxi.mes.module.heli.dal.dataobject.fpuserdetail.FpUserDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.fpuserdetail.FpUserDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.procedure.ProcedureDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.procedure.ProcedureDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDO;
@ -28,6 +32,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.equipmanufacture.EquipManufact
import com.chanko.yunxi.mes.module.heli.dal.mysql.fpuserdetail.FpUserDetailMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.fpuserdetail.FpUserDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.procedure.ProcedureMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.procedure.ProcedureMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper;
@ -101,6 +106,8 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
private bdgzsomthingMapper bdgzsomthingMapper; private bdgzsomthingMapper bdgzsomthingMapper;
@Resource @Resource
private ProcedureMapper procedureMapper; private ProcedureMapper procedureMapper;
@Resource
private ProcessBomDetailMapper processBomDetailMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createTaskDispatch(TaskDispatchSaveReqVO createReqVO) { public Long createTaskDispatch(TaskDispatchSaveReqVO createReqVO) {
@ -141,6 +148,27 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
if(!updateObj.canOperate(operateTypeEnum)){ if(!updateObj.canOperate(operateTypeEnum)){
throw exception(INVALID_OPERATE); throw exception(INVALID_OPERATE);
} }
if (updateReqVO.getDispatchType() != null && updateReqVO.getDispatchType().equals("PRODUCTION")){
List<Long> idList = updateReqVO.getTaskDispatchDetails().stream()
.filter(o -> o.getId() != null)
.map(TaskDispatchDetailDO::getId)
.collect(Collectors.toList());
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(TaskDispatchDetailDO::getId, idList);
wrapper.eq(TaskDispatchDetailDO::getDeleted, 0);
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
for (TaskDispatchDetailDO dispatchDetailDO : detailDOS) {
if (dispatchDetailDO.getPlanStatus()==1){
TaskDispatchDO taskDispatchDO = taskDispatchMapper.selectById(dispatchDetailDO.getDispatchId());
ProcessBomDetailDO bomDetailDO = processBomDetailMapper.selectById(taskDispatchDO.getBomDetailId());
ProcedureDO procedureDO = procedureMapper.selectById(dispatchDetailDO.getProcedureId());
if (ObjectUtil.isNotEmpty(bomDetailDO)&&ObjectUtil.isNotEmpty(procedureDO)){
throw exception(new ErrorCode(400,bomDetailDO.getMaterialName()+" "+procedureDO.getName()+"已做物料需求计划,不能更改,请确认"));
}
}
}
}
// 明细工序状态更新 // 明细工序状态更新
if(operateTypeEnum == OperateTypeEnum.SUBMIT){ if(operateTypeEnum == OperateTypeEnum.SUBMIT){
if (updateReqVO.getDispatchType() != null && updateReqVO.getDispatchType().equals("ASSEMBLE")){ if (updateReqVO.getDispatchType() != null && updateReqVO.getDispatchType().equals("ASSEMBLE")){
@ -437,10 +465,20 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
@Override @Override
public void deleteTaskDispatchDetail(Long id) { public void deleteTaskDispatchDetail(Long id) {
TaskDispatchDetailDO taskDispatchDetailDO = taskDispatchDetailMapper.selectById(id);
if (ObjectUtil.isNotEmpty(taskDispatchDetailDO)&&taskDispatchDetailDO.getPlanStatus()==1){
TaskDispatchDO taskDispatchDO = taskDispatchMapper.selectById(taskDispatchDetailDO.getDispatchId());
ProcessBomDetailDO bomDetailDO = processBomDetailMapper.selectById(taskDispatchDO.getBomDetailId());
ProcedureDO procedureDO = procedureMapper.selectById(taskDispatchDetailDO.getProcedureId());
if (ObjectUtil.isNotEmpty(bomDetailDO)&&ObjectUtil.isNotEmpty(procedureDO)){
throw exception(new ErrorCode(400,bomDetailDO.getMaterialName()+" "+procedureDO.getName()+"已做物料需求计划,不能更改,请确认"));
}
}
taskDispatchDetailMapper.deleteByDispatchId(id); taskDispatchDetailMapper.deleteByDispatchId(id);
} }
@Override @Override
public void deleteTaskDispatchDetailOwner(Long id) { public void deleteTaskDispatchDetailOwner(Long id) {
taskDispatchDetailMapper.deleteByOwnerId(id,null); taskDispatchDetailMapper.deleteByOwnerId(id,null);
taskDispatchDetailOwnerMapper.deleteById(id); taskDispatchDetailOwnerMapper.deleteById(id);
} }

View File

@ -67,6 +67,6 @@ export const deleteMaterial = async (id: number) => {
export const exportMaterial = async (params) => { export const exportMaterial = async (params) => {
return await request.download({ url: `/heli/material/export-excel`, params }) return await request.download({ url: `/heli/material/export-excel`, params })
} }
export const getbzjList = async () => { export const getbzjList = async (params) => {
return await request.get({ url: `/heli/material/getbzjList` }) return await request.get({ url: `/heli/material/getbzjList`,params })
} }

View File

@ -1,7 +1,7 @@
<template> <template>
<el-card class="hl-card"> <el-card class="hl-card">
<template #header> <template #header>
<span>标准件物料需求计划</span> <span>采购订单生成</span>
</template> </template>
<ContentWrap class="borderxx"> <ContentWrap class="borderxx">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
@ -205,7 +205,9 @@ const exportLoading = ref(false) // 导出的加载中
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
multipleTable.value.clearSelection();
const data = await purchaseOrderMakeDetailApi.page(queryParams) const data = await purchaseOrderMakeDetailApi.page(queryParams)
list.value = data.list list.value = data.list
for (const row of list.value ) { for (const row of list.value ) {
// boomCoderemoteMethod // boomCoderemoteMethod
@ -320,6 +322,7 @@ const serachLog = (row) => {
const handleQuery = () => { const handleQuery = () => {
queryParams.pageNo = 1 queryParams.pageNo = 1
getList() getList()
} }
const opearteForm = async(type) =>{ const opearteForm = async(type) =>{
loading.value = true; loading.value = true;

View File

@ -220,6 +220,7 @@ const exportLoading = ref(false) // 导出的加载中
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
multipleTable.value.clearSelection();
const data = await materialPlanBoomApi.getStandardBuyPage(queryParams) const data = await materialPlanBoomApi.getStandardBuyPage(queryParams)
list.value = data.list list.value = data.list
total.value = data.total total.value = data.total

View File

@ -1,7 +1,7 @@
<template> <template>
<el-card class="hl-card"> <el-card class="hl-card">
<template #header> <template #header>
<span>物料需求计划管理</span> <span>标准件库存</span>
</template> </template>
<ContentWrap class="borderxx"> <ContentWrap class="borderxx">
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
@ -62,14 +62,21 @@
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180px" /> <el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180px" />
<el-table-column min-width="200px" align="center" > <el-table-column min-width="200px" align="center" >
<template #header><span class="hl-table_header">*</span>物料编码</template> <template #header><span class="hl-table_header">*</span>物料编码</template>
<template #default="{ row, $index }"> <!-- <template #default="{ row, $index }">-->
<el-form-item :prop="`${$index}.matId`" class="mb-0px!" > <!-- <el-form-item :prop="`${$index}.matId`" class="mb-0px!" >-->
<el-select v-model="row.matId" placeholder="请输入物料" clearable filterable > <!-- <el-select v-model="row.matId" placeholder="请输入物料" clearable filterable >-->
<el-option v-for="item in materialSelectList" :key="item.id" :label="item.code+' '+item.name" :value="item.id" /> <!-- <el-option v-for="item in materialSelectList" :key="item.id" :label="item.code+' '+item.name" :value="item.id" />-->
</el-select> <!-- </el-select>-->
<!-- <MaterialSelect v-model="row.matId" @update:newValue="handleSelected($index, $event)" clearable/>--> <!--&lt;!&ndash; <MaterialSelect v-model="row.matId" @update:newValue="handleSelected($index, $event)" clearable/>&ndash;&gt;-->
</el-form-item> <!-- </el-form-item>-->
<!-- </template>-->
<template #default="scope">
<el-input v-model="scope.row.matCode" disabled>
<template #suffix>
<Icon @click="serachLog(scope.row)" icon="ep:search" color="primary"/>
</template>
</el-input>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="物料名称" align="center" prop="matName" min-width="180px" /> <el-table-column label="物料名称" align="center" prop="matName" min-width="180px" />
@ -100,6 +107,7 @@
<el-button <el-button
link link
type="danger" type="danger"
v-if="scope.row.isPurYard==2|| scope.row.isPurYard==5"
@click="operation('del',scope.row.id)" @click="operation('del',scope.row.id)"
> >
删除 删除
@ -116,6 +124,7 @@
</el-row> </el-row>
</el-card> </el-card>
</el-card> </el-card>
<matLog ref="matLogRef" @success="getMat" />
</template> </template>
@ -123,6 +132,7 @@
import {DICT_TYPE, getIntDictOptions} from '@/utils/dict' import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import { dateFormatter1} from '@/utils/formatTime' import { dateFormatter1} from '@/utils/formatTime'
import * as MaterialPlanApi from '@/api/heli/materialplan' import * as MaterialPlanApi from '@/api/heli/materialplan'
import matLog from './storageLog.vue'
defineOptions({ name: 'MaterialPlan' }) defineOptions({ name: 'MaterialPlan' })
@ -131,17 +141,14 @@ const formLoading = ref(false) // 表单的加载中1修改时的数据加
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
import download from '@/utils/download' import download from '@/utils/download'
import UserSelect from "@/views/heli/materialplan/userSelectNew.vue";
import MaterialSelect from "@/views/heli/matreq/materialNewSelect.vue";
import {ref} from "vue"; import {ref} from "vue";
import {ElTable} from "element-plus"; import {ElTable} from "element-plus";
import {getStandardPartsPages} from "@/api/heli/materialplan";
import * as MatReqApi from "@/api/heli/matreq"; import * as MatReqApi from "@/api/heli/matreq";
import {generate} from "@/api/heli/matreq";
import * as MaterialApi from "@/api/heli/material";
const loading = ref(true) // const loading = ref(true) //
const list = ref([]) // const list = ref([]) //
const total = ref(0) // const total = ref(0) //
const matLogRef = ref()
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
@ -168,9 +175,9 @@ const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // const exportLoading = ref(false) //
const multipleTable = ref<InstanceType<typeof ElTable>>() const multipleTable = ref<InstanceType<typeof ElTable>>()
const handleSelected = (currentIndex, newValue: any) => { // const handleSelected = (currentIndex, newValue: any) => {
list.value[currentIndex].matId = newValue?.id // list.value[currentIndex].matId = newValue?.id
} // }
const jump = async () => { const jump = async () => {
router.push({ path: '/purchase/matreq' }) router.push({ path: '/purchase/matreq' })
// tagsViewStore.delVisitedView(router.currentRoute.value) // tagsViewStore.delVisitedView(router.currentRoute.value)
@ -186,6 +193,19 @@ const getList = async () => {
loading.value = false loading.value = false
} }
} }
const serachLog = (row) => {
matLogRef.value.open(row.id)
}
const getMat = async (rowids,ids,matCodes) => {
//formData.value.boomItemDOList = arrBoom
for(var i = 0 ; i < list.value.length ; i ++){
if(list.value[i].id == rowids){
list.value[i].matCode = matCodes
list.value[i].matId = ids
break;
}
}
}
const submitForm = async () => { const submitForm = async () => {
try { try {
console.log("开始提交"); // 1 console.log("开始提交"); // 1
@ -305,7 +325,7 @@ const userInit = ref()
/** 初始化 **/ /** 初始化 **/
onMounted(async () => { onMounted(async () => {
// //
materialSelectList.value = await MaterialApi.getbzjList() ; // materialSelectList.value = await MaterialApi.getbzjList() ;
getList() getList()
}) })
</script> </script>

View File

@ -0,0 +1,175 @@
<template>
<Dialog title="实时库存" v-model="dialogVisible" width="80%">
<el-card class="hl-card">
<ContentWrap class="borderxx">
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px">
<el-form-item label="物料名称" prop="matName" >
<el-input v-model="queryParams.name" placeholder="物料名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="规格型号" prop="matName" >
<el-input v-model="queryParams.spec" placeholder="规格型号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="物料简称" prop="shortName" >
<el-input v-model="queryParams.shortName" placeholder="物料简称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item >
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table ref="multipleTableRef" v-loading="loading" :data="list" :stripe="true" @row-click="clickRow" @selection-change="handleCurrentChange" :show-overflow-tooltip="true" class="hl-table">
<el-table-column
type="selection"
width="55"/>
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column label="物料编码" align="center" prop="code" fixed min-width="120" />
<el-table-column label="物料名称" align="center" prop="name" fixed min-width="120"/>
<el-table-column label="物料类型" align="center" prop="materialType" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_TYPE" :value="scope.row.materialType" />
</template>
</el-table-column>
<el-table-column label="物料简称" align="center" prop="shortName" min-width="120"/>
<el-table-column label="规格/型号" align="center" prop="spec" min-width="120"/>
</el-table>
<!-- 分页 -->
<Pagination
:total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
</el-card>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="success">
确认
</el-button>
</span>
</template>
</Dialog>
</template>
<script setup lang="ts">
import {DICT_TYPE} from "@/utils/dict";
import * as MaterialApi from "@/api/heli/material";
defineOptions({ name: 'StorageLog' })
const printref = ref()
const whList = ref([])
const rgList = ref([])
const pnList = ref([])
const dialogVisible = ref(false)
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
code: undefined,
name: undefined,
matType: undefined,
lotNo: undefined,
whId: undefined,
rgId:undefined,
pnId: undefined,
headerNo: undefined,
spec:undefined,
materialType:5,
status:1,
shortName:undefined
})
const queryFormRef = ref() //
const currentRow = ref()
const multipleTableRef = ref()
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await MaterialApi.getbzjList(queryParams) ;
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
const clickItem = ref([])
const handleCurrentChange = (val) => {
clickItem.value = val;
if(val.length > 1){
multipleTableRef.value!.clearSelection()
multipleTableRef.value!.toggleRowSelection(val.pop())
}
};
const clickRow = (row) => {
if (clickItem.value==null){
clickItem.value = [];
}
//
if ( clickItem.value[0] == row) {
//
clickItem.value = [];
multipleTableRef.value!.clearSelection()
} else {
//
clickItem.value.push(row);
multipleTableRef.value!.clearSelection()
multipleTableRef.value!.toggleRowSelection(row, true);
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const rowid = ref()
const open = async (rowids) => {
clickItem.value = null;
//multipleTableRef.value!.clearSelection()
dialogVisible.value = true
// queryParams.matName = matCode;
rowid.value = rowids
console.log(rowids)
console.log(rowid.value)
await getList();
}
defineExpose({ open }) // open
const emit = defineEmits(['success'])
// emit('success', multipleSelection.value)
const success = () => {
dialogVisible.value = false;
emit('success', rowid.value, clickItem.value[0].id, clickItem.value[0].code)
}
/** 初始化 **/
onMounted(async () => {
await getList()
})
</script>

View File

@ -24,12 +24,12 @@
</el-row> </el-row>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="单据日期" prop="ordDate"> <el-form-item label="入库日期" prop="ordDate">
<el-date-picker <el-date-picker
v-model="formData.ordDate" v-model="formData.ordDate"
type="date" type="date"
value-format="x" value-format="x"
placeholder="单据日期" placeholder="入库日期"
disabled disabled
/> />
</el-form-item> </el-form-item>

View File

@ -8,7 +8,7 @@
<el-form class="-mb-15px" :model="queryParams" ref="storageNo" :inline="true" label-width="120px"> <el-form class="-mb-15px" :model="queryParams" ref="storageNo" :inline="true" label-width="120px">
<el-form-item label="入库单号" prop="storageNo"> <el-form-item label="入库单号" prop="storageNo">
<el-input <el-input
v-model="queryParams.purchaseNo" placeholder="采购单号" clearable @keyup.enter="handleQuery" v-model="queryParams.purchaseNo" placeholder="入库单号" clearable @keyup.enter="handleQuery"
class="!w-240px" /> class="!w-240px" />
</el-form-item> </el-form-item>
<el-form-item label="项目名称" prop="projectName"> <el-form-item label="项目名称" prop="projectName">

View File

@ -90,7 +90,7 @@ v-for="dict in pnCurrentList" :key="dict.id" :label="dict.pn_name"
<template #header><span class="hl-table_header">*</span>补充数量</template> <template #header><span class="hl-table_header">*</span>补充数量</template>
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.storageOkQtys`" class="mb-0px!" style="margin-left:10px "> <el-form-item :prop="`${$index}.storageOkQtys`" class="mb-0px!" style="margin-left:10px ">
<el-input-number v-model="row.storageOkQtys" type="number" :precision="2" /> <el-input-number v-model="row.storageOkQtys" type="number" :precision="2" :min="0" />
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>

View File

@ -87,7 +87,6 @@ import { dateFormatter1} from '@/utils/formatTime'
import * as MaterialPlanApi from '@/api/heli/materialplan' import * as MaterialPlanApi from '@/api/heli/materialplan'
import * as UserApi from '@/api/system/user' import * as UserApi from '@/api/system/user'
import dayjs from "dayjs"; import dayjs from "dayjs";
import {delMaterial} from "@/api/heli/materialplan";
defineOptions({ name: 'MaterialPlan' }) defineOptions({ name: 'MaterialPlan' })
@ -171,6 +170,7 @@ const handleDelete = async (id: number) => {
try { try {
// //
await message.delConfirm() await message.delConfirm()
// //
await MaterialPlanApi.delMaterial(id) await MaterialPlanApi.delMaterial(id)
message.success(t('common.delSuccess')) message.success(t('common.delSuccess'))

View File

@ -1652,6 +1652,8 @@ const goback = () => {
var listdetail = ref([]); var listdetail = ref([]);
/** 删除子项操作 */ /** 删除子项操作 */
const onDeleteItem = async (row,index) => { const onDeleteItem = async (row,index) => {
let id = row.id
if (id) await TaskDispatchApi.deleteTaskDispatchDetail(id)
var list = []; var list = [];
listdetail.value = []; listdetail.value = [];
var indexs = 1; var indexs = 1;
@ -1672,8 +1674,6 @@ const onDeleteItem = async (row,index) => {
} }
checkList.value = list; checkList.value = list;
checkListTemp.value = checkList.value; checkListTemp.value = checkList.value;
let id = row.id
if (id) await TaskDispatchApi.deleteTaskDispatchDetail(id)
message.success(t('common.delSuccess')) message.success(t('common.delSuccess'))
} }
const handleOutsourcingChange= async (row: any) => { const handleOutsourcingChange= async (row: any) => {