element-ui组件使用两个日期选择器,开工时间不能大于竣工时间

在使用Element-UI的日期选择器组件时,为确保开工时间不能超过竣工时间,可以通过设置`picker-options`属性来定义禁用日期的方法。在`pickerOptions1`中设置`disabledDate`为当选择的时间大于竣工时间时禁用,而在`pickerOptions2`中设置`disabledDate`为当选择的时间小于开工时间时禁用。务必使用箭头函数以保留正确的上下文,并注意返回值的逻辑判断,以实现日期的有效限制。

项目场景:

element-ui组件使用两个日期选择器,提出需要的功能需求
保证开工时间不能大于竣工时间
在这里插入图片描述


问题描述

在必填时间项目中,使用的是element-ui日期选择插件,绑定的数据是父组件传递的参数,需要手动配置两个时间之间的规则

	<el-row>
        <el-col :span="12">
          <el-form-item label="开工时间" prop="kgsj">
            <el-date-picker v-model="bhzsqbbjz.kgsj" type="date" placeholder="选择日期时间" :picker-options="pickerOptions1"> </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="竣工时间" prop="jgrq">
            <el-date-picker v-model="bhzsqbbjz.jgrq" type="date" placeholder="选择日期时间" :picker-options="pickerOptions2"> </el-date-picker>
          </el-form-item>
        </el-col>
 	</el-row>

解决方案:

在上面的元素标签中添加:picker-options属性,用来给当前时间日期选择器定义方法,方法如下面的pickerOptions1,pickerOptions2

export default {
  props: {
    bhzsqbbjz: {
      type: Object,
      default: {}
    },
  },
  data() {
    return {
      pickerOptions1: {
        disabledDate: (time) => {
          return this.bhzsqbbjz.jgrq ? time.getTime() > this.bhzsqbbjz.jgrq.getTime() : false //只能选择竣工日期之前的日期
          //返回---结束时间是否有值?   可选时间小于结束时间   :  任意时间都可选
        }
      },
      pickerOptions2: {
        disabledDate: (time) => {
          return this.bhzsqbbjz.kgsj ? time.getTime() < this.bhzsqbbjz.kgsj.getTime() : false //只能选择开工时间之后的日期
          //返回---开始时间是否有值?   可选时间大于开始时间   :  任意时间都可选
        }
      }
    }
  },
}

注意事项:
1、disabledDate: (time)=>{}这里必须是箭头函数,否则找不到this
2、return 返回的值为false时,所有时间都可选,值为true时,所有时间都不可选
3、return time.getTime() < Date.now();
//这里的"<"表示可选时间大于当前时间,反之同理

<!-- 任务令扣账管理 --> <template> <div style="overflow: hidden;" class="deduction-config"> <title>{{$route.name}}</title> <h1>{{$route.name}}</h1> <aui-form id="editForm"> <div class="first-field" :class="isShowMore?'showMore':'hideMore'"> <aui-form-item label="工厂全称"> <aui-dropdown size="small" v-model="searchForm.factoryCodeListStr" :op="factoryFullNameOp" ref="factoryDropDown"></aui-dropdown> </aui-form-item> <aui-form-item label="发布状态"> <aui-dropdown size="small" v-model="searchForm.releaseStatusListStr" :op="releaseStatusOp"></aui-dropdown> </aui-form-item> <aui-form-item label="任务令"> <aui-input v-model="searchForm.workOrderNameStr" :op="workOrderNameOp"></aui-input> </aui-form-item> <aui-form-item label="产品型号"> <aui-input v-model="searchForm.prodModelCodeStr" :op="prodModelCodeOp"></aui-input> </aui-form-item> <aui-form-item label="编码"> <aui-input v-model="searchForm.itemCodeStr" :op="itemCodeStrOp"></aui-input> </aui-form-item> <aui-form-item label="扣账时间起" label-width="80px"> <aui-datepicker size="small" v-model="searchForm.startTimeStr" :op="startTimeOp"></aui-datepicker> </aui-form-item> <aui-form-item label="扣账时间止" label-width="80px"> <aui-datepicker size="small" v-model="searchForm.endTimeStr" :op="endTimeOp"></aui-datepicker> </aui-form-item> <aui-form-item label="扣账进度"> <aui-dropdown v-model="searchForm.deductionProgress" :op="deductionProgressOp"></aui-dropdown> </aui-form-item> <aui-form-item class="first-field-btn" label-width="0px"> <i v-show="isTriangleIconShow" class="hae-icon" :class="isShowMore?'icon-down':'icon-left-o'" @click="isShowMore = !isShowMore "></i> <aui-button hue="primary" round="true" size="small" @click="search">查询</aui-button> <aui-button hue="primary" round="true" size="small" @click="reset">重置</aui-button> </aui-form-item> </div> </aui-form> <!-- 导入导出功能 :发布 --> <aui-row class="gridTopImportBtns"> <aui-button size="small" v-show="isReleaseShowFlag" @click="release">发布</aui-button> <i class="hae-icon icon-setup" @click.stop="toolBoxShow = !toolBoxShow"> <div v-show="toolBoxShow"> <aui-fileupload round="true" size="small" :mini-mode="true" class='hae-btn' :op="importop">导入</aui-fileupload> <aui-button round="true" size="small" @click="dynamicExportClick">导出头表数据</aui-button> <aui-button round="true" size="small" @click="recodrDynamicExportClick">导出发料明细</aui-button> <aui-button round="true" size="small" @click="downloadFile" resetTime='5000' style="margin-top: 5px">导入模板下载</aui-button> </div> </i> </aui-row> <!-- 扣账记录页面 --> <aui-dialog-box title="发料明细" v-model="showRecord" width="95%" top="10%" :dragable="true"> <!-- 发料明细导出 --> <aui-row style="margin-top:-4px;"> <aui-button size="small" @click="oneRecodrDynamicExportClick">导出</aui-button> </aui-row> <deduction-record v-bind:selectData="clickRowData" v-if="showRecord" :isChange="isChange"></deduction-record> </aui-dialog-box> <div class="grid-head-config"> <aui-grid ref="grid" :op="gridOp" class="dataArea-field"></aui-grid> </div> </div> </template> <script> import { initHtml } from '../unit/js/html.js' import DeductionRecord from '../unit/wave/WaveWorkOrderDeductionRecord.vue' import { downloadFun } from '../unit/js/fileDownload.js' import { Grid, Form, FormItem, Row, Input, Dropdown, Button, Hae, Pager, DialogBox, Datepicker, Fileupload, $, } from '@aurora/ui3' import { publicFun } from '@/components/unit/js/public.js' export default { components: { AuiButton: Button, AuiDialogBox: DialogBox, AuiGrid: Grid, AuiForm: Form, AuiFormItem: FormItem, AuiRow: Row, AuiInput: Input, AuiDropdown: Dropdown, AuiDatepicker: Datepicker, AuiFileupload: Fileupload, DeductionRecord }, data() { let that = this let curDate = new Date() curDate.setDate(curDate.getDate() - 30) let endDate = new Date() endDate.setDate(curDate.getDate() + 1) return { showRecord: false, // 是否弹出记录页面 clickRowData: {}, // 被双击的数据 saveList: [], // 用于记录刚刚保存的数据,方便打钩 timer: 0, // 定义双击事件的次数 isChange: Math.ceil(publicFun.getSecurityRandom() * 100), // 新版是否显示更多条件 toolBoxShow: false, isShowMore: true, isTriangleIconShow: true, // 发布按钮显示控制 isReleaseShowFlag: false, // 初始化查询对象 searchForm: { releaseStatusListStr: '1', startTimeStr: curDate, endTimeStr: endDate }, // 部门名称 factoryFullNameOp: { id: 'factoryFullNameOp', showClearBtn: true, autoSelect: true, alwaysLoad: true, multi: true, editable: true, textField: 'factoryFullName', valueField: 'factoryCode', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/factoryInfoService/getAllFactoryInfoList' } }, emptyDataMsg: '-----没有数据-----' }, releaseStatusOp: { showClearBtn: true, autoSelect: true, multi: true, editable: true, textField: 'releaseStatusName', valueField: 'releaseStatus', placeHolder: '-----请选择-----', dataset: { value: [ { releaseStatus: 1, releaseStatusName: '待发布' }, { releaseStatus: 2, releaseStatusName: '发布中' }, { releaseStatus: 3, releaseStatusName: '发布成功' }, { releaseStatus: 4, releaseStatusName: '发布失败' } ] }, emptyDataMsg: '-----没有数据-----' }, // 任务令 workOrderNameOp: { id: 'workOrderNameOp', showClearBtn: true, editable: true, placeHolder: '-----可模糊查询-----' }, // 产品型号 prodModelCodeOp: { id: 'prodModelCodeOp', showClearBtn: true, editable: true, placeHolder: '-----可模糊查询-----' }, deductionProgressOp: { showClearBtn: true, autoSelect: false, multi: false, editable: false, textField: 'deductionProgressName', valueField: 'deductionProgress', placeHolder: '-----请选择-----', dataset: { value: [ { deductionProgress: 'all', deductionProgressName: '全部扣账' }, { deductionProgress: 'part', deductionProgressName: '部分扣账' } ] }, emptyDataMsg: '-----没有数据-----' }, // 编码 itemCodeStrOp: { id: 'itemCodeStrOp', showClearBtn: true, editable: true, placeHolder: '-----可模糊查询-----' }, // 扣账时间(起) startTimeOp: { id: 'startTimeOp', dateFormat: 'yyyy-MM-dd', dbDateFormat: 'yyyy-MM-dd 00:00:00', valueField: 'startTimeStr', placeHolder: '-----请选择-----' }, // 扣账时间(止) endTimeOp: { id: 'endTimeOp', dateFormat: 'yyyy-MM-dd', dbDateFormat: 'yyyy-MM-dd 23:59:59', valueField: 'endTimeStr', placeHolder: '-----请选择-----' }, // 导入控件 importop: {}, gridOp: { name: 'baseGrid', // name值,配置个性化customSetting/customized id: 'deductionGrid', showTip: true, tipOp: { type: 'normal' }, customized: true, // 是否打开隐藏列功能(动态列不能打开) allowFreeze: true, // 冻结选项 allowResize: true, allowSort: true, percentWidth: false, showStatus: false, showPager: true, // 展示分页 autoLoad: true, // 自动加载 showSeq: false, // 展示序号 cssName: 'text-center', editMode: true, pagerOp: { mode: 'number', pageSizes: [40, 50, 100], pageVO: { curPage: 1, pageSize: 40 } }, dataset: { value: [] }, operation: { insert: { mode: 'top' // 每次新增数行时,都在表格首行的上方依次添加(可选:top | bottom) }, save: { onBeforeSave(ajax, optOp, grid) { let changeList = grid.data let addList = grid.data.items2Create let updateList = grid.data.items2Update if (addList.length === 0 && updateList.length === 0) { Hae.topBox('未选择要保存的数据', 'error', false, 2000) return false } // 校验新增数据字段是否通过 if (addList.length > 0) { let checkResult = that.checkSaveData(addList) if (!checkResult) { return false } } Hae.ajax({ url: 'services/waveWorkorderDeductionService/saveHeadTableData', type: 'post', async: false, data: { addList, updateList }, dataType: 'text', success(result) { if (result === 'SUCCESS') { Hae.topBox('保存成功!', 'successful', false, 2000) let gridWidger = that.$refs.grid.widget that.search() that.saveList = that.saveList.concat(addList) that.saveList = that.saveList.concat(updateList) } else { Hae.topBox(result, 'error', false, 5000) } } }) return false } }, delete: { icon: 'hae-icon icon-del', text: '删除', onClick: this.delete } }, columns: [ { multi: true, columnType: 'select' }, { field: 'wbrdId', header: 'id', hidden: true, editable: false }, { field: 'factoryCode', header: '工厂全称', width: '130', cssName: 'text-center', headCss: 'text-center', textField: 'factoryFullName', valueField: 'factoryCode', freezable: false, editable: false }, { field: 'workorderName', header: '任务令', width: '110', editable: true, cssName: 'text-center', headCss: 'text-center', alwaysLoad: true, freezable: false, rule: { required: true } }, { field: 'prodModelCode', header: '产品型号', editable: false, width: '120', cssName: 'text-center', headCss: 'text-center', freezable: false }, { field: 'itemCode', header: '编码', width: '110', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false }, { field: 'workorderQty', header: '任务令数量', editable: false, width: '110', cssName: 'text-center', headCss: 'text-center', freezable: false }, { field: 'planStartTime', header: '计划开工时间', width: '120', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false, type: 'dateTime' }, { field: 'planOnlineTime', header: '计划上线时间', width: '120', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false, type: 'dateTime' }, { field: 'planCompleteTime', header: '计划完工时间', width: '120', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false, type: 'dateTime' }, { field: 'actStartDate', header: '实际开工时间', width: '120', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false, type: 'dateTime' }, { field: 'deductionDate', header: '扣账时间', editable: true, width: '120', cssName: 'text-center', headCss: 'text-center', freezable: false, type: 'dateTime', rule: { required: true }, editorOp: { conf: { onShow: () => { setTimeout(() => { $('.hae-popup .input-editable input').removeAttr('readonly') }, 500) } } } }, { field: 'batchNo', header: '扣账批次号', editable: true, cssName: 'text-center', headCss: 'text-center', freezable: false, width: '100', type: 'integer', rule: { required: true, custom: { regular: function(value, ruleOp) { let reg = /^[1-9]\d{0,7}$/ return reg.test(value) }, msg: '请输入不超过8位数字的正整数', priority: 1000 } } }, { field: 'ddiQty', header: '本次扣账数量', editable: true, cssName: 'text-center', headCss: 'text-center', freezable: false, width: '120', type: 'integer', rule: { required: false, custom: { regular: function(value, ruleOp) { if (publicFun.isNull(value)) { return true } let reg = /^[1-9]\d*$/ return reg.test(value) }, msg: '请输入正整数', priority: 1000 } } }, { field: 'ddiQtyHis', header: '历史已扣账数量', editable: false, width: '120', cssName: 'text-center', headCss: 'text-center', freezable: false }, { header: '发布状态', field: 'releaseStatusName', width: '110', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false }, { header: '生产指令进度', field: 'ppoProgressCode', width: '110', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false }, { field: 'errorMessage', header: '失败原因', width: '160', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false, showTip: true }, { field: 'releaseBy', header: '发布用户', width: '120', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false }, { field: 'releaseDate', header: '发布时间', width: '120', type: 'dateTime', editable: false, cssName: 'text-center', headCss: 'text-center', freezable: false } ], // 双击事件 onRowClick(rowData, tr, e) { // 只能点击已发布的数据看发料记录 if (rowData.releaseStatusName === '发布成功') { that.timer++ if (that.timer >= 2) { // 校验是否有发料明细数据 let haveDataInSystem = true Hae.ajax({ url: 'services/waveWorkorderDeductionService/getReleaseRecordList/page/40/1', type: 'post', async: false, data: { workOrderNameStr: rowData.workorderName }, dataType: 'text', success(result) { let resultVo = JSON.parse(result) if (resultVo.result === undefined || resultVo.result.length == '0') { Hae.topBox(`任务令:${rowData.workorderName} 暂无发料数据`, 'error', false, 2000) haveDataInSystem = false return false } else { haveDataInSystem = true } } }) if (haveDataInSystem) { that.timer = 0 // 清空计数器 that.showRecord = true that.clickRowData = rowData } } setTimeout(() => { that.timer = 0 }, 300) } }, // 编辑完后,自动计算数据 onAfterEdit(value, rowData, td, col, oldValue) { let { widget } = that.$refs.grid let row = widget.getCellRow(td) // 单元格所在行jQuery对象 // 1.根据任务令带出相关数据信息 if (col.header === '任务令') { if (publicFun.isNull(value)) { Hae.topBox('任务令必填', 'error', false, 2000) return false } let responseStr = '' Hae.ajax({ url: 'services/waveWorkorderDeductionService/getWorkOrderInfoByWorkOrderName', type: 'post', async: false, data: { workorderName: value }, dataType: 'text', success(result) { let response = JSON.parse(result) if (result === undefined || publicFun.isNull(response.workorderName)) { Hae.topBox(`任务令:[${value}]信息不存在`, 'error', false, 2000) rowData.fieldCheckFlag = false return false } else if (publicFun.isNull(response.factoryCode)) { rowData.fieldCheckFlag = false Hae.topBox(`用户暂无任务令:${value} 对应的工厂权限`, 'error', false, 2000) return false } else { rowData.fieldCheckFlag = true responseStr = result } } }) if (responseStr !== undefined && publicFun.isNoNull(responseStr)) { let response = JSON.parse(responseStr) // 根据任务令反查工厂全称 that.setColValueNew(rowData, td, 'factoryCode', response.factoryCode, response.factoryFullName) // 根据任务令反查产品型号 that.setColValueNew(rowData, td, 'prodModelCode', response.prodModelCode, response.prodModelCode) // 根据任务令反查编码 that.setColValueNew(rowData, td, 'itemCode', response.itemCode, response.itemCode) // 根据任务令反任务令数量 that.setColValueNew(rowData, td, 'workorderQty', response.workorderQty, response.workorderQty) // 根据任务令反查历史已扣账数量 that.setColValueNew(rowData, td, 'ddiQtyHis', response.ddiQtyHis, response.ddiQtyHis) // 根据任务令反查计划开工时间 that.setColValueNew(rowData, td, 'planStartTime', Hae.Date.format(response.planStartTime, 'yyyy-MM-dd hh:mm'), Hae.Date.format(response.planStartTime, 'yyyy-MM-dd hh:mm')) // 根据任务令反查计划上线时间 that.setColValueNew(rowData, td, 'planOnlineTime', Hae.Date.format(response.planOnlineTime, 'yyyy-MM-dd hh:mm'), Hae.Date.format(response.planOnlineTime, 'yyyy-MM-dd hh:mm')) // 根据任务令反查计划完工时间 that.setColValueNew(rowData, td, 'planCompleteTime', Hae.Date.format(response.planCompleteTime, 'yyyy-MM-dd hh:mm'), Hae.Date.format(response.planCompleteTime, 'yyyy-MM-dd hh:mm')) } } }, onBeforeEdit: (cellValue, rowData, td, col) => { let { releaseStatusName } = rowData if (releaseStatusName == '待发布' || releaseStatusName == '发布失败') { // 存量数据只能修改待发布、发布失败的数据 if (col.header !== '扣账时间' && col.header !== '本次扣账数量') { return false } } else if (publicFun.isNoNull(releaseStatusName)) { return false } }, onRenderRow(tr, rowData, rowIdx) { // 表格中的数据加载完成后触发的事件 if (rowData.releaseStatusName === '发布失败') { tr.css('background', 'rgb(241, 127, 123)') } else if (rowData.releaseStatusName === '发布成功') { tr.css('background', 'rgb(214, 252, 214)') } else if (rowData.releaseStatusName === '发布中') { tr.css('background', 'rgb(247, 214, 152)') } }, onBeforeBindData: (op, data, widget) => { let that = this // 页面保存的数据自动打钩 if (that.saveList.length > 0) { let recodeList = that.saveList for (let i = 0; i < data.length; i++) { recodeList.forEach(item => { if (item.workorderName === data[i].workorderName) { widget.setRecordSelected(data[i]) } }) } } }, onSelected(tr, rowData, selected) { // 取消选择的数据从saveList中删除 if (!selected && publicFun.isNoNull(that.saveList)) { for (let a = that.saveList.length - 1; a >= 0; a--) { let row = that.saveList[a] if (row.workorderName === rowData.workorderName && !selected) { that.saveList.splice(a, 1) } } } }, onBeforeSelect(tr, rowData, selected) { if (rowData.releaseStatusName == '发布失败' || rowData.releaseStatusName == '待发布' || publicFun.isNull(rowData.releaseStatusName) ) { return true } else { return false } }, // 组件渲染完成时执行的事件。 onRender(grid) { let fromDom = $('#editForm') initHtml.gridAutoHeight(fromDom) } } } }, created() { let that = this that.importop = publicFun.getImportOp('tmas.waveWorkOrderDeduction', Hae) }, mounted() { // 注册全局单机事件隐藏导入按钮栏 document.addEventListener('click', e => { setTimeout(() => { if ( !$(e.target).hasClass('icon-setup') || !$(e.target).hasClass('gridTopBtnDiv') ) { this.toolBoxShow = false // 收起导入导出按钮 } }, 300) }) this.initUserReleaseMenu() // 判断是否有更多条件显示隐藏小三角 let editFormHeight = $('.first-field').outerHeight() this.isTriangleIconShow = !(editFormHeight < 38) this.isShowMore = false }, methods: { // 判断用户是否有发布权限 initUserReleaseMenu() { let that = this Hae.ajax({ url: 'services/waveWorkorderDeductionService/getReleaseUserInfo', type: 'post', async: false, data: {}, dataType: 'json', success(result) { if (publicFun.isNoNull(result)) { that.isReleaseShowFlag = true } } }) }, setSelect(rowData, a) { let { widget } = this.$refs.grid let row = widget.getRow(rowData) widget.rowSelected(row, true, false) }, // 设置单元格值New setColValueNew(rowData, td, fieldName, valueField, textField) { let { widget } = this.$refs.grid let row = widget.getCellRow(td) // 根据编辑的单元格所在行jQuery对象 let rowCell = widget.getRowCell(row, fieldName) // 获取FieldName需要被设置数据的表格对象 rowData[fieldName] = valueField // 表格数据赋值 rowCell.children().html(textField) // 修改页面表格内容 rowCell.attr('val', textField) }, // 校验搜索 search() { Hae.validForm($('#editForm'), result => { if (result === false) { return false } else { // 查询数据 this.findClick() return true } }) }, // 保存数据校验 checkSaveData(list) { let checkFlag = true list.forEach(element => { if (!element.fieldCheckFlag) { Hae.topBox(`任务令:${element.workorderName} 不存在!`, 'error', false, 2000) checkFlag = false return false } if (publicFun.isNull(element.deductionDate)) { Hae.topBox('页面新增数据时“扣账时间”必填', 'error', false, 2000) checkFlag = false return false } if (publicFun.isNoNull(element.ddiQty) && Number(element.ddiQty) > Number(element.workorderQty)) { Hae.topBox('本次扣账数量不能大于任务令数量', 'error', false, 2000) checkFlag = false return false } }) return checkFlag }, // 判断是否正数 reset() { let curDate = new Date() curDate.setDate(curDate.getDate() - 30) let endDate = new Date() endDate.setDate(curDate.getDate() + 1) this.searchForm = { factoryCodeListStr: '', releaseStatusListStr: '1', workOrderNameStr: '', prodModelCodeStr: '', itemCodeStr: '', startTimeStr: curDate, endTimeStr: endDate, deductionProgress: '' } }, findClick() { let that = this let { searchForm } = that let newcol = { dataset: { source: { data: searchForm, // 带条件的查询 type: 'post', url: 'services/waveWorkorderDeductionService/getHeadTableList/page/{{pageSize}}/{{curPage}}' } } } that.$refs.grid.widget.reInit(newcol) }, delete() { let that = this let { widget } = this.$refs.grid let selectList = widget.getSelectedRecords() if (selectList.length === 0) { Hae.topBox('未选择数据,或未选择有效数据', 'warning', false, 2000) return } selectList.forEach(item => { if (item.releaseStatusName === '发布成功' || item.releaseStatusName === '发布中') { Hae.topBox(`任务令:${item.workorderName} ${item.releaseStatusName},不允许删除`, 'warning', false, 2000) } }) Hae.confirm('是否删除该数据?', function(bool) { if (bool) { // 删除新增但未保存的数据 let unSaveList = [] for (let i = selectList.length - 1; i >= 0; i--) { if (selectList[i]._$index < 0) { let currRow = widget.getRowData(selectList[i]._$index) let unSaveDataJQuery = widget.getRow(currRow) unSaveList.push(unSaveDataJQuery) selectList.splice(i, 1) } } if (unSaveList.length > 0) { unSaveList.forEach(item => { widget.removeRows(item) }) if (!selectList.length > 0) { return false } } // 删除数据已存在的数据 Hae.ajax({ url: 'services/waveWorkorderDeductionService/deleteHeadTableData', type: 'post', async: false, data: { list: selectList }, dataType: 'text', success(result) { if (result === 'SUCCESS') { Hae.topBox('删除成功!', 'successful', false, 2000) that.$refs.grid.widget.reInit() } else { Hae.topBox(result, 'error', false, 2000) } } }) } }) }, release() { let that = this let { widget } = this.$refs.grid let selectList = widget.getSelectedRecords() if (selectList.length === 0) { Hae.topBox('未选择数据,或未选择有效数据', 'warning', false, 2000) return } let changeList = widget.getChangedRecords() if (publicFun.isNoNull(changeList)) { let unSaveList = [] unSaveList = unSaveList.concat(changeList.insertedRecords) unSaveList = unSaveList.concat(changeList.updatedRecords) // 未保存的数据不能释放 let unSave = '' if (unSaveList != undefined && unSaveList.length > 0) { unSaveList.forEach(item => { let key = item.workorderName selectList.forEach(selectVo => { if (key === selectVo.workorderName) { unSave += `${key};` } }) }) } if (publicFun.isNoNull(unSave)) { Hae.topBox(`任务令:${unSave.substring(0, unSave.length - 1)} 未保存,不能发布!`, 'error', false, 2000) return false } } let releaseStatus = true let sendID = [] selectList.forEach(item => { // 只能发布待发布、发布失败的数据 if (item.releaseStatusName !== '待发布' && item.releaseStatusName !== '发布失败') { Hae.topBox(`任务令:${item.workorderName}当前状态不能发布`, 'warning', false, 2000) releaseStatus = false } else { sendID.push(item.wbrdId) } }) if (!releaseStatus) { return true } let gridWidger = that.$refs.grid.widget Hae.confirm('是否提交已选择数据', (bool) => { if (bool) { Hae.ajax({ url: 'services/waveWorkorderDeductionService/publishData', data: { ids: sendID }, type: 'post', dataType: 'text', success: (result) => { if (result === 'SUCCESS') { Hae.topBox('任务令发布成功', 'successful', false, 2000) publicFun.jumpFormerPage(gridWidger) // 保存成功的数据从saveList中移除 that.saveList = [] } else { Hae.topBox(result, 'error', false, 2000) publicFun.jumpFormerPage(gridWidger) } } }) } }) }, // 导出 dynamicExportClick() { Hae.validForm($('#editForm'), result => { if (result === false) { Hae.topBox('必填查询条件不能为空', 'error', false, 2000) return false } else { // 查询数据 this.export() return true } }) }, export() { let { searchForm } = this Hae.ajax({ url: 'services/exportFileUtilService/exportWaveWorkOrderDeduction', data: searchForm, type: 'post', success(data) { Hae.confirm( '导出任务已开始,你可以进入[我的导入导出>导出查询]中查看任务状态并下载导出文件!', function(bool) { if (bool) { window.open('#/ListExport') } } ) } }) }, // 发料明细单条任务令导出 oneRecodrDynamicExportClick() { let clickDatExport = this.clickRowData let searchFormExport = this.searchForm searchFormExport.workOrderNameStr = clickDatExport.workorderName Hae.ajax({ url: 'services/exportFileUtilService/exportWaveWorkOrderDeductionRecord', data: searchFormExport, type: 'post', success(data) { Hae.confirm( '导出任务已开始,你可以进入[我的导入导出>导出查询]中查看任务状态并下载导出文件!', function(bool) { if (bool) { window.open('#/ListExport') } } ) } }) }, recodrDynamicExportClick() { let { searchForm } = this Hae.confirm('为避免大批量数据导出,是否已精确查询条件?', (bool) => { if (bool) { Hae.validForm($('#editForm'), result => { if (result) { Hae.ajax({ url: 'services/exportFileUtilService/exportWaveWorkOrderDeductionRecord', data: searchForm, type: 'post', success(data) { Hae.confirm( '导出任务已开始,你可以进入[我的导入导出>导出查询]中查看任务状态并下载导出文件!', function(bool) { if (bool) { window.open('#/ListExport') } } ) } }) } else { Hae.topBox('必填查询条件不能为空', 'error', false, 2000) } }) } }) }, // 下载导入模板 downloadFile() { downloadFun.getID('任务令扣账管理', '导入') // 功能模块,类型 } } } </script> <style scoped src='./../unit/css/newModelPublic.css'> </style> <style scoped> .gridTopImportBtns { width: 200px; position: absolute; top: 111px; left: 285px; /**6px 84px 174px 266px**/ z-index: 30; } .deduction-config { height: 100%; } .grid-head-config { height: 100%; } .deduction-config :deep(#deductionGrid .grid-body) { height: calc(100% - 48px) !important; } #deductionGrid { height: calc(100% - 120px); } .deduction-config :deep(#deductionGrid .hae-grid-body) { height: 100%; } </style> 在查询列表“历史已扣账数量”与“发布状态”之间添加“是否冻结”、“冻结时间”列,可编辑, (1)是否冻结,下拉单选框,非必填,合法值只有“Y”和“N”; (2)冻结时间,日期时间选择框,非必填;
09-06
<template> <!-- 订单发布 --> <eh-tabs-nav full-content id="umppPlanOrderPublish" :tabs.sync="tabs" v-model="tabName"> <template slot="umppPlanOrderPublish-select"> <eh-layout full-content card left-width="18rem" top-height="7rem"> <template v-slot:top> <!-- <eh-button id="umppPOPublish-publish" class="changeButton" v-throttle @click="publish" :disabled="isDisable" >{{ $t("base.i18n_release") }}</eh-button > <eh-button id="umppPOPublish-quick" class="changeButton" @click="workCenterTig">{{ $t("base.i18n_inquire") }}</eh-button> --> <el-form :model="orderTig" label-position="top" :inline="true"> <el-form-item :label="$t('base.TXT_WC_NAME')"> <el-select v-model="orderTig.workCenter" :placeholder="$t('base.i18n_selectTheWorkCenter')" clearable> <el-option v-for="item in workCenterList" :key="item.key" :label="item.value" :value="item.key" ></el-option> </el-select> </el-form-item> <el-form-item :label="$t('base.TXT_PUBLISH_MODE')"> <el-select v-model="publishWay" clearable> <el-option v-for="item in publishWayList" :key="item.key" :label="item.value" :value="item.key" ></el-option> </el-select> </el-form-item> <el-form-item :label="$t('base.TXT_PLANNED_BEGIN_DATE')" prop="beginDate"> <el-date-picker v-model="orderTig.beginDate" type="daterange" unlink-panels :range-separator="$t('base.TXT_TO')" :start-placeholder="$t('base.i18n_startDate')" :end-placeholder="$t('base.i18n_endDate')" :picker-options="$static.DatePickerOption" value-format="yyyy-MM-dd" ></el-date-picker> </el-form-item> <!-- <el-form-item class="button-items-end"> <div> <eh-button id="umppPOPublish-quick" class="changeButton ml-3" @click="workCenterTig" >{{ $t("base.i18n_inquire") }} </eh-button> <eh-button id="umppPOPublish-publish" class="changeButton" v-throttle @click="publish" :disabled="isDisable" >{{ $t("base.i18n_release") }} </eh-button> </div> </el-form-item> --> </el-form> </template> <template slot="left"> <eh-grid id="poResolveLeftGrid" ref="poResolveLeftGrid" :grid="gridOptions.gridDate" :dataSource="gridOptions.dataSourceDate" :options="gridOptions.optionsDate" @cell-click="handleCellClick" class="grid-main" ></eh-grid> </template> <eh-grid id="umppPlanorderPublishGrid" ref="umppPlanorderPublishGrid" :grid="gridOptions.grid" :dataSource="gridOptions.dataSource" :options="gridOptions.options" @selection-change="handleNodeClick" class="grid-main" > <template slot="toolbar"> <eh-button id="umppPOPublish-quick" class="changeButton ml-3" @click="workCenterTig" >{{ $t("base.i18n_inquire") }} </eh-button> <eh-button id="umppPOPublish-publish" class="changeButton" v-throttle @click="publish" :disabled="isDisable" >{{ $t("base.i18n_release") }} </eh-button> </template> </eh-grid> </eh-layout> </template> <template slot="umppPlanOrderPublish-selected"> <eh-layout full-content card> <eh-dyna-big-data-grid id="umppPlanOrderPublishDy" ref="umppPlanOrderPublishDy" :grid="gridOrderPublishHas.grid" :dataSource="gridOrderPublishHas.dataSource" :options="gridOrderPublishHas.options" :extraParamFields="gridOrderPublishHas.options.extraParamFields" @selection-change="handleOrderSplitClick" > <template v-slot:render-code="{ row }"> <el-link @click="go(row)" type="primary" :underline="false"> {{ row.code }} </el-link> </template> <template v-slot:render-produType="{ row }"> <EhState :isType="true" :value="row.produType" :stateList="produTypeList"></EhState> </template> <template v-slot:render-state="{ row }"> <EhState :value="row.state" :stateList="stateList"></EhState> <!-- <span v-html="orderState(row)"></span> --> </template> </eh-dyna-big-data-grid> </eh-layout> </template> </eh-tabs-nav> </template> <script> import qs from "qs"; const gridOrderPublishHas = { options: { extraParamFields: { filters: [ { field: "workCenterId", compare: "eq", data: "", }, { field: "produCode", compare: "cn", data: "", }, { field: "produName", compare: "cn", data: "", }, { field: "code", compare: "cn", data: "", }, { field: "plannedBeginDate", compare: "ge", data: "", }, { field: "plannedBeginDate", compare: "le", data: "", }, { field: "plannedEndDate", compare: "ge", data: "" }, { field: "plannedEndDate", compare: "le", data: "" }, ], }, }, }; export default { name: "umppPlanOrderPublish", // 需使用组件 components: { }, data() { return { produTypeList: [ { label: "普通物料", value: 0, color: "type-strong", }, { label: "产成品", value: 1, color: "type-strong", }, { label: "半成品", value: 2, color: "type-strong", }, ], stateList: [ { label: "未发布", value: 0, color: "state-wait-deliver", }, { label: "部分发布", value: 1, color: "state-section-deliver", }, { label: "已发布", value: 2, color: "state-already-deliver", }, { label: "完工", value: 3, color: "state-already-close", }, ], extraParamFields: { dateTime: "", workCenterId: "", }, activeNames: ["1"], tabName: "umppPlanOrderPublish-select", tabs: [ { title: this.$t("base.i18n_orderRelease"), name: "umppPlanOrderPublish-select", closable: false }, { title: this.$t("base.i18n_ordersPosted"), name: "umppPlanOrderPublish-selected", closable: false }, ], beginDate: "", //计划开始时间 endDate: "", //结束时间 workCenterList: [], publishWayList: [], publishWay: "", //发布方式 workCenter: "", //工作中心 gridOptions: { dataSource: { bean: "umppPlanOrderPublishController", method: "select", loadDataOnFirst: false, }, dataSourceDate: { bean: "umppPlanOrderPublishController", method: "orderPublishGridWest", loadDataOnFirst: false, }, grid: { stripe: true, height: "auto", border: true, refreshBtn: false, columns: [ { prop: "id", label: "id", visible: false, }, { prop: "code", label: vue.$t("base.TXT_PO_CODE"), width: "100px", render: (h, params) => { const go = () => { this.$store.commit("DELETE_MENU_NAV", "umppPlanOrderView"); setTimeout(() => { vue.$router.push({ name: "umppPlanOrderView", query: params.row }); }, 500); }; return ( <el-link onClick={go} type="primary" underline={false}> {params.row.code} </el-link> ); }, }, { prop: "qty", label: vue.$t("base.TXT_QTY"), width: "100px", }, { prop: "woCount", label: vue.$t("base.TXT_WO_COUNT"), width: "100px", sortable: false, }, { prop: "hasPublishQty", label: vue.$t("base.TXT_HAS_PUBLISH_QTY"), width: "140px", sortable: false, }, { prop: "publishQty", label: vue.$t("base.TXT_PUBLISH_QTY"), width: "140px", sortable: false, }, { prop: "routeBatchQty", label: vue.$t("base.TXT_ROUTE_BATCH_QTY"), width: "140px", sortable: false, }, { prop: "batchCount", label: vue.$t("base.TXT_BATCH_COUNT"), width: "100px", sortable: false, render: (h, params) => { vue.$set(params.row, "batchCount", params.row.batchCount); this.triggerSave(params.row); const handleInput = (e) => { params.row.batchCount = e; if (params.row.batchCount != null && params.row.batchCount > 0) { // 计算结果保留两位小数(会自动四舍五入) params.row.batchQty = parseFloat((params.row.publishQty / params.row.batchCount).toFixed(2)); } }; return ( <el-input-number controls={false} precision={0} value={params.row.batchCount} disabled={params.row.publishQty == 0} onInput={handleInput} min={1} max={params.row.publishQty} /> ); }, }, { prop: "batchQty", label: vue.$t("base.TXT_BATCH_QTY"), width: "100px", sortable: false, render: (h, params) => { vue.$set(params.row, "batchQty", params.row.batchQty); this.triggerSave(params.row); const handleInput = (e) => { params.row.batchQty = e; // if (params.row.batchQty != null && params.row.batchQty > 0) { // params.row.batchCount = Math.floor(params.row.publishQty / params.row.batchQty); // } }; return ( <el-input-number controls={false} precision={2} step={0.01} disabled={params.row.publishQty == 0} value={params.row.batchQty} onInput={handleInput} min={0.01} max={(params.row.publishQty / params.row.batchCount).toFixed(2)} /> ); }, }, { prop: "state", label: vue.$t("base.TXT_PUBLISH_STATE"), width: "100px", render: (h, params) => { return <EhState value={params.row.state} stateList={this.stateList}></EhState>; }, }, { prop: "produCode", label: vue.$t("base.TXT_PRODU_CODE"), width: "140px", }, { prop: "produName", label: vue.$t("base.TXT_PRODU_NAME"), width: "140px", }, { prop: "produType", label: vue.$t("base.TXT_PRODU_TYPE"), width: "140px", render: (h, params) => { const produTypeList = [ { label: "普通物料", value: 0, color: "type-strong", }, { label: "产成品", value: 1, color: "type-strong", }, { label: "半成品", value: 2, color: "type-strong", }, { label: "备品备件", value: 3, color: "type-strong", }, ]; return <EhState isType={true} value={params.row.produType} stateList={produTypeList}></EhState>; }, }, { prop: "type", label: vue.$t("base.i18n_orderType"), width: "120px", formatter: ({ cellValue, row, col }) => { if (row.nature == 0) { return "普通订单"; } else if (row.nature == 1) { return "实验订单"; } else if (row.nature == 2) { return "返修订单"; } }, cellFormat: "replaceText", cellFormatOptions: '{"0":"普通订单","1":"实验订单","2":"返修订单"}', }, { prop: "contractCode", label: "合同编码", width: "140px", }, ], defaultSort: { prop: "code", order: "asc", }, pagination: { pageSize: 15, pageSizes: [15, 25, 50, 100, 200], // 页容量选项 }, }, gridDate: { selectMax: 1, refreshBtn: false, columns: [ { prop: "dateTime", label: vue.$t("base.TXT_PLANNED_BEGIN_DATE"), align: "center", sortable: false, }, ], height: "auto", mutiSelect: false, showRowNumber: false, pagination: { pageSize: 15, pageSizes: [15, 25, 50, 100, 200], // 页容量选项 }, pageable: false, }, options: { showFilterTemplate: false, isFullGrid: false, showTableColumnsSet: false, extraParamFields: { dateTime: "", workCenterId: "", }, }, optionsDate: { showFilterTemplate: false, isFullGrid: false, showTableColumnsSet: false, extraParamFields: {}, }, }, gridOrderPublishHas: gridOrderPublishHas, orderTig: { beginDate: "", //计划开始时间 workCenter: "", //工作中心 }, isDisable: true, //发布按钮禁用 editData: {}, //数据暂存 workCenterSecondTabList: [], //已发布订单界面工作中心名称 ruleForm: { mrlCode: "", mrlCodeId: "", }, checkedControl: [], materialDeta: [], //物料编码树 materialProps: { children: "children", label: "text", }, plannedBeginDate: "", //计划开始时间 plannedEndDate: "", //计划结束时间 holdData: {}, //暂存数据 //订单查找带回传参 orderParams: { lookupType: "planOrderForUmpp" }, //物料查找带回传参 mrlParams: { materialType: "1,2", withRoute: "1" }, }; }, created() { //工作中心下拉选择框 --订单发布Tab页 this.$http.post("bppComboxController!createUserWorkCenterCombox.m").then((res) => { this.workCenterList = res; this.orderTig.workCenter = this.optionData(res); }); //发布方式下拉选择框 --订单发布Tab页 this.$http.post("umppComboxController!publishModeList.m").then((res) => { this.publishWayList = res; this.publishWay = this.optionData(res); }); //工作中心下拉选择框 --已发布订单Tab页 this.$http.post("bppComboxController!createUserWorkCenterHeadCombox.m").then((res) => { this.workCenterSecondTabList = res; }); }, mounted() { this.orderTig.beginDate = this.$static.getNeedsTime(); }, methods: { // 订单状态 orderState(row, col) { if (row.state == 0) { return `<span style="color:red"> 未发布</span>`; } else if (row.state == 1) { return `<span style="color:blue"> 部分发布</span>`; } else if (row.state == 2) { return `<span style="color:green"> 已发布</span>`; } else if (row.state == 3) { return `<span style="color:black"> 完工</span>`; } }, go(row) { this.$store.commit("DELETE_MENU_NAV", "umppPlanOrderView"); setTimeout(() => { vue.$router.push({ name: "umppPlanOrderView", query: row }); }, 500); }, //点击触发--已发布订单Tab页 handleOrderSplitClick(data) { this.holdData = data; }, //刷新 refresh() { this.plannedBeginDate = ""; this.plannedEndDate = ""; this.gridOrderPublishHas.options.extraParamFields.filters.forEach((item) => { item.data = ""; }); this.$refs.umppPlanOrderPublishDy.bindGrid(); }, //快速查询--已发布订单Tab页 qukSelect() { let plannedBeginDate = this.plannedBeginDate; let plannedEndDate = this.plannedEndDate; if (plannedBeginDate) { this.gridOrderPublishHas.options.extraParamFields.filters[4].data = plannedBeginDate[0]; this.gridOrderPublishHas.options.extraParamFields.filters[5].data = plannedBeginDate[1]; } else { this.gridOrderPublishHas.options.extraParamFields.filters[4].data = ""; this.gridOrderPublishHas.options.extraParamFields.filters[5].data = ""; } if (plannedEndDate) { this.gridOrderPublishHas.options.extraParamFields.filters[6].data = plannedEndDate[0]; this.gridOrderPublishHas.options.extraParamFields.filters[7].data = plannedEndDate[1]; } else { this.gridOrderPublishHas.options.extraParamFields.filters[6].data = ""; this.gridOrderPublishHas.options.extraParamFields.filters[7].data = ""; } this.$refs.umppPlanOrderPublishDy.bindGrid(); // this.$refs.umppPlanOrderPublishDy.searchWithFilter(); }, //发布 --订单发布Tab页 publish() { let rowData = this.editData; let publishMode = this.publishWay; if (rowData.length != 0 && rowData.length != null && rowData[0].id) { let publishModeStr = publishMode == 0 ? "【直接分批】" : publishMode == 1 ? "【余数分批】" : "【余数合批】"; let elList = []; for (let i = 0; i < rowData.length; i++) { let code = rowData[i].code; let publishQty = rowData[i].publishQty; let batchCount = rowData[i].batchCount; let batchQty = rowData[i].batchQty; let msgEl = ""; if (publishQty == 0) { this.$message({ message: this.$t("base.i18n_orders") + code + this.$t("base.i18n_theNumberOfReleasesCanBe") + publishQty + this.$t("base.i18n_CanNotBeReleased"), type: "warning", }); return false; } if (batchQty == "" || batchQty == "") { this.$message({ message: "请输入分批个数和每批数量后再提交!", type: "warning", }); return false; } if (batchCount * batchQty == publishQty) { if (i == rowData.length - 1) { msgEl = "【" + this.$t("base.i18n_orders") + code + this.$t("base.i18n_release_152") + batchCount + this.$t("base.i18n_theQuantityIs") + batchQty + this.$t("base.i18n_ofOrders_155"); } else { msgEl = "【" + this.$t("base.i18n_orders") + code + this.$t("base.i18n_release_152") + batchCount + this.$t("base.i18n_theQuantityIs") + batchQty + this.$t("base.i18n_ofOrders_155"); } } else if (batchCount * batchQty < publishQty) { let remainderQty = publishQty - batchCount * batchQty; if (publishMode == 0) { if (i == rowData.length - 1) { msgEl = "【" + this.$t("base.i18n_orders") + code + this.$t("base.i18n_release_152") + batchCount + this.$t("base.i18n_theQuantityIs") + batchQty + this.$t("base.i18n_ofOrders_155"); } else { msgEl = "【" + this.$t("base.i18n_orders") + code + this.$t("base.i18n_release_152") + batchCount + this.$t("base.i18n_theQuantityIs") + batchQty + this.$t("base.i18n_ofOrders_155"); } } else if (publishMode == 1) { if (i == rowData.length - 1) { msgEl = "【" + this.$t("base.i18n_orders") + code + this.$t("base.i18n_release_152") + batchCount + this.$t("base.i18n_theQuantityIs") + batchQty + "的订单、1个数量为" + remainderQty + this.$t("base.i18n_ofOrders_155"); } else { msgEl = "【" + this.$t("base.i18n_orders") + code + this.$t("base.i18n_release_152") + batchCount + this.$t("base.i18n_theQuantityIs") + batchQty + "的订单、1个数量为" + remainderQty + this.$t("base.i18n_ofOrders_155"); } } else { if (i == rowData.length - 1) { msgEl = "【" + vue.$t("base.i18n_orders") + code + vue.$t("base.i18n_release") + ":" + (batchCount - 1) + vue.$t("base.i18n_QuantityIs") + batchQty + "的订单、1" + vue.$t("base.i18n_QuantityIs") + (parseInt(remainderQty) + batchQty) + "的订单】"; } else { msgEl = "【" + vue.$t("base.i18n_orders") + code + vue.$t("base.i18n_release") + ":" + (batchCount - 1) + vue.$t("base.i18n_QuantityIs") + batchQty + vue.$t("base.i18n_of") + vue.$t("base.i18n_orders") + "、1" + vue.$t("base.i18n_QuantityIs") + (parseInt(remainderQty) + batchQty) + "的订单】,"; } } } else { this.$message({ message: vue.$t("des.i18n_des_PleaseEnterTheNumberOfBatchesAndTheQuantityOfEachBatchCorrectly") + "!", type: "warning", }); return false; } elList.push(msgEl); } let msgData = `<p class="text-lg text-left leading-tight">请确认以${publishModeStr}方式发布的发布信息的正确性:</p>`; let el = `<div class="mx-4"> ${msgData} <ul class="overflow-auto max-h-56 bg-content mt-3"> ${elList .map((item, index) => { return `<li class="text-sm text-left py-1 px-2">${index + 1}、${item}</li>`; }) .join("")} </ul> </div>`; let formData = JSON.stringify(rowData); this.$MessageBoxMethod.showImageConfirmationMessageBox(el, () => { this.$http .post( "umppPlanOrderPublishControllerEx!doPublishOrder.m", qs.stringify({ isAjaxFlag: "ajax", rowData: formData, publishMode: this.publishWay, }) ) .then((res) => { if (res.type == "success") { this.$message({ message: res.data, type: res.type, }); this.isDisable = true; this.$refs.poResolveLeftGrid.bindGrid(); this.$refs.umppPlanorderPublishGrid.bindGrid(); } else { if (res.code != 500) { // this.$message({ // message: res.data, // type: res.type, // }); this.$MessageBoxMethod.showBusinessHint(res.data); return false; } } }); }); } else { this.$message({ message: this.$t("base.i18n_pleaseSelectAData") + "!", type: "warning", }); return false; } }, //点击左边时间触发右表查询事件 --订单发布Tab页 handleCellClick(row) { let dateTime = row.dateTime; let workCenterId = this.orderTig.workCenter; this.extraParamFields.workCenterId = workCenterId; this.extraParamFields.dateTime = dateTime; this.gridOptions.options.extraParamFields.workCenterId = workCenterId; this.gridOptions.options.extraParamFields.dateTime = dateTime; this.$refs.umppPlanorderPublishGrid.bindGrid(); }, //快速查询 --订单发布Tab页 workCenterTig() { this.isDisable = true; this.$refs.umppPlanorderPublishGrid.clear(); let beginDate = this.orderTig.beginDate; let workCenterId = this.orderTig.workCenter; if (!beginDate) { this.$message({ message: this.$t("base.i18n_pleaseSelectTheStartTimeAndTryAgain"), type: "warning", }); return false; } else if (!workCenterId) { this.$message({ message: this.$t("base.i18n_selectTheWorkCenter") + "!", type: "warning", }); return false; } this.$refs.umppPlanorderPublishGrid.data = []; this.gridOptions.optionsDate.extraParamFields.workCenterId = workCenterId; this.gridOptions.optionsDate.extraParamFields.beginDate = beginDate[0]; this.gridOptions.optionsDate.extraParamFields.endDate = beginDate[1]; this.$refs.poResolveLeftGrid.bindGrid(); }, //选择右表某一行数据 --订单发布Tab页 handleNodeClick(data) { console.log(data); if (data.length != 0) { this.isDisable = false; } else { this.isDisable = true; } this.editData = data; }, //遍历循环下拉框默认显示第一位 --工具 optionData(res) { let optionId = ""; for (let i = 0; i < res.length; i++) { if (res[i].key != "") { optionId = res[i].key; break; } } return optionId; }, //物料编码 mrlCodeSelect(data) { let produCode = data[0].code; let produName = data[0].name; this.gridOrderPublishHas.options.extraParamFields.filters[1].data = produCode; this.gridOrderPublishHas.options.extraParamFields.filters[2].data = produName; this.$refs.gridOrderPublishHas.searchWithFilter(); }, //修改分批个数和每批数量触发 triggerSave(row) { let rowData = this.editData; for (let i in rowData) { if (rowData[i].id == row.id) { rowData[i].batchCount = row.batchCount; rowData[i].batchQty = row.batchQty; } } }, }, }; </script> <style lang="scss" scoped> ::v-deep .button-items-end { .el-form-item__content { align-items: end; } } </style> 帮我分析一下eh-grid是干什么的,怎么用的 下面是README.md中的说明: ## 组件调整 ### eh-grid / x-grid - 增加表格批量操作下拉按钮,和固定列的行操作按钮。 继承表格行操作按钮写法,属性如下: ```js operates: { toolbar: [], // 表格顶部批量操作 list: [], // 固定列的行操作 // toolbar和list:按钮集合[] = // <{ // label: 文本, // type: 类型text(primary / success / warning / danger / info / text), // icon:按钮图标, // disabled:是否禁用, // method:回调方法 --- list时参数为row(当前行), rowIndex(当前行索引) --- toolbar时参数为selectedRows(当前选中行) // pack:是否收起到下拉操作按钮中(false) // }> } ``` 示例: ```js data(){ return { gridOptions:{ grid:{ operates: { toolbar: [{ label: "删除", // 这里使用箭头函数保留this引用 method: (selectedRows) => { this.deleteOper() } }], list: [ { label: "新增", method: (row, rowIndex) => this.addOper()}, { label: "修改", method: (row, rowIndex) => this.editOper(), pack: true }, ], }, } } } } ``` ### eh-layout 新增大量属性。 | 参数 | 说明 | 类型 | 可选值 | 默认值 | | ------------- | ---------------------------- | ------- | ------------- | ------------ | | card | 是否将布局区域设置为卡片模式 | boolean | - | false | | no-wrap | 是否去除外部边距 | boolean | - | false | | size | 布局大小 | string | lg/md/sm/none | md | | gap | 布局区域之间的间距 | string | lg/md/sm/none | md | | full-content | 是否为铺满填充模式 | boolean | - | false | | bottom-fixed | 是否将底部固定 | boolean | - | false | | left-width | 左侧区域的宽度 | string | - | 208px(13rem) | | right-width | 右侧区域的宽度 | string | - | 208px(13rem) | | top-height | 顶部高度 | string | - | 0px | | bottom-height | 底部高度 | string | - | 8rem | - 增加铺满填充模式:`full-content`。可以将当前页面的所有空间占满,内部区域内容超出时,仅会在内部区域滚动。 示例: ```vue <template> <eh-layout card full-content> <div> <!-- 中间区域 --> </div> </eh-layout> </template> ``` 常见场景:单表占满页面。 > **注意:** > > 1. 必须将 `eh-layout` 或 `eh-tabs-nav`(`eh-tabs`)作为 vue 页面的根节点,且 `eh-layout` 和 `eh-tabs-nav` 的组合之间没有其他元素(template 不算)。 > 2. `eh-layout` 和 `eh-tabs-nav`都需要设置 `full-content`。 > 3. `eh-grid` 或 `x-grid`,的 `grid` 属性中,必须将 `height` 设置为:`"auto"` > 4. 带顶部(top)和底部(bottom)时,需设置 top-height 和 bottom-height 属性,才能撑起区域的高度,这两个属性都是带单位的长度字符串(例如 200px,15rem)。 ```vue <template> <!-- 以eh-tabs-nav作为根节点,5.5的新开发页面一般推荐此写法 --> <!-- 参照文件:modules\umasysmanage\operationLog\logList.vue --> <eh-tabs-nav :tabs.sync="tabs" ref="logListTabs" id="logList" full-content> <template slot="logList-select"> <eh-layout full-content card> <eh-grid :grid="gridOptions.grid" id="logGrid" :dataSource="gridOptions.dataSource"></eh-grid> </eh-layout> </template> </eh-tabs-nav> </template> ``` ```vue <template> <!-- 以eh-layout作为根节点,此场景一般是5.2迁移的代码,但仍需按要求调整,同时,这里的eh-layout一般也不会带card属性 --> <!-- 参照文件:modules\umasysmanage\requestControl\role.vue --> <eh-layout id="roleEntry" full-content> <eh-tabs :tabs.sync="tabs" ref="myTabs" full-content @after-close="tabAfterClose"> <template slot="role-select"> <eh-grid id="roleGid" :grid="gridOptions.grid" :dataSource="gridOptions.dataSource"></eh-grid> </template> </eh-tabs> </eh-layout> </template> ```
08-27
<template> <div class="sec-container"> <van-popup v-model:show="showDetailModal" :style="{ width: showType === 'qcOrder'?'30%':'100%', height: '100%', overflow: 'auto' }" position="right" round closeable @close="handleDetailClose" > <van-form ref="addCommentsFormRef" @submit="handleSave"> <!-- 检验单信息 --> <van-cell-group title="检验单信息" v-if="showType === 'qcOrder'"> <!-- <van-field--> <!-- v-model="saveData.applyDate"--> <!-- is-link--> <!-- readonly--> <!-- clearable--> <!-- @click="handleDate"--> <!-- placeholder="请选择提出时间"--> <!-- />--> <van-field v-model="saveData.applyDate" is-link readonly label="提出时间" placeholder="点击选择日期" @click="showDatePicker = true" /> <van-popup v-model:show="showDatePicker" round position="bottom"> <van-date-picker v-model="saveData.applyDate" @confirm="onConfirm" @cancel="showDatePicker = false" /> </van-popup> </van-cell-group> <!-- 编辑/新增时的表单 --> <van-cell-group title="检验单信息" v-if="showType === 'show' || showType === 'result'"> <van-field name="radio" label="检验状态" v-if="showType === 'result'"> <template #input> <van-radio-group v-model="saveData.status" direction="horizontal"> <van-radio name="0">新建</van-radio> <van-radio name="1">检验中</van-radio> <van-radio name="2">合格</van-radio> <van-radio name="-1">不合格</van-radio> </van-radio-group> </template> </van-field> <van-field name="projectNo" label="项目"> <template #input> {{saveData.projectNo}} </template> </van-field> <van-field name="inspClass" label="检验大类" > <template #input> {{saveData.inspClassStr}} </template> </van-field> <van-field name="inspType" label="检验类型" > <template #input> {{saveData.inspTypeName}} </template> </van-field> <van-field name="orgNo" label="基地" > <template #input> {{saveData.orgName}} </template> </van-field> <van-field name="workzone" label="作业区" > <template #input> {{saveData.workzoneName}} </template> </van-field> <van-field name="inspLoc" label="检验地点" > <template #input> {{saveData.inspLoc}} </template> </van-field> <van-field name="mainUserNo" label="负责人" > <template #input> {{saveData.mainUserName}} </template> </van-field> <van-field name="tel" label="联系方式"> <template #input> {{saveData.tel}} </template> </van-field> </van-cell-group> <!-- 管路信息 --> <van-cell-group title="管路信息" v-if="showType != 'qcOrder'"> <!-- 简化显示 --> <div class="search-btn" v-if="showType === 'result'"> <van-button type="primary" @click="changeStatus(1,'pipe')" style="margin-right:10px">合格</van-button> <van-button type="primary" @click="changeStatus(-1,'pipe')" style="margin-right:10px">不合格 </van-button> <van-button type="primary" @click="changeStatus(2,'pipe')" style="margin-right:10px">取消 </van-button> </div> <a-table sticky v-if="showType == 'show'" :scroll="{ x: '100%' }" :columns="pipeTable.columns" :dataSource="pipeTable.dataSource" bordered size="middle" :loading="loading" :pagination="false" rowKey="id" ref="pipeTableRef" > </a-table> <a-table sticky v-if="showType == 'result'" :scroll="{ x: '100%' }" :columns="pipeTable.resColumns" :dataSource="pipeTable.dataSource" bordered size="middle" :loading="loading" :pagination="false" rowKey="id" ref="pipeTableRef" :row-selection="{ selectedRowKeys: pipeTable.selectedRowKeys, onChange: onSelectChange }" > </a-table> </van-cell-group> <!-- 焊缝信息 --> <van-cell-group title="焊缝信息" v-if="showType != 'qcOrder'"> <div class="search-btn" v-if="showType === 'result'"> <van-button type="primary" @click="changeStatus(1,'weld')" style="margin-right:10px">合格</van-button> <van-button type="primary" @click="changeStatus(-1,'weld')" style="margin-right:10px">不合格 </van-button> <van-button type="primary" @click="changeStatus(2,'weld')" style="margin-right:10px">取消 </van-button> </div> <a-table sticky v-if="showType == 'show'" :scroll="{ x: '100%' }" :columns="weldTable.columns" :dataSource="weldTable.dataSource" bordered size="middle" :loading="loading" :pagination="false" rowKey="id" ref="weldTableRef" > </a-table> <a-table sticky v-if="showType == 'result'" :scroll="{ x: '100%' }" :columns="weldTable.resColumns" :dataSource="weldTable.dataSource" bordered size="middle" :loading="loading" :pagination="false" rowKey="id" ref="weldTableRef" :row-selection="{ selectedRowKeys: weldTable.selectedRowKeys, onChange: onWeldSelectChange }" > </a-table> </van-cell-group> <!-- 提交按钮 --> <div style="margin: 16px;"> <van-button round block type="default" @click="handleDetailClose">取消</van-button> <van-button round block type="primary" @click = 'handleSave' native-type="submit" v-if=" showType === 'result' || showType === 'qcOrder'">提交</van-button> </div> </van-form> </van-popup> <div class="top-content"> <div class="project-content"> <div class=""></div> </div> <div class="btn-content"> <div class="btn-right" @click="openSearchDialog"> <SearchOutlined style="font-size: 20px; color: #004688" /> <p class="speNorm">搜索</p> </div> </div> </div> <div class="bot-content" @scroll="handleScroll"> <a-table sticky :scroll="{ x: '100%' }" :columns="columns" :dataSource="data" bordered size="middle" :loading="loading" :pagination="false" rowKey="id" > <template #bodyCell="{ column, record }"> <template v-if="column.key === 'action'"> <a-button type="link" @click="showData(record,'show')" v-resource="[{ url: '/service-piping/cp/insp/order', method: 'POST' }]">查看</a-button> <a-button type="link" @click="showData(record,'result')" v-resource="[{ url: '/service-piping/cp/insp/order', method: 'POST' }]">结果维护</a-button> <a-button type="link" @click="showData(record,'qcOrder')" v-if="record.applyFlag!='Y'" >申请检验</a-button> </template> </template> </a-table> </div> <van-popup v-model:show="searchOpen" position="right" :style="{ width: popupWidth, height: '100%', overflow: 'hidden' }" round closeable @close="handleDetailClose" > <div class="search-content"> <div class="search-top"> <div class="search-project-back" v-if="projectType" @click="handleBack"> <LeftOutlined style="font-size: 15px; color: #004688; margin-top: 3px" />返回 </div> <div class="search-titles"> <span>{{ !projectType ? '搜索' : '搜索项目' }}</span> </div> </div> <div class="search-state"> <van-cell-group inset> <van-field v-model="searchState.projectNo" clearable label="项目" readonly @click="handleProject" /> <van-field v-model="searchState.orderNo" clearable label="检验单号" /> <van-field v-model="searchState.inspClass" clearable @click="handleInspClass" label="检验大类" is-link readonly /> </van-cell-group> <van-popup v-model:show="showPicker" round position="bottom"> <van-picker :columns="inspColumns" @cancel="showPicker = false" @confirm="onInspClassConfirm" /> </van-popup> <project-panel ref="projectpanelRef" @get="getProj"></project-panel> </div> <div class="search-btn"> <van-button type="warning" color="#9A9A9A" @click="onReset">重置</van-button> <van-button type="primary" @click="onSearch">查询 </van-button> </div> </div> </van-popup> </div> </template> <script setup> import { ref, onMounted, onUnmounted, onActivated, computed, watch, createVNode, reactive } from 'vue' import { SearchOutlined, LeftOutlined, ExclamationCircleOutlined } from '@ant-design/icons-vue' import * as serve from '@/api/cp/pipeInspection' import ProjectPanel from '@/components/ProjectPanel.vue' import dayjs from 'dayjs' import { Buffer } from 'buffer' import { useRouter } from 'vue-router' import localforage from 'localforage' import { useHomePage } from '@/stores/homePage' import { Modal } from 'ant-design-vue' import {getBuildBases} from "@/api/common/index.js"; import {showNotify} from "vant"; import { cloneDeep } from 'lodash-es' const showDatePicker = ref(false); const onSelectChange = (keys, rows) => { pipeTable.selectedRowKeys = keys pipeTable.selectedRows = rows } const onWeldSelectChange = (keys, rows) => { weldTable.selectedRowKeys = keys weldTable.selectedRows = rows } const workZoneNos = ref([]) const statusOptions = ref([ { value: -1, text: "不合格" }, { value: 0, text: "新建" }, { value: 1, text: "合格" }, { value: 2, text: "取消" } ]) // const inspClassOptions = [ // { text: '焊前检验', value: 'HQ' }, // { text: '焊后检验', value: 'HH' }, // { text: '压力检验', value: 'PT' }, // { text: '完工检验', value: 'HP' }, // { text: '其他检验', value: 'JY' }, // ] const currProjectNo =ref(null) const selectInsp = ref([]) const weldTable = reactive({ toolbar: { // buttons: [{ code: "addCar", name: "添加物料" }] }, resToolbar: { buttons: [{ code: "qualifiedWeld", name: "合格" },{ code: "unqualifiedWeld", name: "不合格" },{ code: "cancelWeld", name: "取消" }] }, selectedRowKeys: [], selectedRows: [], columns: [ { title: "管号", dataIndex: "pipeNo", width: 120, }, { title: "焊缝号", dataIndex: "weldNo", width: 150, }, { title: "焊缝长度", dataIndex: "length", width: 150, }, { title: "焊接日期", type: "date", dataIndex: "weldDate", width: 150, }, // { // title: "操作", // key: "action", // align: "center", // width: 90, // sorter: false, // scopedSlots: { customRender: "action" }, // fixed: "right", // formInvisible: true // } ], resColumns: [ { title: "项目", dataIndex: "projectNo", width: 90, type: "project", }, { title: "管号", dataIndex: "pipeNo", width: 120, }, { title: "版本号", dataIndex: "pipeVersion", width: 120, }, { title: "焊缝号", dataIndex: "weldNo", width: 150, }, { title: "检验结果", dataIndex: "status", type: "select", width: 80, customRender: function (text) { if (text.record.status) { return stateColumns.value.find( (item) => item.value == text.record.status ).text } else { return '新建' } } }, { title: "小票删除", dataIndex: "pipeDelFlag", width: 80, }, { title: "小票暂停", dataIndex: "pipePauseFlag", width: 80, }, { title: "小票最新版", dataIndex: "pipeTopFlag", width: 80, }, { title: "焊缝删除", dataIndex: "delFlag", width: 80, }, { title: "操作", key: "action", align: "center", width: 200, sorter: false, scopedSlots: { customRender: "action" }, fixed: "right", formInvisible: true } ], dataSource: [] }) const showType = ref('') window.Buffer = Buffer const router = useRouter() const homePage = useHomePage() const saveData = ref({}) const stateColumns = ref( [{ value: 0, text: "新建" }, { value: -1, text: "不合格" }, { value: 1, text: "检验中" }, { value: 2, text: "合格" },] ) const showDetailModal = ref(false) const inspColumns = ref([ { value: 'HQ', text: "焊前检验" }, { value: 'HH', text: "焊后检验" }, { value: 'PT', text: "压力检验" }, { value: 'HP', text: "完工检验" }, { value: 'JY', text: "其他检验" }, ]) const showPicker = ref(false) const buildBaseList = ref([]) const data = ref([]) const loading = ref(false) const dataCount = ref(0) const searchState = ref({ size: 20, page: 0, projectNo: undefined, inspClass: undefined, orderNo: undefined, }) const searchOpen = ref(false) const projectpanelRef = ref(null) const projectType = ref(false) const popupWidth = ref('30%') const isLast = ref(false) const statusList = ref([ { text: '新建', value: 0 }, { text: '进行中', value: 1 }, { text: '已完成', value: 2 } ]) const pipeTable = reactive({ toolbar: { buttons: [{ code: "addPipe", name: "添加物料" }] }, resToolbar: { buttons: [{ code: "qualifiedPipe", name: "合格" },{ code: "unqualifiedPipe", name: "不合格" },{ code: "cancelPipe", name: "取消" }] }, selectedRowKeys: [], selectedRows: [], columns: [ { title: "图号", dataIndex: "drawNo", width: 120, }, { title: "作业对象", dataIndex: "block", width: 150, }, { title: "托盘号", dataIndex: "instPalletNo", width: 150, }, { title: "管号", dataIndex: "pipeNo", width: 120, }, { title: "页号", dataIndex: "pageNo", width: 80, }, { title: "暂停", dataIndex: "isPause", width: 80, }, { title: "删除", dataIndex: "isDelete", width: 80, }, { title: "最新版", dataIndex: "isTopVersion", width: 80, }, { title: "装配承包商", dataIndex: "assyCoopName", width: 150, }, { title: "焊接承包商", dataIndex: "weldingCoopName", width: 150, }, { title: "焊前检验单", dataIndex: "weldingPreOrderNo", width: 150, }, { title: "焊后检验单", dataIndex: "weldingPostOrderNo", width: 150, }, { title: "压力检验单", dataIndex: "ptOrderNo", width: 150, }, { title: "完工/预制放行检验单", dataIndex: "preFinishOrderNo", width: 150, }, { title: "PMI检验单", dataIndex: "pmiOrderNo", width: 150, }, { title: "焊后热处理检验单", dataIndex: "pwhtOrderNo", width: 150, }, { title: "硬度检验单", dataIndex: "hardnessOrderNo", width: 150, }, { title: "铁素体检验单", dataIndex: "ferriteOrderNo", width: 150, }, // { // title: "操作", // key: "action", // align: "center", // sorter: false, // scopedSlots: { customRender: "action" }, // fixed: "right", // formInvisible: true // } ], resColumns: [ { title: "项目", dataIndex: "projectNo", width: 90, type: "project", }, { title: "管号", dataIndex: "pipeNo", width: 120, }, { title: "版本号", dataIndex: "pipeVersion", width: 80, }, { title: "删除", dataIndex: "isDelete", width: 80, }, { title: "暂停", dataIndex: "isPause", width: 80, }, { title: "最新版", dataIndex: "isTopVersion", width: 80, }, { title: "检验结果", dataIndex: "status", type: "select", width: 80, customRender: function (text) { if (text.record.status) { return statusOptions.value.find( (item) => item.value == text.record.status ).text } else { return '新建' } } }, { title: "操作", key: "action", align: "center", width: 200, sorter: false, scopedSlots: { customRender: "action" }, fixed: "right", formInvisible: true } ], dataSource: [] }) const columns = computed(() => { return [ { title: '项目号', dataIndex: 'projectNo', width: 120 }, { title: "基地", dataIndex: "orgNo", condition: true, width: 90, customRender: function (text) { if (text.record.orgNo) return buildBaseList.value.find( (item) => item.value == text.record.orgNo ).text }, }, { title: "检验单号", dataIndex: "orderNo", condition: true, width: 150 }, { dataIndex: "workzoneName", title: "作业区", width: 150, }, { title: "QC单号", dataIndex: "qcOrderNo", condition: true, width: 150 }, { title: "申请检验时间", dataIndex: "createDate", width: 150, type: "datetime", align: "center", customRender: function (text) { if (text.record.createDate) return dayjs(text.record.createDate).format('YYYY-MM-DD HH:mm:ss') }, }, { title: "检验大类", dataIndex: "inspClass", type: "select", width: 100, condition: true, customRender: function (text) { if (text.record.inspClass) return inspColumns.value.find( (item) => item.value == text.record.inspClass ).text }, }, { title: "检验类型", dataIndex: "inspTypeName", width: 150, }, { title: "创建时间", dataIndex: "createDate", width: 150, type: "datetime", customRender: function (text) { if (text.record.createDate) return dayjs(text.record.createDate).format('YYYY-MM-DD HH:mm:ss') }, }, { title: "创建人", dataIndex: "createUserId", width: 120, type: "employeeDescription", options: { fieldNames: { label: "createUserName", value: "createUserId" } } }, { title: "管数量", dataIndex: "pipeNum", width: 80 }, { title: "状态", dataIndex: "status", type: "select", width: 80, condition: true, customRender: function (text) { if (text.record.status) { return statusOptions.value.find( (item) => item.value == text.record.status ).text } else { return '新建' } } }, { title: '操作', dataIndex: 'action', width: 140, key: 'action' } ] }) const loadData = (type) => { loading.value = true serve.getOrderList(searchState.value).then(async (res) => { for (let item of res.content) { item.targetStorageDate = item.targetStorageDate ? dayjs(item.targetStorageDate).format('YYYY-MM-DD') : '' item.isDownload = false let value = await localforage.getItem(item.id.toString()) if (value instanceof Blob && value.size > 0 && value.type === 'application/pdf') { item.isDownload = true } } if (type == 'scroll') { data.value.push(...res.content) } else { data.value = res.content } dataCount.value = res.totalElements || 0 isLast.value = res.last loading.value = false }) } const handleScroll = (e) => { const element = e.target if (element.scrollTop + element.clientHeight >= element.scrollHeight) { if (!isLast.value) { searchState.value.page++ loadData('scroll') } } } const openSearchDialog = () => { searchOpen.value = true } const handleProject = () => { projectType.value = true projectpanelRef.value.open = true projectpanelRef.value.init() } const handleBack = () => { projectType.value = false projectpanelRef.value.open = false } const handleClose = () => { projectType.value = false projectpanelRef.value.open = false } const handleDetailClose = () => { showDetailModal.value = false } const handleResize = () => { if (window.innerWidth < 1000) { popupWidth.value = '60%' } else { popupWidth.value = '30%' } } const getProj = (val) => { searchState.value.projectNo = val.projId searchState.value.projNo = val.projNo handleClose() } const onSearch = () => { searchState.value.page = 0 loadData() searchOpen.value = false } const onReset = () => { searchState.value.page = 0 searchState.value.projectNo = undefined searchState.value.projNo = undefined searchState.value.inspClass = undefined searchState.value.orderNo = undefined } const handleBeforeUnload = () => { if (!homePage.isOnline) { Modal.confirm({ title: '浏览器当前处于离线状态,是否继续?', icon: createVNode(ExclamationCircleOutlined), content: createVNode( 'div', { style: 'color:red;' }, '一旦刷新,将无法继续使用' ), onOk() { console.log('OK') }, onCancel() { console.log('Cancel') } }) } } watch( () => homePage.isOnline, async (newVal) => { if (!newVal) { try { const listData = await localforage.getItem('downloadList') if (listData) { const list = JSON.parse(listData) list.forEach((item) => { item.isDownload = true }) data.value = list } } catch (error) { console.error('Error parsing list data:', error) } } else { onReset() loadData() } } ) const onInspClassConfirm = ({ selectedOptions }) => { showPicker.value = false searchState.value.inspClass = selectedOptions[0].value } const handleInspClass = () => { showPicker.value = true } onMounted(() => { getBuildBase() serve.getWorkZone({majors:'管路'}).then((res) => { workZoneNos.value = res.status == 200 ? res.data.map((item) => { return { label: item.name, value: item.code, } }) : []; }) if (homePage.isOnline) { loadData() } handleResize() window.addEventListener('resize', handleResize) window.addEventListener('beforeunload', handleBeforeUnload) }) onUnmounted(() => { window.removeEventListener('resize', handleResize) window.removeEventListener('beforeunload', handleBeforeUnload) }) onActivated(async () => { if (!homePage.isOnline) { try { const listData = await localforage.getItem('downloadList') if (listData) { const list = JSON.parse(listData) list.forEach((item) => { item.isDownload = true }) data.value = list } } catch (error) { console.error('Error parsing list data:', error) } } }) const getBuildBase = () => { getBuildBases().then((res) => { buildBaseList.value = res.map((item) => ({ value: item.orgNo, text: item.name })) }) } const showData = (record,showTypeStr) => { serve.getOrderList({id:record.id}).then((res) => { console.log('res.data',res) console.log('res.data',res.data) console.log('res.data.content',res.content) saveData.value = res.content[0] saveData.value.mainUserNo = { label: saveData.value.mainUserName, value: saveData.value.mainUserNo } saveData.value.status = saveData.value.status+'' pipeTable.dataSource = res.content[0].pipeList console.log('pipeTable.dataSource',pipeTable.dataSource) weldTable.dataSource = res.content[0].weldList currProjectNo.value = res.content[0].projectNo showDetailModal.value = true showType.value = showTypeStr saveData.value.inspClassStr = inspColumns.value.find( (item) => item.value == saveData.value.inspClass ).text saveData.value.orgName = buildBaseList.value.find( (item) => item.value == saveData.value.orgNo ).text serve.getInsp({ projName: res.content[0].projectNo, professionNo: "CP" }).then((res) => { selectInsp.value = res.map((item) => { return { label: item.MSVALUE+"", value: item.MSKEY+"", } }) }) }) } const onConfirm = ({ selectedValues }) => { saveData.applyDate = selectedValues.join('-'); console.log('saveData.applyDate',saveData.applyDate) console.log('selectedValues',selectedValues) showDatePicker.value = false; }; const changeStatus = (stateNum,type)=>{ console.log('pipeTable',pipeTable.selectedRows) console.log('weldTable',weldTable.selectedRows) if(type === 'pipe' ){ if(pipeTable.selectedRows.length === 0 ){ showNotify({ type: 'danger', message: '请选择一条数据' }) return } pipeTable.dataSource = pipeTable.dataSource.map(item => { const selectedItem = pipeTable.selectedRows.find(row => row.id === item.id); return selectedItem ? { ...item, status: stateNum } : item; }); } if(type === 'weld'){ if(weldTable.selectedRows.length === 0 ){ showNotify({ type: 'danger', message: '请选择一条数据' }) return } weldTable.dataSource = weldTable.dataSource.map(item => { const selectedItem = weldTable.selectedRows.find(row => row.id === item.id); return selectedItem ? { ...item, status: stateNum } : item; }); } console.log('pipeTable.dataSource',pipeTable.dataSource) console.log('weldTable.dataSource',weldTable.dataSource) } const handleSave = () => { let param = cloneDeep(saveData.value) if(showType.value == 'result'){ param.editType = 1 param.id = saveData.value.id } else { param.getEditType = 0 if('edit' == showType.value){ param.id = saveData.value.id } } if (param.mainUserNo && param.mainUserNo.value) { param.mainUserName = param.mainUserNo.label param.mainUserNo = param.mainUserNo.value } else { param.mainUserNo = '' } param.pipeList = pipeTable.dataSource param.weldList = weldTable.dataSource serve.saveOrderList(param).then(() => { showNotify({ type: 'success', message: '操作成功' }) // if(type.value != 'result'){ showDetailModal.value = false // } }) } </script> <style lang="scss" scoped> :deep .urgentFlag-active { background: #ffb656; } :deep .abnormalFlag-active { background: #fb7171; } :deep .anticon-search { line-height: 0 !important; } </style> <style lang="scss" scoped> @import '@/styles/common.scss'; .search-content { width: 100%; overflow: hidden; // height: 100%; .search-top { width: 100%; height: 50px; margin-top: 20px; display: flex; justify-content: center; align-content: center; .search-project-back { font-size: 14px; display: flex; align-content: center; position: absolute; left: 10px; color: #004688; } .search-titles { height: 100%; display: flex; justify-content: center; align-content: center; color: #004688; span { font-size: 15px; margin-left: 5px; } } } .search-state { width: 100%; height: calc(100% - 45px - 10px); position: absolute; bottom: 0; overflow: hidden; overflow-y: scroll; } } .action-buttons { display: flex; align-items: center; justify-content: space-around; } </style> 点击申请检验后点击提出时间没有弹出日期选择框
最新发布
09-17
Js双日历控件,在一个网页上同时显示两个日期选择器,写成了封装类,方便使用者调用。同时美化的相当不错。   包括了以下函数:   1、2012——2020年节假日信息(包括节假日前1~3天/后1~3天)   2、格式化数字,不足两位前面补0   3、将日期对象/日期字会串格式化为指定日期字符串   4、将日期字符串格式化为数字   5、获取目标元素针对于文档的位置   6、元素选择器   7、查找元素位置   8、判断目标元素是否包含指定的className      关于一些日历调用的参数说明:Calendar({    id: "#J_date_1", //触发显示日历元素ID    isPopup: !0, //弹出式日历    isPrevBtn: !0, //显示上月按钮    isNextBtn: !0, //显示下月按钮    isCloseBtn: !0, //显示关闭按钮    isHoliday: !0, //节假日特殊显示    isHolidayTips: !0, //显示节假日1~3天/后1~3天信息    isDateInfo: !0, //显示日期信息    isMessage: !0, //有日历提示信息    isCalStart: !0, //标记为开始时间    dateInfoClass: "date-info-start", //开始时间icon样式    range: {mindate: "2011-09-01", maxdate: "2020-12-31"},//限制范围(当天——2020-12-31)    count: 2, //日历个数    monthStep: 1, //切换上下月日历步长    onSelectDate: fnSelectDate, //选择日期回调方法    onClose: fnClose //关闭日历回调方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值