入库问题修改

This commit is contained in:
z 2025-07-18 19:28:24 +08:00
parent e401652ec4
commit b8e4cec878
47 changed files with 684 additions and 138 deletions

View File

@ -155,7 +155,13 @@ public class MaterialController {
PageResult<MaterialDO> pageResult = materialService.getStorageNowPageGroupMaterial(pageReqVO);
return success(pageResult);
}
@GetMapping("/page-material-group-no")
@Operation(summary = "根据采购单获得入库物料列表")
@PreAuthorize("@ss.hasPermission('heli:storage-log:query')")
public CommonResult<PageResult<MaterialDO>> getStorageNowMaterialNoPage(@Valid StorageLogPageReqVO pageReqVO) {
PageResult<MaterialDO> pageResult = materialService.getStorageNowMaterialNoPage(pageReqVO);
return success(pageResult);
}
@GetMapping("/page-now-all")
@Operation(summary = "获得出库物料列表")
@PreAuthorize("@ss.hasPermission('heli:storage-log:query')")

View File

@ -75,5 +75,7 @@ public class MaterialPlanPageReqVO extends PageParam {
private Integer mplanStatus;
@Schema(description = "责任人")
private String duEmpName;
@Schema(description = "责任人")
private String blueprintNo;
}

View File

@ -21,8 +21,7 @@ import java.util.Date;
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false避免BOM导入有问题
public class PartExcelVO {
@ExcelProperty("工序名称")
private String procedureName;
@ExcelProperty("项目名称")
@ -30,11 +29,14 @@ public class PartExcelVO {
@ExcelProperty("子项目名称")
private String projectSubName;
@ExcelProperty("客户简码")
private String customerName;
@ExcelProperty("零件号")
private String blueprintNo;
// @ExcelProperty("客户简码")
// private String customerName;
@ExcelProperty("零件名称")
private String materialName;
@ExcelProperty("工序名称")
private String procedureName;
@ExcelProperty("材质")
private String compositionName;

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorderno.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat;
import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert;
import com.chanko.yunxi.mes.framework.excel.core.convert.TimestampToDateConvert;
@ -109,4 +110,6 @@ public class PurchaseOrderNoRespVO {
private String isPrint;
@Schema(description = "收货状态")
private Integer receivingStatus1;
@Schema(description = "创建人")
private String submitUserName;
}

View File

@ -5,12 +5,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.outsourcestockboom.vo.OutsourceStockBoomSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
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.storagein.StorageInDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storageinventory.StorageInventoryDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagemat.StorageMatDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper;
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.storageinventory.StorageInventoryMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogNowMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagemat.StorageMatMapper;
@ -72,6 +76,10 @@ public class StorageController {
private MaterialMapper materialMapper;
@Resource
private StorageInventoryMapper storageInventoryMapper;
@Resource
private PurchaseOrderNoDetailMapper purchaseOrderNoDetailMapper;
@Resource
private PurchaseOrderNoMapper purchaseOrderNoMapper;
@PostMapping("/cancelWeiWai")
@Operation(summary = "委外取消提交")
@PreAuthorize("@ss.hasPermission('heli:storage:create')")
@ -184,6 +192,11 @@ public class StorageController {
storageInventoryDO.setYardAmount(totalNumber);
}
storageInventoryMapper.insertOrUpdate(storageInventoryDO);
PurchaseOrderNoDetailDO purchaseOrderNoDetailDO = purchaseOrderNoDetailMapper.selectById(storageMatDO.getPurchaseOrderNoDetailId());
if (ObjectUtil.isNotEmpty(purchaseOrderNoDetailDO)){
purchaseOrderNoDetailDO.setPurchaseRemAmount(purchaseOrderNoDetailDO.getPurchaseRemAmount().subtract(storageMatDO.getStorageOkQty()));
purchaseOrderNoDetailMapper.updateById(purchaseOrderNoDetailDO);
}
}
}
}else if (updateReqVO.getStockType()==2){
@ -285,6 +298,14 @@ public class StorageController {
@PreAuthorize("@ss.hasPermission('heli:storage:query')")
public CommonResult<StorageRespVO> getStorage(@RequestParam("id") Long id) {
StorageDO storage = storageService.getStorage(id);
if (storage.getStockType()==1&&storage.getStockInType()==1){
LambdaQueryWrapper<PurchaseOrderNoDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(PurchaseOrderNoDO::getPurchaseNo,storage.getHeaderNo());
PurchaseOrderNoDO purchaseOrderNoDO = purchaseOrderNoMapper.selectOne(wrapper);
if (ObjectUtil.isNotEmpty(purchaseOrderNoDO)){
storage.setHeaderId(purchaseOrderNoDO.getId());
}
}
return success(BeanUtils.toBean(storage, StorageRespVO.class));
}

View File

@ -107,5 +107,7 @@ public class StorageRespVO {
@Schema(description = "子项目id")
@ExcelProperty("子项目id")
private Integer projectNo;
@Schema(description = "上游单号id")
private Long headerId;
}

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.storage.vo;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo.StorageMatSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@ -82,4 +83,6 @@ public class StorageSaveReqVO {
private Long rgId;
@Schema(description = "库位id")
private Long pnId;
private List<StorageMatSaveReqVO> matItemDOList;
}

View File

@ -48,7 +48,8 @@ public class StorageLogPageReqVO extends PageParam {
@Schema(description = "库位")
private Long pnId;
@Schema(description = "库位")
private Long headerId;
}

View File

@ -1,15 +1,18 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.storagemat;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.chanko.yunxi.mes.module.heli.controller.admin.storage.vo.StorageSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO;
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.storage.StorageDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelog.StorageLogDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordernodetail.PurchaseOrderNoDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storage.StorageMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogNowMapper;
import com.chanko.yunxi.mes.module.heli.enums.CodeEnum;
@ -69,6 +72,8 @@ public class StorageMatController {
private StorageLogNowMapper storageLogNowMapper;
@Resource
private SerialNumberService serialNumberService;
@Resource
private PurchaseOrderNoDetailMapper purchaseOrderNoDetailMapper;
@PostMapping("/create")
@Operation(summary = "创建入/出库物料")
@ -99,6 +104,8 @@ public class StorageMatController {
public CommonResult<Long> createStorageMat(@Valid @RequestBody List<StorageMatSaveReqVO> createReqVO,@RequestParam("stockid") Long stockid) {
storageMatService.deleteStorageMatList(stockid);
List<String> attr3List = new ArrayList<>();
for (StorageMatSaveReqVO item : createReqVO) {
item.setId(null);
if (item.getMatCode()!=null){
@ -137,8 +144,6 @@ public class StorageMatController {
bdgzsomthingService.updateById(bdgzsomthingDO);
}
}
}
}

View File

@ -87,5 +87,9 @@ public class StorageMatRespVO {
@Schema(description = "库存")
@ExcelProperty("库存")
private BigDecimal matRest;
@Schema(description = "采购单id")
private Long purchaseOrderNoId;
@Schema(description = "采购单明细id")
private Long purchaseOrderNoDetailId;
}

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -52,4 +53,6 @@ public class StorageMatSaveReqVO {
private BigDecimal amount;
@Schema(description = "备注", example = "你猜")
private String projectSubName;
private Long purchaseOrderNoDetailId;
private Long purchaseOrderNoId;
}

View File

@ -182,4 +182,16 @@ public class MaterialDO extends TenantBaseDO {
private Long materialTypeId;
@TableField(exist = false)
private String matUnitId;
@TableField(exist = false)
private BigDecimal purchaseRemAmount;
@TableField(exist = false)
private BigDecimal estimatedPrice;
@TableField(exist = false)
private BigDecimal purchaseAmount;
@TableField(exist = false)
private BigDecimal unitPrice;
@TableField(exist = false)
private Long purchaseOrderNoDetailId;
@TableField(exist = false)
private Long purchaseOrderNoId;
}

View File

@ -148,6 +148,8 @@ public class PurchaseOrderNoDO extends BaseDO {
@TableField(exist = false)
private String postalCode;
@TableField(exist = false)
private String submitUserName;
@TableField(exist = false)
private String deliveryAddress;
@TableField(exist = false)
private Integer receivingStatus1;

View File

@ -138,5 +138,7 @@ public class StorageDO extends BaseDO {
private String signature;
@TableField(exist = false)
private Date date;
@TableField(exist = false)
private Long headerId;
}

View File

@ -225,6 +225,8 @@ public class TaskDispatchDetailDO extends BaseDO {
@TableField(exist = false)
private String nameSim;
@TableField(exist = false)
private String blueprintNo;
@TableField(exist = false)
private String projectNameSim;
@TableField(exist = false)
private Long duEmpId;

View File

@ -9,12 +9,14 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.storagelog.vo.StorageLo
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.pn.PnDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordernodetail.PurchaseOrderNoDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.rg.RgDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storageinventory.StorageInventoryDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
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.warehouse.WarehouseDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordernodetail.PurchaseOrderNoDetailMapper;
import com.chanko.yunxi.mes.module.heli.enums.MaterialTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum;
import com.chanko.yunxi.mes.module.system.dal.dataobject.dict.DictDataDO;
@ -216,4 +218,33 @@ public interface MaterialMapper extends BaseMapperX<MaterialDO> {
}
return selectPage(pageReqVO, query);
}
default PageResult<MaterialDO> getStorageNowMaterialNoPage(StorageLogPageReqVO pageReqVO){
MPJLambdaWrapper<MaterialDO> query = new MPJLambdaWrapper<>();
query.selectAll(MaterialDO.class)
.select("ifnull(sum(s.yard_amount),0) matRest")
.select("t.name as matName,t.code as matCode,d.label as matType,t.spec as matSpec,t.brand as matBrand")
.select("d1.label as matUnit")
.select("p.id as purchaseOrderNoDetailId,p.purchase_order_id as purchaseOrderNoId")
.select("p.purchase_amount as purchaseAmount","p.estimated_price as estimatedPrice")
.select("p.purchase_rem_amount as purchaseRemAmount","ROUND(p.estimated_price / NULLIF(p.purchase_amount, 0)) AS unitPrice")
.leftJoin(StorageInventoryDO.class, "s", StorageInventoryDO::getMaterialId, MaterialDO::getId)
.leftJoin(PurchaseOrderNoDetailDO.class,"p",PurchaseOrderNoDetailDO::getMaterialId, MaterialDO::getId)
.leftJoin(DictDataDO.class,"d",DictDataDO::getValue, MaterialDO::getMaterialType)
.leftJoin(DictDataDO.class,"d1",DictDataDO::getValue, MaterialDO::getUnit)
.disableSubLogicDel()
.groupBy(MaterialDO::getId)
.orderByDesc(MaterialDO::getId);
query.like(!com.alibaba.druid.util.StringUtils.isEmpty(pageReqVO.getMatSpec()),MaterialDO::getSpec, pageReqVO.getMatSpec())
.like(!com.alibaba.druid.util.StringUtils.isEmpty(pageReqVO.getMatName()), MaterialDO::getName, pageReqVO.getMatName())
.like(!com.alibaba.druid.util.StringUtils.isEmpty(pageReqVO.getMatCode()), MaterialDO::getCode, pageReqVO.getMatCode())
.eq(true,PurchaseOrderNoDetailDO::getPurchaseOrderId, pageReqVO.getHeaderId())
.eq(true,MaterialDO::getVirtualPart, YesOrNoEnum.N.name())
.eq(MaterialDO::getStatus,1)
.eq("d.dict_type","heli_material_type")
.eq("d1.dict_type","heli_material_unit")
;
return selectPage(pageReqVO,query);
}
}

View File

@ -237,6 +237,7 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
.disableSubLogicDel();
query
.like(!StringUtils.isEmpty(pageReqVO.getProjectName()),MaterialPlanDO::getProjectName, pageReqVO.getProjectName())
.like(!StringUtils.isEmpty(pageReqVO.getBlueprintNo()),ProcessBomDetailDO::getBlueprintNo, pageReqVO.getBlueprintNo())
.like(!StringUtils.isEmpty(pageReqVO.getProjectSubName()), MaterialPlanDO::getName, pageReqVO.getProjectSubName())
.like(!StringUtils.isEmpty(pageReqVO.getMaterialName()), MaterialPlanBoomDO::getMatName, pageReqVO.getMaterialName())
.like(!StringUtils.isEmpty(pageReqVO.getMatName()), MaterialPlanBoomDO::getMatName, pageReqVO.getMatName())

View File

@ -33,6 +33,7 @@ public interface PurchaseOrderNoMapper extends BaseMapperX<PurchaseOrderNoDO> {
query.selectAll(PurchaseOrderNoDO.class)
.select("s.name as supplierName","m.project_material_plan_no as materialPlanNo")
.select("u1.nickname as submitUserName")
.select("CASE " +
" WHEN COUNT(d.id) = 0 THEN 1 " + // 无子记录
" WHEN SUM(CASE d.receiving_status WHEN 3 THEN 0 ELSE 1 END) = 0 THEN 3 " + // 全部为3
@ -43,6 +44,7 @@ public interface PurchaseOrderNoMapper extends BaseMapperX<PurchaseOrderNoDO> {
.leftJoin(PurchaseOrderNoDetailDO.class,"d", PurchaseOrderNoDetailDO::getPurchaseOrderId, PurchaseOrderNoDO::getId)
.leftJoin(MaterialPlanDO.class, "m", MaterialPlanDO::getId, PurchaseOrderNoDO::getProjectMaterialPlanId)
.leftJoin(AdminUserDO.class,"u", AdminUserDO::getId, PurchaseOrderNoDetailDO::getDuEmpId)
.leftJoin(AdminUserDO.class,"u1", AdminUserDO::getId, PurchaseOrderNoDO::getCreator)
.disableSubLogicDel()
.groupBy(PurchaseOrderNoDO::getId)
.orderByDesc(PurchaseOrderNoDO::getCreateTime);

View File

@ -721,6 +721,7 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
.select("d.material_name as materialName,DATE_FORMAT(p.boom_arrive_date, '%Y-%m-%d') AS boomArriveDates")
.select("e.brief as customerName,u.nickname as nickname,c.id as projectSubId")
.select("p.boom_arrive_date as boomArriveDate,p.du_emp_id as duEmpId,p.description as description,p.mat_weight as matWeight")
.select("d.blueprint_no as blueprintNo")
.leftJoin(TaskDispatchDO.class, "a", TaskDispatchDO::getId, TaskDispatchDetailDO::getDispatchId)
.leftJoin(ProjectOrderDO.class, "b", ProjectOrderDO::getId, TaskDispatchDO::getProjectId)
.leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, TaskDispatchDO::getProjectSubId)
@ -737,6 +738,7 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
query
.like(!StringUtils.isEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode, pageReqVO.getProjectCode())
.like(!StringUtils.isEmpty(pageReqVO.getBlueprintNo()), ProcessBomDetailDO::getBlueprintNo, pageReqVO.getBlueprintNo())
.like(!StringUtils.isEmpty(pageReqVO.getProjectName()), ProjectOrderDO::getProjectName, pageReqVO.getProjectName())
.like(!StringUtils.isEmpty(pageReqVO.getProjectSubName()), ProjectOrderSubDO::getName, pageReqVO.getProjectSubName())
.like(!StringUtils.isEmpty(pageReqVO.getMaterialName()), ProcessBomDetailDO::getMaterialName, pageReqVO.getMaterialName())

View File

@ -70,4 +70,6 @@ public interface MaterialService {
PageResult<StorageInventoryDO> getStorageNowPageAll(StorageLogPageReqVO pageReqVO);
PageResult<MaterialDO> getSupplementPage(StorageInventoryPageReqVO pageReqVO);
PageResult<MaterialDO> getStorageNowMaterialNoPage(StorageLogPageReqVO pageReqVO);
}

View File

@ -290,6 +290,40 @@ public class MaterialServiceImpl implements MaterialService {
return materialMapper.getSupplementPage(pageReqVO);
}
@Override
public PageResult<MaterialDO> getStorageNowMaterialNoPage(StorageLogPageReqVO pageReqVO) {
PageResult<MaterialDO> pageResult = materialMapper.getStorageNowMaterialNoPage(pageReqVO);
if (ObjectUtil.isNotEmpty(pageReqVO.getWhId())) {
if (ObjectUtil.isNotEmpty(pageResult.getList())) {
// 获取所有物料编码
List<Long> ids = pageResult.getList().stream()
.map(MaterialDO::getId)
.collect(Collectors.toList());
// 批量查询库存日志
LambdaQueryWrapper<StorageInventoryDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StorageInventoryDO::getWhId, pageReqVO.getWhId())
.in(StorageInventoryDO::getMaterialId,ids );
List<StorageInventoryDO> logList = storageInventoryMapper.selectList(wrapper);
// 将库存日志按物料编码分组
Map<Long, List<StorageInventoryDO>> logMap = logList.stream()
.collect(Collectors.groupingBy(StorageInventoryDO::getMaterialId));
// 计算每个物料的剩余数量并设置到对应的 StorageMaterialDO 对象中
for (MaterialDO materialDO : pageResult.getList()) {
List<StorageInventoryDO> logs = logMap.getOrDefault(materialDO.getId(), Collections.emptyList());
BigDecimal matRest = logs.stream()
.map(StorageInventoryDO::getYardAmount)
.filter(Objects::nonNull) // 确保过滤掉 null
.reduce(BigDecimal.ZERO, BigDecimal::add);
materialDO.setMatRest(matRest);
}
}
}
return pageResult;
}
private void checkData(List<MaterialExcelVO> materialExcelVOList) {
// 基础校验
Set<ConstraintViolation<List<MaterialExcelVO>>> validate = validator.validate(materialExcelVOList, MaterialExcelVO.class);

View File

@ -130,6 +130,7 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
// purchaseOrderNoDetailDO.setBoomUnit(detailDO.getBoomUnit());
// purchaseOrderNoDetailDO.setBoomSpec(detailDO.getBoomSpec());
PurchaseOrderNoDetailDO purchaseOrderNoDetailDO = BeanUtils.toBean(detailDO, PurchaseOrderNoDetailDO.class);
purchaseOrderNoDetailDO.setDuEmpId(detailDO.getDuEmpId());
purchaseOrderNoDetailDO.setId(null);
purchaseOrderNoDetailDO.setCreateTime(null);
purchaseOrderNoDetailDO.setUpdateTime(null);

View File

@ -3,6 +3,7 @@ package com.chanko.yunxi.mes.module.heli.service.plan;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanko.yunxi.mes.framework.common.exception.ErrorCode;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
@ -481,7 +482,9 @@ private TaskReportMapper taskReportMapper;
eq(ProcessBomDO::getProjectSubId, planSubDOS.getProjectSubId());
last("LIMIT 1");
}});
if (processBomDO.getBomStatus() !=7){
throw exception(new ErrorCode(400,"BOM没有审核请先审核BOM"));
}
PlanTaskDO planTaskDO = planTaskMapper.selectOne(new LambdaQueryWrapper<PlanTaskDO>() {{
eq(PlanTaskDO::getProjectId, planSubDOS.getProjectId());
eq(PlanTaskDO::getProjectPlanId, planSubDOS.getProjectPlanId());

View File

@ -109,6 +109,12 @@ public class PurchaseOrderNoDetailServiceImpl implements PurchaseOrderNoDetailSe
public Long createPurchaseOrderNoDetail(PurchaseOrderNoDetailSaveReqVO createReqVO) {
// 插入
PurchaseOrderNoDetailDO purchaseOrderNoDetail = BeanUtils.toBean(createReqVO, PurchaseOrderNoDetailDO.class);
PurchaseOrderNoDO purchaseOrderNoDO = purchaseOrderNoMapper.selectById(createReqVO.getPurchaseOrderId());
if (ObjectUtil.isNotEmpty(purchaseOrderNoDO)){
if (purchaseOrderNoDO.getPurchaseType() == 2){
purchaseOrderNoDetail.setPurchaseRemAmount(purchaseOrderNoDetail.getPurchaseAmount());
}
}
purchaseOrderNoDetailMapper.insert(purchaseOrderNoDetail);
// 返回
return purchaseOrderNoDetail.getId();

View File

@ -5,9 +5,11 @@ import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanko.yunxi.mes.framework.common.exception.ErrorCode;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.module.heli.controller.admin.outsourcestockboom.vo.OutsourceStockBoomSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.storageinventory.StorageInventoryController;
import com.chanko.yunxi.mes.module.heli.controller.admin.storagemat.vo.StorageMatSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.bdgzsomthing.bdgzsomthingDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
@ -339,11 +341,19 @@ private StorageLogService storageLogService;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createStorage(StorageSaveReqVO createReqVO) {
if (createReqVO.getStockType()==1&&createReqVO.getStockInType()==1){
for (StorageMatSaveReqVO item : createReqVO.getMatItemDOList()) {
PurchaseOrderNoDetailDO purchaseOrderNoDetailDO = purchaseOrderNoDetailMapper.selectById(item.getPurchaseOrderNoDetailId());
if (ObjectUtil.isNotEmpty(purchaseOrderNoDetailDO)){
if (item.getStorageOkQty().compareTo(purchaseOrderNoDetailDO.getPurchaseRemAmount())>0){
throw exception(new ErrorCode(400,"本次入库数量"+item.getStorageOkQty()+" 大于订单剩余数量"+purchaseOrderNoDetailDO.getPurchaseRemAmount()+"请确认."));
}
}
}
}
// 插入
StorageDO storage = BeanUtils.toBean(createReqVO, StorageDO.class);
SerialNumberDO serialNumberDO = new SerialNumberDO();
if(createReqVO.getStockType().equals(1)) {
// 月度流水号
@ -371,6 +381,20 @@ private StorageLogService storageLogService;
public void updateStorage(StorageSaveReqVO updateReqVO) {
// 校验存在
validateStorageExists(updateReqVO.getId());
if (updateReqVO.getStockType()==1&&updateReqVO.getStockInType()==1){
List<StorageMatDO> storageMatDOS = storageMatMapper.selectMatByStorckID(updateReqVO.getId());
if (ObjectUtil.isNotEmpty(storageMatDOS)){
for (StorageMatDO item :storageMatDOS) {
PurchaseOrderNoDetailDO purchaseOrderNoDetailDO = purchaseOrderNoDetailMapper.selectById(item.getPurchaseOrderNoDetailId());
if (ObjectUtil.isNotEmpty(purchaseOrderNoDetailDO)){
if (item.getStorageOkQty().compareTo(purchaseOrderNoDetailDO.getPurchaseRemAmount())>0){
throw exception(new ErrorCode(400,"本次入库数量"+item.getStorageOkQty()+" 大于订单剩余数量"+purchaseOrderNoDetailDO.getPurchaseRemAmount()+"请确认."));
}
}
}
}
}
// 更新
StorageDO updateObj = BeanUtils.toBean(updateReqVO, StorageDO.class);
storageMapper.updateById(updateObj);

View File

@ -17,6 +17,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.equipmanufacture.EquipMan
import com.chanko.yunxi.mes.module.heli.dal.dataobject.fpuserdetail.FpUserDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.procedure.ProcedureDO;
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.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
@ -30,6 +31,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.fpuserdetail.FpUserDetailMappe
import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.procedure.ProcedureMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper;
@ -105,6 +107,8 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
private ProcedureMapper procedureMapper;
@Resource
private ProcessBomDetailMapper processBomDetailMapper;
@Resource
private ProcessBomMapper processBomMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createTaskDispatch(TaskDispatchSaveReqVO createReqVO) {
@ -165,6 +169,17 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
throw exception(PROCESS_BOM_DETAIL_NOT_EXISTS);
}
}
if(operateTypeEnum == OperateTypeEnum.SUBMIT||operateTypeEnum == OperateTypeEnum.SAVE){
ProcessBomDetailDO bomDetailDO = processBomDetailMapper.selectById(updateReqVO.getBomDetailId());
if (ObjectUtil.isNotEmpty(bomDetailDO)){
ProcessBomDO processBomDO = processBomMapper.selectById(bomDetailDO.getBomId());
if (ObjectUtil.isNotEmpty(processBomDO)){
if (processBomDO.getBomStatus()!=7){
throw exception(new ErrorCode(400,"BOM没有审核请先审核BOM"));
}
}
}
}
// 更新
TaskDispatchDO updateObj = BeanUtils.toBean(updateReqVO, TaskDispatchDO.class);
if(!updateObj.canOperate(operateTypeEnum)){

View File

@ -84,3 +84,6 @@ export const getStorageNowMaterialGroupPage = async (params) => {
export const getSupplementPage = async (params) => {
return await request.get({ url: `/heli/material/getSupplementPage`, params })
}
export const getStorageNowMaterialNoPage = async (params) => {
return await request.get({ url: `/heli/material/page-material-group-no`, params })
}

View File

@ -147,6 +147,8 @@ ref="contractUploadRef" :file-list="contractUploadFiles" multiple :action="uplo
<el-card class="hl-card-info" v-if="query.active != 'detailArchive'">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="() => router.back()" size="large" style="margin-left: 5rem"> </el-button>
<el-button v-if="'update,create'.indexOf(query.active) > -1 " @click="submitForm('SAVE')" type="success" size="large"> </el-button>
</template>
<el-row>
<el-col>
@ -166,10 +168,9 @@ ref="contractUploadRef" :file-list="contractUploadFiles" multiple :action="uplo
</el-row>
</el-card>
</el-form>
<div class="hl-footer text-center">
<el-button @click="() => router.back()" size="large"> </el-button>
<el-button v-if="'update,create'.indexOf(query.active) > -1 " @click="submitForm('SAVE')" type="success" size="large"> </el-button>
</div>
<!-- <div class="hl-footer text-center">-->
<!-- -->
<!-- </div>-->
</el-card>
</template>
<script setup lang="ts">

View File

@ -360,6 +360,10 @@
<el-card class="hl-card-info" v-if="active != 'create'">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="goback" size="large" style="margin-left: 5rem"> </el-button>
<el-button v-if="active != 'detail' && formData.deliverStatus == 1" @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="(((active != 'detail' && formData.id) || active == 'deliver') && formData.deliverStatus == 1)" @click="submitForm('DELIVER')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="active == 'detail' && formData.deliverStatus == 2 && formData.id" type="primary" @click="printHandle" :disabled="formLoading" size="large">打印发货单</el-button>
</template>
<el-row>
<el-col>
@ -378,12 +382,9 @@
</el-row>
</el-card>
</el-form>
<div class="hl-footer text-center">
<el-button @click="goback" size="large"> </el-button>
<el-button v-if="active != 'detail' && formData.deliverStatus == 1" @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="(((active != 'detail' && formData.id) || active == 'deliver') && formData.deliverStatus == 1)" @click="submitForm('DELIVER')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="active == 'detail' && formData.deliverStatus == 2 && formData.id" type="primary" @click="printHandle" :disabled="formLoading" size="large">打印发货单</el-button>
</div>
<!-- <div class="hl-footer text-center">-->
<!-- -->
<!-- </div>-->
</el-card>
<ProjectOrderDialog ref="projectOrderDialog" @success="handleSelectedProjectOrder" />
<!-- 打印发货单 - 弹框-->

View File

@ -1,7 +1,7 @@
<template>
<el-card class="hl-card">
<template #header>
<span>零件物料需求计划</span>
<span>零件需求计划</span>
</template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
@ -23,6 +23,9 @@
<el-form-item label="物料需求单号" prop="projectMaterialPlanNo">
<el-input v-model="queryParams.projectMaterialPlanNo" placeholder="请输入物料需求单号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="零件号" prop="blueprintNo">
<el-input v-model="queryParams.blueprintNo" placeholder="请输入零件号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item style="margin-left:30px">
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" /> 搜索
@ -57,17 +60,19 @@
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column fixed label="序号" align="center" type="index" width="60" />
<el-table-column label="工序名称" align="center" prop="procedureName" min-width="180" >
<template #default="scope">
<el-button text type="primary">
{{ scope.row.procedureName }}
</el-button>
</template>
</el-table-column>
<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 label="客户简码" align="center" prop="customerName" min-width="100" />
<!-- <el-table-column label="客户简码" align="center" prop="customerName" min-width="100" />-->
<el-table-column label="零件号" align="center" prop="blueprintNo" min-width="100" />
<el-table-column label="零件名称" align="center" prop="materialName" min-width="180" />
<el-table-column label="工序名称" align="center" prop="procedureName" min-width="180" >
<template #default="scope">
<el-button text type="primary">
{{ scope.row.procedureName }}
</el-button>
</template>
</el-table-column>
<el-table-column label="材质" align="center" prop="compositionName" min-width="120" />
<el-table-column label="数量" align="center" prop="boomAmount" min-width="120" />
<el-table-column min-width="200px" align="center" >
@ -164,7 +169,8 @@ const queryParams = reactive({
createTime: [],
ownerName:undefined,
materialName:undefined,
projectMaterialPlanNo:undefined
projectMaterialPlanNo:undefined,
blueprintNo:undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //

View File

@ -1,5 +1,5 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1200px">
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1200px" @close="cancel">
<el-form
ref="formRef"
:model="formData"

View File

@ -322,6 +322,7 @@ const submitForm = async () => {
//
formLoading.value = true
try {
formData.value.cgOrderIdId=detailId.value
const data = formData.value as unknown as InvoiceApi.InvoiceVO
let dataId = await InvoiceApi.operateInvoice(data)
@ -430,6 +431,7 @@ const refreshAttachments = (files) => {
for (let i = 0; i < files.length; i++) {
let file = files[i]
file.createTime = new Date()
console.log(file)
formData.value.attachments.push(file)
}
//

View File

@ -1,11 +1,12 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1200px">
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1200px" @close="cancel">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="160px"
v-loading="formLoading"
>
<el-row>
@ -388,11 +389,34 @@ const submitForm = async () => {
message.error('付款类型跟订单不一致,不允许添加')
return false
}
}
if (formData.value.cgYishou>=formData.value.cgYs){
message.error('已收金额大于应收金额,请确认')
if (formData.value.orderYsDetails[i].cgType==1&&formData.value.orderYsDetails[i].cgYishou>formData.value.shouFuKuan){
message.error('首付款回款金额'+formData.value.orderYsDetails[i].cgYishou+">首付款应收金额"+formData.value.shouFuKuan+",请确认");
return false
}
if (formData.value.orderYsDetails[i].cgType==2&&formData.value.orderYsDetails[i].cgYishou>formData.value.twoFuKuan){
message.error('第二笔款回款金额'+formData.value.orderYsDetails[i].cgYishou+">第二笔款应收金额"+formData.value.twoFuKuan+",请确认")
return false
}
if (formData.value.orderYsDetails[i].cgType==3&&formData.value.orderYsDetails[i].cgYishou>formData.value.threeFuKuan){
message.error('第三笔款回款金额'+formData.value.orderYsDetails[i].cgYishou+">第三笔款应收金额"+formData.value.threeFuKuan+",请确认")
return false
}
if (formData.value.orderYsDetails[i].cgType==4&&formData.value.orderYsDetails[i].cgYishou>formData.value.fourFuKuan){
message.error('第四笔款回款金额'+formData.value.orderYsDetails[i].cgYishou+">第四笔款应收金额"+formData.value.fourFuKuan+",请确认")
return false
}
if (formData.value.orderYsDetails[i].cgType==5&&formData.value.orderYsDetails[i].cgYishou>formData.value.fiveFuKuan){
message.error('第五笔款回款金额'+formData.value.orderYsDetails[i].cgYishou+">第五笔款应收金额"+formData.value.fiveFuKuan+",请确认")
return false
}
if (formData.value.orderYsDetails[i].cgType==6&&formData.value.orderYsDetails[i].cgYishou>formData.value.sixFuKuan){
message.error('第六笔款回款金额'+formData.value.orderYsDetails[i].cgYishou+">第六笔款应收金额"+formData.value.sixFuKuan+",请确认")
return false
}
}
if (formData.value.cgYishou!=''&&formData.value.cgYishou!=undefined&&formData.value.cgYishou!=null){
if (formData.value.cgYishou<formData.value.cgYs&&formData.value.cgTypee==1){
await message.confirm("已收金额小于应收金额,回款未全部完成,请确认")

View File

@ -324,7 +324,7 @@ const submitForm = async () => {
//
formLoading.value = true
try {
console.log(formData.value)
formData.value.cgOrderIdId=detailId.value
const data = formData.value as unknown as InvoiceApi.InvoiceVO
let dataId = await InvoiceApi.operateInvoice(data)
@ -382,8 +382,7 @@ const handleAvatarSuccess: UploadProps['onSuccess'] = async (
// formData.value.attachments = (await getFilePage(attParams)).list
// await reload()
// formData.value.attachments=[]
console.log(111)
console.log(formData.value.attachments)
uploading.value = false;
}
@ -438,6 +437,7 @@ const refreshAttachments = (files) => {
for (let i = 0; i < files.length; i++) {
let file = files[i]
file.createTime = new Date()
console.log(file)
formData.value.attachments.push(file)
}
//

View File

@ -281,8 +281,9 @@ const tableRowClassName = ({ row }) => {
// endTime currentTime
endTime.setHours(0, 0, 0, 0);
currentTime.setHours(0, 0, 0, 0);
console.log(endTime)
console.log(currentTime)
if (endTime < currentTime){
console.log(1)
return 'warning-row1';
}else {
return ''

View File

@ -147,12 +147,14 @@ import purchaseorderDialog from '@/views/heli/outsourcestock/purchaseorderDialog
import { useTagsViewStore } from '@/store/modules/tagsView'
import supplierDialog from '@/views/heli/purchaseorder/supplierDialog.vue'
import * as OutsourceStockApi from '@/api/heli/outsourcestock'
import {useUserStore} from "@/store/modules/user";
const { t } = useI18n() //
const message = useMessage() //
const router = useRouter()
const tagsViewStore = useTagsViewStore()
const userStore = useUserStore()
const username = userStore.getUser.nickname
const currentTag = router.currentRoute.value
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
@ -169,7 +171,7 @@ const formData = ref({
autoStockIn: undefined,
autoStockOut: undefined,
deliver: undefined,
receiver: undefined,
receiver: username,
arrivalDate: undefined,
inspectionDate: undefined,
remark: undefined,
@ -210,6 +212,7 @@ const handleSelectedProjectPurchaseorder = (arr) => {
formData.value.supplierName = arr.supplierName
formData.value.supplierId = arr.supplierId
formData.value.goodsType = arr.goodsType
formData.value.deliver=arr.submitUserName
setAutomaticWarehousing()
}
}

View File

@ -128,7 +128,7 @@ const queryParams = reactive({
taxRatio: undefined,
estimatedPrice: undefined,
actualPrice: undefined,
status: undefined,
status: 2,
receivingStatus: undefined,
submitUserId: undefined,
submitTime: [],

View File

@ -29,6 +29,9 @@
<el-form-item label="物料需求单号" prop="projectMaterialPlanNo">
<el-input v-model="queryParams.projectMaterialPlanNo" placeholder="请输入物料需求单号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="零件号" prop="blueprintNo">
<el-input v-model="queryParams.blueprintNo" placeholder="请输入零件号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item style="margin-left:30px">
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" /> 搜索
@ -62,14 +65,8 @@
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column fixed label="序号" align="center" type="index" width="60" />
<el-table-column label="工序" align="center" prop="procedureName" min-width="100" fixed>
<template #default="scope">
<el-button text type="primary">
{{ scope.row.procedureName }}
</el-button>
</template>
</el-table-column>
<el-table-column label="客户简称" align="center" prop="brief" min-width="180" fixed />
<!-- <el-table-column label="客户简称" align="center" prop="brief" min-width="180" fixed />-->
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" fixed />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" />
<el-table-column label="泡沫" align="center" prop="isFoams">
@ -86,8 +83,15 @@
</template>
</el-table-column>
<el-table-column label="零件名称" align="center" prop="matName" min-width="180" />
<el-table-column label="工序" align="center" prop="procedureName" min-width="100" >
<template #default="scope">
<el-button text type="primary">
{{ scope.row.procedureName }}
</el-button>
</template>
</el-table-column>
<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="unit" min-width="120">
<template #default="scope">
@ -210,7 +214,8 @@ const queryParams = reactive({
materialName:undefined,
matName:undefined,
projectMaterialPlanNo:undefined,
matType:1
matType:1,
blueprintNo:undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //

View File

@ -477,6 +477,7 @@ disabled style="width: 100%;" v-model="row.endDate" type="date" value-format="x"
<el-card class="hl-card-info" v-if="false">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="() => router.back()" size="large" style="margin-left: 5rem"> </el-button>
</template>
<el-row>
<el-col>
@ -495,9 +496,9 @@ disabled style="width: 100%;" v-model="row.endDate" type="date" value-format="x"
</el-row>
</el-card>
</el-form>
<div class="hl-footer text-center">
<el-button @click="() => router.back()" size="large"> </el-button>
</div>
<!-- <div class="hl-footer text-center">-->
<!-- -->
<!-- </div>-->
</el-card>
<ProjectOrderDialog ref="projectOrderDialog" @success="handleSelectedProjectOrder" />
<printDialog ref="printref" :minAmount="minAmount" :formData="formData" />

View File

@ -596,6 +596,8 @@ v-for="dict in mergedArray7" :key="dict.id"
<el-card class="hl-card-info" v-if="false">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="() => router.back()" size="large" style="margin-left: 5rem"> </el-button>
<el-button @click="submitForm" type="success" size="large"> </el-button>
</template>
<el-row>
<el-col>
@ -614,10 +616,9 @@ v-for="dict in mergedArray7" :key="dict.id"
</el-row>
</el-card>
</el-form>
<div class="hl-footer text-center">
<el-button @click="() => router.back()" size="large"> </el-button>
<el-button @click="submitForm" type="success" size="large"> </el-button>
</div>
<!-- <div class="hl-footer text-center">-->
<!-- -->
<!-- </div>-->
</el-card>
<ProjectOrderDialog ref="projectOrderDialog" @success="handleSelectedProjectOrder" />
<ProjectSubDialog :title="dialogTitle" width="80%" v-model="dialogVisible" :parent-method="parentMethod" :parent-methods="clouse" :projectOrderSubs="dataList" :ownerId="ownerId" :dateOne="dateOne" :dateTwo="dateTwo" :id="id" :diffDays="diffDays" :typeNames="typeNames" @update="handleUpdate" :showCloseProp="false" center /><!-- :ownerId="ownerId" :dateOne="dateOne" :dateTwo="dateTwo" :id="id" :diffDays="diffDays" :typeNames="typeNames" -->

View File

@ -54,14 +54,8 @@
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column fixed label="计划单号" align="center" prop="planNo" width="150">
<template #default="scope">
<el-button text type="primary" @click="handleCommand('detail',scope.row.id)">
{{scope.row.planNo}}
</el-button>
</template>
</el-table-column>
<!-- <el-table-column fixed label="项目编号" align="center" prop="projectCode" width="220" /> -->
<el-table-column fixed label="项目编号" align="center" prop="projectCode" width="220" />
<el-table-column fixed label="项目变更次数" align="center" prop="changeNum" width="150" />
<el-table-column label="客户名称" align="center" prop="customerName" width="150" />
<el-table-column label="项目名称" align="center" prop="projectName" width="150" />
@ -126,7 +120,13 @@
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="计划单号" align="center" prop="planNo" width="150">
<template #default="scope">
<el-button text type="primary" @click="handleCommand('detail',scope.row.id)">
{{scope.row.planNo}}
</el-button>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="190">
<template #default="scope">
<el-row>
@ -266,7 +266,7 @@ const complete=async(id:number)=>{
cancelButtonText: '否',
confirmButtonText: '是',
type: 'warning',
}
}
).then(async () => {
const data =await PlanApi.complete(id)
if (data){

View File

@ -246,6 +246,10 @@
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="() => router.back()" size="large" style="margin-left: 5rem"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SAVE')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SUBMIT')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 2" @click="submitForm('CANCEL_SUBMIT')" type="danger" :disabled="formLoading" size="large">取消提交</el-button>
</template>
<el-row>
<el-col>
@ -264,12 +268,9 @@
</el-row>
</el-card>
</el-form>
<div class="hl-footer text-center">
<el-button @click="() => router.back()" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SAVE')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SUBMIT')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 2" @click="submitForm('CANCEL_SUBMIT')" type="danger" :disabled="formLoading" size="large">取消提交</el-button>
</div>
<!-- <div class="hl-footer text-center">-->
<!-- -->
<!-- </div>-->
</el-card>
</template>
<script setup lang="ts">

View File

@ -323,6 +323,19 @@
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="goback" size="large" style="margin-left: 5rem"> </el-button>
<el-button
v-if="active != 'detail' && active != 'shenhe' && formData.bomStatus == 1 || active == 'update'"
@click="submitForm('SAVE')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button
v-if="active != 'detail' && active != 'shenhe' && formData.bomStatus == 1 || active == 'update'"
@click="submitForm('SUBMIT')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button
v-if="active != 'detail' && active != 'shenhe' && formData.bomStatus == 2"
@click="submitForm('CANCEL_SUBMIT')" type="danger" :disabled="formLoading" size="large">取消提交</el-button>
<el-button
v-if="active != 'detail' && active == 'shenhe'" @click="submitForm('AUDIT')" type="success"
:disabled="formLoading" size="large">审核</el-button>
</template>
<el-row>
<el-col>
@ -342,22 +355,10 @@
</el-col>
</el-row>
<div class="hl-footer text-center">
<el-button @click="goback" size="large"> </el-button>
<el-button
v-if="active != 'detail' && active != 'shenhe' && formData.bomStatus == 1 || active == 'update'"
@click="submitForm('SAVE')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button
v-if="active != 'detail' && active != 'shenhe' && formData.bomStatus == 1 || active == 'update'"
@click="submitForm('SUBMIT')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button
v-if="active != 'detail' && active != 'shenhe' && formData.bomStatus == 2"
@click="submitForm('CANCEL_SUBMIT')" type="danger" :disabled="formLoading" size="large">取消提交</el-button>
<el-button
v-if="active != 'detail' && active == 'shenhe'" @click="submitForm('AUDIT')" type="success"
:disabled="formLoading" size="large">审核</el-button>
<!-- <div class="hl-footer text-center">-->
</div>
<!-- </div>-->
</el-card>
</el-form>
</el-card>

View File

@ -753,9 +753,40 @@ v-if="!!scope.row.id" link type="primary" size="small"
</el-col>
</el-row>
</el-card>
<!-- <div class="hl-footer text-center">-->
<!-- -->
<!-- </div>-->
<el-card class="hl-card-info" v-if="query.active != 'detailArchive'">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="() => router.back()" size="large" style="margin-left: 5rem;"> </el-button>
<el-button
v-if="'update,create'.indexOf(query.active) > -1 && formData.orderStatus <= 4"
@click="submitForm('SAVE')" type="success" size="large" :disabled="saveDisabled"> </el-button>
<el-button
v-if="'price'.indexOf(query.active) > -1"
@click="submitForm('PRICE')" type="success" size="large"> </el-button>
<el-button
v-if="'update,create'.indexOf(query.active) > -1 && formData.orderStatus < 8"
@click="submitForm('SUBMIT_AUDIT')" type="primary" size="large" :disabled="submitDisabled"> </el-button>
<el-button
v-if="query.active == 'audit' && formData.orderStatus == 8" @click="submitForm('AUDIT')"
type="primary" size="large"> </el-button>
<el-button
v-if="query.active == 'approve' && formData.orderStatus == 16" @click="submitForm('APPROVE')"
type="primary" size="large"> </el-button>
<el-button
v-if="query.active == 'alter' && formData.orderStatus == 32" @click="submitForm('ALTER')"
type="danger" size="large">发起变更</el-button>
<el-button
v-if="
'audit,approve'.indexOf(query.active) > -1 &&
(formData.orderStatus == 8 || formData.orderStatus == 16)
" @click="activeOpinionDialogVisible = true" type="danger" size="large"> </el-button>
<el-button
v-if="query.active == 'terminate' && formData.orderStatus == 32" @click="submitForm('TERMINATE')"
type="danger" size="large">直接终止</el-button>
</template>
<el-row>
<el-col>
@ -779,35 +810,7 @@ label="操作时间" align="center" prop="startTime" width="220"
</el-row>
</el-card>
</el-form>
<div class="hl-footer text-center">
<el-button @click="() => router.back()" size="large"> </el-button>
<el-button
v-if="'update,create'.indexOf(query.active) > -1 && formData.orderStatus <= 4"
@click="submitForm('SAVE')" type="success" size="large" :disabled="saveDisabled"> </el-button>
<el-button
v-if="'price'.indexOf(query.active) > -1"
@click="submitForm('PRICE')" type="success" size="large"> </el-button>
<el-button
v-if="'update,create'.indexOf(query.active) > -1 && formData.orderStatus < 8"
@click="submitForm('SUBMIT_AUDIT')" type="primary" size="large" :disabled="submitDisabled"> </el-button>
<el-button
v-if="query.active == 'audit' && formData.orderStatus == 8" @click="submitForm('AUDIT')"
type="primary" size="large"> </el-button>
<el-button
v-if="query.active == 'approve' && formData.orderStatus == 16" @click="submitForm('APPROVE')"
type="primary" size="large"> </el-button>
<el-button
v-if="query.active == 'alter' && formData.orderStatus == 32" @click="submitForm('ALTER')"
type="danger" size="large">发起变更</el-button>
<el-button
v-if="
'audit,approve'.indexOf(query.active) > -1 &&
(formData.orderStatus == 8 || formData.orderStatus == 16)
" @click="activeOpinionDialogVisible = true" type="danger" size="large"> </el-button>
<el-button
v-if="query.active == 'terminate' && formData.orderStatus == 32" @click="submitForm('TERMINATE')"
type="danger" size="large">直接终止</el-button>
</div>
</el-card>
<el-dialog v-model="activeOpinionDialogVisible" title="打回原因" width="30%" center>
@ -2007,4 +2010,5 @@ type="textarea" v-model="formData.activeOpinion" placeholder="请输入打回原
background: transparent;
border: 3px solid orange !important;
}
</style>

View File

@ -362,6 +362,7 @@ link type="primary" size="small" :disabled="ctrView || ctrDelete"
</el-card>
<!-- 表单弹窗物料列表 -->
<materials ref="matOpenFormRef" @success="getList" />
<materials1 ref="matOpenFormRef1" @success="getList1" />
<!-- 表单弹窗物料列表 -->
<projects ref="proOpenFormRef" @success="getProject" />
<purchaseorderDialog ref="projectPurchaseorderDialog" @success="handleSelectedProjectPurchaseorder" />
@ -480,6 +481,7 @@ import { deleteFile, downloadFile, getFilePage } from '@/api/infra/file'
import download from '@/utils/download'
import * as UserApi from '@/api/system/user'
import materials from './materialsin.vue'
import materials1 from './materialsin1.vue'
import projects from './subproject.vue'
import {Search} from "@element-plus/icons-vue";
import purchaseorderDialog from '@/views/heli/outsourcestock/purchaseorderDialog.vue'
@ -542,6 +544,7 @@ const queryParams = reactive({
})
const matOpenFormRef = ref()
const proOpenFormRef = ref()
const matOpenFormRef1 = ref()
const openMatForm = () => {
// if (formData.value.whId == undefined || formData.value.whId == '') {
@ -549,7 +552,12 @@ const openMatForm = () => {
// return
// }
// formData.value.whId
matOpenFormRef.value.open(formData.value.whId,'in')
console.log(formData.value.headerId)
if (formData.value.stockInType==1&&formData.value.headerNo!=null&&formData.value.headerNo!=undefined&&formData.value.headerNo!=''){
matOpenFormRef1.value.open(formData.value.whId,'in',formData.value.headerId)
}else {
matOpenFormRef.value.open(formData.value.whId,'in')
}
}
// const isPrint = async () => {
// var newVar = await StorageApi.isPrint(query.id);
@ -769,7 +777,64 @@ const getList = async (arrMat) => {
}
}
const getList1 = async (arrMat) => {
let flag=true
let whName=''
for (let i = 0; i < whList.value.length; i++) {
if (whList.value[i].id==formData.value.whId){
whName=whList.value[i].whName
break;
}
}
queryParams.whId=formData.value.whId;
console.log(formData.value.matItemDOList)
console.log(arrMat)
for (const row of arrMat) {
if (
formData.value.matItemDOList.filter(
(item) =>
item.matId == row.id
).length == 0
) {
row.matId = row.id
// if (rgList.value.length==1){
// row.rgId =rgList.value[0].id
// }else {
// row.rgId =''
// }
queryParams.materialId=row.matId;
var newVar = await storageInventoryApi.getById(queryParams);
if (newVar){
row.rgId = newVar.rgId;
row.pnId = newVar.pnId;
}else {
formData.value.rgId = '';
formData.value.pnId = '';
}
row.pnlist = ref([])
row.pnlist = pnList.value.filter((pn) => pn.rg_id == row.rgId)
// if (row.pnlist.length == 1) {
// row.pnId = row.pnlist[0].id
// }else
if (pnList.value.length == 0) {
flag=false
}
row.price=row.unitPrice
row.storageOkQty=row.purchaseRemAmount
row.purchaseOrderNoId=row.purchaseOrderNoId
row.purchaseOrderNoDetailId=row.purchaseOrderNoDetailId
if (flag){
formData.value.matItemDOList.push(row)
}
}
}
if (!flag){
message.error("该"+whName+"没有配置入库库位,请确认!")
}
}
const getProject = async (pro,scope) => {
formData.value.matItemDOList.forEach(
(item) =>{
@ -908,7 +973,7 @@ const failedAttachments = ref<UploadUserFile[]>([])
const failedAttachmentsName = ref()
const openProjectPurchaseorderDialog = () => {
projectPurchaseorderDialog.value?.open()
projectPurchaseorderDialog.value?.open()
}
const refreshAttachments = (files, type) => {
formData.value.attachments = formData.value.attachments.filter((value) => value.id)

View File

@ -0,0 +1,235 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="80%">
<ContentWrap class="borderxx">
<el-form class="-mb-15px" :model="queryReqVo" :inline="true" label-width="108px">
<el-form-item label=" 物料编码:" label-width="150px">
<el-input v-model="queryReqVo.matCode" placeholder="物料编码" class="!w-240px" :disabled="!chkboxEnable" />
</el-form-item>
<el-form-item label=" 物料名称:" label-width="150px">
<el-input v-model="queryReqVo.matName" placeholder="物料名称" class="!w-240px" :disabled="!chkboxEnable" />
</el-form-item>
<el-form-item label="规格/型号">
<el-input v-model="queryReqVo.matSpec" placeholder="规格/型号" class="!w-240px" :disabled="!chkboxEnable" />
</el-form-item>
<el-form-item>
<el-button @click="handleQuery" type="primary" :disabled="!chkboxEnable">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button><el-button @click="resetQuery" :disabled="!chkboxEnable">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<el-card class="hl-table">
<el-table ref="multipleTable" :data="list" v-loading="formLoading" class="hl-table" @selection-change="handleSelectionChange" :row-key="getRowKeys" @row-click="clickRow" :selection="true" :reserve-selection="true" min-width="1800" >
<el-table-column type="selection" width="55" :reserve-selection="true" :selectable="row=>chkboxEnable" />
<!-- <el-table-column prop="no" label="序号" min-width="120" align="center" /> -->
<el-table-column label="序号" type="index" min-width="120" align="center" />
<el-table-column prop="matCode" label="物料编码" min-width="120" align="center" />
<el-table-column prop="matName" label="物料名称" min-width="140" align="center" />
<el-table-column prop="matType" label="物料类型" min-width="120" align="center" />
<el-table-column prop="matSpec" label="规格/型号" min-width="120" align="center" />
<el-table-column prop="purchaseAmount" label="采购数量" min-width="120" align="center" />
<el-table-column prop="purchaseRemAmount" label="剩余数量" min-width="120" align="center" />
<el-table-column prop="estimatedPrice" label="预估总价(元)" min-width="150" align="center" />
<!-- <el-table-column prop="rgName" label="库区" min-width="120" align="center" v-if="formType !='in'">-->
<!-- <template #default="scope">-->
<!-- {{scope.row.num>1&&formType=='group'? '':scope.row.rgName}}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column prop="pnName" label="库位" min-width="140" align="center" v-if="formType !='in'">-->
<!-- <template #default="scope">-->
<!-- {{scope.row.num>1&&formType=='group'? '':scope.row.pnName}}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column prop="storageOkQty" label="库存数量" min-width="120" align="center" v-if="formType=='out'"/>
<el-table-column prop="matRest" label="库存数量" min-width="120" align="center" v-if="formType!='out'"/>
<el-table-column prop="matUnit" label="库存单位" min-width="120" align="center" />
<el-table-column prop="shortName" label="物料简称" min-width="120" align="center" />
<el-table-column prop="matBrand" label="品牌" min-width="120" align="center" />
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryReqVo.pageNo" v-model:limit="queryReqVo.pageSize" @pagination="getList()" />
</el-card>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import * as StorageLogApi from '@/api/heli/storagelog'
import * as MaterialApi from '@/api/heli/material'
import * as ProcessBomApi from '@/api/heli/processbom'
import { ElTable } from 'element-plus'
import {getStorageNowMaterialNoPage} from "@/api/heli/material";
//:selectable="row=>row.disabled || chkboxEnable"
const chkboxEnable = ref(true)
const queryEnable = ref(true)
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const list = ref([]) //
const total = ref(0) //
const multipleTable = ref<InstanceType<typeof ElTable>>()
const multipleSelection = ref([])
const handleSelectionChange = (val: []) => {
multipleSelection.value = val
}
const clickRow = (row: any) => {
if (chkboxEnable.value) {
if (row) {
multipleTable.value!.toggleRowSelection(row, undefined)
} else {
multipleTable.value!.clearSelection()
}
}
}
//key,
const getRowKeys = (row) => {
return row.id
}
const queryReqVo: any = reactive({
pageNo: 1,
pageSize: 10,
whId: undefined,
matCode: undefined,
matSpec: undefined,
headerId:undefined,
})
/** 搜索按钮操作 */
const handleQuery = async () => {
queryReqVo.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryReqVo.matCode = ''
queryReqVo.matSpec = ''
queryReqVo.matName = ''
queryReqVo.headerId=''
handleQuery()
}
const getList = async () => {
formLoading.value = true
var data;
var dataone;
try {
if(formType.value == 'out'){
data = await StorageLogApi.getStorageNowAllPage(queryReqVo)
}else if(formType.value == 'in'){
// data = await StorageLogApi.getStorageNowMaterialGroupPage(queryReqVo)
data = await MaterialApi.getStorageNowMaterialNoPage(queryReqVo)
}else if(formType.value == 'group'){
data = await StorageLogApi.getStorageNowMaterialGroupPage(queryReqVo)
data.list.forEach(mat =>{
mat.storageOkQty = mat.matRest
mat.requireAmount = mat.matRest
})
}else if(formType.value == 'bomfind'){
dataone = await ProcessBomApi.getProcessBomDetailListByBomIdbyid(queryReqVo.whId.projectNo)
dataone = dataone.filter(item => item.whId === queryReqVo.whId.whId);
// datatow
}
if(dataone){
list.value = dataone.map(item => ({
...item,
matCode: item.materialCode,
matName: item.materialName,
matSpec:item.spec,
storageOkQty:item.amount,
matUnit:item.unit,/// aa
matType: item.type == 1 ? '标准件' : item.type == 2 ? '其他' : item.type,
rgId:item.rgId,
pnId:item.pnId,
rgName:item.rgName,
pnName:item.pnName,
whId1:item.whId,
matId:item.id,
materialId:item.id
}))
total.value = dataone.length
}
if(data){
list.value = data.list
total.value = data.total
}
//list.value = data.splice((queryReqVo.pageNo - 1) * queryReqVo.pageSize, queryReqVo.pageSize)
} finally {
formLoading.value = false
}
}
const formType = ref()
/** 打开弹窗 */
const open = async (whId: number,type:string,headerId:number) => {
multipleSelection.value = []
dialogVisible.value = true
dialogTitle.value = '物料列表'
list.value=[]
formType.value = type
//
queryReqVo.whId = whId
queryReqVo.matCode = ''
queryReqVo.matSpec = ''
queryReqVo.headerId=headerId
getList()
chkboxEnable.value = true
list.value.forEach((row) => {
setTimeout(() => {
multipleTable.value.toggleRowSelection(row, !chkboxEnable.value) //
}, 0)
})
try {
//
} finally {
formLoading.value = false
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
formLoading.value = true
try {
dialogVisible.value = false
multipleSelection.value.forEach((item) => {
if (item.amount) {
item.matRest = item.amount;
} else {
item.matRest = item.storageOkQty;
}
if(item.whId1){
item.matId = item.materialId
}else{
item.matId = item.id
}
item.storageOkQty = ''
item.whId= item.whId??''
item.rgId= item.rgId??''
item.pnId= item.pnId??''
})
console.log(multipleSelection.value)
//
emit('success', multipleSelection.value)
} finally {
formLoading.value = false
}
}
</script>

View File

@ -412,6 +412,19 @@ v-if="'detail' != active && (scope.row.beginProduce == 0 && scope.row.procedureS
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="goback" size="large"> </el-button>
<el-button
v-if="active != 'detail' && formData.dispatchStatus == 1" @click="submitForm('SAVE')" type="primary"
:disabled="formLoading" size="large"> </el-button>
<el-button
v-if="active != 'detail' && formData.dispatchStatus == 1" @click="submitForm('SUBMIT')" type="success"
:disabled="formLoading" size="large"> </el-button>
<el-button
v-if="active != 'detail' && formData.dispatchStatus == 2" @click="submitForm('CANCEL_SUBMIT')"
type="danger" :disabled="formLoading" size="large">取消提交</el-button>
<el-button
v-if="formData.dispatchStatus == 2" @click="printHandle(formData.id)" :disabled="formLoading"
size="large" type="primary">打印流程卡</el-button>
</template>
<el-row>
<el-col>
@ -432,21 +445,9 @@ v-if="'detail' != active && (scope.row.beginProduce == 0 && scope.row.procedureS
</el-row>
</el-card>
</el-form>
<div class="hl-footer text-center">
<el-button @click="goback" size="large"> </el-button>
<el-button
v-if="active != 'detail' && formData.dispatchStatus == 1" @click="submitForm('SAVE')" type="primary"
:disabled="formLoading" size="large"> </el-button>
<el-button
v-if="active != 'detail' && formData.dispatchStatus == 1" @click="submitForm('SUBMIT')" type="success"
:disabled="formLoading" size="large"> </el-button>
<el-button
v-if="active != 'detail' && formData.dispatchStatus == 2" @click="submitForm('CANCEL_SUBMIT')"
type="danger" :disabled="formLoading" size="large">取消提交</el-button>
<el-button
v-if="formData.dispatchStatus == 2" @click="printHandle(formData.id)" :disabled="formLoading"
size="large" type="primary">打印流程卡</el-button>
</div>
<!-- <div class="hl-footer text-center">-->
<!-- -->
<!-- </div>-->
<div>
<!-- 排产弹框 -->
<el-dialog v-model="dialogTableVisible" title="dialogTitle" width="1000">