This commit is contained in:
BinBin Song 2025-06-27 22:45:29 +08:00
commit d5f25b6f66
44 changed files with 1329 additions and 63 deletions

View File

@ -200,17 +200,11 @@ public class MaterialPlanController {
return materialPlanService.delMaterial(id); return materialPlanService.delMaterial(id);
} }
// @PostMapping("/getPartPurchasePages")
// @Operation(summary = "获得零件采购分页")
// public CommonResult<PageResult<MaterialPlanBoomDO>> getPartPurchasePages(@Valid @RequestBody MaterialPlanPageReqVO pageReqVO) {
// PageResult<MaterialPlanBoomDO> pageResult = materialPlanService.getPartPurchasePages(pageReqVO);
// return success(pageResult);
// }
@GetMapping("/getPartPurchasePages") @GetMapping("/getPartPurchasePages")
@Operation(summary = "获得零件采购分页") @Operation(summary = "获得零件采购分页")
public CommonResult<PageResult<MaterialPlanBoomDO>> getPartPurchasePages() { public CommonResult<PageResult<MaterialPlanBoomDO>> getPartPurchasePages(@Valid MaterialPlanPageReqVO pageReqVO) {
String a ="asdij"; PageResult<MaterialPlanBoomDO> pageResult = materialPlanService.getPartPurchasePages(pageReqVO);
return null; return success(pageResult);
} }
} }

View File

@ -118,5 +118,21 @@ public class PurchaseOrderMakeController {
public CommonResult<Boolean> updatePartCheckNo(@Valid PurchaseOrderMakeSaveReqVO updateReqVO) { public CommonResult<Boolean> updatePartCheckNo(@Valid PurchaseOrderMakeSaveReqVO updateReqVO) {
return success(partPurchaseOrderService.updatePartCheckStatusNo(updateReqVO)); return success(partPurchaseOrderService.updatePartCheckStatusNo(updateReqVO));
} }
@PutMapping("/reject")
@Operation(summary = "采购审批驳回")
public CommonResult<Boolean> reject(@Valid PurchaseOrderMakeSaveReqVO updateReqVO) {
return success(partPurchaseOrderService.reject(updateReqVO));
}
@PutMapping("/approval")
@Operation(summary = "采购单批准")
public CommonResult<Boolean> approval(@RequestParam("id") Long id) {
return success(partPurchaseOrderService.approval(id));
}
@GetMapping("/getDetail")
@Operation(summary = "获得采购单明细")
// @PreAuthorize("@ss.hasPermission('heli:material-plan:query')")
public CommonResult<PageResult<PartPurchaseOrderPageRespVO>> getDetail(@Valid PartPurchaseOrderPageReqVO partPurchaseOrderPageReqVO) {
PageResult<PartPurchaseOrderPageRespVO> pageResult = partPurchaseOrderService.getDetail(partPurchaseOrderPageReqVO);
return success(pageResult);
}
} }

View File

@ -158,4 +158,5 @@ public class PurchaseOrderNoController {
public CommonResult<Boolean> deleteForm(@RequestParam("id") Long id) { public CommonResult<Boolean> deleteForm(@RequestParam("id") Long id) {
return purchaseOrderNoService.deleteForm(id); return purchaseOrderNoService.deleteForm(id);
} }
} }

View File

@ -1,5 +1,8 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordernodetail; package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordernodetail;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorderno.vo.PurchaseOrderNoPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorderno.vo.PurchaseOrderNoRespVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -111,5 +114,23 @@ public class PurchaseOrderNoDetailController {
public CommonResult<Boolean> receiveGoods(@Valid @RequestBody List<PurchaseOrderNoDetailDO> list) { public CommonResult<Boolean> receiveGoods(@Valid @RequestBody List<PurchaseOrderNoDetailDO> list) {
return purchaseOrderNoDetailService.receiveGoods(list); return purchaseOrderNoDetailService.receiveGoods(list);
} }
@GetMapping("/received")
@Operation(summary = "获得标准件收货分页")
@PreAuthorize("@ss.hasPermission('project:purchase-order-no-detail:query')")
public CommonResult<PageResult<PurchaseOrderNoDetailDO>> received(@Valid PurchaseOrderNoDetailPageReqVO pageReqVO) {
PageResult<PurchaseOrderNoDetailDO> pageResult = purchaseOrderNoDetailService.received(pageReqVO);
return success(pageResult);
}
@GetMapping("/exportReceived")
@Operation(summary = "导出采购订单主 Excel")
@PreAuthorize("@ss.hasPermission('project:purchase-order-no:export')")
@OperateLog(type = EXPORT)
public void exportPurchaseOrderNoExcel(@Valid PurchaseOrderNoDetailPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<PurchaseOrderNoDetailDO> list = purchaseOrderNoDetailService.received(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "标准件收货.xlsx", "数据", ReceivedExcelVo.class,
BeanUtils.toBean(list, ReceivedExcelVo.class));
}
} }

View File

@ -114,5 +114,10 @@ public class PurchaseOrderNoDetailPageReqVO extends PageParam {
@Schema(description = "责任人id", example = "30495") @Schema(description = "责任人id", example = "30495")
private Long duEmpId; private Long duEmpId;
@Schema(description = "子项目名称")
private String projectSubName;
@Schema(description = "项目编码")
private String projectCode;
@Schema(description = "项目编码")
private Integer goodsType;
} }

View File

@ -0,0 +1,50 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordernodetail.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat;
import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* Excel 导入 VO
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false避免BOM导入有问题
public class ReceivedExcelVo {
@ExcelProperty("子项目编码")
private String projectSubCode;
@ExcelProperty("物料编码")
private String matCode;
@ExcelProperty("标准件名称")
private String boomName;
@ExcelProperty("规格型号")
private String boomSpec;
@ExcelProperty("需求数量")
private String boomAmount;
@ExcelProperty("采购数量")
private String purchaseAmount;
@ExcelProperty("剩余数量")
private String purchaseRemAmount;
@ExcelProperty("需求完成时间")
private String requireTimes;
@ExcelProperty("计划到货日期")
private String arriveTimes;
@ExcelProperty("供应商")
private String supplierName;
@ExcelProperty("价格")
private String estimatedPrice;
@ExcelProperty(value = "订单状态", converter = DictConvert.class)
@DictFormat("heli_purchase_receiving_status")
private String receivingStatus;
}

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.storagein; package com.chanko.yunxi.mes.module.heli.controller.admin.storagein;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -96,9 +97,20 @@ public class StorageInController {
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:storage-in:query')") @PreAuthorize("@ss.hasPermission('heli:storage-in:query')")
public CommonResult<StorageInDO> isPrint(@RequestParam("id") Long id) { public CommonResult<StorageInDO> isPrint(@RequestParam("id") Long id) {
return success(storageInService.isPrint(id)); return success(storageInService.isPrint(id));
} }
@PostMapping("/standardPartsReceived")
@Operation(summary = "标准件收货")
@PreAuthorize("@ss.hasPermission('heli:storage-in:query')")
public CommonResult<Boolean> standardPartsReceived(@Valid @RequestBody List<PurchaseOrderNoDetailDO> list) {
return storageInService.standardPartsReceived(list);
}
@GetMapping("/warehousing")
@Operation(summary = "采购入库")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:storage-in:query')")
public CommonResult<Boolean> warehousing(@RequestParam("id") Long id) {
return storageInService.warehousing(id);
}
} }

View File

@ -1,14 +1,10 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.storagein.vo; package com.chanko.yunxi.mes.module.heli.controller.admin.storagein.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.time.LocalDate;
import java.util.*;
import java.util.*; import java.util.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*; import com.alibaba.excel.annotation.*;

View File

@ -172,4 +172,9 @@ public class MaterialPlanBoomDO extends BaseDO {
*/ */
@TableField(exist = false) @TableField(exist = false)
private String duEmpName; private String duEmpName;
/**
* 客户简称
*/
@TableField(exist = false)
private String brief;
} }

View File

@ -184,6 +184,10 @@ public class PurchaseOrderNoDetailDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private String matType; private String matType;
@TableField(exist = false) @TableField(exist = false)
private String supplierName;
@TableField(exist = false)
private String purchaseNo;
@TableField(exist = false)
private BigDecimal matRest; private BigDecimal matRest;
@TableField(exist = false) @TableField(exist = false)
private BigDecimal unitPrice; private BigDecimal unitPrice;
@ -200,4 +204,13 @@ public class PurchaseOrderNoDetailDO extends BaseDO {
private String compositionName; private String compositionName;
@TableField(exist = false) @TableField(exist = false)
private String procedureName; private String procedureName;
/**
* 入库数量
*/
@TableField(exist = false)
private Date boomArriveDates;
@TableField(exist = false)
private String arriveTimes;
@TableField(exist = false)
private String requireTimes;
} }

View File

@ -142,6 +142,18 @@ public class StorageInDetailDO extends BaseDO {
* 供应商id * 供应商id
*/ */
private Long supplierId; private Long supplierId;
/**
* 采购单明细id
*/
private Long purchaseOrderNoDetailId;
/**
* 采购单明细id
*/
private Long purchaseOrderNoId;
/**
* 到货日期
*/
private Date acarrDate;
/** /**
* 入库数量 * 入库数量
*/ */

View File

@ -21,11 +21,13 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.enums.BoomDetailTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.BoomDetailTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO; import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.google.common.collect.Lists;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.*;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
@ -42,6 +44,14 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
Long hasPurchase(Map map); Long hasPurchase(Map map);
Long hasPurYard(Map map); Long hasPurYard(Map map);
default int updateSetNull(List<Long> ids){
UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("supplier_id",null).set("estimated_price",null)
.set("purchase_amount",null).set("arrive_time",null).set("mat_rest",null)
.in("id",ids);
return update(updateWrapper);
}
default PageResult<MaterialPlanBoomDO> selectPage(MaterialPlanBoomPageReqVO reqVO) { default PageResult<MaterialPlanBoomDO> selectPage(MaterialPlanBoomPageReqVO reqVO) {
MPJLambdaWrapper<MaterialPlanBoomDO> query = new MPJLambdaWrapper<>(); MPJLambdaWrapper<MaterialPlanBoomDO> query = new MPJLambdaWrapper<>();
query.selectAll(MaterialPlanBoomDO.class) query.selectAll(MaterialPlanBoomDO.class)
@ -197,7 +207,7 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
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.name as projectSubName") .select("p.project_name as projectName","p.name as projectSubName")
.select("d.blueprint_no as blueprintNo","d.unit as unit") .select("d.blueprint_no as blueprintNo","d.unit as unit","f.name as supplierName")
.select("a.nickname as duEmpName","c.name as procedureName","e.name as compositionName") .select("a.nickname as duEmpName","c.name as procedureName","e.name as compositionName")
.select(MaterialPlanDO::getBrief) .select(MaterialPlanDO::getBrief)
.leftJoin(MaterialPlanDO.class, "p", MaterialPlanDO::getId,MaterialPlanBoomDO::getProjectMaterialPlanId) .leftJoin(MaterialPlanDO.class, "p", MaterialPlanDO::getId,MaterialPlanBoomDO::getProjectMaterialPlanId)
@ -205,6 +215,7 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
.leftJoin(AdminUserDO.class, "a", AdminUserDO::getId, MaterialPlanBoomDO::getDuEmpId) .leftJoin(AdminUserDO.class, "a", AdminUserDO::getId, MaterialPlanBoomDO::getDuEmpId)
.leftJoin(ProcedureDO.class, "c", ProcedureDO::getId, MaterialPlanBoomDO::getProcedureId) .leftJoin(ProcedureDO.class, "c", ProcedureDO::getId, MaterialPlanBoomDO::getProcedureId)
.leftJoin(CompositionDO.class, "e", CompositionDO::getId, ProcessBomDetailDO::getCompositionId) .leftJoin(CompositionDO.class, "e", CompositionDO::getId, ProcessBomDetailDO::getCompositionId)
.leftJoin(SupplierDO.class, "f", SupplierDO::getId, MaterialPlanBoomDO::getSupplierId)
.disableSubLogicDel(); .disableSubLogicDel();
query query
.like(!StringUtils.isEmpty(pageReqVO.getProjectName()),MaterialPlanDO::getProjectName, pageReqVO.getProjectName()) .like(!StringUtils.isEmpty(pageReqVO.getProjectName()),MaterialPlanDO::getProjectName, pageReqVO.getProjectName())
@ -215,9 +226,11 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
.like(!StringUtils.isEmpty(pageReqVO.getDuEmpName()), AdminUserDO::getNickname, pageReqVO.getDuEmpName()) .like(!StringUtils.isEmpty(pageReqVO.getDuEmpName()), AdminUserDO::getNickname, pageReqVO.getDuEmpName())
.eq(!StringUtils.isEmpty(pageReqVO.getMatType()), MaterialPlanDO::getMatType, pageReqVO.getMatType()) .eq(!StringUtils.isEmpty(pageReqVO.getMatType()), MaterialPlanDO::getMatType, pageReqVO.getMatType())
.eq(!StringUtils.isEmpty(pageReqVO.getStatus()), MaterialPlanBoomDO::getIsPurYard, pageReqVO.getStatus()) .eq(!StringUtils.isEmpty(pageReqVO.getStatus()), MaterialPlanBoomDO::getIsPurYard, pageReqVO.getStatus())
.eq(Objects.nonNull(pageReqVO.getMplanStatus()), MaterialPlanBoomDO::getMplanStatus, pageReqVO.getMplanStatus()) .in(Objects.nonNull(pageReqVO.getMplanStatus()), MaterialPlanBoomDO::getMplanStatus, pageReqVO.getMplanStatus() != 0 ? Arrays.asList(pageReqVO.getMplanStatus()) : Arrays.asList(0, 3))
.eq(Objects.nonNull(pageReqVO.getProjectMaterialPlanNo()), MaterialPlanDO::getProjectMaterialPlanNo, pageReqVO.getProjectMaterialPlanNo()); .eq(Objects.nonNull(pageReqVO.getProjectMaterialPlanNo()), MaterialPlanDO::getProjectMaterialPlanNo, pageReqVO.getProjectMaterialPlanNo());
return selectPage(pageReqVO, query);
PageResult<MaterialPlanBoomDO> pageResult = selectPage(pageReqVO, query);
return pageResult;
} }

View File

@ -67,11 +67,7 @@ public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO>
List<ProcessBomDetailDO> selectStandardListByBomId(@Param("bomId") Long bomId); List<ProcessBomDetailDO> selectStandardListByBomId(@Param("bomId") Long bomId);
@Select("SELECT p.*, IFNULL(SUM(s.storage_ok_qty), 0) AS storage_ok_qty " + @Select("SELECT p.* FROM pro_process_bom_detail p WHERE p.bom_id = #{bomId} and p.type = 1 AND p.deleted IN (0, 1) ")
"FROM pro_process_bom_detail p " +
"LEFT JOIN v_storage_material_now s ON p.material_name = s.mat_name " +
"WHERE p.bom_id = #{bomId} and p.type = 1 AND p.deleted IN (0, 1) " +
"GROUP BY p.material_name")
//2025 0601 因为bom明细页查询到结果 group by materialcode转换为 group by id //2025 0601 因为bom明细页查询到结果 group by materialcode转换为 group by id
List<ProcessBomDetailDO> selectStandardListByBomId20250609(@Param("bomId") Long bomId); List<ProcessBomDetailDO> selectStandardListByBomId20250609(@Param("bomId") Long bomId);
default Long getBomDetailByBluePrintNoAndBomId(String bomCode,String bluePrintNo){ default Long getBomDetailByBluePrintNoAndBomId(String bomCode,String bluePrintNo){
@ -231,7 +227,7 @@ public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO>
// .eq(MaterialPlanBoomDO::getDeleted,0) // .eq(MaterialPlanBoomDO::getDeleted,0)
// .eq(MaterialPlanDO::getDeleted,0); // .eq(MaterialPlanDO::getDeleted,0);
if (ObjectUtils.isEmpty(pageReqVO.getProjectMaterialPlanNo())) { if (ObjectUtils.isEmpty(pageReqVO.getProjectMaterialPlanNo())) {
query.eq(ProcessBomDO::getBomStatus,"2") query.eq(ProcessBomDO::getBomStatus,"7")
.ne(ProjectOrderDO::getOrderStatus,"64") .ne(ProjectOrderDO::getOrderStatus,"64")
.eq(ProcessBomDetailDO::getType,"1"); .eq(ProcessBomDetailDO::getType,"1");
; ;

View File

@ -86,6 +86,7 @@ public interface PurchaseOrderMakeMapper extends BaseMapperX<PurchaseOrderMakeDO
.like(Objects.nonNull(reqVO.getProjectName()), PurchaseOrderMakeDO::getProjectName, reqVO.getProjectName()) .like(Objects.nonNull(reqVO.getProjectName()), PurchaseOrderMakeDO::getProjectName, reqVO.getProjectName())
.eq(Objects.nonNull(reqVO.getProjectNameSim()), PurchaseOrderMakeDO::getProjectNameSim, reqVO.getProjectNameSim()) .eq(Objects.nonNull(reqVO.getProjectNameSim()), PurchaseOrderMakeDO::getProjectNameSim, reqVO.getProjectNameSim())
.groupBy(PurchaseOrderMakeDO::getId)
.orderByDesc(PurchaseOrderMakeDO::getId); .orderByDesc(PurchaseOrderMakeDO::getId);
// 使用 selectJoinPage 进行分页查询 // 使用 selectJoinPage 进行分页查询

View File

@ -45,7 +45,7 @@ public interface PurchaseOrderMakeDetailMapper extends BaseMapperX<PurchaseOrder
.leftJoin(ProjectOrderDO.class,"po",ProjectOrderDO::getId, ProjectOrderSubDO::getProjectOrderId) .leftJoin(ProjectOrderDO.class,"po",ProjectOrderDO::getId, ProjectOrderSubDO::getProjectOrderId)
.leftJoin(PurchaseOrderMakeDO.class,"pom",PurchaseOrderMakeDO::getId,PurchaseOrderMakeDetailDO::getPurchaseOrderId) .leftJoin(PurchaseOrderMakeDO.class,"pom",PurchaseOrderMakeDO::getId,PurchaseOrderMakeDetailDO::getPurchaseOrderId)
.eq(PurchaseOrderMakeDO::getGoodsType,1) .eq(PurchaseOrderMakeDO::getGoodsType,1)
.disableSubLogicDel(); .eq(PurchaseOrderMakeDO::getStatus,2);
if (!StringUtils.isEmpty(reqVO.getProjectName())){ if (!StringUtils.isEmpty(reqVO.getProjectName())){
query.like(ProjectOrderDO::getProjectName, reqVO.getProjectName()); query.like(ProjectOrderDO::getProjectName, reqVO.getProjectName());
} }
@ -108,4 +108,39 @@ public interface PurchaseOrderMakeDetailMapper extends BaseMapperX<PurchaseOrder
return pageResult; return pageResult;
} }
default PageResult<PartPurchaseOrderPageRespVO> getDetail(PartPurchaseOrderPageReqVO partPurchaseOrderPageReqVO){
MPJLambdaWrapper<PurchaseOrderMakeDetailDO> query = new MPJLambdaWrapper<>();
query.selectAll(PurchaseOrderMakeDetailDO.class)
.select(PurchaseOrderMakeDO::getContractNo,
PurchaseOrderMakeDO::getGoodsType,
PurchaseOrderMakeDO::getBrief,
PurchaseOrderMakeDO::getProjectName,
PurchaseOrderMakeDO::getProjectNameSim,
PurchaseOrderMakeDO::getStatus)
.select("c.nickname as duEmpName")
.select("d.name as supplierName")
.select("e.name as procedureName")
.leftJoin(PurchaseOrderMakeDO.class,"a",PurchaseOrderMakeDO::getId,PurchaseOrderMakeDetailDO::getPurchaseOrderId)
.leftJoin(ProjectOrderDO.class,"b",ProjectOrderDO::getId,PurchaseOrderMakeDO::getProjectId)
.leftJoin(AdminUserDO.class,"c", AdminUserDO::getId,PurchaseOrderMakeDetailDO::getDuEmpId)
.leftJoin(SupplierDO.class, "d", SupplierDO::getId,PurchaseOrderMakeDetailDO::getSupplierId)
.leftJoin(ProcedureDO.class, "e", ProcedureDO::getId, PurchaseOrderMakeDetailDO::getProcedureId)
.disableLogicDel()
.disableSubLogicDel()
.eq(Objects.nonNull(partPurchaseOrderPageReqVO.getPurchaseOrderId()), PurchaseOrderMakeDO::getId, partPurchaseOrderPageReqVO.getPurchaseOrderId())
.eq(StringUtils.isNotBlank(partPurchaseOrderPageReqVO.getContractNo()), PurchaseOrderMakeDO::getContractNo, partPurchaseOrderPageReqVO.getContractNo())
.eq(Objects.nonNull(partPurchaseOrderPageReqVO.getDocumentStatus()), PurchaseOrderMakeDO::getStatus, partPurchaseOrderPageReqVO.getDocumentStatus())
.like(StringUtils.isNotBlank(partPurchaseOrderPageReqVO.getProjectName()), PurchaseOrderMakeDO::getProjectName, partPurchaseOrderPageReqVO.getProjectName())
.like(StringUtils.isNotBlank(partPurchaseOrderPageReqVO.getProjectSubName()), PurchaseOrderMakeDetailDO::getName, partPurchaseOrderPageReqVO.getProjectSubName())
.like(StringUtils.isNotBlank(partPurchaseOrderPageReqVO.getMaterialName()), PurchaseOrderMakeDetailDO::getBoomName, partPurchaseOrderPageReqVO.getMaterialName())
.eq(Objects.nonNull(partPurchaseOrderPageReqVO.getStatus()), PurchaseOrderMakeDetailDO::getOrderStatus, partPurchaseOrderPageReqVO.getStatus())
.eq(Objects.nonNull(partPurchaseOrderPageReqVO.getProjectCode()), ProjectOrderDO::getCode, partPurchaseOrderPageReqVO.getProjectCode())
.like(Objects.nonNull(partPurchaseOrderPageReqVO.getOwnerName()), AdminUserDO::getNickname, partPurchaseOrderPageReqVO.getOwnerName())
.like(Objects.nonNull(partPurchaseOrderPageReqVO.getSupplierName()), SupplierDO::getName, partPurchaseOrderPageReqVO.getSupplierName());
String sqlStr= query.getTargetSql();
PageResult<PartPurchaseOrderPageRespVO> pageResult = selectJoinPage(partPurchaseOrderPageReqVO, PartPurchaseOrderPageRespVO.class, query);
return pageResult;
}
} }

View File

@ -9,10 +9,12 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.materialplanboom.vo.Pro
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo.PurchaseOrderMaterialPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo.PurchaseOrderMaterialPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplandetail.MaterialPlanDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplandetail.MaterialPlanDetailDO;
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.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorder.PurchaseOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorder.PurchaseOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderboom.PurchaseOrderBoomDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderboom.PurchaseOrderBoomDO;
@ -20,10 +22,13 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermaterial.Pur
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageMaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordernodetail.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordernodetail.vo.*;
import org.springframework.beans.PropertyValues; import org.springframework.beans.PropertyValues;
import org.springframework.util.StringUtils;
/** /**
* 采购订单明细 Mapper * 采购订单明细 Mapper
@ -80,4 +85,28 @@ public interface PurchaseOrderNoDetailMapper extends BaseMapperX<PurchaseOrderNo
query.eq(PurchaseOrderNoDetailDO::getDeleted, 0); query.eq(PurchaseOrderNoDetailDO::getDeleted, 0);
return selectList(query); return selectList(query);
} }
default PageResult<PurchaseOrderNoDetailDO> received(PurchaseOrderNoDetailPageReqVO pageReqVO){
MPJLambdaWrapper<PurchaseOrderNoDetailDO> query = new MPJLambdaWrapper<>();
query.selectAll(PurchaseOrderNoDetailDO.class)
.select("s.name as supplierName","m.code as matCode","p.purchase_no as purchaseNo","t.purchase_rem_amount as purchaseRemAmounts")
.select("DATE_FORMAT(t.require_time,'%Y-%m-%d') as requireTimes","DATE_FORMAT(t.arrive_time,'%Y-%m-%d') as arriveTimes")
.leftJoin(PurchaseOrderNoDO.class,"p", PurchaseOrderNoDO::getId, PurchaseOrderNoDetailDO::getPurchaseOrderId)
.leftJoin(SupplierDO.class, "s", SupplierDO::getId, PurchaseOrderNoDO::getSupplierId)
.leftJoin(MaterialDO.class,"m", MaterialDO::getId, PurchaseOrderNoDetailDO::getMaterialId)
.leftJoin(ProjectOrderDO.class,"pro", ProjectOrderDO::getId, PurchaseOrderNoDetailDO::getProjectId)
.disableSubLogicDel()
.groupBy(PurchaseOrderNoDetailDO::getId)
.orderByDesc(PurchaseOrderNoDetailDO::getCreateTime);
query
.eq(pageReqVO.getReceivingStatus() != null, PurchaseOrderNoDetailDO::getReceivingStatus, pageReqVO.getReceivingStatus())
.eq(pageReqVO.getGoodsType() != null, PurchaseOrderNoDO::getGoodsType, pageReqVO.getGoodsType())
.like(!StringUtils.isEmpty(pageReqVO.getProjectName()), PurchaseOrderNoDetailDO::getProjectName, pageReqVO.getProjectName())
.like(!StringUtils.isEmpty(pageReqVO.getProjectSubName()), PurchaseOrderNoDetailDO::getName, pageReqVO.getProjectSubName())
.like(!StringUtils.isEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode, pageReqVO.getProjectCode())
.like(!StringUtils.isEmpty(pageReqVO.getBoomName()), PurchaseOrderNoDetailDO::getBoomName, pageReqVO.getBoomName());
return selectPage(pageReqVO, query);
}
} }

View File

@ -65,6 +65,7 @@ public interface StorageInDetailMapper extends BaseMapperX<StorageInDetailDO> {
.leftJoin(SupplierDO.class,"sup", SupplierDO::getId, StorageInDetailDO::getSupplierId) .leftJoin(SupplierDO.class,"sup", SupplierDO::getId, StorageInDetailDO::getSupplierId)
.leftJoin(MaterialDO.class,"m", MaterialDO::getId, StorageInDetailDO::getMaterialId) .leftJoin(MaterialDO.class,"m", MaterialDO::getId, StorageInDetailDO::getMaterialId)
.groupBy(StorageInDetailDO::getId) .groupBy(StorageInDetailDO::getId)
.disableSubLogicDel()
.orderByDesc(StorageInDetailDO::getCreateTime); .orderByDesc(StorageInDetailDO::getCreateTime);
query.eq(pageReqVO.getStorageNoId() != null, StorageInDetailDO::getStorageNoId, pageReqVO.getStorageNoId()); query.eq(pageReqVO.getStorageNoId() != null, StorageInDetailDO::getStorageNoId, pageReqVO.getStorageNoId());
return selectPage(pageReqVO, query); return selectPage(pageReqVO, query);

View File

@ -16,6 +16,7 @@ import org.apache.poi.hpsf.Decimal;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -106,7 +107,7 @@ public interface StorageLogNowMapper extends BaseMapperX<StorageLogNowDO> {
List<StorageLogNowDO> selectNowList(StorageNowAllReqVO reqVO); List<StorageLogNowDO> selectNowList(StorageNowAllReqVO reqVO);
List<StorageLogNowDO> selectAllByMatNames(@Param("matNames") List<String> matNames);
List<StorageLogNowDO> selectNowByMatPnId(@Param("matId")Long matId,@Param("pnId")Long pnId); List<StorageLogNowDO> selectNowByMatPnId(@Param("matId")Long matId,@Param("pnId")Long pnId);
default PageResult<StorageLogNowDO> getStorageNowPricePage(StorageLogPageReqVO reqVO) { default PageResult<StorageLogNowDO> getStorageNowPricePage(StorageLogPageReqVO reqVO) {

View File

@ -372,10 +372,16 @@ public class MaterialPlanServiceImpl implements MaterialPlanService {
break; break;
case "caigou": case "caigou":
if (boomDO.getIsPurYard()!=1) return CommonResult.error(400,"该物料信息状态非库存状态,请刷新界面!"); if (boomDO.getIsPurYard()!=1) return CommonResult.error(400,"该物料信息状态非库存状态,请刷新界面!");
boomDO.setIsPurYard(5); // boomDO.setIsPurYard(5);
LambdaUpdateWrapper<MaterialPlanBoomDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(MaterialPlanBoomDO::getId,pageReqVO.getId())
.set(MaterialPlanBoomDO::getIsPurYard,5)
.set(MaterialPlanBoomDO::getMaterialId,null)
.set(MaterialPlanBoomDO::getMatRest,0);
materialPlanBoomMapper.update(wrapper);
break; break;
} }
materialPlanBoomMapper.updateById(boomDO); if (!"caigou".equals(pageReqVO.getType())) materialPlanBoomMapper.updateById(boomDO);
} }
return CommonResult.success(true); return CommonResult.success(true);
} }

View File

@ -224,6 +224,7 @@ public class MaterialPlanBoomServiceImpl implements MaterialPlanBoomService {
} }
}else{ }else{
//去库存要同时删掉供应商采购数量预估总价预计到货日期
List<MaterialPlanBoomDO> materialPlanBoomDOList = updateReqVO.getMaterialPlanBoomDOList(); List<MaterialPlanBoomDO> materialPlanBoomDOList = updateReqVO.getMaterialPlanBoomDOList();
List<Long> ids = new ArrayList<>(); List<Long> ids = new ArrayList<>();
@ -243,7 +244,7 @@ public class MaterialPlanBoomServiceImpl implements MaterialPlanBoomService {
throw exception(PURCHASE_ORDER_MAKE_DETAIL_IS_STORAGE); throw exception(PURCHASE_ORDER_MAKE_DETAIL_IS_STORAGE);
} }
materialPlanBoomMapper.updateBatch(materialPlanBoomDOList); materialPlanBoomMapper.updateBatch(materialPlanBoomDOList);
materialPlanBoomMapper.updateSetNull(ids);
} }

View File

@ -139,6 +139,7 @@ public class MatReqServiceImpl implements MatReqService {
matReqDO.setProjectName(planDO.getProjectName()); matReqDO.setProjectName(planDO.getProjectName());
matReqDO.setCustomerId(planDO.getCustomerId()); matReqDO.setCustomerId(planDO.getCustomerId());
matReqDO.setReqDate(LocalDate.now()); matReqDO.setReqDate(LocalDate.now());
matReqDO.setProjectPlanId(planDO.getProjectPlanId());
matReqMapper.insert(matReqDO); matReqMapper.insert(matReqDO);
List<MatReqDetailDO> matReqDetailDOS = new ArrayList<>(); List<MatReqDetailDO> matReqDetailDOS = new ArrayList<>();
for (MaterialPlanBoomDO materialPlanBoomDO : list) { for (MaterialPlanBoomDO materialPlanBoomDO : list) {

View File

@ -56,4 +56,10 @@ public interface PartPurchaseOrderService {
* @return 更新采购单审批状态 * @return 更新采购单审批状态
*/ */
boolean updatePartCheckStatusNo(PurchaseOrderMakeSaveReqVO updateReqVO); boolean updatePartCheckStatusNo(PurchaseOrderMakeSaveReqVO updateReqVO);
Boolean reject(PurchaseOrderMakeSaveReqVO updateReqVO);
Boolean approval(Long id);
PageResult<PartPurchaseOrderPageRespVO> getDetail(PartPurchaseOrderPageReqVO partPurchaseOrderPageReqVO);
} }

View File

@ -1,9 +1,12 @@
package com.chanko.yunxi.mes.module.heli.service.partpurchaseorder; package com.chanko.yunxi.mes.module.heli.service.partpurchaseorder;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.chanko.yunxi.mes.framework.common.exception.ErrorCode;
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.QueryWrapperX; import com.chanko.yunxi.mes.framework.mybatis.core.query.QueryWrapperX;
import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PartPurchaseOrderPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PartPurchaseOrderPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PartPurchaseOrderPageRespVO; import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PartPurchaseOrderPageRespVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO;
@ -25,11 +28,15 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PURCHASE_ORDER; import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PURCHASE_ORDER;
@Service @Service
@ -111,6 +118,8 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO(); PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
purchaseOrderMakeDO.setId(id); purchaseOrderMakeDO.setId(id);
purchaseOrderMakeDO.setStatus(2); purchaseOrderMakeDO.setStatus(2);
purchaseOrderMakeDO.setAuditor(SecurityFrameworkUtils.getLoginUserId());
purchaseOrderMakeDO.setAuditTime(LocalDateTime.now());
purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO); purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO);
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_id", id); List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_id", id);
@ -150,4 +159,61 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
return true; return true;
} }
@Override
public Boolean reject(PurchaseOrderMakeSaveReqVO updateReqVO) {
PurchaseOrderMakeDO orderMakeDO = purchaseOrderMakeMapper.selectById(updateReqVO.getId());
if (orderMakeDO.getStatus() != 1) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
purchaseOrderMakeDO.setId(updateReqVO.getId());
purchaseOrderMakeDO.setStatus(3);
purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO);
purchaseOrderMakeMapper.deleteById(purchaseOrderMakeDO);
LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, updateReqVO.getId());
purchaseOrderMakeDetailMapper.delete(wrapper);
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_id", updateReqVO.getId());
materialPlanBoomDOs.forEach(materialPlanBoom -> {
UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", materialPlanBoom.getId())
.set("mplan_status", 3)
.set("project_purchase_order_make_id", null)
.set("purchase_no", null)
.set("project_purchase_order_make_detail_id", null)
.set("purchase_amount", BigDecimal.ZERO)
.set("estimated_price", BigDecimal.ZERO)
.set("arrive_time",null)
.set("supplier_id", null);
materialPlanBoomMapper.update(updateWrapper);
});
return true;
}
@Override
public Boolean approval(Long id) {
PurchaseOrderMakeDO orderMakeDO = purchaseOrderMakeMapper.selectById(id);
if (orderMakeDO.getStatus() != 1) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
purchaseOrderMakeDO.setId(id);
purchaseOrderMakeDO.setStatus(2);
purchaseOrderMakeDO.setAuditTime(LocalDateTime.now());
purchaseOrderMakeDO.setAuditor(getLoginUser().getId());
purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO);
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_id", id);
materialPlanBoomDOs.forEach(materialPlanBoomDO -> {
MaterialPlanBoomDO materialPlanBoom = new MaterialPlanBoomDO();
materialPlanBoom.setId(materialPlanBoomDO.getId());
materialPlanBoom.setMplanStatus(2);
materialPlanBoomMapper.updateById(materialPlanBoom);
});
return true;
}
@Override
public PageResult<PartPurchaseOrderPageRespVO> getDetail(PartPurchaseOrderPageReqVO partPurchaseOrderPageReqVO) {
return purchaseOrderMakeDetailMapper.getDetail(partPurchaseOrderPageReqVO);
}
} }

View File

@ -33,6 +33,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.shenhe.ShenheDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.shenhe.ShenheDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.attentiontodo.AttentiontodoMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.attentiontodo.AttentiontodoMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplan.MaterialPlanMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplan.MaterialPlanMapper;
@ -42,6 +43,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.plantask.PlanTaskMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.shenhe.ShenheMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.shenhe.ShenheMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogNowMapper;
import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum;
import com.chanko.yunxi.mes.module.heli.service.attentiontodo.AttentiontodoService; import com.chanko.yunxi.mes.module.heli.service.attentiontodo.AttentiontodoService;
import com.chanko.yunxi.mes.module.heli.service.composition.CompositionService; import com.chanko.yunxi.mes.module.heli.service.composition.CompositionService;
@ -123,6 +125,8 @@ public class ProcessBomServiceImpl implements ProcessBomService {
private MaterialPlanMapper materialPlanMapper; private MaterialPlanMapper materialPlanMapper;
@Resource @Resource
private MaterialPlanBoomMapper materialPlanBoomMapper; private MaterialPlanBoomMapper materialPlanBoomMapper;
@Resource
private StorageLogNowMapper storageLogNowMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createProcessBom(ProcessBomSaveReqVO createReqVO) { public Long createProcessBom(ProcessBomSaveReqVO createReqVO) {
@ -808,6 +812,29 @@ public class ProcessBomServiceImpl implements ProcessBomService {
list.addAll(processBomDetailMapper.selectStandardListByBomId20250609(bomId)); list.addAll(processBomDetailMapper.selectStandardListByBomId20250609(bomId));
// Map<Long, List<ProcessBomDetailDO>> standardGroupByMatId = processBomDetailDOS.stream().collect(Collectors.groupingBy(vo -> vo.getMaterialId() == null ? -1 : vo.getMaterialId())); // Map<Long, List<ProcessBomDetailDO>> standardGroupByMatId = processBomDetailDOS.stream().collect(Collectors.groupingBy(vo -> vo.getMaterialId() == null ? -1 : vo.getMaterialId()));
//查非标准件的 //查非标准件的
if (CollUtil.isNotEmpty(list)){
HashSet<String> materialNameSet = new HashSet<>();
for (ProcessBomDetailDO processBomDetailDO : list) {
processBomDetailDO.setStorageOkQty(BigDecimal.ZERO);
if (processBomDetailDO.getMaterialName() != null) {
materialNameSet.add(processBomDetailDO.getMaterialName());
}
}
if (CollUtil.isNotEmpty(materialNameSet)){
List<StorageLogNowDO> storageLogNowDOS = storageLogNowMapper.selectAllByMatNames(new ArrayList<>(materialNameSet));
for (ProcessBomDetailDO processBomDetailDO : list) {
for (StorageLogNowDO storageLogNowDO : storageLogNowDOS) {
if (processBomDetailDO.getMaterialName()!= null && storageLogNowDO.getMatName().equals(processBomDetailDO.getMaterialName())) {
processBomDetailDO.setStorageOkQty(storageLogNowDO.getStorageOkQty());
break;
}
}
}
}
}
List<ProcessBomDetailDO> processBomDetailNoStandardDOS = processBomDetailMapper.selectListNoStandardList(bomId); List<ProcessBomDetailDO> processBomDetailNoStandardDOS = processBomDetailMapper.selectListNoStandardList(bomId);
List<ProcessBomDetailDO> noStandardList = processBomDetailNoStandardDOS.stream() List<ProcessBomDetailDO> noStandardList = processBomDetailNoStandardDOS.stream()

View File

@ -59,4 +59,6 @@ public interface PurchaseOrderNoDetailService {
CommonResult<Boolean> verification(List<PurchaseOrderNoDetailDO> list); CommonResult<Boolean> verification(List<PurchaseOrderNoDetailDO> list);
CommonResult<Boolean> receiveGoods(List<PurchaseOrderNoDetailDO> list); CommonResult<Boolean> receiveGoods(List<PurchaseOrderNoDetailDO> list);
PageResult<PurchaseOrderNoDetailDO> received(PurchaseOrderNoDetailPageReqVO pageReqVO);
} }

View File

@ -180,4 +180,9 @@ public class PurchaseOrderNoDetailServiceImpl implements PurchaseOrderNoDetailSe
return success(true); return success(true);
} }
@Override
public PageResult<PurchaseOrderNoDetailDO> received(PurchaseOrderNoDetailPageReqVO pageReqVO) {
return purchaseOrderNoDetailMapper.received(pageReqVO);
}
} }

View File

@ -1,10 +1,15 @@
package com.chanko.yunxi.mes.module.heli.service.storagein; package com.chanko.yunxi.mes.module.heli.service.storagein;
import javax.validation.*; import javax.validation.*;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagein.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.storagein.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagein.StorageInDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagein.StorageInDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import java.util.List;
/** /**
* 入库单 Service 接口 * 入库单 Service 接口
* *
@ -52,4 +57,8 @@ public interface StorageInService {
StorageInDO isPrint(Long id); StorageInDO isPrint(Long id);
CommonResult<Boolean> standardPartsReceived(List<PurchaseOrderNoDetailDO> list);
CommonResult<Boolean> warehousing(Long id);
} }

View File

@ -3,18 +3,27 @@ package com.chanko.yunxi.mes.module.heli.service.storagein;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.module.heli.controller.admin.storageindetail.vo.StorageInDetailPageReqVO; import com.chanko.yunxi.mes.module.heli.controller.admin.storageindetail.vo.StorageInDetailPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storageindetail.StorageInDetailDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storageindetail.StorageInDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorderno.PurchaseOrderNoMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordernodetail.PurchaseOrderNoDetailMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordernodetail.PurchaseOrderNoDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storageindetail.StorageInDetailMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.storageindetail.StorageInDetailMapper;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import com.sun.corba.se.spi.ior.IdentifiableFactory; import com.sun.corba.se.spi.ior.IdentifiableFactory;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; 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.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagein.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.storagein.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagein.StorageInDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagein.StorageInDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
@ -24,6 +33,8 @@ import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagein.StorageInMapper; import com.chanko.yunxi.mes.module.heli.dal.mysql.storagein.StorageInMapper;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PURCHASE_ORDER;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.STOCK_IN;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*; import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
/** /**
@ -41,6 +52,10 @@ public class StorageInServiceImpl implements StorageInService {
private StorageInDetailMapper storageInDetailMapper; private StorageInDetailMapper storageInDetailMapper;
@Resource @Resource
private PurchaseOrderNoDetailMapper purchaseOrderNoDetailMapper; private PurchaseOrderNoDetailMapper purchaseOrderNoDetailMapper;
@Resource
private SerialNumberService serialNumberService;
@Resource
private PurchaseOrderNoMapper purchaseOrderNoMapper;
@Override @Override
public Long createStorageIn(StorageInSaveReqVO createReqVO) { public Long createStorageIn(StorageInSaveReqVO createReqVO) {
// 插入 // 插入
@ -70,21 +85,20 @@ public class StorageInServiceImpl implements StorageInService {
if (ObjectUtil.isNotEmpty(storageInDetailDOS)){ if (ObjectUtil.isNotEmpty(storageInDetailDOS)){
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::getId,storageInDetailDO.getPurchaseOrderNoDetailId());
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<>();
updateWrapper.eq(PurchaseOrderNoDetailDO::getId,purchaseOrderNoDetailDO.getId()); updateWrapper.eq(PurchaseOrderNoDetailDO::getId,purchaseOrderNoDetailDO.getId());
updateWrapper.set(PurchaseOrderNoDetailDO::getStorageId,null); updateWrapper.set(PurchaseOrderNoDetailDO::getStorageId,null);
updateWrapper.set(PurchaseOrderNoDetailDO::getStorageMatId,null); updateWrapper.set(PurchaseOrderNoDetailDO::getStorageMatId,null);
purchaseOrderNoDetailDO.setPurchaseRemAmount(purchaseOrderNoDetailDO.getPurchaseRemAmount().add(storageInDetailDO.getStorageAmount()));
if (purchaseOrderNoDetailDO.getPurchaseAmount().compareTo(purchaseOrderNoDetailDO.getPurchaseRemAmount())==0){ if (purchaseOrderNoDetailDO.getPurchaseAmount().compareTo(purchaseOrderNoDetailDO.getPurchaseRemAmount())==0){
updateWrapper.set(PurchaseOrderNoDetailDO::getReceivingStatus,1); updateWrapper.set(PurchaseOrderNoDetailDO::getReceivingStatus,1);
}else { }else {
updateWrapper.set(PurchaseOrderNoDetailDO::getReceivingStatus,2); updateWrapper.set(PurchaseOrderNoDetailDO::getReceivingStatus,2);
} }
updateWrapper.set(PurchaseOrderNoDetailDO::getPurchaseRemAmount,purchaseOrderNoDetailDO.getPurchaseRemAmount().add(storageInDetailDO.getStorageAmount())); updateWrapper.set(PurchaseOrderNoDetailDO::getPurchaseRemAmount,purchaseOrderNoDetailDO.getPurchaseRemAmount());
purchaseOrderNoDetailMapper.update(updateWrapper); purchaseOrderNoDetailMapper.update(updateWrapper);
} }
} }
@ -123,4 +137,132 @@ public class StorageInServiceImpl implements StorageInService {
return storageInDO; return storageInDO;
} }
@Override
public CommonResult<Boolean> standardPartsReceived(List<PurchaseOrderNoDetailDO> list) {
List<Long> idList = list.stream()
.filter(Objects::nonNull) // 过滤空对象
.map(PurchaseOrderNoDetailDO::getId)
.filter(Objects::nonNull) // 过滤空ID
.collect(Collectors.toList());
Map<Long, BigDecimal> idToRemAmountMap = list.stream()
.collect(Collectors.toMap(
PurchaseOrderNoDetailDO::getId, // id
PurchaseOrderNoDetailDO::getPurchaseRemAmounts, // purchaseRemAmounts
(existing, replacement) -> existing // 键冲突时处理策略保留现有值
));
LambdaQueryWrapper<PurchaseOrderNoDetailDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(PurchaseOrderNoDetailDO::getId,idList);
List<PurchaseOrderNoDetailDO> purchaseOrderNoDetailDOS = purchaseOrderNoDetailMapper.selectList(lambdaQueryWrapper);
if (ObjectUtil.isNotEmpty(purchaseOrderNoDetailDOS)) {
for (PurchaseOrderNoDetailDO purchaseOrderNoDetailDO : purchaseOrderNoDetailDOS){
BigDecimal amount = (purchaseOrderNoDetailDO.getId() != null)
? idToRemAmountMap.getOrDefault(purchaseOrderNoDetailDO.getId(), BigDecimal.ZERO)
: BigDecimal.ZERO;
if (purchaseOrderNoDetailDO.getPurchaseRemAmount().compareTo(amount)<0){
return CommonResult.error(400,"标准件名称"+purchaseOrderNoDetailDO.getBoomName()+"剩余数量"+purchaseOrderNoDetailDO.getPurchaseRemAmount()+"小于入库数量"+amount+"请确认!");
}
LambdaQueryWrapper<StorageInDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StorageInDetailDO::getPurchaseOrderNoDetailId,purchaseOrderNoDetailDO.getId());
wrapper.eq(StorageInDetailDO::getDeleted,0);
List<StorageInDetailDO> storageInDetailDOS = storageInDetailMapper.selectList(wrapper);
if (ObjectUtil.isNotEmpty(storageInDetailDOS)){
BigDecimal StorageAmount = storageInDetailDOS.stream()
.filter(Objects::nonNull) // 过滤掉空对象
.map(StorageInDetailDO::getStorageAmount)
.filter(Objects::nonNull) // 过滤掉空值
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加求和
BigDecimal sum = StorageAmount.add(amount);
if (sum.compareTo(purchaseOrderNoDetailDO.getBoomAmount())>0){
return CommonResult.error(400,"标准件名称"+purchaseOrderNoDetailDO.getBoomName()+"入库数量"+sum+"+本次入库数量"+amount+"大于需求数量"+purchaseOrderNoDetailDO.getBoomAmount()+"请确认!");
}
}
}
}
StorageInDO storageInDO = new StorageInDO();
// 月度流水号
SerialNumberDO serialNumberDO = new SerialNumberDO();
serialNumberDO = serialNumberService.getSerialNumber(PURCHASE_ORDER.name(), new SimpleDateFormat("yyyyMMdd").format(new Date()));
serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1);
storageInDO.setStorageNo(STOCK_IN.getCode(serialNumberDO.getSerialNumber().toString()));
storageInDO.setGoodsType(1);
storageInDO.setStatus(1);
storageInDO.setIsPrint("N");
storageInDO.setOrdDate(new Date());
storageInMapper.insert(storageInDO);
List<StorageInDetailDO> storageInDetailDOList = new ArrayList<>();
for (PurchaseOrderNoDetailDO orderNoDetailDO : list) {
StorageInDetailDO storageInDetailDO = new StorageInDetailDO();
storageInDetailDO.setStorageNoId(storageInDO.getId());
storageInDetailDO.setProjectSubCode(orderNoDetailDO.getProjectSubCode());
storageInDetailDO.setBoomDetailId(orderNoDetailDO.getBoomDetailId());
storageInDetailDO.setBoomName(orderNoDetailDO.getBoomName());
storageInDetailDO.setBoomSpec(orderNoDetailDO.getBoomSpec());
storageInDetailDO.setBoomUnit(orderNoDetailDO.getBoomUnit());
storageInDetailDO.setComposition(orderNoDetailDO.getComposition());
storageInDetailDO.setPurchaseAmount(orderNoDetailDO.getPurchaseAmount());
storageInDetailDO.setEstimatedPrice(orderNoDetailDO.getEstimatedPrice());
storageInDetailDO.setActualPrice(orderNoDetailDO.getActualPrice());
storageInDetailDO.setBoomAmount(orderNoDetailDO.getBoomAmount());
storageInDetailDO.setRequireTime(orderNoDetailDO.getRequireTime());
storageInDetailDO.setProjectMaterialPlanId(orderNoDetailDO.getProjectMaterialPlanId());
storageInDetailDO.setProjectMaterialPlanBoomId(orderNoDetailDO.getProjectMaterialPlanBoomId());
storageInDetailDO.setProjectPlanSubId(orderNoDetailDO.getProjectPlanSubId());
storageInDetailDO.setName(orderNoDetailDO.getName());
storageInDetailDO.setNameSim(orderNoDetailDO.getNameSim());
storageInDetailDO.setProjectId(orderNoDetailDO.getProjectId());
storageInDetailDO.setProjectPlanId(orderNoDetailDO.getProjectPlanId());
storageInDetailDO.setCustomerId(orderNoDetailDO.getCustomerId());
storageInDetailDO.setBrief(orderNoDetailDO.getBrief());
storageInDetailDO.setProjectName(orderNoDetailDO.getProjectName());
storageInDetailDO.setProjectNameSim(orderNoDetailDO.getProjectNameSim());
storageInDetailDO.setMaterialId(orderNoDetailDO.getMaterialId());
storageInDetailDO.setStorageAmount(orderNoDetailDO.getPurchaseRemAmounts());
PurchaseOrderNoDO purchaseOrderNoDO = purchaseOrderNoMapper.selectById(orderNoDetailDO.getPurchaseOrderId());
if (ObjectUtil.isNotEmpty(purchaseOrderNoDO)){
storageInDetailDO.setSupplierId(purchaseOrderNoDO.getSupplierId());
}
storageInDetailDO.setPurchaseOrderNoId(orderNoDetailDO.getPurchaseOrderId());
storageInDetailDO.setPurchaseOrderNoDetailId(orderNoDetailDO.getId());
storageInDetailDO.setAcarrDate(new Date());
if (orderNoDetailDO.getPurchaseRemAmount().compareTo(orderNoDetailDO.getPurchaseRemAmounts())==0){
orderNoDetailDO.setReceivingStatus(3);
}else {
orderNoDetailDO.setReceivingStatus(2);
}
orderNoDetailDO.setPurchaseRemAmount(orderNoDetailDO.getPurchaseRemAmount().subtract(orderNoDetailDO.getPurchaseRemAmounts()));
purchaseOrderNoDetailMapper.updateById(orderNoDetailDO);
storageInDetailDOList.add(storageInDetailDO);
}
storageInDetailMapper.insertBatch(storageInDetailDOList);
// 回写序列记录
serialNumberService.updateSerialNumber(serialNumberDO);
return CommonResult.success(true);
}
@Override
public CommonResult<Boolean> warehousing(Long id) {
PurchaseOrderNoDetailDO purchaseOrderNoDetailDO = purchaseOrderNoDetailMapper.selectById(id);
LambdaQueryWrapper<StorageInDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StorageInDetailDO::getPurchaseOrderNoDetailId,id);
wrapper.eq(StorageInDetailDO::getDeleted,0);
List<StorageInDetailDO> storageInDetailDOS = storageInDetailMapper.selectList(wrapper);
BigDecimal sum=BigDecimal.ZERO;
if (ObjectUtil.isNotEmpty(storageInDetailDOS)){
sum = storageInDetailDOS.stream()
.filter(Objects::nonNull) // 过滤掉空对象
.map(StorageInDetailDO::getStorageAmount)
.filter(Objects::nonNull) // 过滤掉空值
.reduce(BigDecimal.ZERO, BigDecimal::add); // 累加求和
}
if (sum.compareTo(purchaseOrderNoDetailDO.getBoomAmount())!=0){
return CommonResult.error(400,"该入库数量"+sum+"!=需求数量"+purchaseOrderNoDetailDO.getBoomAmount()+"请确认!");
}
purchaseOrderNoDetailDO.setReceivingStatus(3);
purchaseOrderNoDetailDO.setPurchaseRemAmount(BigDecimal.ZERO);
purchaseOrderNoDetailMapper.updateById(purchaseOrderNoDetailDO);
return CommonResult.success(true);
}
} }

View File

@ -153,13 +153,14 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
.filter(o -> o.getId() != null) .filter(o -> o.getId() != null)
.map(TaskDispatchDetailDO::getId) .map(TaskDispatchDetailDO::getId)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(idList)){
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(TaskDispatchDetailDO::getId, idList); wrapper.in(TaskDispatchDetailDO::getId, idList);
wrapper.eq(TaskDispatchDetailDO::getDeleted, 0); wrapper.eq(TaskDispatchDetailDO::getDeleted, 0);
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper); List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
for (TaskDispatchDetailDO dispatchDetailDO : detailDOS) { TaskDispatchDO taskDispatchDO = taskDispatchMapper.selectById(updateObj.getId());
for (TaskDispatchDetailDO dispatchDetailDO : detailDOS) {
if (dispatchDetailDO.getPlanStatus()==1){ if (dispatchDetailDO.getPlanStatus()==1){
TaskDispatchDO taskDispatchDO = taskDispatchMapper.selectById(dispatchDetailDO.getDispatchId());
ProcessBomDetailDO bomDetailDO = processBomDetailMapper.selectById(taskDispatchDO.getBomDetailId()); ProcessBomDetailDO bomDetailDO = processBomDetailMapper.selectById(taskDispatchDO.getBomDetailId());
ProcedureDO procedureDO = procedureMapper.selectById(dispatchDetailDO.getProcedureId()); ProcedureDO procedureDO = procedureMapper.selectById(dispatchDetailDO.getProcedureId());
if (ObjectUtil.isNotEmpty(bomDetailDO)&&ObjectUtil.isNotEmpty(procedureDO)){ if (ObjectUtil.isNotEmpty(bomDetailDO)&&ObjectUtil.isNotEmpty(procedureDO)){
@ -167,6 +168,7 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
} }
} }
} }
}
} }
// 明细工序状态更新 // 明细工序状态更新

View File

@ -71,10 +71,16 @@
</where> </where>
order by t.mat_code order by t.mat_code
</select> </select>
<select id="selectNowByMatPnId" resultType="com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO"> <select id="selectNowByMatPnId" resultType="com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO">
select * from v_storage_material_now where id=#{matId} and pn_id=#{pnId} order by mat_code select * from v_storage_material_now where id=#{matId} and pn_id=#{pnId} order by mat_code
</select> </select>
<select id="selectAllByMatNames" resultType="com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO">
select mat_name as matName,IFNULL(SUM(storage_ok_qty), 0) AS storage_ok_qty from v_storage_material_now where mat_name in
<foreach collection="matNames" open="(" close=")" separator="," item="name">
#{name}
</foreach>
group by mat_name
</select>
<select id="selectMaterialWithNow" <select id="selectMaterialWithNow"
parameterType="com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageNowAllReqVO" parameterType="com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageNowAllReqVO"
resultType="com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO"> resultType="com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO">

View File

@ -6,7 +6,7 @@
"private": false, "private": false,
"scripts": { "scripts": {
"i": "pnpm install", "i": "pnpm install",
"dev": "vite --mode dev", "dev": "vite --mode base",
"front": "vite --mode front", "front": "vite --mode front",
"ts:check": "vue-tsc --noEmit", "ts:check": "vue-tsc --noEmit",
"build:pro": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode pro", "build:pro": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build --mode pro",

View File

@ -95,12 +95,7 @@ export const delMaterial = async (id: number) => {
return await request.delete({ url: `/heli/material-plan/delMaterial?id=` + id }) return await request.delete({ url: `/heli/material-plan/delMaterial?id=` + id })
} }
// // 查询零件采购分页 // 查询零件采购分页
// export const getPartPurchasePages = async (params) => { export const getPartPurchasePages = async (params) => {
// return await request.post({ url: `/heli/material-plan/getPartPurchasePages`, params }) return await request.get({ url: `/heli/material-plan/getPartPurchasePages`, params })
// }
// 更新采购单主驳回
export const getPartPurchasePages = async () => {
return await request.get({ url: `/heli/material-plan/getPartPurchasePage` })
} }

View File

@ -3,7 +3,7 @@ import request from '@/config/axios'
export interface PartPurchaseOrderVO { export interface PartVO {
id: number id: number
projectMaterialPlanNo: string projectMaterialPlanNo: string
projectId: number projectId: number
@ -45,3 +45,13 @@ export const updatePurchaseOrderMakeNo = async (params) => {
return await request.put({ url: `/heli/purchase-order-make/updatePartCheckNo`, params }) return await request.put({ url: `/heli/purchase-order-make/updatePartCheckNo`, params })
} }
export const reject = async (params) => {
return await request.put({ url: `/heli/purchase-order-make/reject`, params })
}
export const approval = async (id: number) => {
return await request.put({ url: `/heli/purchase-order-make/approval?id=` + id })
}
// 获取零件采购订单生成分页
export const getDetail = async (params) => {
return await request.get({ url: `/heli/purchase-order-make/getDetail`, params })
}

View File

@ -73,3 +73,11 @@ export const verification = async (data) => {
export const receiveGoods= async (data) => { export const receiveGoods= async (data) => {
return await request.post({ url: `/heli/purchase-order-no-detail/receiveGoods`, data }) return await request.post({ url: `/heli/purchase-order-no-detail/receiveGoods`, data })
} }
// 查询采购订单明细分页
export const received = async (params) => {
return await request.get({ url: `/heli/purchase-order-no-detail/received`, params })
}
// 导出采购订单明细 Excel
export const exportReceived = async (params) => {
return await request.download({ url: `/heli/purchase-order-no-detail/exportReceived`, params })
}

View File

@ -48,3 +48,11 @@ export const exportStorageIn = async (params) => {
export const isPrint = async (id: number) => { export const isPrint = async (id: number) => {
return await request.get({ url: `/heli/storage-in/isPrint?id=` + id }) return await request.get({ url: `/heli/storage-in/isPrint?id=` + id })
} }
// 新增入库单
export const standardPartsReceived = async (data: StorageInVO) => {
return await request.post({ url: `/heli/storage-in/standardPartsReceived`, data })
}
// 查询入库单详情
export const warehousing = async (id: number) => {
return await request.get({ url: `/heli/storage-in/warehousing?id=` + id })
}

View File

@ -53,7 +53,7 @@
<el-card class="hl-card-info"> <el-card class="hl-card-info">
<template #header> <template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">零件明细</span> <div class="hl-card-info-icona"></div><span class="hl-card-info-text">零件明细</span>
<el-button style="margin-left: 18px" @click="singleSubmissions()" type="success" size="large"></el-button> <el-button style="margin-left: 18px" @click="singleSubmissions()" type="success" size="large"> </el-button>
</template> </template>
<el-row> <el-row>
<el-col> <el-col>
@ -69,13 +69,75 @@
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="客户简称" align="center" prop="brief" min-width="180" /> <el-table-column label="客户简称" align="center" prop="customerBriefName" min-width="180" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" /> <el-table-column label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" />
<el-table-column min-width="200px" align="center">
<template #header>泡沫</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.isFoam`" class="mb-0px!">
<el-checkbox-group v-model="row.isFoam">
<el-checkbox v-for="dict in ['是', '否']" :key="dict" :label="dict">
{{ dict }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="零件名称" align="center" prop="matName" min-width="180" /> <el-table-column label="零件名称" align="center" prop="matName" min-width="180" />
<el-table-column label="材质" align="center" prop="compositionName" min-width="120" /> <el-table-column label="材质" align="center" prop="compositionName" min-width="120" />
<el-table-column label="图号" align="center" prop="blueprintNo" min-width="120" /> <el-table-column label="图号" align="center" prop="blueprintNo" min-width="120" />
<el-table-column label="需求数量" align="center" prop="boomAmount" min-width="120" /> <el-table-column label="需求数量" align="center" prop="boomAmount" min-width="120" />
<el-table-column label="单位" align="center" prop="unit" min-width="120" /> <el-table-column label="单位" align="center" prop="unit" min-width="120" />
<el-table-column min-width="200px" align="center">
<template #header>采购数量</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.purchaseAmount`" class="mb-0px!" >
<el-input-number v-model="row.purchaseAmount" type="number" :precision="0" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center" >
<template #header><span class="hl-table_header">*</span>供应商</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.supplierId`" class="mb-0px!" >
<SupplierSelect v-model="row.supplierId" class="!w-265px" clearable @update:newValue="handleSelectedUser($index, $event)"/>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center">
<template #header>预估总价</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.estimatedPrice`" class="mb-0px!" >
<el-input-number v-model="row.estimatedPrice" type="number" :precision="2" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center" >
<template #header><span class="hl-table_header">*</span>预计到货日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.arriveTime`" class="mb-0px!" >
<el-date-picker class="!w-265px" v-model="row.arriveTime" type="date" value-format="x" placeholder="预计到货日期" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center" >
<template #header>技术要求</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.description`" class="mb-0px!" >
<el-input class="!w-265px" v-model="row.description" placeholder="技术要求" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center">
<template #header>理论重量()</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.theWeight`" class="mb-0px!" >
<el-input-number v-model="row.theWeight" type="number" :precision="3" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="责任人" align="center" prop="duEmpName" min-width="120" /> <el-table-column label="责任人" align="center" prop="duEmpName" min-width="120" />
<el-table-column label="状态" align="center" prop="mplanStatus" min-width="120" /> <el-table-column label="状态" align="center" prop="mplanStatus" min-width="120" />
<el-table-column label="采购单号" align="center" prop="purchaseNo" min-width="120" /> <el-table-column label="采购单号" align="center" prop="purchaseNo" min-width="120" />
@ -102,6 +164,7 @@ import {ElTable} from "element-plus";
import {useUserStore} from "@/store/modules/user"; import {useUserStore} from "@/store/modules/user";
import {dateFormatter1} from "@/utils/formatTime"; import {dateFormatter1} from "@/utils/formatTime";
import {getPartPurchasePages} from "@/api/heli/materialplan"; import {getPartPurchasePages} from "@/api/heli/materialplan";
import SupplierSelect from "@/views/heli/hlvuestyle/supplierSelect.vue";
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
defineOptions({ name: 'standard' }) defineOptions({ name: 'standard' })
@ -144,10 +207,9 @@ const exportLoading = ref(false) // 导出的加载中
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
// const data = await MaterialPlanApi.getPartPurchasePages(queryParams) const data = await MaterialPlanApi.getPartPurchasePages(queryParams)
// list.value = data.list list.value = data.list
// total.value = data.total total.value = data.total
await MaterialPlanApi.getPartPurchasePages()
} finally { } finally {
loading.value = false loading.value = false
} }
@ -177,9 +239,14 @@ const handleQuery = () => {
queryParams.pageNo = 1 queryParams.pageNo = 1
getList() getList()
} }
// //
// const handleSelectedSupplier = (newValue: any) => {
// formData.value.supplierId = newValue?.id
// }
const handleSelectedUser = (currentIndex, newValue: any) => { const handleSelectedUser = (currentIndex, newValue: any) => {
list.value[currentIndex].duEmpId = newValue?.id list.value[currentIndex].supplierId = newValue?.id
} }
const singleSubmission= (val) =>{ const singleSubmission= (val) =>{
multipleTable.value=[] multipleTable.value=[]
multipleTable.value.push(val) multipleTable.value.push(val)
@ -204,6 +271,26 @@ const submitForm = async () => {
return; return;
} }
for (let i = 0; i < list.length; i++) {
if (list[i].purchaseAmount === null || list[i].purchaseAmount === 0) {
message.error("采购数量为0或空");
break;
}
if (list[i].supplierId === null) {
message.error("供应商为空");
break;
}
if (list[i].arriveTime === null) {
message.error("预计到货日期为空");
break;
}
if (list[i].estimatedPrice === null) {
message.error("预估总价为空");
break;
}
}
// 2. // 2.
const firstSupplierId = list[0].supplierId; const firstSupplierId = list[0].supplierId;
if (list.some(item => item.supplierId !== firstSupplierId)) { if (list.some(item => item.supplierId !== firstSupplierId)) {

View File

@ -135,13 +135,27 @@ const updateParams = reactive({
reason: undefined reason: undefined
}) })
const approve = async () => { const approve = async () => {
const checkParams = await PartPurchaseOrderApi.getPurchaseOrderMake(query.id)
if (checkParams.status != 1){
message.warning("该单据状态非待审核,请刷新界面!");
return;
}
await PartPurchaseOrderApi.updatePurchaseOrderMake(formData.value.id) await PartPurchaseOrderApi.updatePurchaseOrderMake(formData.value.id)
message.success("提交成功"); message.success("提交成功");
getList(); getList();
} }
const handleReject = async () => { const handleReject = async () => {
const checkParams = await PartPurchaseOrderApi.getPurchaseOrderMake(query.id)
if (checkParams.status != 1){
message.warning("该单据状态非待审核,请刷新界面!");
return;
}
try { try {
const { value, action } = await ElMessageBox.prompt('请输入驳回原因', '提示', { const { value, action } = await ElMessageBox.prompt('请输入驳回原因', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',

View File

@ -0,0 +1,189 @@
<template>
<el-card class="hl-card" style="position: relative">
<template #header>
<span>详情页</span>
</template>
<el-form ref="formRef" :model="formData" label-width="160px" v-loading="formLoading">
<!-- 基础信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span>
</template>
<el-row>
<el-col :span="24">
<el-row>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="采购单号" prop="purchaseNo">
<el-input class="!w-300px" placeholder="系统自动生成" v-model="formData.purchaseNo" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
<!-- 需求单信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">采购单信息</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-table :data="formData.matBoomDOList" class="hl-table" v-loading="loading">
<el-table-column type="index" label="序号" fixed align="center" min-width="60" />
<el-table-column prop="projectName" min-width="200" label="项目名称" align="center"/>
<el-table-column prop="projectSubCode" min-width="200" label="子项目编码" align="center"/>
<el-table-column prop="boomName" min-width="200" label="物料名称" align="center"/>
<el-table-column prop="boomSpec" min-width="120" label="规格型号" align="center"/>
<el-table-column prop="boomAmount" min-width="100" label="需求数量" align="center"/>
<el-table-column prop="purchaseAmount" min-width="100" label="采购数量" align="center"/>
<el-table-column prop="requireTime" min-width="200" label="需要完成日期" align="center" :formatter="dateFormatter1"/>
<el-table-column prop="arriveTime" min-width="200" label="预计到货日期" align="center" :formatter="dateFormatter1"/>
<el-table-column prop="supplierName" min-width="100" label="供应商" align="center"/>
<el-table-column prop="description" min-width="200" label="备注" align="center"/>
<el-table-column prop="estimatedPrice" min-width="100" label="预估总价" align="center"/>
</el-table>
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</el-card>
</el-col>
</el-row>
</el-card>
</el-form>
<div class="hl-footer text-center">
<template v-if="formData.type === 'check'">
<el-button @click="approve" type="primary" v-if="formData.status == 1"
size="large"> </el-button>
<el-button @click="reject" v-if="formData.status == 1" size="large" type="danger"> </el-button>
<el-button @click="cancel" size="large"> </el-button>
</template>
<template v-if="formData.type === 'detail'">
<el-button @click="cancel" size="large"> </el-button>
</template>
</div>
</el-card>
<!-- 表单弹窗物料列表 -->
</template>
<script setup lang="ts">
import * as UserApi from '@/api/system/user'
import { dateFormatter1} from '@/utils/formatTime'
import { useTagsViewStore } from '@/store/modules/tagsView'
import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
import { ElMessageBox } from 'element-plus'
import { ref } from 'vue'
const reload: any = inject('reload')
const { t } = useI18n() //
const message = useMessage() //
const { query } = useRoute()
const router = useRouter()
const tagsViewStore = useTagsViewStore()
const dialogVisible = ref(false) //
const formLoading = ref(false) // 12
const formData = ref({
id: undefined,
purchaseNo: undefined,
projectId: undefined,
projectPlanId: undefined,
projectPlanNo: undefined,
projectCode: undefined,
auditor: undefined,
createTime: new Date(),
status: undefined,
description: undefined,
boomItemDOList: [],
boomItemRemoveList: [],
matBoomDOList: [],
matItemRemoveList: [],
attachments: [],
type: undefined,
})
const formRef = ref() // Ref
const subFormRef = ref() // Ref
const loading = ref(true) //
const total = ref(0) //
const subBoomFormLoading = ref(false)
const subBoomFormRef = ref()
const updateParams = reactive({
id: query.id,
})
const approve = async () => {
await PartPurchaseOrderApi.approval(formData.value.id)
message.success("批准成功");
formData.value = await PartPurchaseOrderApi.getPurchaseOrderMake(query.id)
formData.value.type = query.type
getList();
}
const handleReject = async () => {
try {
const { value, action } = await ElMessageBox.prompt('请输入驳回原因', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
inputPattern: /.+/, //
inputErrorMessage: '内容不能为空'
})
if (action === 'confirm') {
reject(value) // reject
}
} catch (err) {
//
console.log('操作取消或输入无效')
}
}
// reject
const reject = async() => {
// updateParams.reason = reason
//
await PartPurchaseOrderApi.reject(updateParams)
message.success("驳回成功");
router.push({ path: '/purchase/PurchaseOrderMake'});
tagsViewStore.delVisitedView(router.currentRoute.value)
}
const cancel = async () => {
router.push({ path: '/purchase/PurchaseOrderMake'});
}
const userList = ref<UserApi.UserVO[]>([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
purchaseOrderId: query.id
})
//
onMounted(async () => {
//
formData.value = await PartPurchaseOrderApi.getPurchaseOrderMake(query.id)
formData.value.type = query.type
getList();
})
const getList = async () => {
loading.value = true
try {
const data = await PartPurchaseOrderApi.getDetail(queryParams)
formData.value.matBoomDOList = data.list
total.value = data.total
} finally {
loading.value = false
}
}
</script>

View File

@ -0,0 +1,197 @@
<template>
<el-card class="hl-card">
<template #header>
<span>采购单审批</span>
</template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="130px">
<el-form-item label="采购单号" prop="purchaseNo">
<el-input v-model="queryParams.purchaseNo" placeholder="采购单号" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="queryParams.projectName" placeholder="项目名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="子项目名称" prop="projectSubName">
<el-input v-model="queryParams.projectSubName" placeholder="请输入子项目名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="供应商" prop="supplierName">
<el-input v-model="queryParams.supplierName" placeholder="请输入供应商名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<!-- <el-form-item label="采购单类型" prop="goodType">-->
<!-- <el-select v-model="queryParams.goodsType" placeholder="请选择采购单类型" clearable class="!w-240px">-->
<!-- <el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PART_PURCHASE_ORDER_TYPE)" :key="dict.value" :label="dict.label" :value="dict.value" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item label="单据状态" prop="documentStatus">
<el-select v-model="queryParams.status" placeholder="请选择单据状态" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_DOCUMENT_STATUS)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item style="margin-left:15px">
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column label="序号" type="index" align="center" fixed min-width="70px" />
<el-table-column label="采购单号" align="center" prop="purchaseNo" min-width="180" fixed>
<template #default="scope">
<el-button text type="primary" @click="openForm('detail', scope.row.id)">
{{ scope.row.purchaseNo }}
</el-button>
</template>
</el-table-column>
<el-table-column label="采购单类型" align="center" prop="goodsType" min-width="180px" >
<template #default="scope">
{{
getIntDictOptions(DICT_TYPE.HELI_PART_PURCHASE_ORDER_TYPE).find(
(dict) => dict.value === scope.row.goodsType
)?.label || '未知状态'
}}
</template>
</el-table-column>
<el-table-column label="客户简码" align="center" prop="brief" min-width="180px" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180px" />
<el-table-column label="项目简码" align="center" prop="projectNameSim" min-width="180px" />
<el-table-column label="单据状态" align="center" prop="status" min-width="180px" >
<template #default="scope">
{{
getIntDictOptions(DICT_TYPE.HELI_DOCUMENT_STATUS).find(
(dict) => dict.value === scope.row.status
)?.label || '未知状态'
}}
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" min-width="180">
<template #default="scope">
<el-button
v-if="scope.row.status === 1"
link
type="primary"
@click="openForm('check', scope.row.id)"
>
去审核
</el-button>
<el-button link type="primary" @click="openForm('detail', scope.row.id)">
查看详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
</el-card>
</template>
<script setup lang="ts">
import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import * as MaterialPlanApi from '@/api/heli/materialplan'
import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
defineOptions({ name: 'MaterialPlan' })
const router = useRouter()
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
id: undefined,
purchaseNo: undefined,
projectId: undefined,
projectPlanId: undefined,
submitUserId: undefined,
projectName: undefined,
projectSubName: undefined,
supplierName:undefined,
submitTime: [],
auditor: undefined,
auditTime: [],
goodsType: 1,
description: undefined,
createTime: [],
matType:undefined,
status:1
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await PartPurchaseOrderApi.getPartCheckPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const openForm = (type: string, id?: number) => {
switch (type) {
case 'create':
router.push({ path: '/purchase/materialplanadd', query: { id: id } })
break;
case 'update':
router.push({ path: '/purchase/materialplanedit', query: { id: id } })
break;
case 'detail':
router.push({ path: '/purchase/PurchaseOrderMakeDetail', query: { id: id , type: type} })
break;
case 'check':
router.push({ path: '/purchase/PurchaseOrderMakeDetail', query: { id: id , type: type} })
break;
default:
break;
}
}
/** 初始化 **/
onMounted(async () => {
//
// userInit.value = await UserApi.getSimpleUserList()
getList()
})
onActivated(() => {
getList()
})
</script>

View File

@ -0,0 +1,270 @@
<template>
<el-card class="hl-card">
<template #header>
<span>标准件收货</span>
</template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="120px">
<el-form-item label="项目名称" prop="projectName">
<el-input
v-model="queryParams.projectName" placeholder="项目名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="子项目名称" prop="projectSubName">
<el-input
v-model="queryParams.projectSubName" placeholder="子项目名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="零件名称" prop="boomName">
<el-input
v-model="queryParams.boomName" placeholder="零件名称" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="项目编码" prop="projectCode">
<el-input
v-model="queryParams.projectCode" placeholder="项目编码" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="订单状态" prop="receivingStatus">
<el-select v-model="queryParams.receivingStatus" placeholder="下拉选择" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PURCHASE_RECEIVING_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item style="margin-left:50px">
<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-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">订单明细</span>
<el-button style="margin-left: 20px" @click="standardPartsReceived" type="success" size="large">收货</el-button>
<el-button style="margin-left: 20px" type="primary" @click="jump" size="large">入库单管理</el-button>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-form ref="subFormRef" :model="list" v-loading="formLoading" label-width="0" >
<el-table
v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table" ref="multipleTable" @selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column fixed label="序号" type="index" align="center" width="60" />
<!-- <el-table-column label="id" align="center" min-width="180" prop="id" />-->
<el-table-column label="子项目编码" align="center" min-width="180" prop="projectSubCode" />
<el-table-column label="物料编码" align="center" min-width="120" prop="matCode" />
<el-table-column label="标准件名称" align="center" min-width="150" prop="boomName" />
<el-table-column label="规格型号" align="center" min-width="120" prop="boomSpec" />
<el-table-column label="需求数量" align="center" min-width="100" prop="boomAmount" />
<el-table-column label="采购数量" align="center" min-width="100" prop="purchaseAmount" />
<el-table-column label="剩余数量" align="center" min-width="100" prop="purchaseRemAmount" />
<el-table-column prop="purchaseRemAmounts" min-width="180" align="center">
<template #header><span class="hl-table_header">*</span>入库数量</template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.purchaseRemAmounts`" class="mb-0px!">
<el-input-number style="width: 100%" v-model="scope.row.purchaseRemAmounts" placeholder="入库数量" :min="0" :precision="2" />
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center" >
<template #header>到货日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.boomArriveDates`" class="mb-0px!" >
<el-date-picker class="!w-265px" v-model="row.boomArriveDates" type="date" value-format="x" placeholder="到货日期" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="需求完成时间" align="center" prop="requireTime" :formatter="dateFormatter2" min-width="180" />
<el-table-column label="计划到货日期" align="center" prop="arriveTime" :formatter="dateFormatter2" min-width="180" />
<el-table-column label="供应商" align="center" min-width="180" prop="supplierName" />
<el-table-column label="价格" align="center" min-width="100" prop="estimatedPrice" />
<el-table-column label="订单状态" align="center" prop="receivingStatus" min-width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PURCHASE_RECEIVING_STATUS" :value="scope.row.receivingStatus" />
</template>
</el-table-column>
<el-table-column label="采购订单号" align="center" min-width="180" prop="purchaseNo" />
<el-table-column label="操作" align="center" fixed="right" min-width="110">
<template #header>
<span style="margin-right: 30%">操作</span>
</template>
<template #default="scope">
<el-button link type="primary" @click="warehousing(scope.row.id)" v-if="scope.row.purchaseAmount>scope.row.boomAmount">
采购入库
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
</el-card>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import download from '@/utils/download'
import * as PurchaseOrderApi from '@/api/heli/purchaseorder'
import * as PurchaseOrderNoDetailApi from '@/api/heli/purchaseordernodetail'
import * as StorageinApi from '@/api/heli/storagein'
import { ElTable } from 'element-plus'
import {useUserStore} from "@/store/modules/user";
import {ref} from "vue";
import {dateFormatter2} from "@/utils/formatTime";
import {PurchaseOrderNoDetailVO} from "@/api/heli/purchaseordernodetail";
import * as ProcessBomApi from "@/api/heli/processbom";
const formLoading = ref(false) // 12
defineOptions({ name: 'PurchaseOrder' })
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
id: undefined,
ids: undefined,
purchaseNo: undefined,
supplierId: undefined,
contractNo: undefined,
purchaseType: undefined,
projectMaterialPlanId: undefined,
goodsType: 1,
currencyType: undefined,
taxRatio: undefined,
estimatedPrice: undefined,
actualPrice: undefined,
status: undefined,
submitUserId: undefined,
submitTime: [],
auditor: undefined,
auditTime: [],
description: undefined,
creator: undefined,
createTime: undefined,
receivingStatus:undefined,
projectName:undefined,
projectSubName:undefined,
supplierName:undefined,
boomName:undefined,
projectCode:undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
const multipleTable = ref<InstanceType<typeof ElTable>>()
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
queryParams.ids = undefined
const data = await PurchaseOrderNoDetailApi.received(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
const handleSelectionChange = (val) => {
multipleTable.value=val
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
const jump = async () => {
router.push({ path: '/inventory/storagein' })
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
const multipleSelection: any = ref([])
const warehousing = async (id) => {
await StorageinApi.warehousing(id)
message.success("采购入库成功")
await getList()
}
const standardPartsReceived = async () => {
const list = multipleTable.value|| []; //
// 1.
if (!list || list.length==null) {
message.error("提交明细不能为空,请确认");
return;
}
for (let i = 0; i < list.length; i++) {
if (list[i].purchaseRemAmounts==null||list[i].purchaseRemAmounts==0){
message.error("标准件"+list[i].boomName+"入库数量为空或数量为0,请确认")
return
}
}
try {
await StorageinApi.standardPartsReceived(list)
formLoading.value = true
message.success("收货成功")
//
getList()
emit('success')
} finally {
formLoading.value = false
}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await PurchaseOrderNoDetailApi.exportReceived(queryParams)
download.excel(data, '标准件收货.xlsx')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted( () => {
getList()
})
</script>

View File

@ -24,6 +24,7 @@
</el-row> </el-row>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-row>
<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"
@ -33,6 +34,7 @@
disabled disabled
/> />
</el-form-item> </el-form-item>
</el-row>
</el-col> </el-col>
</el-row> </el-row>
</el-col> </el-col>

View File

@ -91,7 +91,6 @@ const message = useMessage() // 消息弹窗
const { query } = useRoute() const { query } = useRoute()
const router = useRouter() const router = useRouter()
const tagsViewStore = useTagsViewStore() const tagsViewStore = useTagsViewStore()
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
const formData = ref({ const formData = ref({
@ -126,7 +125,7 @@ const subBoomFormRef = ref()
const closeForm = async () => { const closeForm = async () => {
router.push({ path: '/purchase/management' }) router.push({ path: '/inventory/supplementManagement' ,query: { ...query }})
tagsViewStore.delVisitedView(router.currentRoute.value) tagsViewStore.delVisitedView(router.currentRoute.value)
} }
const userList = ref<UserApi.UserVO[]>([]) // const userList = ref<UserApi.UserVO[]>([]) //

View File

@ -89,7 +89,7 @@ import * as UserApi from '@/api/system/user'
import dayjs from "dayjs"; import dayjs from "dayjs";
defineOptions({ name: 'MaterialPlan' }) defineOptions({ name: 'supplementManagement' })
const router = useRouter() const router = useRouter()
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
@ -156,7 +156,6 @@ const openForm = (type: string, id?: number) => {
router.push({ path: '/purchase/materialplanedit', query: { id: id } }) router.push({ path: '/purchase/materialplanedit', query: { id: id } })
break; break;
case 'detail': case 'detail':
console.log("0000")
router.push({ path: '/inventory/supplemanagementdetail', query: { id: id } }) router.push({ path: '/inventory/supplemanagementdetail', query: { id: id } })
break; break;
default: default:
@ -189,9 +188,12 @@ const userInit = ref()
/** 初始化 **/ /** 初始化 **/
onMounted(async () => { onMounted(async () => {
userInit.value = await UserApi.getSimpleUserList() userInit.value = await UserApi.getSimpleUserList()
// //
setDefaultDate() setDefaultDate()
getList() getList()
}) })
onActivated(() => {
console.log(11)
getList()
})
</script> </script>

View File

@ -1514,7 +1514,6 @@ const onAddItem = () => {
}else{ }else{
if(formData.value.taskDispatchDetails != null && formData.value.taskDispatchDetails.length > 0){ if(formData.value.taskDispatchDetails != null && formData.value.taskDispatchDetails.length > 0){
var it = formData.value.taskDispatchDetails [0] var it = formData.value.taskDispatchDetails [0]
console.log(it)
if(it.startTime != null){ if(it.startTime != null){
row.startTime = it.startTime row.startTime = it.startTime
} }
@ -1545,6 +1544,17 @@ const onAddItem = () => {
} }
}); });
if(formData.value.taskDispatchDetails != null && formData.value.taskDispatchDetails.length > 0){
for(var i = 0 ; i < formData.value.taskDispatchDetails.length ; i ++ ){
var item = formData.value.taskDispatchDetails[i];
for(var j = 0 ; j < list.length ; j ++ ){
var item1 = list[j];
if(item.procedureId == item1.procedureId){
item1.dispatchType = item.dispatchType
}
}
}
}
formData.value.taskDispatchDetails = list; formData.value.taskDispatchDetails = list;
}else{ }else{
formData.value.taskDispatchDetails = [] formData.value.taskDispatchDetails = []
@ -1677,6 +1687,7 @@ const onDeleteItem = async (row,index) => {
message.success(t('common.delSuccess')) message.success(t('common.delSuccess'))
} }
const handleOutsourcingChange= async (row: any) => { const handleOutsourcingChange= async (row: any) => {
console.log('ss')
if(row.isOutsourcing == false){ if(row.isOutsourcing == false){
row.dispatchType = 1 row.dispatchType = 1
row.postId = '' row.postId = ''