BOM二维码

This commit is contained in:
Ledo 2025-06-09 15:21:29 +08:00
parent 98a9303e0a
commit 88ce02275f
18 changed files with 555 additions and 77 deletions

View File

@ -27,7 +27,7 @@ public class PlanTaskBomRespVO {
@Schema(description = "负责人")
@ExcelProperty("负责人")
private String owner;
private String bomBlueprintNo;
@Schema(description = "要求完成日期")
@ExcelProperty("要求完成日期")
private LocalDateTime requireEndDate;

View File

@ -58,6 +58,7 @@ public class TaskDispatchSaveReqVO {
@Schema(description = "操作类型")
@NotBlank(message = "操作类型不能为空")
private String active;
private String bomBlueprintNo;
@Schema(description = "操作意见")
private String activeOpinion;

View File

@ -116,6 +116,8 @@ public class PlanDO extends BaseDO {
*要求设计结束日期
* */
private LocalDateTime changeEndTime;
private String name;
private String brief;
/**
* 子项目id
*/

View File

@ -45,7 +45,8 @@ public class PlanTaskBomDO extends BaseDO {
* 要求完成日期
*/
private LocalDateTime requireEndDate;
@TableField(exist = false)
private String bomBlueprintNo;
@TableField(exist = false)
private String materialName;
/**材质名称*/

View File

@ -69,6 +69,7 @@ public class ProcessBomDetailDO extends BaseDO {
* 图号
*/
private String blueprintNo;
private String bomBlueprintNo;
/**
* 数量
*/

View File

@ -37,6 +37,8 @@ public class TaskDispatchDO extends BaseDO {
* 编号唯一
*/
private String code;
private String bomBlueprintNo;
/**
* 派工类型 生产任务|装配任务 PRODUCTION|ASSEMBLE
*

View File

@ -38,6 +38,7 @@ public interface PlanTaskBomMapper extends BaseMapperX<PlanTaskBomDO> {
.select("f.memo as memo","f.bom_edit_status as bomEditStatus","f.bom_operate_count as bomOperateCount")
.select("g.name as compositionName")
.select("u1.nickname as ownerName")
.select("f.bom_blueprint_no as bomBlueprintNo")
.leftJoin(PlanTaskDO.class, "a", PlanTaskDO::getId, PlanTaskBomDO::getTaskId)
.leftJoin(PlanSubDO.class, "b", PlanSubDO::getId, PlanTaskDO::getProjectPlanSubId)
.leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, PlanSubDO::getProjectSubId)

View File

@ -58,6 +58,14 @@ public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO>
"GROUP BY p.id") //2025 0601 因为bom明细页查询到结果 group by materialcode转换为 group by id
List<ProcessBomDetailDO> selectStandardListByBomId(@Param("bomId") Long bomId);
@Select("SELECT p.*, IFNULL(SUM(s.storage_ok_qty), 0) AS storage_ok_qty " +
"FROM pro_process_bom_detail p " +
"LEFT JOIN v_storage_material_now s ON p.material_name = s.mat_name " +
"WHERE p.bom_id = #{bomId} and p.type = 1 AND p.deleted IN (0, 1) " +
"GROUP BY p.material_name")
//2025 0601 因为bom明细页查询到结果 group by materialcode转换为 group by id
List<ProcessBomDetailDO> selectStandardListByBomId20250609(@Param("bomId") Long bomId);
default Long getBomDetailByBluePrintNoAndBomId(String bomCode,String bluePrintNo){
MPJLambdaWrapper<ProcessBomDetailDO> query = new MPJLambdaWrapper<>();
query.leftJoin(ProcessBomDO.class,"q",ProcessBomDO::getId,ProcessBomDetailDO::getBomId)

View File

@ -531,6 +531,7 @@ public class CrossOrderManager {
MPJLambdaWrapper<PlanTaskBomDO> query = new MPJLambdaWrapper<>();
query.selectAll(PlanTaskBomDO.class)
.select("bom_edit_status as bom_deleted")
.select("b.bom_blueprint_no as bomBlueprintNo")
.leftJoin(PlanTaskDO.class, "a", PlanTaskDO::getId, PlanTaskBomDO::getTaskId)
.leftJoin(ProcessBomDetailDO.class, "b", ProcessBomDetailDO::getId, PlanTaskBomDO::getBomDetailId)
.disableSubLogicDel()
@ -581,6 +582,7 @@ public class CrossOrderManager {
.setProjectId(planTaskDO.getProjectId())
.setProjectSubId(planSubDO.getProjectSubId())
.setBomDetailId(planTaskBomDO.getBomDetailId())
.setBomBlueprintNo(planTaskBomDO.getBomBlueprintNo() == null ?"":planTaskBomDO.getBomBlueprintNo())
.setActive(OperateTypeEnum.SAVE.name())
.setDispatchStatus(TaskDispatchStatusEnum.SAVE.getCode())
.setStatus(ValidStatusEnum.VALID.getCode());
@ -612,6 +614,7 @@ public class CrossOrderManager {
.setPlanId(planTaskDO.getProjectPlanId())
.setProjectId(planTaskDO.getProjectId())
.setProjectSubId(planSubDO.getProjectSubId())
.setBomBlueprintNo(planTaskBomDO.getBomBlueprintNo() == null ?"":planTaskBomDO.getBomBlueprintNo())
.setBomDetailId(planTaskBomDO.getBomDetailId())
.setActive(OperateTypeEnum.SAVE.name())
.setDispatchStatus(TaskDispatchStatusEnum.SAVE.getCode())

View File

@ -117,7 +117,7 @@ public class ProcessBomServiceImpl implements ProcessBomService {
// 插入子表
if(createReqVO.getProcessBomDetails() != null && !createReqVO.getProcessBomDetails().isEmpty())
createProcessBomDetailList(processBom.getId(), createReqVO.getProcessBomDetails(),0);
createProcessBomDetailList(processBom.getCode() == null ? "":processBom.getCode(),processBom.getId(), createReqVO.getProcessBomDetails(),0);
createReqVO.setId(processBom.getId());
// 返回
return processBom.getId();
@ -357,6 +357,7 @@ public class ProcessBomServiceImpl implements ProcessBomService {
@Override
@Transactional(rollbackFor = Exception.class)
public void updateProcessBom(ProcessBomSaveReqVO updateReqVO) {
// 校验存在
validateProcessBomExists(updateReqVO.getId());
// 提交的时候 明细不容许为空
@ -676,12 +677,14 @@ public class ProcessBomServiceImpl implements ProcessBomService {
}else{
updateObj.setBomStatus(ProcessBomStatusEnum.valueOf(updateReqVO.getActive()).getCode());
}
if (updateReqVO.getProjectSubCode() != null){
updateObj.setCode("BOM-"+updateReqVO.getProjectSubCode() );
}
processBomMapper.updateById(updateObj);
// 更新子表
updateProcessBomDetailList(updateReqVO.getId(), updateReqVO.getProcessBomDetails());
updateProcessBomDetailList(updateObj.getCode() == null ? "": updateObj.getCode(),updateReqVO.getId(), updateReqVO.getProcessBomDetails());
}
@Override
@ -753,7 +756,7 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<ProcessBomDetailDO> list = new ArrayList<>();
// List<ProcessBomDetailDO> processBomDetailDOS = processBomDetailMapper.selectStandardListByBomId(bomId);
//这一部分是标准件含id的是有库存的
list.addAll(processBomDetailMapper.selectStandardListByBomId(bomId));
list.addAll(processBomDetailMapper.selectStandardListByBomId20250609(bomId));
// Map<Long, List<ProcessBomDetailDO>> standardGroupByMatId = processBomDetailDOS.stream().collect(Collectors.groupingBy(vo -> vo.getMaterialId() == null ? -1 : vo.getMaterialId()));
//查非标准件的
@ -984,7 +987,7 @@ public class ProcessBomServiceImpl implements ProcessBomService {
public void updateProcessBomDetail(ProcessBomDetailDO processBomDetailDO){
processBomDetailMapper.updateById(processBomDetailDO);
}
private void createProcessBomDetailList(Long bomId, List<ProcessBomDetailDO> list,Integer num) {
private void createProcessBomDetailList(String bomCode,Long bomId, List<ProcessBomDetailDO> list,Integer num) {
LocalDateTime now = LocalDateTime.now();
/*list.forEach(o -> {o.setBomId(bomId);o.setUpdateTimes(now);}
);*/
@ -992,6 +995,7 @@ public class ProcessBomServiceImpl implements ProcessBomService {
for (ProcessBomDetailDO originalObj : list) {
originalObj.setBomId(bomId);
originalObj.setBomBlueprintNo(bomCode+"-"+originalObj.getBlueprintNo());
originalObj.setUpdateTimes(now);
if (originalObj.getId()!= null ) {
originalObj.setBomType(4);
@ -1036,8 +1040,8 @@ public class ProcessBomServiceImpl implements ProcessBomService {
}
}
private void updateProcessBomDetailList(Long bomId, List<ProcessBomDetailDO> list) {
createProcessBomDetailList(bomId, list,1);
private void updateProcessBomDetailList(String bomCode,Long bomId, List<ProcessBomDetailDO> list) {
createProcessBomDetailList(bomCode,bomId, list,1);
}
public HashMap<String,String> getUnitDictData(){

View File

@ -27,6 +27,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumber
import com.chanko.yunxi.mes.module.heli.dal.mysql.bdgzsomthing.bdgzsomthingMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.orderys.OrderYsMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
@ -90,7 +91,6 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Resource
private FileService fileService;
@Resource
private AdminUserApi userApi;
@Resource
@ -297,6 +297,8 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
serialNumberService.updateSerialNumber(serialNumberDO);
}
updateObj.setOrderStatus(ProjectOrderStatusEnum.valueOf(updateReqVO.getActive()).getCode());
projectOrderMapper.updateById(updateObj);
updateReqVO.setOrderStatus(updateObj.getOrderStatus());

View File

@ -31,7 +31,8 @@
<el-col :span="24">
<el-form-item label="项目负责人" prop="projectOwner">
<el-select class="!w-265px" v-model="formData.projectOwner" filterable disabled>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username + ' '+ dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
@ -41,7 +42,8 @@
<el-col :span="24">
<el-form-item label="是否要工艺" prop="hasCraft">
<el-radio-group v-model="formData.hasCraft">
<el-radio disabled v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" :key="dict.value"
<el-radio
disabled v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" :key="dict.value"
:label="dict.value">
{{ dict.label }}
</el-radio>
@ -53,7 +55,8 @@
<el-col :span="24">
<el-form-item label="计划编制人" prop="editor">
<el-select class="!w-265px" v-model="formData.editor" filterable disabled>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username + ' '+ dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
@ -62,7 +65,8 @@
<el-row>
<el-col :span="24">
<el-form-item label="计划编制日期" prop="editorDate">
<el-date-picker disabled class="!w-265px" v-model="formData.editorDate" type="date" value-format="x"
<el-date-picker
disabled class="!w-265px" v-model="formData.editorDate" type="date" value-format="x"
placeholder="计划编制日期" />
</el-form-item>
</el-col>
@ -70,7 +74,8 @@
<el-row>
<el-col :span="80">
<el-form-item label="备注" prop="description">
<el-input disabled class="!w-713px" type="textarea" v-model="formData.description" show-word-limit
<el-input
disabled class="!w-713px" type="textarea" v-model="formData.description" show-word-limit
maxlength="200" />
</el-form-item>
</el-col>
@ -96,7 +101,8 @@
<el-col :span="24">
<el-form-item label="所属业务线" prop="businessLine">
<el-select class="!w-265px" v-model="formData.businessLine" disabled>
<el-option disabled v-for="dict in getStrDictOptions(DICT_TYPE.HELI_BUSINESS_LINE)" :key="dict.value"
<el-option
disabled v-for="dict in getStrDictOptions(DICT_TYPE.HELI_BUSINESS_LINE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@ -106,7 +112,8 @@
<el-col :span="24">
<el-form-item label="工艺负责人" prop="craftOwner">
<el-select class="!w-265px" v-model="formData.craftOwner" filterable disabled>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username + ' '+ dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
@ -116,7 +123,8 @@
<el-col :span="24">
<el-form-item label="计划审核人" prop="auditor">
<el-select class="!w-265px" v-model="formData.auditor" filterable disabled>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username + ' '+ dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
@ -125,7 +133,8 @@
<el-row>
<el-col :span="24">
<el-form-item label="计划审核日期" prop="auditDate">
<el-date-picker disabled class="!w-265px" v-model="formData.auditDate" type="date" value-format="x"
<el-date-picker
disabled class="!w-265px" v-model="formData.auditDate" type="date" value-format="x"
placeholder="计划审核日期" />
</el-form-item>
</el-col>
@ -137,7 +146,8 @@
<el-col :span="24">
<el-form-item label="项目状态" prop="projectStatus">
<el-select v-model="formData.projectStatus" placeholder="项目状态" clearable class="!w-265px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_STATUS)"
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_STATUS)"
:key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@ -146,7 +156,8 @@
<el-row>
<el-col :span="24">
<el-form-item label="项目开始日期" prop="projectStartTime">
<el-date-picker class="!w-265px" v-model="formData.projectStartTime" type="date" value-format="x"
<el-date-picker
class="!w-265px" v-model="formData.projectStartTime" type="date" value-format="x"
placeholder="项目开始日期" disabled />
</el-form-item>
</el-col>
@ -155,7 +166,8 @@
<el-col :span="24">
<el-form-item label="性质" prop="property">
<el-select class="!w-265px" v-model="formData.property" placeholder="下拉选择" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)" :key="dict.value"
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@ -164,7 +176,8 @@
<el-row>
<el-col :span="24">
<el-form-item label="工艺开始日期" prop="craftStartTime">
<el-date-picker disabled class="!w-265px" v-model="formData.craftStartDate" type="date" value-format="x"
<el-date-picker
disabled class="!w-265px" v-model="formData.craftStartDate" type="date" value-format="x"
placeholder="工艺开始日期" />
</el-form-item>
</el-col>
@ -173,7 +186,8 @@
<el-col :span="24">
<el-form-item label="计划批准人" prop="approver">
<el-select class="!w-265px" v-model="formData.approver" filterable >
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username + ' '+ dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
@ -182,7 +196,8 @@
<el-row>
<el-col :span="24">
<el-form-item label="计划批准日期" prop="approveDate">
<el-date-picker disabled class="!w-265px" v-model="formData.approveDate" type="date" value-format="x"
<el-date-picker
disabled class="!w-265px" v-model="formData.approveDate" type="date" value-format="x"
placeholder="计划批准日期" />
</el-form-item>
</el-col>
@ -191,7 +206,8 @@
<el-col :span="24">
<el-form-item label="生产状态" prop="status">
<el-select v-model="formData.status" placeholder="生产状态" clearable class="!w-265px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PLAN_STATUS)" :key="dict.value"
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PLAN_STATUS)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@ -210,7 +226,8 @@
<el-row>
<el-col :span="24">
<el-form-item label="项目结束日期" prop="projectEndTime">
<el-date-picker class="!w-265px" v-model="formData.projectEndTime" type="date" value-format="x"
<el-date-picker
class="!w-265px" v-model="formData.projectEndTime" type="date" value-format="x"
placeholder="项目结束日期" disabled />
<span style="position: absolute; left: 0; top: 30px" v-if="formData.projectStartTime && formData.projectEndTime">{{
' 共计' +
@ -227,7 +244,8 @@
<el-col :span="24">
<el-form-item label="是否紧急" prop="isUrgency">
<el-select class="!w-265px" v-model="formData.isUrgency" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" :key="dict.value"
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
@ -236,7 +254,8 @@
<el-row>
<el-col :span="24">
<el-form-item label="工艺结束日期" prop="craftEndTime">
<el-date-picker disabled class="!w-265px" v-model="formData.craftEndDate" type="date" value-format="x"
<el-date-picker
disabled class="!w-265px" v-model="formData.craftEndDate" type="date" value-format="x"
placeholder="工艺结束日期" />
</el-form-item>
</el-col>
@ -244,7 +263,8 @@
<el-row>
<el-col :span="24">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker class="!w-265px" v-model="formData.createTime" type="date" value-format="x"
<el-date-picker
class="!w-265px" v-model="formData.createTime" type="date" value-format="x"
placeholder="创建时间" disabled />
</el-form-item>
</el-col>
@ -274,13 +294,18 @@
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">子项目信息</span>
<el-button style="margin-left: 3%" type="warning" size="large" @click="printfClick">打印</el-button>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-form ref="projectOrderSubFormRef" :model="formData.projectOrderSubs" :rules="subFormRules"
<el-card class="hl-incard">
<el-form
ref="projectOrderSubFormRef" :model="formData.projectOrderSubs" :rules="subFormRules"
v-loading="subFormLoading" label-width="0">
<el-table :data="formData.projectOrderSubs" :show-overflow-tooltip="true" class="hl-table">
<el-table :data="formData.projectOrderSubs" @selection-change="handleSelectionChange" :show-overflow-tooltip="true" class="hl-table">
<el-table-column
type="selection"
width="55"/>
<el-table-column label="序号" type="index" width="80" fixed />
<el-table-column prop="name" label="子项目名称" min-width="120" align="center" fixed/>
<el-table-column prop="projectSubShortName" min-width="180" align="center" >
@ -307,7 +332,8 @@
<template #default="scope">
<el-form-item :prop="`${scope.$index}.equipId`" class="mb-0px!">
<el-select disabled v-model="scope.row.equipId" clearable placeholder="下拉选择" style="width: 100%">
<el-option v-for="dict in scope.row.equipList" :key="dict.id" :label="dict.name"
<el-option
v-for="dict in scope.row.equipList" :key="dict.id" :label="dict.name"
:value="dict.id" />
</el-select>
</el-form-item>
@ -324,7 +350,8 @@
<template #header>毛坯结束日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.blankDate`" class="mb-0px!">
<el-date-picker disabled class="!w-265px" v-model="row.blankDate" type="date" value-format="x"
<el-date-picker
disabled class="!w-265px" v-model="row.blankDate" type="date" value-format="x"
placeholder="毛坯结束日期" />
</el-form-item>
</template>
@ -334,7 +361,8 @@
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.blankOwner`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.blankOwner" filterable disabled>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username + ' '+ dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
@ -345,7 +373,8 @@
<template #header>2D结束日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.twoDimDate`" class="mb-0px!">
<el-date-picker disabled class="!w-265px" v-model="row.twoDimDate" type="date" value-format="x"
<el-date-picker
disabled class="!w-265px" v-model="row.twoDimDate" type="date" value-format="x"
placeholder="2D结束日期" />
</el-form-item>
</template>
@ -355,7 +384,8 @@
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.twoDimOwner`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.twoDimOwner" filterable disabled>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username + ' '+ dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
@ -366,7 +396,8 @@
<template #header>3D结束日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.threeDimDate`" class="mb-0px!">
<el-date-picker disabled class="!w-265px" v-model="row.threeDimDate" type="date" value-format="x"
<el-date-picker
disabled class="!w-265px" v-model="row.threeDimDate" type="date" value-format="x"
placeholder="3D结束日期" />
</el-form-item>
</template>
@ -376,7 +407,8 @@
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.threeDimOwner`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.threeDimOwner" filterable disabled>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username + ' '+ dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
@ -406,7 +438,8 @@
<el-table-column min-width="150" label="开始日期" align="center">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.startDate`" class="mb-0px!">
<el-date-picker disabled v-model="row.startDate" type="date" value-format="x" style="width: 100%;"
<el-date-picker
disabled v-model="row.startDate" type="date" value-format="x" style="width: 100%;"
placeholder="开始日期" />
</el-form-item>
</template>
@ -415,7 +448,8 @@
<template #header> 结束日期 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.endDate`" class="mb-0px!">
<el-date-picker disabled style="width: 100%;" v-model="row.endDate" type="date" value-format="x"
<el-date-picker
disabled style="width: 100%;" v-model="row.endDate" type="date" value-format="x"
placeholder="结束日期" />
</el-form-item>
</template>
@ -461,11 +495,12 @@
</el-row>
</el-card>
</el-form>
<div class="text-center hl-footer">
<div class="hl-footer text-center">
<el-button @click="() => router.back()" size="large"> </el-button>
</div>
</el-card>
<ProjectOrderDialog ref="projectOrderDialog" @success="handleSelectedProjectOrder" />
<printDialog ref="printref" :minAmount="minAmount" :formData="formData" />
</template>
<script setup lang="ts">
import { inject } from 'vue'
@ -474,6 +509,7 @@ import {betweenDay, formatDate, dateFormatter, betweenDay1} from '@/utils/format
import { Search, Plus } from '@element-plus/icons-vue'
import ProjectOrderDialog from '@/views/heli/plan/projectOrderDialog.vue'
import * as PlanApi from '@/api/heli/plan'
import printDialog from './printDialog.vue'
import * as PlanSubApi from '@/api/heli/plansub'
import * as ProjectOrderApi from '@/api/heli/projectorder'
import * as CustomerApi from '@/api/heli/customer'
@ -487,7 +523,7 @@ const message = useMessage() // 消息弹窗
const { query } = useRoute()
const router = useRouter()
const reload = inject('reload')
const printref = ref()
const formLoading = ref(false) // 12
const formRef = ref() //
const formData = ref({
@ -521,6 +557,29 @@ const projectOrderDialog = ref()
const openProjectOrderDialog = () => {
projectOrderDialog.value?.open()
}
const clickItem = ref([])
const handleSelectionChange = (val) => {
clickItem.value = val;
};
const printfClick = () =>{
if(clickItem.value == null || clickItem.value.length == 0){
message.error("至少选择一项后,打印!")
return
}
for(var i = 0 ; i < clickItem.value.length ; i ++ ){
var item = clickItem.value[i];
if(item.id == null ){
message.error("请先保存后再打印!");
return
}
if(item.projectSubShortName == null || item.projectSubShortName == ''){
message.error(item.projectSubName == null ?'子项目简码不得为空':item.projectSubName + "的子项目简码不得为空!")
return;
}
}
printref.value.open(clickItem.value)
}
const handleSelectedProjectOrder = (arr: ProjectOrderVO[]) => {
if (arr) {
formData.value.projectCode = arr.code

View File

@ -37,7 +37,8 @@
</el-select> -->
<!-- <UserSelect v-model="formData.projectOwner" @update:new-value="handleSelectedUser1" class="!w-265px"/>-->
<el-select class="!w-265px" v-model="formData.projectOwner" clearable filterable>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
@ -312,7 +313,9 @@ class="!w-265px" v-model="formData.changeEndTime" type="date" value-format="x"
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">子项目信息</span>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">子项目信息</span>
<el-button style="margin-left: 3%" type="warning" size="large" @click="printfClick">打印</el-button>
</template>
<el-row>
<el-col>
@ -320,7 +323,10 @@ class="!w-265px" v-model="formData.changeEndTime" type="date" value-format="x"
<el-form
ref="subFormRef" :model="formData.projectPlanSubs" :rules="subFormRules"
v-loading="subFormLoading" label-width="0">
<el-table :show-overflow-tooltip="true" :data="formData.projectPlanSubs" class="hl-table">
<el-table :show-overflow-tooltip="true" @selection-change="handleSelectionChange" :data="formData.projectPlanSubs" class="hl-table">
<el-table-column
type="selection"
width="55"/>
<el-table-column label="序号" align="center" type="index" width="70px" fixed />
<el-table-column prop="name" label="子项目名称" min-width="140px" align="center" fixed />
<el-table-column prop="projectSubShortName" min-width="130px" align="center">
@ -384,7 +390,8 @@ class="!w-265px" v-model="row.blankDate" type="date" value-format="x"
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.blankOwner`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.blankOwner" clearable @update:new-value="handleSelectedUser6($index,$event)" @change="handleDateChange($index, row.startBlankDate,row.blankDate,'1',row.blankOwner,row.id)" filterable>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<!-- <UserSelect v-model="row.blankOwner" @update:new-value="handleSelectedUser6($index,$event)" @change="handleDateChange($index, row.startBlankDate,row.blankDate,'1',row.blankOwner,row.id)" class="!w-265px"/>-->
@ -421,7 +428,8 @@ class="!w-265px" v-model="row.twoDimDate" type="date" value-format="x"
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.twoDimOwner`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.twoDimOwner" clearable @update:new-value="handleSelectedUser7($index,$event)" @change="handleDateChange($index, row.startTwoDimDate,row.twoDimDate,'2',row.twoDimOwner,row.id)" filterable>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<!-- <UserSelect v-model="row.twoDimOwner" @update:new-value="handleSelectedUser7($index,$event)" @change="handleDateChange($index, row.startTwoDimDate,row.twoDimDate,'2',row.twoDimOwner,row.id)" class="!w-265px"/>-->
@ -454,7 +462,8 @@ class="!w-265px" v-model="row.threeDimDate" type="date" value-format="x"
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.threeDimOwner`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.threeDimOwner" clearable @update:new-value="handleSelectedUser8($index,$event)" @change="handleDateChange($index, row.startThreeDimDate,row.threeDimDate,'3',row.threeDimOwner,row.id)" filterable>
<el-option v-for="dict in userInit" :key="dict.id"
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<!-- <UserSelect v-model="row.threeDimOwner" @update:new-value="handleSelectedUser8($index,$event)" @change="handleDateChange($index, row.startThreeDimDate,row.threeDimDate,'3',row.threeDimOwner,row.id)" class="!w-265px"/>-->
@ -521,35 +530,43 @@ style="width: 100%" v-model="row.endDate" type="date" value-format="x"
<!-- :label="dict.username+' '+dict.nickname" :value="dict.id" />-->
<!-- </el-select>-->
<el-select style="width: 100%" v-model="row.owner" clearable filterable @update:new-value="handleSelectedUser9($index,$event)" v-if="row.name=='母模/毛坯'">
<el-option v-for="dict in mergedArray" :key="dict.id"
<el-option
v-for="dict in mergedArray" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<el-select style="width: 100%" v-model="row.owner" clearable filterable @update:new-value="handleSelectedUser9($index,$event)" v-if="row.name=='粗,精加工'">
<el-option v-for="dict in mergedArray1" :key="dict.id"
<el-option
v-for="dict in mergedArray1" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<el-select style="width: 100%" v-model="row.owner" clearable filterable @update:new-value="handleSelectedUser9($index,$event)" v-if="row.name=='热处理'">
<el-option v-for="dict in mergedArray2" :key="dict.id"
<el-option
v-for="dict in mergedArray2" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<el-select style="width: 100%" v-model="row.owner" clearable filterable @update:new-value="handleSelectedUser9($index,$event)" v-if="row.name=='电火花'">
<el-option v-for="dict in mergedArray3" :key="dict.id"
<el-option
v-for="dict in mergedArray3" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<el-select style="width: 100%" v-model="row.owner" clearable filterable @update:new-value="handleSelectedUser9($index,$event)" v-if="row.name=='打孔/抛光'">
<el-option v-for="dict in mergedArray4" :key="dict.id"
<el-option
v-for="dict in mergedArray4" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<el-select style="width: 100%" v-model="row.owner" clearable filterable @update:new-value="handleSelectedUser9($index,$event)" v-if="row.name=='装配'">
<el-option v-for="dict in mergedArray5" :key="dict.id"
<el-option
v-for="dict in mergedArray5" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<el-select style="width: 100%" v-model="row.owner" clearable filterable @update:new-value="handleSelectedUser9($index,$event)" v-if="row.name=='预验收'">
<el-option v-for="dict in mergedArray6" :key="dict.id"
<el-option
v-for="dict in mergedArray6" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
<el-select style="width: 100%" v-model="row.owner" clearable filterable @update:new-value="handleSelectedUser9($index,$event)" v-if="row.name=='检验'">
<el-option v-for="dict in mergedArray7" :key="dict.id"
<el-option
v-for="dict in mergedArray7" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
@ -598,13 +615,14 @@ style="width: 100%" v-model="row.endDate" type="date" value-format="x"
</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" -->
<printDialog ref="printref" :minAmount="minAmount" :formData="formData" />
</template>
<script setup lang="ts">
import { inject } from 'vue'
import { getIntDictOptions, getStrDictOptions, getDictLabel, DICT_TYPE } from '@/utils/dict'
import {betweenDay, formatDate, dateFormatter, betweenDay1} from '@/utils/formatTime'
import printDialog from './printDialog.vue'
import { Search, Plus } from '@element-plus/icons-vue'
import ProjectOrderDialog from '@/views/heli/plan/projectOrderDialog.vue'
import ProjectSubDialog from '@/views/heli/plan/projectSubDialog.vue'
@ -619,7 +637,7 @@ import { getOperateLogPage } from '@/api/system/operatelog'
import UserSelect from '@/views/heli/hlvuestyle/userSelect.vue'
import EquipSelect from '@/views/heli/hlvuestyle/equipSelect.vue'
import * as ProjectLeaderApi from "@/api/heli/projectleader";
const printref = ref()
const { t } = useI18n() //
const message = useMessage() //
const { query } = useRoute()
@ -696,6 +714,10 @@ const projectOrderDialog = ref()
const openProjectOrderDialog = () => {
projectOrderDialog.value?.open()
}
const clickItem = ref([])
const handleSelectionChange = (val) => {
clickItem.value = val;
};
const handleSelectedProjectOrder = (arr: ProjectOrderVO[]) => {
if (arr) {
formData.value.projectCode = arr.code
@ -1055,6 +1077,25 @@ const getOwnderListss = async (index: number) => {
dialogVisible.value = true;
}
};
const printfClick = () =>{
if(clickItem.value == null || clickItem.value.length == 0){
message.error("至少选择一项后,打印!")
return
}
for(var i = 0 ; i < clickItem.value.length ; i ++ ){
var item = clickItem.value[i];
if(item.id == null ){
message.error("请先保存后再打印!");
return
}
if(item.projectSubShortName == null || item.projectSubShortName == ''){
message.error(item.projectSubName == null ?'子项目简码不得为空':item.projectSubName + "的子项目简码不得为空!")
return;
}
}
printref.value.open(clickItem.value)
}
/* const getOwnderListss = async (index: number) => {
//

View File

@ -0,0 +1,161 @@
<template>
<Dialog
title="打印预览"
v-model="dialogVisible"
width="1000"
top="0%"
:before-close="(doClose) => beforeDialogClose(doClose)"
>
<el-button @click="outopen" style="float: right;margin-right: 0.5%;">取消</el-button>
<el-button @click="onPrint" type="primary" style="float: right;margin-right: 1%;">打印</el-button>
<!-- 打印预览 -->
<div class="print-wrap page" ref="print">
<div id="qrCodeContainer"></div>
</div>
<template #footer>
<!-- 打印 -->
<el-button @click="onPrint" type="primary">打印</el-button>
<el-button @click="outopen">取消</el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
// import { ref, reactive } from 'vue'
// import { betweenDay, dateFormatter, formatDate } from '@/utils/formatTime'
import QRCode from 'qrcode'
// import * as ProjectOrderApi from '@/api/biz/projectorder'
const dialogVisible = ref(false) //
let clauseId = null;
const startPageNum=ref(0);
const endPageNum=ref(0);
const onPrint = () => {
// dom
const printNode = document.querySelector('.print-wrap')
if (!printNode) return
//
const newIframe: any = document.createElement('iframe')
newIframe.setAttribute(
'style',
'width:0px;height:0px;position:absolute;left:-9999px;top:-9999px;'
)
newIframe.setAttribute('align', 'center')
document.body.appendChild(newIframe)
//
let doc: any = null
doc = newIframe.contentWindow.document
doc.write(`
<style type="text/css">
/* 浏览器打印基本样式 */
@page {
size: 70mm 200mm;
margin: 0;
height: 200mm;
}
@media print {
.page {
margin: 0;
display: block;
}
.qr-page {
width: 70mm;
height: 200mm;
margin: 0;
padding: 0;
}
}
</style>
<div>
${printNode.innerHTML}
</div>`)
console.log(clauseId)
doc.close()
//
setTimeout(() => {
newIframe.contentWindow.focus()
newIframe.contentWindow.print()
document.body.removeChild(newIframe) //
dialogVisible.value = false
}, 100)
// ProjectOrderApi.updatePrintStatus({clauseId:clauseId,printEmp:'',startPageNum:startPageNum.value,endPageNum:endPageNum.value})
}
// / Dialog
function beforeDialogClose(doClose: (shouldClose: boolean) => void): void {
outopen()
}
//
const outopen = () => {
dialogVisible.value = false
}
const printCodeName = ref([])
const datavals = ref([])
/** 打开弹窗 */
const specarr: any = ref([])
const cnenList: any = ref([])
const open = async (vals) => {
console.log("打印预览传输的信息")
console.log(vals)
specarr.value = []
//
// cnenList.value = await ProjectOrderApi.getcnenList()
console.log(vals)
datavals.value = []
printCodeName.value = []
vals.forEach((item) => {
const row = {
projectSubShortName: item.projectSubShortName ,
}
const newName = `${item.projectSubShortName}`
const row1 = {
name: newName
}
printCodeName.value.push(row1)
datavals.value.push(row)
})
dialogVisible.value = true
await Promise.all(
printCodeName.value.map(async (item) => {
const qrCodeData = await QRCode.toDataURL(item.name)
const qrCodeElement = document.getElementById('qrCodeContainer')
if (qrCodeElement) {
(qrCodeElement.innerHTML +=
`<div class="page qr-page">
<div class="qr-code-container" style="padding:0mm;font-size:15px !important;font-weight:700;position: relative; height: 200mm">
<div style="text-align:center;"> <img src="${qrCodeData}" width="100%" alt="QR Code"/></div>
<div style="margin:0 2mm;text-align:left;font-size:19px !important;" >
<span style="display:block;font-size:17px !important;">子项目编码${item.name}</span>
</div>
</div>
</div>`)
}
})
)
}
// <p>${datavals.value[0]?.projectSubName},${datavals.value[0].spec},${datavals.value[0].sort},${datavals.value[0].amount}</p>
// <div class="qr-code-name">${item}</div>
defineExpose({ open }) // open
</script>
<style scoped lang="scss">
.page {
width: 70mm;
min-height: 200mm;
margin: auto;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}
/*
A4的大小21cm*29.7cmwidth:794px;
单位换算1 inch = 2.54 cm 1mm = 96 px 1 cm = 37.79528 px*/
</style>

View File

@ -145,11 +145,11 @@
<el-card class="hl-incard">
<el-form ref="subFormRef" :model="formData.bomDetails" :rules="subFormRules" v-loading="formLoading" label-width="0" >
<el-table :row-class-name="tableRowClassName" :data="formData.bomDetails" @selection-change="handleSelectionChange">
<el-table-column type="selection" min-width="50px" >
<!-- <el-table-column type="selection" min-width="50px" >
<template #default="{ row}">
<el-checkbox v-model="row.chkboxEnable"/>
</template>
</el-table-column>
</el-table-column> -->
<!-- <el-table-column type="selection" width="55" />-->
<el-table-column label="序号" type="index" min-width="50px" />
<el-table-column label="变更次数" prop="bomEditStatus" max-width="60px" align="center">

View File

@ -102,7 +102,7 @@
<el-row>
<el-col v-if="!detailDisabled">
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem">新增</el-button>
<el-button
<el-button
type="success"
size="large"
@ -111,6 +111,7 @@
>
<Icon icon="ep:upload" /> 导入BOM
</el-button>
<el-button type="warning" size="large" @click="printfClick">打印</el-button>
</el-col>
<el-col>
<el-card class="hl-incard">
@ -119,10 +120,10 @@
v-loading="subFormLoading" label-width="0">
<el-table
:data="formData.processBomDetails" class="hl-table" @selection-change="handleSelectionChange" :row-class-name="tableRowClassName"
:style="{ height: formData.processBomDetails && formData.processBomDetails.length > 9 ? '540px' : '' }">
<!-- <el-table-column
:style="{ height: formData.processBomDetails && formData.processBomDetails.length > 9 ? '540px' : '' }" >
<el-table-column
type="selection"
width="55"/> -->
width="55"/>
<el-table-column label="序号" type="index" width="80" fixed="left"/>
<el-table-column label="是否标准件" prop="type" min-width="200" fixed="left">
<template #default="{ row, $index }">
@ -143,10 +144,10 @@
<template #header><span class="hl-table_header">*</span>零件名称</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.materialName`" :rules="subFormRules.materialName" class="mb-0px!">
<MaterialSelect
<!-- <MaterialSelect
:disabled="getDisable(row.bomEditStatus)" v-if="row.type == '1'" v-model="row.materialId"
@update:new-value="(val) => { handleSelectedMaterial(row, val); }" />
<el-input :disabled="getDisable(row.bomEditStatus)" v-else v-model="row.materialName" />
@update:new-value="(val) => { handleSelectedMaterial(row, val); }" /> -->
<el-input :disabled="getDisable(row.bomEditStatus)" v-model="row.materialName" />
</el-form-item>
</template>
</el-table-column>
@ -205,8 +206,8 @@
<template #header> <span class="hl-table_header">*</span>系统单位</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unit`" :rules="subFormRules.unit" class="mb-0px!">
<span v-if="row.type == '1'">{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, row.unit) }}</span>
<el-select :disabled="getDisable(row.bomEditStatus)" v-else v-model="row.unit" clearable class="!w-250px">
<!-- <span v-if="row.type == '1'">{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, row.unit) }}</span>-->
<el-select :disabled="getDisable(row.bomEditStatus)" v-model="row.unit" clearable class="!w-250px">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_MATERIAL_UNIT)" :key="dict.value"
:label="dict.label" :value="dict.value" />
@ -361,6 +362,7 @@
</el-form>
</el-card>
<BomImportForm ref="importFormRef" @success="getList" />
<printDialog ref="printref" :minAmount="minAmount" :formData="formData" />
</template>
<script setup lang="ts">
import { DICT_TYPE, getDictLabel, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
@ -376,7 +378,7 @@ import * as ProcessBomApi from '@/api/heli/processbom'
import * as storageApi from '@/api/heli/storage'
import { getOperateLogPage } from '@/api/system/operatelog'
import { deleteProcessBomDetail } from "@/api/heli/processbom";
import printDialog from './printDialog.vue'
import { UploadUserFile } from 'element-plus'
import { getAccessToken, getTenantId } from '@/utils/auth'
import { deleteFileLogic, downloadFile, getFilePage } from '@/api/infra/file'
@ -397,6 +399,7 @@ const currentId = toRef(commonStore.getStore('id'))
const formLoading = ref(false)
const dialogTitle = ref('')
const detailDisabled = ref(false)
const printref = ref()
const formData = ref({
id: undefined,
code: undefined,
@ -623,8 +626,10 @@ const subFormRules = reactive({
blueprintNo: [{ required: true, message: '图号不能为空', trigger: 'blur' }],
spec: [{ required: true, message: '规格型号不能为空', trigger: 'blur' }]
})
const clickItem = ref([])
const handleSelectionChange = (val) => {
clickItem.value = val;
val.forEach((item) => {
const target = formData.value.processBomDetails.find((dataItem) => dataItem === item);
if (target) {
@ -755,7 +760,29 @@ const onDeleteItem = async (index) => {
let id = deletedItems[0].id;
if (id) await ProcessBomApi.deleteProcessBomDetail(id)
}
const printfClick = () =>{
if(formData.value.code == null || formData.value.code == ''){
message.error("当前BOM编码为空请完善子项目简码后重试!")
return
}
if(clickItem.value == null || clickItem.value.length == 0){
message.error("至少选择一项后,打印!")
return
}
for(var i = 0 ; i < clickItem.value.length ; i ++ ){
var item = clickItem.value[i];
if(item.id == null ){
message.error("请先保存后再打印!");
return
}
if(item.blueprintNo == null || item.blueprintNo == ''){
message.error(item.materialName == null ?'物料明细行图号不得为空':item.materialName + "图号不得为空!")
return;
}
}
printref.value.open(formData.value.code,clickItem.value)
}
const onChangeType = (row, val) => {
if (val==2){
row.spec = "A"

View File

@ -0,0 +1,160 @@
<template>
<Dialog
title="打印预览"
v-model="dialogVisible"
width="1000"
top="0%"
:before-close="(doClose) => beforeDialogClose(doClose)"
>
<el-button @click="outopen" style="float: right;margin-right: 0.5%;">取消</el-button>
<el-button @click="onPrint" type="primary" style="float: right;margin-right: 1%;">打印</el-button>
<!-- 打印预览 -->
<div class="print-wrap page" ref="print">
<div id="qrCodeContainer"></div>
</div>
<template #footer>
<!-- 打印 -->
<el-button @click="onPrint" type="primary">打印</el-button>
<el-button @click="outopen">取消</el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
// import { ref, reactive } from 'vue'
// import { betweenDay, dateFormatter, formatDate } from '@/utils/formatTime'
import QRCode from 'qrcode'
// import * as ProjectOrderApi from '@/api/biz/projectorder'
const dialogVisible = ref(false) //
let clauseId = null;
const startPageNum=ref(0);
const endPageNum=ref(0);
const onPrint = () => {
// dom
const printNode = document.querySelector('.print-wrap')
if (!printNode) return
//
const newIframe: any = document.createElement('iframe')
newIframe.setAttribute(
'style',
'width:0px;height:0px;position:absolute;left:-9999px;top:-9999px;'
)
newIframe.setAttribute('align', 'center')
document.body.appendChild(newIframe)
//
let doc: any = null
doc = newIframe.contentWindow.document
doc.write(`
<style type="text/css">
/* 浏览器打印基本样式 */
@page {
size: 70mm 200mm;
margin: 0;
height: 200mm;
}
@media print {
.page {
margin: 0;
display: block;
}
.qr-page {
width: 70mm;
height: 200mm;
margin: 0;
padding: 0;
}
}
</style>
<div>
${printNode.innerHTML}
</div>`)
console.log(clauseId)
doc.close()
//
setTimeout(() => {
newIframe.contentWindow.focus()
newIframe.contentWindow.print()
document.body.removeChild(newIframe) //
dialogVisible.value = false
}, 100)
// ProjectOrderApi.updatePrintStatus({clauseId:clauseId,printEmp:'',startPageNum:startPageNum.value,endPageNum:endPageNum.value})
}
// / Dialog
function beforeDialogClose(doClose: (shouldClose: boolean) => void): void {
outopen()
}
//
const outopen = () => {
dialogVisible.value = false
}
const printCodeName = ref([])
const datavals = ref([])
/** 打开弹窗 */
const specarr: any = ref([])
const cnenList: any = ref([])
const open = async (bomCode,vals) => {
console.log("打印预览传输的信息")
specarr.value = []
//
// cnenList.value = await ProjectOrderApi.getcnenList()
console.log(vals)
datavals.value = []
printCodeName.value = []
vals.forEach((item) => {
const row = {
blueprintNo: item.blueprintNo ,
}
const newName = `${bomCode}-${item.blueprintNo}`
const row1 = {
name: newName
}
printCodeName.value.push(row1)
datavals.value.push(row)
})
dialogVisible.value = true
await Promise.all(
printCodeName.value.map(async (item) => {
const qrCodeData = await QRCode.toDataURL(item.name)
const qrCodeElement = document.getElementById('qrCodeContainer')
if (qrCodeElement) {
(qrCodeElement.innerHTML +=
`<div class="page qr-page">
<div class="qr-code-container" style="padding:0mm;font-size:15px !important;font-weight:700;position: relative; height: 200mm">
<div style="text-align:center;"> <img src="${qrCodeData}" width="100%" alt="QR Code"/></div>
<div style="margin:0 2mm;text-align:left;font-size:19px !important;" >
<span style="display:block;font-size:17px !important;">图纸编号${item.name}</span>
</div>
</div>
</div>`)
}
})
)
}
// <p>${datavals.value[0]?.projectSubName},${datavals.value[0].spec},${datavals.value[0].sort},${datavals.value[0].amount}</p>
// <div class="qr-code-name">${item}</div>
defineExpose({ open }) // open
</script>
<style scoped lang="scss">
.page {
width: 70mm;
min-height: 200mm;
margin: auto;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}
/*
A4的大小21cm*29.7cmwidth:794px;
单位换算1 inch = 2.54 cm 1mm = 96 px 1 cm = 37.79528 px*/
</style>

View File

@ -128,8 +128,9 @@
}
const searchVal = ref('')
// const dataListDefault = ref([])
const handleSearch = async () => {
queryParams.subOrDetailName = searchVal.value;
const handleSearch = async (e) => {
queryParams.subOrDetailName = e.inputValue;
queryParams.pageNo = 1;
isFinish.value = false;
dataList.value = []
@ -140,8 +141,11 @@
<template>
<view class="cont">
<view class="search" v-if="props.orderState == '0,1' ">
<input class="uni-input" v-model="searchVal" placeholder="请输入项目或子项目名称" />
<uni-icons type="search" size="30" class="icons" @click="handleSearch"></uni-icons>
<spring-search-box :showScan="true" :showReset="true" bgColor="#E2F3FF" @input="(e) => handleSearch(e)" placeholderColor="#28A0F8" searchColor="#28A0F8" v-model="searchVal" :mode="3" @change="(e) => handleSearch(e)" placeholder="请输入项目或子项目名称" clearable></spring-search-box>
<!-- <spring-search-box :showScan="true" :showReset="true" bgColor="#E2F3FF" @input="(e) => handleSearch(e)" placeholderColor="#28A0F8" searchColor="#28A0F8" v-model="searchVal" :mode="3" @change="(e) => handleSearch(e)" placeholder="请输入项目或子项目名称"></spring-search-box -->
<!-- <input class="uni-input" v-model="searchVal" placeholder="请输入项目或子项目名称" />
<button><uni-icons type="search" size="30" class="icons" @click="handleSearch"></uni-icons></button> -->
</view>
<scroll-view enable-back-to-top scroll-y class="data-list" refresher-enabled :refresher-triggered="isTriggered"
@refresherrefresh="onRefresherrefresh" @scrolltolower="getListData">
@ -220,6 +224,7 @@
}
.data-list {
height: 90vh;
.item {