BOM二维码
This commit is contained in:
parent
98a9303e0a
commit
88ce02275f
@ -27,7 +27,7 @@ public class PlanTaskBomRespVO {
|
||||
@Schema(description = "负责人")
|
||||
@ExcelProperty("负责人")
|
||||
private String owner;
|
||||
|
||||
private String bomBlueprintNo;
|
||||
@Schema(description = "要求完成日期")
|
||||
@ExcelProperty("要求完成日期")
|
||||
private LocalDateTime requireEndDate;
|
||||
|
@ -58,6 +58,7 @@ public class TaskDispatchSaveReqVO {
|
||||
@Schema(description = "操作类型")
|
||||
@NotBlank(message = "操作类型不能为空")
|
||||
private String active;
|
||||
private String bomBlueprintNo;
|
||||
|
||||
@Schema(description = "操作意见")
|
||||
private String activeOpinion;
|
||||
|
@ -116,6 +116,8 @@ public class PlanDO extends BaseDO {
|
||||
*要求设计结束日期
|
||||
* */
|
||||
private LocalDateTime changeEndTime;
|
||||
private String name;
|
||||
private String brief;
|
||||
/**
|
||||
* 子项目id
|
||||
*/
|
||||
|
@ -45,7 +45,8 @@ public class PlanTaskBomDO extends BaseDO {
|
||||
* 要求完成日期
|
||||
*/
|
||||
private LocalDateTime requireEndDate;
|
||||
|
||||
@TableField(exist = false)
|
||||
private String bomBlueprintNo;
|
||||
@TableField(exist = false)
|
||||
private String materialName;
|
||||
/**材质名称*/
|
||||
|
@ -69,6 +69,7 @@ public class ProcessBomDetailDO extends BaseDO {
|
||||
* 图号
|
||||
*/
|
||||
private String blueprintNo;
|
||||
private String bomBlueprintNo;
|
||||
/**
|
||||
* 数量
|
||||
*/
|
||||
|
@ -37,6 +37,8 @@ public class TaskDispatchDO extends BaseDO {
|
||||
* 编号,唯一
|
||||
*/
|
||||
private String code;
|
||||
private String bomBlueprintNo;
|
||||
|
||||
/**
|
||||
* 派工类型 生产任务|装配任务 PRODUCTION|ASSEMBLE
|
||||
*
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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())
|
||||
|
@ -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(){
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||
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
|
||||
|
@ -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) => {
|
||||
|
||||
//根据行索引获取到编辑行
|
||||
|
161
mes-ui/mes-ui-admin-vue3/src/views/heli/plan/printDialog.vue
Normal file
161
mes-ui/mes-ui-admin-vue3/src/views/heli/plan/printDialog.vue
Normal 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.7cm(width:794px;)。
|
||||
单位换算:1 inch = 2.54 cm 1mm = 96 px 1 cm = 37.79528 px*/
|
||||
</style>
|
@ -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">
|
||||
|
@ -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"
|
||||
|
@ -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.7cm(width:794px;)。
|
||||
单位换算:1 inch = 2.54 cm 1mm = 96 px 1 cm = 37.79528 px*/
|
||||
</style>
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user