添加批量审批
This commit is contained in:
parent
ee32488786
commit
c114c17a99
@ -269,6 +269,20 @@ public class ProcessBomController {
|
|||||||
public CommonResult<Boolean> withdraw(@RequestParam("code") String code) {
|
public CommonResult<Boolean> withdraw(@RequestParam("code") String code) {
|
||||||
return processBomService.withdraw(code);
|
return processBomService.withdraw(code);
|
||||||
}
|
}
|
||||||
|
@GetMapping("/updateById")
|
||||||
|
@Operation(summary = "修改生产任务单")
|
||||||
|
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||||
|
@PreAuthorize("@ss.hasPermission('heli:process-bom:query')")
|
||||||
|
public CommonResult<Boolean> updateById(@RequestParam("code") String code) {
|
||||||
|
return processBomService.updateById(code);
|
||||||
|
}
|
||||||
|
@GetMapping("/selectPlanTaskStatus")
|
||||||
|
@Operation(summary = "查看生产任务单状态")
|
||||||
|
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||||
|
@PreAuthorize("@ss.hasPermission('heli:process-bom:query')")
|
||||||
|
public CommonResult<Boolean> selectPlanTaskStatus(@RequestParam("id") String id) {
|
||||||
|
return processBomService.selectPlanTaskStatus(id);
|
||||||
|
}
|
||||||
@GetMapping("/exportStandard")
|
@GetMapping("/exportStandard")
|
||||||
@Operation(summary = "导出标准件物料需求计划Excel")
|
@Operation(summary = "导出标准件物料需求计划Excel")
|
||||||
@OperateLog(type = EXPORT)
|
@OperateLog(type = EXPORT)
|
||||||
|
@ -171,9 +171,9 @@ public class PurchaseOrderMakeController {
|
|||||||
public CommonResult<Boolean> rejects(@RequestParam("id") Long id) {
|
public CommonResult<Boolean> rejects(@RequestParam("id") Long id) {
|
||||||
return success(partPurchaseOrderService.rejects(id));
|
return success(partPurchaseOrderService.rejects(id));
|
||||||
}
|
}
|
||||||
@GetMapping("/approvals")
|
@PostMapping("/approvals")
|
||||||
@Operation(summary = "采购单批准")
|
@Operation(summary = "采购单批准")
|
||||||
public CommonResult<Boolean> approvals(@RequestParam("id") Long id) {
|
public CommonResult<Boolean> approvals(@Valid @RequestBody List<PurchaseOrderMakeDetailDO> list) {
|
||||||
return success(partPurchaseOrderService.approvals(id));
|
return success(partPurchaseOrderService.approvals(list));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,15 +139,19 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
|
|||||||
// 校验存在
|
// 校验存在
|
||||||
DeliverOrderDO oldDO = validateDeliverOrderExists(updateReqVO.getId());
|
DeliverOrderDO oldDO = validateDeliverOrderExists(updateReqVO.getId());
|
||||||
OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(updateReqVO.getActive());
|
OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(updateReqVO.getActive());
|
||||||
if(!oldDO.canOperate(operateTypeEnum)){
|
// if(!oldDO.canOperate(operateTypeEnum)){
|
||||||
throw exception(INVALID_OPERATE);
|
// throw exception(INVALID_OPERATE);
|
||||||
}
|
// }
|
||||||
// 超额校验
|
|
||||||
overageDeliverValidate(updateReqVO.getSaleOrderIds(), updateReqVO.getDeliverOrderSubs());
|
|
||||||
|
|
||||||
// 更新
|
// 更新
|
||||||
DeliverOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliverOrderDO.class);
|
DeliverOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliverOrderDO.class);
|
||||||
updateObj.setDeliverStatus(DeliverOrderStatusEnum.valueOf(updateReqVO.getActive()).getCode());
|
updateObj.setDeliverStatus(DeliverOrderStatusEnum.valueOf(updateReqVO.getActive()).getCode());
|
||||||
|
if (oldDO.getDeliverStatus()==2){
|
||||||
|
updateObj.setDeliverStatus(2);
|
||||||
|
}else {
|
||||||
|
// 超额校验
|
||||||
|
overageDeliverValidate(updateReqVO.getSaleOrderIds(), updateReqVO.getDeliverOrderSubs());
|
||||||
|
}
|
||||||
deliverOrderMapper.updateById(updateObj);
|
deliverOrderMapper.updateById(updateObj);
|
||||||
updateReqVO.setDeliverStatus(updateObj.getDeliverStatus());
|
updateReqVO.setDeliverStatus(updateObj.getDeliverStatus());
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.Pa
|
|||||||
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO;
|
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO;
|
||||||
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.purchaseordermake.PurchaseOrderMakeDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermake.PurchaseOrderMakeDO;
|
||||||
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermakedetail.PurchaseOrderMakeDetailDO;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -68,7 +69,7 @@ public interface PartPurchaseOrderService {
|
|||||||
|
|
||||||
Long countReview();
|
Long countReview();
|
||||||
|
|
||||||
Boolean approvals(Long id);
|
Boolean approvals(List<PurchaseOrderMakeDetailDO> list);
|
||||||
|
|
||||||
Boolean rejects(Long id);
|
Boolean rejects(Long id);
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail
|
|||||||
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.plan.PlanDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
|
||||||
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermake.PurchaseOrderMakeDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermake.PurchaseOrderMakeDO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermakedetail.PurchaseOrderMakeDetailDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermakedetail.PurchaseOrderMakeDetailDO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO;
|
||||||
@ -29,6 +30,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
|
|||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanBoomMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanBoomMapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper;
|
||||||
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermake.PurchaseOrderMakeMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermake.PurchaseOrderMakeMapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermakedetail.PurchaseOrderMakeDetailMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermakedetail.PurchaseOrderMakeDetailMapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorderno.PurchaseOrderNoMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorderno.PurchaseOrderNoMapper;
|
||||||
@ -50,10 +52,8 @@ 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.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Date;
|
import java.util.stream.Collectors;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
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.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
|
import static com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
|
||||||
@ -84,6 +84,8 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
|
|||||||
private OrderYfService orderYfService;
|
private OrderYfService orderYfService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private SupplierMapper supplierMapper;
|
private SupplierMapper supplierMapper;
|
||||||
|
@Autowired
|
||||||
|
private ProcessBomDetailMapper processBomDetailMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<PartPurchaseOrderPageRespVO> getPartPurchaseOrderPage(PartPurchaseOrderPageReqVO pageReqVO) {
|
public PageResult<PartPurchaseOrderPageRespVO> getPartPurchaseOrderPage(PartPurchaseOrderPageReqVO pageReqVO) {
|
||||||
@ -190,16 +192,41 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean updatePartCheckStatusNo(PurchaseOrderMakeSaveReqVO updateReqVO) {
|
public boolean updatePartCheckStatusNo(PurchaseOrderMakeSaveReqVO updateReqVO) {
|
||||||
PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
|
// PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
|
||||||
purchaseOrderMakeDO.setId(updateReqVO.getId());
|
// purchaseOrderMakeDO.setId(updateReqVO.getId());
|
||||||
purchaseOrderMakeDO.setStatus(3);
|
// purchaseOrderMakeDO.setStatus(3);
|
||||||
purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO);
|
// purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO);
|
||||||
purchaseOrderMakeMapper.deleteById(purchaseOrderMakeDO);
|
// purchaseOrderMakeMapper.deleteById(purchaseOrderMakeDO);
|
||||||
|
//
|
||||||
LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaUpdateWrapper<>();
|
// LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaUpdateWrapper<>();
|
||||||
wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, updateReqVO.getId());
|
// wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, updateReqVO.getId());
|
||||||
purchaseOrderMakeDetailMapper.delete(wrapper);
|
// purchaseOrderMakeDetailMapper.delete(wrapper);
|
||||||
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_id", updateReqVO.getId());
|
// 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("rej_remark", updateReqVO.getReason());
|
||||||
|
// materialPlanBoomMapper.update(updateWrapper);
|
||||||
|
// });
|
||||||
|
// return true;
|
||||||
|
PurchaseOrderMakeDetailDO orderMakeDetailDO = purchaseOrderMakeDetailMapper.selectById(updateReqVO.getId());
|
||||||
|
if (ObjectUtil.isNotEmpty(orderMakeDetailDO)){
|
||||||
|
if (orderMakeDetailDO.getStatus() != 1) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
|
||||||
|
PurchaseOrderMakeDO orderMakeDO = purchaseOrderMakeMapper.selectById(orderMakeDetailDO.getPurchaseOrderId());
|
||||||
|
purchaseOrderMakeDetailMapper.deleteById(orderMakeDetailDO);
|
||||||
|
if (ObjectUtil.isNotEmpty(orderMakeDO)){
|
||||||
|
LambdaQueryWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, orderMakeDO.getId());
|
||||||
|
if (purchaseOrderMakeDetailMapper.selectCount(wrapper) == 0){
|
||||||
|
purchaseOrderMakeMapper.deleteById(orderMakeDO.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_detail_id", updateReqVO.getId());
|
||||||
materialPlanBoomDOs.forEach(materialPlanBoom -> {
|
materialPlanBoomDOs.forEach(materialPlanBoom -> {
|
||||||
UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>();
|
UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>();
|
||||||
updateWrapper.eq("id", materialPlanBoom.getId())
|
updateWrapper.eq("id", materialPlanBoom.getId())
|
||||||
@ -207,11 +234,14 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
|
|||||||
.set("project_purchase_order_make_id", null)
|
.set("project_purchase_order_make_id", null)
|
||||||
.set("purchase_no", null)
|
.set("purchase_no", null)
|
||||||
.set("project_purchase_order_make_detail_id", null)
|
.set("project_purchase_order_make_detail_id", null)
|
||||||
.set("rej_remark", updateReqVO.getReason());
|
.set("estimated_price", BigDecimal.ZERO)
|
||||||
|
.set("supplier_id", null)
|
||||||
|
.set("rej_remark", updateReqVO.getReason())
|
||||||
|
.set("mat_rest",null);
|
||||||
materialPlanBoomMapper.update(updateWrapper);
|
materialPlanBoomMapper.update(updateWrapper);
|
||||||
});
|
});
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -307,7 +337,20 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
|
|||||||
purchaseOrderMakeMapper.insert(purchaseOrderMakeDO);
|
purchaseOrderMakeMapper.insert(purchaseOrderMakeDO);
|
||||||
long purchaseOrderMakeId = purchaseOrderMakeDO.getId();
|
long purchaseOrderMakeId = purchaseOrderMakeDO.getId();
|
||||||
String purchaseOrderMakeDOPurchaseNo = purchaseOrderMakeDO.getPurchaseNo();
|
String purchaseOrderMakeDOPurchaseNo = purchaseOrderMakeDO.getPurchaseNo();
|
||||||
|
Map<Long, String> groupedResult = updateReqVOs.stream()
|
||||||
|
.collect(Collectors.groupingBy(
|
||||||
|
MaterialPlanBoomDO::getBoomDetailId, // 根据 boomDetailId 分组
|
||||||
|
Collectors.collectingAndThen(
|
||||||
|
Collectors.toList(), // 将同组元素收集为 List
|
||||||
|
list -> list.get(0).getBoomSpec() // 取第一个元素的 boomSpec
|
||||||
|
)
|
||||||
|
));
|
||||||
|
groupedResult.forEach((boomDetailId, boomSpec) -> {
|
||||||
|
LambdaUpdateWrapper<ProcessBomDetailDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
|
||||||
|
lambdaUpdateWrapper.eq(ProcessBomDetailDO::getId,boomDetailId);
|
||||||
|
lambdaUpdateWrapper.set(ProcessBomDetailDO::getSpec, boomSpec);
|
||||||
|
processBomDetailMapper.update(lambdaUpdateWrapper);
|
||||||
|
});
|
||||||
updateReqVOs.forEach(updateReq -> {
|
updateReqVOs.forEach(updateReq -> {
|
||||||
createPurchaseOrderMakeAndDetail(updateReq,purchaseOrderMakeId, purchaseOrderMakeDOPurchaseNo,planDO.getId());
|
createPurchaseOrderMakeAndDetail(updateReq,purchaseOrderMakeId, purchaseOrderMakeDOPurchaseNo,planDO.getId());
|
||||||
});
|
});
|
||||||
@ -357,22 +400,31 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Boolean approvals(Long id) {
|
public Boolean approvals(List<PurchaseOrderMakeDetailDO> list) {
|
||||||
PurchaseOrderMakeDetailDO orderMakeDetailDO = purchaseOrderMakeDetailMapper.selectById(id);
|
if (ObjectUtil.isNotEmpty( list)){
|
||||||
if (ObjectUtil.isNotEmpty(orderMakeDetailDO)){
|
List<Long> ids = list.stream().map(PurchaseOrderMakeDetailDO::getId).collect(Collectors.toList());
|
||||||
if (orderMakeDetailDO.getStatus() != 1) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
|
LambdaQueryWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
orderMakeDetailDO.setStatus(2);
|
wrapper.in(PurchaseOrderMakeDetailDO::getId, ids);
|
||||||
orderMakeDetailDO.setAuditTime(LocalDateTime.now());
|
wrapper.ne(PurchaseOrderMakeDetailDO::getStatus,1);
|
||||||
orderMakeDetailDO.setAuditor(getLoginUser().getId());
|
if (purchaseOrderMakeDetailMapper.selectCount(wrapper) > 0) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
|
||||||
purchaseOrderMakeDetailMapper.updateById(orderMakeDetailDO);
|
LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> updateWrapper = new LambdaUpdateWrapper<>();
|
||||||
|
updateWrapper.in(PurchaseOrderMakeDetailDO::getId, ids);
|
||||||
|
updateWrapper.set(PurchaseOrderMakeDetailDO::getStatus,2);
|
||||||
|
updateWrapper.set(PurchaseOrderMakeDetailDO::getAuditTime, LocalDateTime.now());
|
||||||
|
updateWrapper.set(PurchaseOrderMakeDetailDO::getAuditor, getLoginUser().getId());
|
||||||
|
purchaseOrderMakeDetailMapper.update(updateWrapper);
|
||||||
|
LambdaUpdateWrapper<MaterialPlanBoomDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
|
||||||
|
lambdaUpdateWrapper.in(MaterialPlanBoomDO::getProjectPurchaseOrderMakeDetailId, ids);
|
||||||
|
lambdaUpdateWrapper.set(MaterialPlanBoomDO::getMplanStatus,2);
|
||||||
|
materialPlanBoomMapper.update(lambdaUpdateWrapper);
|
||||||
|
// List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_detail_id", id);
|
||||||
|
// materialPlanBoomDOs.forEach(materialPlanBoomDO -> {
|
||||||
|
// MaterialPlanBoomDO materialPlanBoom = new MaterialPlanBoomDO();
|
||||||
|
// materialPlanBoom.setId(materialPlanBoomDO.getId());
|
||||||
|
// materialPlanBoom.setMplanStatus(2);
|
||||||
|
// materialPlanBoomMapper.updateById(materialPlanBoom);
|
||||||
|
// });
|
||||||
}
|
}
|
||||||
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_detail_id", id);
|
|
||||||
materialPlanBoomDOs.forEach(materialPlanBoomDO -> {
|
|
||||||
MaterialPlanBoomDO materialPlanBoom = new MaterialPlanBoomDO();
|
|
||||||
materialPlanBoom.setId(materialPlanBoomDO.getId());
|
|
||||||
materialPlanBoom.setMplanStatus(2);
|
|
||||||
materialPlanBoomMapper.updateById(materialPlanBoom);
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,4 +116,8 @@ public interface ProcessBomService {
|
|||||||
BigDecimal assemblyLaborCost(Long id, Long projectSubId);
|
BigDecimal assemblyLaborCost(Long id, Long projectSubId);
|
||||||
|
|
||||||
CommonResult<Boolean> delMaterialPlan(Long id, String projectMaterialPlanNo);
|
CommonResult<Boolean> delMaterialPlan(Long id, String projectMaterialPlanNo);
|
||||||
|
|
||||||
|
CommonResult<Boolean> updateById(String code);
|
||||||
|
|
||||||
|
CommonResult<Boolean> selectPlanTaskStatus(String id);
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ 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.excel.core.util.ExcelUtils;
|
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
|
||||||
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
|
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
|
||||||
|
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
|
||||||
import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils;
|
import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomImportExcelVO;
|
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomImportExcelVO;
|
||||||
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomPageReqVO;
|
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomPageReqVO;
|
||||||
@ -29,6 +30,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantask.PlanTaskDO;
|
|||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantaskbom.PlanTaskBomDO;
|
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantaskbom.PlanTaskBomDO;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
|
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.purchaseordernodetail.PurchaseOrderNoDetailDO;
|
||||||
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.dataobject.storagelogNow.StorageLogNowDO;
|
||||||
@ -51,6 +53,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogNowMapper
|
|||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper;
|
||||||
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskreport.TaskReportMapper;
|
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskreport.TaskReportMapper;
|
||||||
|
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
|
||||||
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.enums.YesOrNoEnum;
|
import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum;
|
||||||
import com.chanko.yunxi.mes.module.heli.service.attentiontodo.AttentiontodoService;
|
import com.chanko.yunxi.mes.module.heli.service.attentiontodo.AttentiontodoService;
|
||||||
@ -65,6 +68,7 @@ import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
|
|||||||
import com.chanko.yunxi.mes.module.system.dal.mysql.dict.DictDataMapper;
|
import com.chanko.yunxi.mes.module.system.dal.mysql.dict.DictDataMapper;
|
||||||
import com.chanko.yunxi.mes.module.system.service.user.AdminUserService;
|
import com.chanko.yunxi.mes.module.system.service.user.AdminUserService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.security.core.parameters.P;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@ -85,6 +89,7 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
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.framework.common.pojo.CommonResult.error;
|
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.error;
|
||||||
|
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
|
||||||
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.MATERIAL_PLAN;
|
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.MATERIAL_PLAN;
|
||||||
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
|
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
|
||||||
|
|
||||||
@ -486,10 +491,13 @@ public class ProcessBomServiceImpl implements ProcessBomService {
|
|||||||
List<PlanTaskBomDO> planTaskBomDOS = planTaskBomMapper.selectList(wrapper);
|
List<PlanTaskBomDO> planTaskBomDOS = planTaskBomMapper.selectList(wrapper);
|
||||||
if (ObjectUtil.isNotEmpty(planTaskBomDOS)){
|
if (ObjectUtil.isNotEmpty(planTaskBomDOS)){
|
||||||
List<Long> collect = planTaskBomDOS.stream().map(PlanTaskBomDO::getTaskId).distinct().collect(Collectors.toList());
|
List<Long> collect = planTaskBomDOS.stream().map(PlanTaskBomDO::getTaskId).distinct().collect(Collectors.toList());
|
||||||
|
if (ObjectUtil.isNotEmpty( collect)){
|
||||||
LambdaQueryWrapper<PlanTaskDO> planTaskDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<PlanTaskDO> planTaskDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
planTaskDOLambdaQueryWrapper.in(PlanTaskDO::getId, collect);
|
planTaskDOLambdaQueryWrapper.in(PlanTaskDO::getId, collect);
|
||||||
planTaskDOLambdaQueryWrapper.eq(PlanTaskDO::getStatus, 2);
|
planTaskDOLambdaQueryWrapper.eq(PlanTaskDO::getStatus, 2);
|
||||||
if (planTaskMapper.selectCount(planTaskDOLambdaQueryWrapper) > 0) throw exception(new ErrorCode(1_007_9999,"该生产任务单状态已提交,请先取消再修改BOM"));
|
if (planTaskMapper.selectCount(planTaskDOLambdaQueryWrapper) > 0) throw exception(new ErrorCode(1_007_9999,"该生产任务单状态已提交,请先取消再修改BOM"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
//标准件不管材质,非标准件材质必填
|
//标准件不管材质,非标准件材质必填
|
||||||
@ -559,13 +567,21 @@ public class ProcessBomServiceImpl implements ProcessBomService {
|
|||||||
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
|
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
|
||||||
if (ObjectUtil.isNotEmpty(list)){
|
if (ObjectUtil.isNotEmpty(list)){
|
||||||
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
|
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
|
||||||
|
if (ObjectUtil.isNotEmpty( collect)) {
|
||||||
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
|
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
|
||||||
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
|
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
|
||||||
|
if (ObjectUtil.isNotEmpty(detailDOS)) {
|
||||||
List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList());
|
List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList());
|
||||||
|
if (ObjectUtil.isNotEmpty(collect1)) {
|
||||||
LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1);
|
taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1);
|
||||||
if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper)>0) throw exception(new ErrorCode(1_007_9988,"物料"+po.getMaterialName()+"已报工,不允许修改零件名称"));
|
if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper) > 0)
|
||||||
|
throw exception(new ErrorCode(1_007_9988, "物料" + po.getMaterialName() + "已报工,不允许修改零件名称"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!vo.getBlueprintNo().equals(po.getBlueprintNo())) {
|
if (!vo.getBlueprintNo().equals(po.getBlueprintNo())) {
|
||||||
@ -578,14 +594,19 @@ public class ProcessBomServiceImpl implements ProcessBomService {
|
|||||||
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
|
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
|
||||||
if (ObjectUtil.isNotEmpty(list)){
|
if (ObjectUtil.isNotEmpty(list)){
|
||||||
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
|
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
|
||||||
|
if (ObjectUtil.isNotEmpty(collect)){
|
||||||
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
|
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
|
||||||
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
|
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
|
||||||
List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList());
|
List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList());
|
||||||
|
if (ObjectUtil.isNotEmpty(collect1)){
|
||||||
LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1);
|
taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1);
|
||||||
if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper)>0) throw exception(new ErrorCode(1_007_9988,"物料"+po.getMaterialName()+"已报工,不允许修改图号"));
|
if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper)>0) throw exception(new ErrorCode(1_007_9988,"物料"+po.getMaterialName()+"已报工,不允许修改图号"));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
|
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
|
||||||
}
|
}
|
||||||
if (!vo.getAmount().equals(po.getAmount())) {
|
if (!vo.getAmount().equals(po.getAmount())) {
|
||||||
@ -595,11 +616,13 @@ public class ProcessBomServiceImpl implements ProcessBomService {
|
|||||||
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
|
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
|
||||||
if (ObjectUtil.isNotEmpty(list)){
|
if (ObjectUtil.isNotEmpty(list)){
|
||||||
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
|
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
|
||||||
|
if (ObjectUtil.isNotEmpty( collect)){
|
||||||
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
|
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
|
||||||
wrapper.eq(TaskDispatchDetailDO::getProcedureStatus, 2);
|
wrapper.eq(TaskDispatchDetailDO::getProcedureStatus, 2);
|
||||||
if (taskDispatchDetailMapper.selectCount(wrapper)>0) throw exception(new ErrorCode(1_007_9998,"该零件"+po.getMaterialName()+"工序已报工完成,不允许修改"));
|
if (taskDispatchDetailMapper.selectCount(wrapper)>0) throw exception(new ErrorCode(1_007_9998,"该零件"+po.getMaterialName()+"工序已报工完成,不允许修改"));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
|
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1530,6 +1553,26 @@ public class ProcessBomServiceImpl implements ProcessBomService {
|
|||||||
return CommonResult.error(400,"boom明细不存在,请刷新页面");
|
return CommonResult.error(400,"boom明细不存在,请刷新页面");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<Boolean> updateById(String code) {
|
||||||
|
LambdaUpdateWrapper<PlanTaskDO> wrapper = new LambdaUpdateWrapper<>();
|
||||||
|
wrapper.eq(PlanTaskDO::getProcessBomId, code);
|
||||||
|
wrapper.set(PlanTaskDO ::getStatus,1);
|
||||||
|
planTaskMapper.update(wrapper);
|
||||||
|
return success( true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<Boolean> selectPlanTaskStatus(String id) {
|
||||||
|
LambdaQueryWrapper<PlanTaskDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
|
lambdaQueryWrapper.eq(PlanTaskDO::getProcessBomId, id);
|
||||||
|
PlanTaskDO planTaskDO = planTaskMapper.selectOne(lambdaQueryWrapper);
|
||||||
|
if (ObjectUtil.isNotEmpty(planTaskDO)){
|
||||||
|
if (planTaskDO.getStatus()==2) return CommonResult.success(true);
|
||||||
|
}
|
||||||
|
return success(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void createProcessBomDetailList(String bomCode,Long bomId, List<ProcessBomDetailDO> list,Integer num) {
|
private void createProcessBomDetailList(String bomCode,Long bomId, List<ProcessBomDetailDO> list,Integer num) {
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
@ -73,6 +73,6 @@ export const obtainReviewDetails = async (id:number) => {
|
|||||||
export const rejects = async (id:number) => {
|
export const rejects = async (id:number) => {
|
||||||
return await request.get({ url: `/heli/purchase-order-make/rejects?id=` +id })
|
return await request.get({ url: `/heli/purchase-order-make/rejects?id=` +id })
|
||||||
}
|
}
|
||||||
export const approvals = async (id: number) => {
|
export const approvals = async (data) => {
|
||||||
return await request.get({ url: `/heli/purchase-order-make/approvals?id=` + id })
|
return await request.post({ url: `/heli/purchase-order-make/approvals`,data })
|
||||||
}
|
}
|
||||||
|
@ -104,3 +104,9 @@ export const planBZJPage = async (params) => {
|
|||||||
export const delMaterialPlan = async (id: number,projectMaterialPlanNo:string) => {
|
export const delMaterialPlan = async (id: number,projectMaterialPlanNo:string) => {
|
||||||
return await request.delete({ url: `/heli/process-bom/delMaterialPlan?id=` + id+"&projectMaterialPlanNo="+projectMaterialPlanNo})
|
return await request.delete({ url: `/heli/process-bom/delMaterialPlan?id=` + id+"&projectMaterialPlanNo="+projectMaterialPlanNo})
|
||||||
}
|
}
|
||||||
|
export const updateById = async (code) => {
|
||||||
|
return await request.get({ url: `/heli/process-bom/updateById?code=` + code })
|
||||||
|
}
|
||||||
|
export const selectPlanTaskStatus = async (id) => {
|
||||||
|
return await request.get({ url: `/heli/process-bom/selectPlanTaskStatus?id=` + id })
|
||||||
|
}
|
||||||
|
@ -243,7 +243,7 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center" min-width="100">
|
<el-table-column label="操作" align="center" min-width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button v-if="'update,create,deliver'.indexOf(active) > -1" link type="danger" size="small" @click.prevent="onDeleteItem(scope.$index)">
|
<el-button v-if="'update,create,deliver'.indexOf(active) > -1 &&formData.deliverStatus != 2" link type="danger" size="small" @click.prevent="onDeleteItem(scope.$index)">
|
||||||
删除
|
删除
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
@ -344,7 +344,7 @@
|
|||||||
<el-table-column prop="createTime" align="center" label="上传时间" :formatter="dateFormatter" />
|
<el-table-column prop="createTime" align="center" label="上传时间" :formatter="dateFormatter" />
|
||||||
<el-table-column label="操作" align="center">
|
<el-table-column label="操作" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button v-if="'update,create,deliver'.indexOf(active) > -1" link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
|
<el-button v-if="'update,create,deliver'.indexOf(active) > -1 && formData.deliverStatus != 2" link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
|
||||||
删除
|
删除
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button v-if="!!scope.row.id" link type="primary" size="small" @click="downloadAttachment(scope.row.name, scope.row.url)">
|
<el-button v-if="!!scope.row.id" link type="primary" size="small" @click="downloadAttachment(scope.row.name, scope.row.url)">
|
||||||
@ -362,9 +362,9 @@
|
|||||||
<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 @click="goback" size="large" style="margin-left: 5rem">取 消</el-button>
|
<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'" @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.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>
|
<el-button v-if=" formData.id" type="primary" @click="printHandle" :disabled="formLoading" size="large">打印发货单</el-button>
|
||||||
</template>
|
</template>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col>
|
<el-col>
|
||||||
@ -912,7 +912,7 @@ const queryData = async (type: string, id?: number) => {
|
|||||||
dialogTitle.value = t('action.' + type)
|
dialogTitle.value = t('action.' + type)
|
||||||
// 修改时,设置数据
|
// 修改时,设置数据
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
formData.value.deliverDate = new Date().getTime()
|
// formData.value.deliverDate = new Date().getTime()
|
||||||
try {
|
try {
|
||||||
if (id) {
|
if (id) {
|
||||||
formData.value = await DeliverOrderApi.getDeliverOrder(id)
|
formData.value = await DeliverOrderApi.getDeliverOrder(id)
|
||||||
|
@ -0,0 +1,80 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible" @close="cancel">
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="驳回原因" prop="reason">
|
||||||
|
<el-input type="textarea" :rows="5" v-model="formData.reason" placeholder="请输入驳回原因" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<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 * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
|
||||||
|
import {updatePurchaseOrderMakeNo} from "@/api/heli/partpurchaseorder";
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const dialogTitle = ref('') // 弹窗的标题
|
||||||
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||||
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||||
|
const formData = ref({
|
||||||
|
id: undefined,
|
||||||
|
reason: undefined,
|
||||||
|
})
|
||||||
|
const formRules = reactive({
|
||||||
|
reason: [{ required: true, message: '驳回原因不能为空', trigger: 'blur' }],
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (id?: number) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
resetForm()
|
||||||
|
formData.value.id=id
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
|
/** 提交表单 */
|
||||||
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
|
const cancel = async () => {
|
||||||
|
dialogVisible.value = false
|
||||||
|
emit('success')
|
||||||
|
}
|
||||||
|
const submitForm = async () => {
|
||||||
|
// 校验表单
|
||||||
|
await formRef.value.validate()
|
||||||
|
// 提交请求
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
|
||||||
|
dialogVisible.value = false
|
||||||
|
await PartPurchaseOrderApi.updatePurchaseOrderMakeNo(formData.value)
|
||||||
|
// 发送操作成功的事件
|
||||||
|
message.success("驳回成功");
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置表单 */
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
reason:undefined,
|
||||||
|
}
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
</script>
|
@ -64,16 +64,23 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<el-card class="hl-card-info">
|
||||||
<ContentWrap>
|
<template #header>
|
||||||
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table" show-summary :summary-method="getSummaries">
|
<el-button style="margin-left: 20px" @click="approves()" type="success" size="large">全部审核</el-button>
|
||||||
|
</template>
|
||||||
|
<el-row>
|
||||||
|
<el-col>
|
||||||
|
<el-form ref="multipleTable" :model="list" v-loading="formLoading" label-width="0" >
|
||||||
|
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" show-summary :summary-method="getSummaries" @selection-change="handleSelectionChange" :row-class-name="tableRowClassName">
|
||||||
|
<el-table-column type="selection" width="70"/>
|
||||||
<el-table-column label="序号" type="index" align="center" fixed min-width="70px" />
|
<el-table-column label="序号" type="index" align="center" fixed min-width="70px" />
|
||||||
<el-table-column label="送审日期" align="center" prop="createTime" min-width="150px" :formatter="dateFormatter1"/>
|
<el-table-column label="送审日期" align="center" prop="createTime" min-width="150px" :formatter="dateFormatter1"/>
|
||||||
<el-table-column label="客户简称" align="center" prop="brief" min-width="100px" />
|
<!-- <el-table-column label="客户简称" align="center" prop="brief" min-width="100px" />-->
|
||||||
<el-table-column label="子项目编码" align="center" prop="projectSubCode" min-width="250px" />
|
<el-table-column label="子项目编码" align="center" prop="projectSubCode" min-width="250px" />
|
||||||
<el-table-column label="图号" align="center" prop="blueprintNo" min-width="120px" />
|
<el-table-column label="图号" align="center" prop="blueprintNo" min-width="120px" />
|
||||||
<el-table-column label="零件名称" align="center" prop="boomName" min-width="180px" />
|
<el-table-column label="零件名称" align="center" prop="boomName" min-width="180px" />
|
||||||
<el-table-column label="规格" align="center" prop="boomSpec" min-width="120px" />
|
<el-table-column label="规格" align="center" prop="boomSpec" min-width="120px" />
|
||||||
|
<el-table-column label="材料" align="center" prop="composition" min-width="120px" />
|
||||||
<el-table-column label="工序" align="center" prop="procedureName" min-width="120px" />
|
<el-table-column label="工序" align="center" prop="procedureName" min-width="120px" />
|
||||||
<el-table-column label="需求数量" align="center" prop="boomAmount" min-width="100px" />
|
<el-table-column label="需求数量" align="center" prop="boomAmount" min-width="100px" />
|
||||||
<el-table-column label="采购数量" align="center" prop="purchaseAmount" min-width="100px" fixed="right" />
|
<el-table-column label="采购数量" align="center" prop="purchaseAmount" min-width="100px" fixed="right" />
|
||||||
@ -93,11 +100,11 @@
|
|||||||
v-if="scope.row.status != 2"
|
v-if="scope.row.status != 2"
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="approve(scope.row.id)"
|
@click="approve(scope.row)"
|
||||||
>
|
>
|
||||||
审核
|
审核
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button link type="danger" @click="reject(scope.row.id)" v-if="scope.row.status != 2">
|
<el-button link type="danger" @click="openForm(scope.row.id)" v-if="scope.row.status != 2">
|
||||||
驳回
|
驳回
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
@ -106,22 +113,32 @@
|
|||||||
<!-- 分页 -->
|
<!-- 分页 -->
|
||||||
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
|
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList" />
|
@pagination="getList" />
|
||||||
</ContentWrap>
|
</el-form>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-card>
|
||||||
|
<Form ref="formRef" @success="getList" />
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
|
import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
|
||||||
import * as MaterialPlanApi from '@/api/heli/materialplan'
|
import * as MaterialPlanApi from '@/api/heli/materialplan'
|
||||||
import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
|
import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
|
||||||
|
import Form from "./Form.vue"
|
||||||
import {dateFormatter1} from "@/utils/formatTime";
|
import {dateFormatter1} from "@/utils/formatTime";
|
||||||
import {approvals, review} from "@/api/heli/partpurchaseorder";
|
import {ref} from "vue";
|
||||||
|
import {ElTable, ElTableColumn} from "element-plus";
|
||||||
defineOptions({ name: 'PartPurchaseCheck' })
|
defineOptions({ name: 'PartPurchaseCheck' })
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||||
|
|
||||||
|
const updateParams = reactive({
|
||||||
|
id: undefined,
|
||||||
|
reason: undefined
|
||||||
|
})
|
||||||
|
|
||||||
const loading = ref(true) // 列表的加载中
|
const loading = ref(true) // 列表的加载中
|
||||||
const list = ref([]) // 列表的数据
|
const list = ref([]) // 列表的数据
|
||||||
@ -155,6 +172,7 @@ const queryParams = reactive({
|
|||||||
})
|
})
|
||||||
const queryFormRef = ref() // 搜索的表单
|
const queryFormRef = ref() // 搜索的表单
|
||||||
const exportLoading = ref(false) // 导出的加载中
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
const multipleTable = ref<InstanceType<typeof ElTable>>()
|
||||||
|
|
||||||
/** 查询列表 */
|
/** 查询列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
@ -162,27 +180,77 @@ const getList = async () => {
|
|||||||
try {
|
try {
|
||||||
const data = await PartPurchaseOrderApi.getPartCheckPages(queryParams)
|
const data = await PartPurchaseOrderApi.getPartCheckPages(queryParams)
|
||||||
list.value = data.list
|
list.value = data.list
|
||||||
|
list.value.forEach(item=>{
|
||||||
|
item.isSelected=false
|
||||||
|
})
|
||||||
total.value = data.total
|
total.value = data.total
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false
|
loading.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const approve = async (id:number) => {
|
const approve = async (row) => {
|
||||||
await PartPurchaseOrderApi.approvals(id)
|
multipleTable.value=[]
|
||||||
message.success("审批成功");
|
multipleTable.value.push(row)
|
||||||
getList();
|
approves();
|
||||||
|
}
|
||||||
|
const approves = async () => {
|
||||||
|
try{
|
||||||
|
const list = multipleTable.value|| []; // 安全获取数据
|
||||||
|
// 1. 检查空数据
|
||||||
|
if (!list || list.length==null) {
|
||||||
|
message.error("提交明细不能为空,请确认");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
formLoading.value = true;
|
||||||
|
|
||||||
|
// 5. 提交数据(添加超时处理)
|
||||||
|
const res = await Promise.race([
|
||||||
|
PartPurchaseOrderApi.approvals(list),
|
||||||
|
new Promise((_, reject) =>
|
||||||
|
setTimeout(() => reject(new Error("请求超时")), 30000)
|
||||||
|
)
|
||||||
|
]);
|
||||||
|
message.success("审批成功");
|
||||||
|
getList(); // 确保刷新完成
|
||||||
|
|
||||||
|
emit('success');
|
||||||
|
} catch (error) {
|
||||||
|
console.error("提交失败:", error);
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false;
|
||||||
}
|
}
|
||||||
const reject = async (id:number) => {
|
|
||||||
await PartPurchaseOrderApi.rejects(id)
|
|
||||||
message.success("驳回成功");
|
|
||||||
getList();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (id?: number) => {
|
||||||
|
formRef.value.open( id)
|
||||||
|
}
|
||||||
/** 搜索按钮操作 */
|
/** 搜索按钮操作 */
|
||||||
const handleQuery = () => {
|
const handleQuery = () => {
|
||||||
queryParams.pageNo = 1
|
queryParams.pageNo = 1
|
||||||
getList()
|
getList()
|
||||||
}
|
}
|
||||||
|
const handleSelectionChange = (val) => {
|
||||||
|
// 第一步:重置所有行的 isSelected 为 false
|
||||||
|
list.value.forEach(row => {
|
||||||
|
row.isSelected = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 第二步:将当前选中行的 isSelected 设为 true
|
||||||
|
val.forEach(selectedRow => {
|
||||||
|
// 找到对应行并更新状态(通过唯一标识符匹配更准确)
|
||||||
|
const targetRow = list.value.find(row => row.id === selectedRow.id);
|
||||||
|
if (targetRow) {
|
||||||
|
targetRow.isSelected = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
multipleTable.value=val
|
||||||
|
}
|
||||||
|
|
||||||
|
const tableRowClassName = ({ row }) => {
|
||||||
|
return row.isSelected ? 'selected-row' : '';
|
||||||
|
}
|
||||||
const getSummaries = (param: SummaryMethodProps) => {
|
const getSummaries = (param: SummaryMethodProps) => {
|
||||||
const summaryField = ["boomAmount","purchaseAmount","estimatedPrice"];
|
const summaryField = ["boomAmount","purchaseAmount","estimatedPrice"];
|
||||||
const { columns, data } = param;
|
const { columns, data } = param;
|
||||||
@ -256,28 +324,28 @@ const floatMul = (a, b) => {
|
|||||||
}
|
}
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
|
|
||||||
const openForm = (type: string, id?: number) => {
|
// const openForm = (type: string, id?: number) => {
|
||||||
|
//
|
||||||
switch (type) {
|
// switch (type) {
|
||||||
case 'create':
|
// case 'create':
|
||||||
router.push({ path: '/purchase/materialplanadd', query: { id: id } })
|
// router.push({ path: '/purchase/materialplanadd', query: { id: id } })
|
||||||
break;
|
// break;
|
||||||
case 'update':
|
// case 'update':
|
||||||
router.push({ path: '/purchase/materialplanedit', query: { id: id } })
|
// router.push({ path: '/purchase/materialplanedit', query: { id: id } })
|
||||||
break;
|
// break;
|
||||||
case 'detail':
|
// case 'detail':
|
||||||
router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
|
// router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
|
||||||
// window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
|
// // window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
|
||||||
break;
|
// break;
|
||||||
case 'check':
|
// case 'check':
|
||||||
router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
|
// router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
|
||||||
// window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
|
// // window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
|
||||||
break;
|
// break;
|
||||||
default:
|
// default:
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
const handleDelete = async (id: number) => {
|
const handleDelete = async (id: number) => {
|
||||||
@ -297,7 +365,12 @@ const userInit = ref()
|
|||||||
/** 初始化 **/
|
/** 初始化 **/
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
//用户列表数据
|
//用户列表数据
|
||||||
// userInit.value = await UserApi.getSimpleUserList()
|
|
||||||
getList()
|
getList()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
<style>
|
||||||
|
.selected-row {
|
||||||
|
background-color: #ffe6cc !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<td colspan="6" >
|
<td colspan="6" >
|
||||||
<span style="font-size: 20px; font-weight: 700">模具生产计划单</span>
|
<span style="font-size: 20px; font-weight: 700">模具生产计划单</span>
|
||||||
</td>
|
</td>
|
||||||
<td colspan="2" style="padding: 5px 0">
|
<td colspan="2" style="padding: 5px 0;" >
|
||||||
<div style="border-bottom: 1px solid #666; padding-bottom: 5px;font-size: 16px" >项目编号</div>
|
<div style="border-bottom: 1px solid #666; padding-bottom: 5px;font-size: 16px" >项目编号</div>
|
||||||
<div style="padding-top: 5px; font-size: 16px" >{{ formData.code }}</div>
|
<div style="padding-top: 5px; font-size: 16px" >{{ formData.code }}</div>
|
||||||
</td>
|
</td>
|
||||||
@ -22,10 +22,9 @@
|
|||||||
<tbody class="masterClass">
|
<tbody class="masterClass">
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2" style="font-size: 16px"> 客户名称 </td>
|
<td colspan="2" style="font-size: 16px"> 客户名称 </td>
|
||||||
<td colspan="5">
|
<td colspan="6">
|
||||||
<span style="font-size: 16px">{{ formData.customerName }}</span>
|
<span style="font-size: 16px">{{ formData.customerName }}({{ formData.customer.brief}})</span>
|
||||||
</td>
|
</td>
|
||||||
<td colspan="1" style="font-size: 16px">{{ formData.customer.brief }}</td>
|
|
||||||
<td style="font-size: 16px"> 编码: </td>
|
<td style="font-size: 16px"> 编码: </td>
|
||||||
<td style="font-size: 16px">{{ formData.customer.code }} </td>
|
<td style="font-size: 16px">{{ formData.customer.code }} </td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -41,12 +40,12 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2" style="font-size: 16px"> 项目工期 </td>
|
<td colspan="2" style="font-size: 16px"> 项目工期 </td>
|
||||||
<td colspan="1" style="padding: 0 5px"> 起 </td>
|
<td colspan="1" style="padding: 0 5px; width: 40px"> 起 </td>
|
||||||
<td colspan="1" style="min-width: 70px;">{{ formatDate(new Date(formData.projectStartTime), 'YYYY-MM-DD') }}</td>
|
<td colspan="1" style="min-width: 90px; font-size: 16px">{{ formatDate(new Date(formData.projectStartTime), 'YYYY-MM-DD') }}</td>
|
||||||
<td colspan="1" style="min-width: 70px;">至</td>
|
<td colspan="1" style="min-width: 70px;">至</td>
|
||||||
<td colspan="1" style="min-width: 70px;">{{ formatDate(new Date(formData.projectEndTime), 'YYYY-MM-DD') }}</td>
|
<td colspan="1" style="min-width: 90px; font-size: 16px ">{{ formatDate(new Date(formData.projectEndTime), 'YYYY-MM-DD') }}</td>
|
||||||
<td style="min-width: 70px;">天数</td>
|
<td style="min-width: 70px;">天数</td>
|
||||||
<td colspan="1">{{ betweenDay(new Date(formData.projectStartTime), new Date(formData.projectEndTime)) +1 }}</td>
|
<td colspan="1" width="60px">{{ betweenDay(new Date(formData.projectStartTime), new Date(formData.projectEndTime)) +1 }}</td>
|
||||||
<td colspan="1"> 是否有价格: </td>
|
<td colspan="1"> 是否有价格: </td>
|
||||||
<td colspan="1">{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, formData.hasPrice) }} </td>
|
<td colspan="1">{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, formData.hasPrice) }} </td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -117,17 +116,25 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="xh"> 序号 </td>
|
<td class="xh"> 序号 </td>
|
||||||
<td colspan="3"> 名称/编号 </td>
|
<td colspan="2"> 名称 </td>
|
||||||
<td> 设备型号 </td>
|
<td> 设备型号 </td>
|
||||||
<td> 数量 </td>
|
<td> 数量 </td>
|
||||||
<td> 主要材料 </td>
|
<td> 主要材料 </td>
|
||||||
<td style="width:160px"> 毛坯日期 </td>
|
<td colspan="2"> 毛坯日期 </td>
|
||||||
<td> 2D/日期 </td>
|
<td> 2D/日期 </td>
|
||||||
<td> 3D/日期 </td>
|
<td> 3D/日期 </td>
|
||||||
|
<!-- <td class="xh" style="width:10%" > 序号 </td>-->
|
||||||
|
<!-- <td colspan="3" style="width: 15%"> 名称/编号 </td>-->
|
||||||
|
<!-- <td style="width: 10%"> 设备型号 </td>-->
|
||||||
|
<!-- <td style="width: 10%"> 数量 </td>-->
|
||||||
|
<!-- <td style="width: 10%"> 主要材料 </td>-->
|
||||||
|
<!-- <td style="width: 50%"> 毛坯日期 </td>-->
|
||||||
|
<!-- <td style="width: 10%"> 2D/日期 </td>-->
|
||||||
|
<!-- <td style="width: 10%"> 3D/日期 </td>-->
|
||||||
</tr>
|
</tr>
|
||||||
<tr v-for="(item,idx) in formData.projectOrderSubs.slice(0, 6)" :key="idx">
|
<tr v-for="(item,idx) in formData.projectOrderSubs" :key="idx">
|
||||||
<td class="xh"> {{ idx+1 }} </td>
|
<td class="xh"> {{ idx+1 }} </td>
|
||||||
<td colspan="3" style="padding: 0 0">
|
<td colspan="2" style="padding: 0 0">
|
||||||
<div style="display: flex; flex-direction: column; justify-content: space-between">
|
<div style="display: flex; flex-direction: column; justify-content: space-between">
|
||||||
<span> {{item.name}} </span>
|
<span> {{item.name}} </span>
|
||||||
<!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>-->
|
<!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>-->
|
||||||
@ -138,7 +145,7 @@
|
|||||||
<td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td>
|
<td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td>
|
||||||
<td>{{item.amount}} </td>
|
<td>{{item.amount}} </td>
|
||||||
<td>{{ item.compositionName }} </td>
|
<td>{{ item.compositionName }} </td>
|
||||||
<td>
|
<td colspan="2">
|
||||||
<span v-if="!item.blankDate"> </span>
|
<span v-if="!item.blankDate"> </span>
|
||||||
<span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span>
|
<span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span>
|
||||||
</td>
|
</td>
|
||||||
@ -167,27 +174,26 @@
|
|||||||
<tbody v-if="formData.projectOrderSubs.length<6">
|
<tbody v-if="formData.projectOrderSubs.length<6">
|
||||||
<tr v-for="item in (6-formData.projectOrderSubs.length)" :key="item">
|
<tr v-for="item in (6-formData.projectOrderSubs.length)" :key="item">
|
||||||
<td> {{item+(formData.projectOrderSubs.length)}}</td>
|
<td> {{item+(formData.projectOrderSubs.length)}}</td>
|
||||||
<td colspan="3"> </td>
|
<td colspan="2"> </td>
|
||||||
<td> </td>
|
|
||||||
<td> </td>
|
<td> </td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
|
<td colspan="2"> </td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
<tbody class="masterClass">
|
<tbody>
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td class="xh"> 序号 </td>
|
<td class="xhs"> 序号 </td>
|
||||||
<td colspan="2" style="width: 200px"> 工艺流程 </td>
|
<td colspan="2"> 工艺流程 </td>
|
||||||
<td colspan="2"> 开始日期 </td>
|
<td colspan="2"> 开始日期 </td>
|
||||||
<td colspan="2"> 结束日期 </td>
|
<td colspan="2"> 结束日期 </td>
|
||||||
<td> 责任人 </td>
|
<td> 责任人 </td>
|
||||||
<td colspan="2"> 备注 </td>
|
<td colspan="2"> 备注 </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr v-for="(its,index) in planData.craftInfos" :key="its.index">
|
<tr v-for="(its,index) in planData.craftInfos" :key="its.index">
|
||||||
<td class="xh"> {{ index+1 }} </td>
|
<td class="xhs"> {{ index+1 }} </td>
|
||||||
<td colspan="2"> {{ its.name }}</td>
|
<td colspan="2"> {{ its.name }}</td>
|
||||||
|
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
@ -215,7 +221,7 @@ style="
|
|||||||
">
|
">
|
||||||
<span>说明:</span>
|
<span>说明:</span>
|
||||||
<span>1.每个项目的零部件制作工艺,材料材质,硬度要求必须统一,出现任何问题,各工程师负责!</span>
|
<span>1.每个项目的零部件制作工艺,材料材质,硬度要求必须统一,出现任何问题,各工程师负责!</span>
|
||||||
<span>2.模具调试,试模需要根据客户要求,自己安排调试,我司根据需要安排人员参与配合。</span>
|
<!-- <span>2.模具调试,试模需要根据客户要求,自己安排调试,我司根据需要安排人员参与配合。</span>-->
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -259,9 +265,9 @@ style="
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<div v-if="formData.projectOrderSubs.length>6">
|
<!-- <div v-if="formData.projectOrderSubs.length>6">-->
|
||||||
<!-- 附页是否开启需要判断 根据子项目信息-->
|
<!-- <!– 附页是否开启需要判断 根据子项目信息–>-->
|
||||||
<table border="2" cellspacing="0" id="table" style="height:27.2cm;">
|
<!-- <table border="2" cellspacing="0" id="table" style="height:27.2cm;">-->
|
||||||
<!-- <tbody >-->
|
<!-- <tbody >-->
|
||||||
<!-- <tr>-->
|
<!-- <tr>-->
|
||||||
<!-- <td colspan="2">-->
|
<!-- <td colspan="2">-->
|
||||||
@ -318,24 +324,24 @@ style="
|
|||||||
<!-- </td>-->
|
<!-- </td>-->
|
||||||
<!-- </tr>-->
|
<!-- </tr>-->
|
||||||
|
|
||||||
<tbody >
|
<!-- <tbody >-->
|
||||||
<tr>
|
<!-- <tr>-->
|
||||||
<td colspan="10" style="height: 30px">
|
<!-- <td colspan="10" style="height: 30px">-->
|
||||||
<div style="text-align: left; width: 100%">子项目信息:</div>
|
<!-- <div style="text-align: left; width: 100%">子项目信息:</div>-->
|
||||||
</td>
|
<!-- </td>-->
|
||||||
</tr>
|
<!-- </tr>-->
|
||||||
<tr>
|
<!-- <tr>-->
|
||||||
<td class="xh" style="width:20%" > 序号 </td>
|
<!-- <td class="xh" style="width:20%" > 序号 </td>-->
|
||||||
<td colspan="3" style="width: 25%"> 名称/编号 </td>
|
<!-- <td colspan="3" style="width: 25%"> 名称/编号 </td>-->
|
||||||
<td style="width: 10%"> 设备型号 </td>
|
<!-- <td style="width: 10%"> 设备型号 </td>-->
|
||||||
<td style="width: 10%"> 数量 </td>
|
<!-- <td style="width: 10%"> 数量 </td>-->
|
||||||
<td style="width: 10%"> 主要材料 </td>
|
<!-- <td style="width: 10%"> 主要材料 </td>-->
|
||||||
<td style="width: 10%"> 毛坯日期 </td>
|
<!-- <td style="width: 10%"> 毛坯日期 </td>-->
|
||||||
<td style="width: 10%"> 2D/日期 </td>
|
<!-- <td style="width: 10%"> 2D/日期 </td>-->
|
||||||
<td style="width: 10%"> 3D/日期 </td>
|
<!-- <td style="width: 10%"> 3D/日期 </td>-->
|
||||||
</tr>
|
<!-- </tr>-->
|
||||||
</tbody>
|
<!-- </tbody>-->
|
||||||
<tbody>
|
<!-- <tbody>-->
|
||||||
<!-- <tr v-for="(item, idx) in formData.projectOrderSubs.slice(6)" :key="idx">-->
|
<!-- <tr v-for="(item, idx) in formData.projectOrderSubs.slice(6)" :key="idx">-->
|
||||||
<!-- <td class="xh"> {{ idx+7 }} </td>-->
|
<!-- <td class="xh"> {{ idx+7 }} </td>-->
|
||||||
<!-- <td colspan="3" style="padding: 0 0">-->
|
<!-- <td colspan="3" style="padding: 0 0">-->
|
||||||
@ -373,56 +379,56 @@ style="
|
|||||||
<!-- </div>-->
|
<!-- </div>-->
|
||||||
<!-- </td>-->
|
<!-- </td>-->
|
||||||
<!-- </tr>-->
|
<!-- </tr>-->
|
||||||
<tr v-for="(item,idx) in formData.projectOrderSubs.slice(6)" :key="idx" >
|
<!--<tr v-for="(item,idx) in formData.projectOrderSubs.slice(6)" :key="idx" >-->
|
||||||
<td class="xh"> {{ idx+7 }} </td>
|
<!-- <td class="xh"> {{ idx+7 }} </td>-->
|
||||||
<td colspan="3" style="padding: 0 0">
|
<!-- <td colspan="3" style="padding: 0 0">-->
|
||||||
<div style="display: flex; flex-direction: column; justify-content: space-between">
|
<!-- <div style="display: flex; flex-direction: column; justify-content: space-between">-->
|
||||||
<span> {{item.name}} </span>
|
<!-- <span> {{item.name}} </span>-->
|
||||||
<!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>-->
|
<!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>-->
|
||||||
<!-- <span v-if="!item.projectSubShortName"> </span>-->
|
<!-- <span v-if="!item.projectSubShortName"> </span>-->
|
||||||
<!-- <span v-else style="font-size: 10px">{{ formData.code+'-'+formData.customer.code+'-'+ item.projectSubShortName}}</span>-->
|
<!-- <span v-else style="font-size: 10px">{{ formData.code+'-'+formData.customer.code+'-'+ item.projectSubShortName}}</span>-->
|
||||||
</div>
|
<!-- </div>-->
|
||||||
</td>
|
<!-- </td>-->
|
||||||
<td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td>
|
<!-- <td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td>-->
|
||||||
<td>{{item.amount}} </td>
|
<!-- <td>{{item.amount}} </td>-->
|
||||||
<td>{{ item.compositionName }} </td>
|
<!-- <td>{{ item.compositionName }} </td>-->
|
||||||
<td>
|
<!-- <td>-->
|
||||||
<span v-if="!item.blankDate"> </span>
|
<!-- <span v-if="!item.blankDate"> </span>-->
|
||||||
<span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span>
|
<!-- <span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span>-->
|
||||||
</td>
|
<!-- </td>-->
|
||||||
<td style="padding: 0 0">
|
<!-- <td style="padding: 0 0">-->
|
||||||
<div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">
|
<!-- <div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">-->
|
||||||
<span v-if="!item.twoDimDate" style="border-bottom: 1px solid #666"> </span>
|
<!-- <span v-if="!item.twoDimDate" style="border-bottom: 1px solid #666"> </span>-->
|
||||||
<span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.twoDimDate), 'YYYY-MM-DD') }} </span>
|
<!-- <span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.twoDimDate), 'YYYY-MM-DD') }} </span>-->
|
||||||
<span v-if="userInit.find((user) => user.id === item.twoDimOwner)?.nickname">{{ userInit.find((user) => user.id == item.twoDimOwner)?.nickname }}</span>
|
<!-- <span v-if="userInit.find((user) => user.id === item.twoDimOwner)?.nickname">{{ userInit.find((user) => user.id == item.twoDimOwner)?.nickname }}</span>-->
|
||||||
<span v-else> </span>
|
<!-- <span v-else> </span>-->
|
||||||
</div>
|
<!-- </div>-->
|
||||||
</td>
|
<!-- </td>-->
|
||||||
<td style="padding: 0 0">
|
<!-- <td style="padding: 0 0">-->
|
||||||
<div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">
|
<!-- <div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">-->
|
||||||
<span v-if="!item.threeDimDate" style="border-bottom: 1px solid #666"> </span>
|
<!-- <span v-if="!item.threeDimDate" style="border-bottom: 1px solid #666"> </span>-->
|
||||||
|
|
||||||
<span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.threeDimDate), 'YYYY-MM-DD') }} </span>
|
<!-- <span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.threeDimDate), 'YYYY-MM-DD') }} </span>-->
|
||||||
<span v-if="userInit.find((user) => user.id === item.threeDimOwner)?.nickname">
|
<!-- <span v-if="userInit.find((user) => user.id === item.threeDimOwner)?.nickname">-->
|
||||||
{{ userInit.find((user) => user.id === item.threeDimOwner)?.nickname }}
|
<!-- {{ userInit.find((user) => user.id === item.threeDimOwner)?.nickname }}-->
|
||||||
</span>
|
<!-- </span>-->
|
||||||
<span v-else> </span>
|
<!-- <span v-else> </span>-->
|
||||||
</div>
|
<!-- </div>-->
|
||||||
</td>
|
<!-- </td>-->
|
||||||
</tr>
|
<!--</tr>-->
|
||||||
</tbody>
|
<!-- </tbody>-->
|
||||||
<tbody>
|
<!-- <tbody>-->
|
||||||
<tr v-for="item in num" :key="item">
|
<!-- <tr v-for="item in num" :key="item">-->
|
||||||
<td> {{item+(formData.projectOrderSubs.length)}}</td>
|
<!-- <td> {{item+(formData.projectOrderSubs.length)}}</td>-->
|
||||||
<td colspan="3"> </td>
|
<!-- <td colspan="3"> </td>-->
|
||||||
<td> </td>
|
<!-- <td> </td>-->
|
||||||
<td> </td>
|
<!-- <td> </td>-->
|
||||||
<td> </td>
|
<!-- <td> </td>-->
|
||||||
<td> </td>
|
<!-- <td> </td>-->
|
||||||
<td> </td>
|
<!-- <td> </td>-->
|
||||||
<td> </td>
|
<!-- <td> </td>-->
|
||||||
</tr>
|
<!-- </tr>-->
|
||||||
</tbody>
|
<!-- </tbody>-->
|
||||||
|
|
||||||
<!-- <tbody>-->
|
<!-- <tbody>-->
|
||||||
<!-- <tr>-->
|
<!-- <tr>-->
|
||||||
@ -480,8 +486,8 @@ style="
|
|||||||
<!-- </td>-->
|
<!-- </td>-->
|
||||||
<!-- </tr>-->
|
<!-- </tr>-->
|
||||||
<!-- </tbody>-->
|
<!-- </tbody>-->
|
||||||
</table>
|
<!-- </table>-->
|
||||||
</div>
|
<!-- </div>-->
|
||||||
</div>
|
</div>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<!-- 【打印】 -->
|
<!-- 【打印】 -->
|
||||||
@ -589,6 +595,9 @@ const onPrint = () => {
|
|||||||
width: 50px !important;
|
width: 50px !important;
|
||||||
}
|
}
|
||||||
.xh {
|
.xh {
|
||||||
|
height: 40px !important;
|
||||||
|
}
|
||||||
|
.xhs {
|
||||||
height: 20px !important;
|
height: 20px !important;
|
||||||
}
|
}
|
||||||
.checkbox {
|
.checkbox {
|
||||||
@ -613,7 +622,6 @@ const onPrint = () => {
|
|||||||
document.body.removeChild(newIframe) // 移除打印内框架,下次打印下次再挂载
|
document.body.removeChild(newIframe) // 移除打印内框架,下次打印下次再挂载
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
}, 100)
|
}, 100)
|
||||||
|
|
||||||
}
|
}
|
||||||
// const onPrint = () => {
|
// const onPrint = () => {
|
||||||
// const printNode = document.querySelector('.print-wrap');
|
// const printNode = document.querySelector('.print-wrap');
|
||||||
|
@ -367,23 +367,21 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { DICT_TYPE, getDictLabel, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getDictLabel, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
|
||||||
import { dateFormatter, formatDate } from '@/utils/formatTime'
|
import { dateFormatter} from '@/utils/formatTime'
|
||||||
import BomImportForm from './bomImportForm.vue'
|
import BomImportForm from './bomImportForm.vue'
|
||||||
import { ref } from 'vue'
|
import { ref } from 'vue'
|
||||||
import { inject } from 'vue'
|
import { inject } from 'vue'
|
||||||
import { useUserStore } from '@/store/modules/user'
|
import { useUserStore } from '@/store/modules/user'
|
||||||
import { useCommonStore } from '@/store/modules/common'
|
import { useCommonStore } from '@/store/modules/common'
|
||||||
import MaterialSelect from '@/views/heli/hlvuestyle/materialSelect.vue'
|
|
||||||
import CompositionSelect from '@/views/heli/hlvuestyle/compositionSelect.vue'
|
import CompositionSelect from '@/views/heli/hlvuestyle/compositionSelect.vue'
|
||||||
import * as ProcessBomApi from '@/api/heli/processbom'
|
import * as ProcessBomApi from '@/api/heli/processbom'
|
||||||
import * as storageApi from '@/api/heli/storage'
|
import * as storageApi from '@/api/heli/storage'
|
||||||
import { getOperateLogPage } from '@/api/system/operatelog'
|
import { getOperateLogPage } from '@/api/system/operatelog'
|
||||||
import { deleteProcessBomDetail } from "@/api/heli/processbom";
|
|
||||||
import printDialog from './printDialog.vue'
|
import printDialog from './printDialog.vue'
|
||||||
import { UploadUserFile } from 'element-plus'
|
import { UploadUserFile } from 'element-plus'
|
||||||
import { getAccessToken, getTenantId } from '@/utils/auth'
|
import { getAccessToken, getTenantId } from '@/utils/auth'
|
||||||
import { deleteFileLogic, downloadFile, getFilePage } from '@/api/infra/file'
|
import { deleteFileLogic, downloadFile, getFilePage } from '@/api/infra/file'
|
||||||
import { Row } from 'element-plus/es/components/table-v2/src/components'
|
import {selectBomStatus, selectPlanTaskStatus} from "@/api/heli/processbom";
|
||||||
|
|
||||||
defineOptions({ name: 'ProcessBomDetail' })
|
defineOptions({ name: 'ProcessBomDetail' })
|
||||||
|
|
||||||
@ -438,7 +436,17 @@ const formRef = ref() // 表单 Ref
|
|||||||
const subFormRef = ref()
|
const subFormRef = ref()
|
||||||
//20250601新增
|
//20250601新增
|
||||||
const importFormRef = ref()
|
const importFormRef = ref()
|
||||||
const handleImport = () => {
|
const handleImport = async () => {
|
||||||
|
if (formData.value.processBomDetails!=null){
|
||||||
|
var status
|
||||||
|
await ProcessBomApi.selectPlanTaskStatus(formData.value.id).then(data=>{
|
||||||
|
status=data
|
||||||
|
});
|
||||||
|
if (status){
|
||||||
|
await message.confirm("是否取消提交生产任务单")
|
||||||
|
await ProcessBomApi.updateById(formData.value.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
importFormRef.value.open(formData.value.id)
|
importFormRef.value.open(formData.value.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ import DOMPurify from 'dompurify';
|
|||||||
defineOptions({ name: 'BomImportForm' })
|
defineOptions({ name: 'BomImportForm' })
|
||||||
|
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
|
import * as ProcessBomApi from '@/api/heli/processbom'
|
||||||
|
|
||||||
|
|
||||||
const dialogVisible = ref(false) // 弹窗的是否展示
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
@ -72,7 +73,7 @@ const submitForm = async () => {
|
|||||||
|
|
||||||
/** 文件上传成功 */
|
/** 文件上传成功 */
|
||||||
const emits = defineEmits(['success'])
|
const emits = defineEmits(['success'])
|
||||||
const submitFormSuccess = (response: any) => {
|
const submitFormSuccess = async (response: any) => {
|
||||||
if (response.code == 500) {
|
if (response.code == 500) {
|
||||||
uploadRef.value!.clearFiles()
|
uploadRef.value!.clearFiles()
|
||||||
let formattedMsg = response.msg
|
let formattedMsg = response.msg
|
||||||
@ -90,10 +91,9 @@ const submitFormSuccess = (response: any) => {
|
|||||||
center: true
|
center: true
|
||||||
});
|
});
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
message.error(response.msg)
|
message.error(response.msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
formLoading.value = false
|
formLoading.value = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -110,7 +110,7 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column v-if="activeIndex == 'first'" label="零件采购订单" prop="planStatus" min-width="180" align="center">
|
<el-table-column v-if="activeIndex == 'first'" label="零件采购订单" prop="planStatus" min-width="180" align="center">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
{{ row.receivingStatus ?(row.receivingStatus== 1?'已生成':(row.receivingStatus == 2? '部分收货':(row.planStatus == 3? '已收货':''))):''}}
|
{{ row.receivingStatus ?(row.receivingStatus== 1?'已生成':(row.receivingStatus == 2? '部分收货':(row.receivingStatus == 3? '已收货':''))):''}}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column v-if="activeIndex == 'second'" label="生产报工" prop="procedureStatus" min-width="180" align="center">
|
<el-table-column v-if="activeIndex == 'second'" label="生产报工" prop="procedureStatus" min-width="180" align="center">
|
||||||
@ -182,8 +182,12 @@ const handleClick = async(tab: TabsPaneContext, event: Event) => {
|
|||||||
var tabIndex = tab.props.name;
|
var tabIndex = tab.props.name;
|
||||||
queryParams.pageNo = 1;
|
queryParams.pageNo = 1;
|
||||||
activeIndex.value = tabIndex;
|
activeIndex.value = tabIndex;
|
||||||
|
if (allConditionsEmpty.value) {
|
||||||
|
message.error("必须输入查询条件查询")
|
||||||
|
}else{
|
||||||
await getList(tabIndex);
|
await getList(tabIndex);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** 查询列表 */
|
/** 查询列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
|
Loading…
Reference in New Issue
Block a user