Browse Source

feat:[模板管理][sp003]

lkf
luojie 2 months ago
parent
commit
d3c2017d15
8 changed files with 357 additions and 280 deletions
  1. +18
    -1
      src/components/Template/BaseInfoFormPcakge.vue
  2. +32
    -21
      src/components/Template/CustomTable.vue
  3. +3
    -0
      src/components/Template/HandleFormItem.vue
  4. +254
    -245
      src/utils/index.js
  5. +29
    -4
      src/views/business/comps/template/comps/sp/SWYPBQGZYZBB.vue
  6. +17
    -6
      src/views/business/comps/template/comps/sp/SWYPNBGZYZBB.vue
  7. +1
    -1
      src/views/business/comps/template/formConfig/paralleAndLadderConfig.js
  8. +3
    -2
      src/views/business/comps/template/mixins/templateMixin.js

+ 18
- 1
src/components/Template/BaseInfoFormPcakge.vue View File

@ -83,6 +83,7 @@
<div v-else-if="sItem.type === 'clickable'" class="flex1">
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey+'_'+key" type="clickable" @clickable="handleClickable(sItem, $event)"
:error="errors[key]" @update:error="errors[key] = false"
@resetRecord="resetRecord(key)"
:item="sItem" :value="formFields[key]" />
</div>
@ -129,6 +130,7 @@
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey+'_'+sItem.subKey" class="ml-10" v-else-if="sItem.subType === 'clickable'" type="clickable"
@clickable="handleClickable(sItem, $event)" :item="getClickableItem(sItem)"
:error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false"
@resetRecord="resetRecord(sItem.subKey)"
:value="formFields[sItem.subKey]" />
<div v-show="isShowOther(formFields[sItem.subKey])" class="flex flex1">
<div class="other-title">{{sItem.otherLabel ? $t(sItem.otherLabel) : $t("template.common.other") }}</div>
@ -158,12 +160,14 @@
<HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey+'_'+sItem.subKey" class="ml-10" v-else-if="sItem.subType === 'clickable'"
@clickable="handleClickable(sItem, $event)" :error="errors[sItem.subKey]" type="clickable"
@update:error="errors[sItem.subKey] = false"
@resetRecord="resetRecord(sItem.subKey)"
:item="getClickableItem(sItem)" :value="formFields[sItem.subKey]" />
</div>
<div v-else-if="sItem.type === 'clickable'" class="flex flex1">
<HandleFormItem :field-item-label="fieldItemLabel"
:field-key="prefixKey+'_'+key" type="clickable" @clickable="handleClickable(sItem, $event)"
:error="errors[key]" @update:error="errors[key] = false"
@resetRecord="resetRecord(key)"
:item="sItem" :value="formFields[key]" />
</div>
</div>
@ -213,6 +217,7 @@ export default {
allFieldsConfig: {},//config,
errors: {},//
orangeBgFields: {},//
oldFormFields: {},//
};
},
watch: {
@ -268,7 +273,16 @@ export default {
}
},
//
updateFormData(key, value) {
updateFormData(key, value,oldKeys = []) {
if(oldKeys.length){
//
const cloneFormFields = JSON.parse(JSON.stringify(this.formFields));
oldKeys.forEach(oldKey => {
//clickable
this.oldFormFields[oldKey] = cloneFormFields[oldKey];
})
}
this.formFields[key] = value;
//
if (this.errors[key]) {
@ -557,6 +571,9 @@ console.log(key,val,compKey,"compKey")
this.onBlur(key, formFields[key]);
}
},
resetRecord(key){
this.formFields = {...this.formFields, ...this.oldFormFields}
},
},
}
</script>

+ 32
- 21
src/components/Template/CustomTable.vue View File

@ -76,12 +76,14 @@
@update:error="onErrorUpdate(rowIndex, colIndex, col.prop, $event)"
:orange-bg="hasOrangeBg(rowIndex, colIndex, col.prop)" />
</div>
<template v-else>
{{ row[col.prop] }}
<template v-else-if="col.bodyType === 'span'">
<div class="body-span">
{{ row[col.prop] }}
</div>
</template>
</div>
<div v-show="isShowOther(row[col.prop])" class="flex flex1">
<div v-show="isShowOther(row[col.prop],col)" class="flex flex1">
<div class="other-title">{{ col.otherLabel ? $t(col.otherLabel) : $t("template.common.other") }}
</div>
<div class="flex flex1">
@ -114,7 +116,9 @@
</template>
<template v-else-if="col.bodySubType === 'span'">
{{ row[col.bodySubKey] }}
<div class="body-span">
{{ row[col.bodySubKey] }}
</div>
</template>
</div>
</div>
@ -207,7 +211,7 @@ export default {
const { stepTableFormData = [], headerSelectFields = {} } = newData;
this.updateDataSource(stepTableFormData);
this.headerSelectFields = JSON.parse(JSON.stringify(headerSelectFields));
// compareTo
this.checkCompareToOnDataLoad();
}
@ -238,7 +242,10 @@ export default {
}
},
//
isShowOther(v = []) {
isShowOther(v = [],col) {
if(!col.otherCode){
return false;
}
// v
const arr = Array.isArray(v) ? v : [v];
//value
@ -431,11 +438,11 @@ export default {
// compareTo
checkCompareToLogic(rowIndex, colIndex, colKey, value) {
const col = this.columns[colIndex];
// compareTo
if (col && col.bodyFillType === "actFill" && col.compareTo) {
const compareToValue = this.localDataSource[rowIndex][col.compareTo];
// compareTo
if (value !== compareToValue) {
this.setOrangeBg(rowIndex, colIndex, colKey, true);
@ -445,15 +452,15 @@ export default {
}
}
},
// compareTo
checkCompareToOnDataLoad() {
// compareTo
this.localDataSource.forEach((row, rowIndex) => {
this.columns.forEach((col, colIndex) => {
const currentValue = row[col.prop];
const compareToValue = row[col.compareTo];
if ( col.compareTo && currentValue && compareToValue) {
const currentValue = row[col.prop];
const compareToValue = row[col.compareTo];
if (col.compareTo && currentValue && compareToValue) {
// compareTo
if (!isEqual(currentValue, compareToValue)) {
this.setOrangeBg(rowIndex, colIndex, col.prop, true);
@ -462,13 +469,13 @@ export default {
this.setOrangeBg(rowIndex, colIndex, col.prop, false);
}
}
// compareTo
if (col.bodySubFillType === "actFill" && col.bodySubCompareTo) {
const currentValue = row[col.bodySubKey];
const compareToValue = row[col.bodySubCompareTo];
if (!!currentValue&& !!compareToValue) {
if (!!currentValue && !!compareToValue) {
// compareTo
if (!isEqual(currentValue, compareToValue)) {
this.setOrangeBg(rowIndex, colIndex, col.bodySubKey, true);
@ -481,15 +488,15 @@ export default {
});
});
},
//
onBodyValueChange(rowIndex, colIndex, value) {
const col = this.columns[colIndex];
this.localDataSource[rowIndex][col.prop] = value;
// compareTo
this.checkCompareToLogic(rowIndex, colIndex, col.prop, value);
//
this.formErrors = this.formErrors.filter(error =>
!(error.rowIndex === rowIndex &&
@ -502,11 +509,11 @@ export default {
onBodySubValueChange(rowIndex, colIndex, value) {
const col = this.columns[colIndex];
this.localDataSource[rowIndex][col.bodySubKey] = value;
// compareTo
if (col && col.bodySubFillType === "actFill" && col.bodySubCompareTo) {
const compareToValue = this.localDataSource[rowIndex][col.bodySubCompareTo];
// compareTo
if (value !== compareToValue) {
this.setOrangeBg(rowIndex, colIndex, col.bodySubKey, true);
@ -515,7 +522,7 @@ export default {
this.setOrangeBg(rowIndex, colIndex, col.bodySubKey, false);
}
}
//
this.formErrors = this.formErrors.filter(error =>
!(error.rowIndex === rowIndex &&
@ -822,4 +829,8 @@ export default {
color: #606266;
width: auto;
}
.body-span {
text-align: center;
}
</style>

+ 3
- 0
src/components/Template/HandleFormItem.vue View File

@ -387,6 +387,9 @@ export default {
this.$emit('input', this.inputValue); // v-model
this.$emit("blur", this.oldValue);
this.$emit("change", this.oldValue);
if(this.item.type === "clickable"){
this.$emit("resetRecord");
}
},
//

+ 254
- 245
src/utils/index.js View File

@ -1,18 +1,19 @@
import { parseTime } from './ruoyi'
import { encrypt,decrypt } from '@/utils/encryptUtil'
import { encrypt, decrypt } from '@/utils/encryptUtil';
import moment from 'moment';
/**
* 表格时间格式化
*/
export function formatDate(cellValue) {
if (cellValue == null || cellValue == "") return ""
var date = new Date(cellValue)
var year = date.getFullYear()
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
if (cellValue == null || cellValue == "") return ""
var date = new Date(cellValue)
var year = date.getFullYear()
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
}
/**
@ -21,41 +22,41 @@ export function formatDate(cellValue) {
* @returns {string}
*/
export function formatTime(time, option) {
if (('' + time).length === 10) {
time = parseInt(time) * 1000
} else {
time = +time
}
const d = new Date(time)
const now = Date.now()
const diff = (now - d) / 1000
if (diff < 30) {
return '刚刚'
} else if (diff < 3600) {
// less 1 hour
return Math.ceil(diff / 60) + '分钟前'
} else if (diff < 3600 * 24) {
return Math.ceil(diff / 3600) + '小时前'
} else if (diff < 3600 * 24 * 2) {
return '1天前'
}
if (option) {
return parseTime(time, option)
} else {
return (
d.getMonth() +
1 +
'月' +
d.getDate() +
'日' +
d.getHours() +
'时' +
d.getMinutes() +
'分'
)
}
if (('' + time).length === 10) {
time = parseInt(time) * 1000
} else {
time = +time
}
const d = new Date(time)
const now = Date.now()
const diff = (now - d) / 1000
if (diff < 30) {
return '刚刚'
} else if (diff < 3600) {
// less 1 hour
return Math.ceil(diff / 60) + '分钟前'
} else if (diff < 3600 * 24) {
return Math.ceil(diff / 3600) + '小时前'
} else if (diff < 3600 * 24 * 2) {
return '1天前'
}
if (option) {
return parseTime(time, option)
} else {
return (
d.getMonth() +
1 +
'月' +
d.getDate() +
'日' +
d.getHours() +
'时' +
d.getMinutes() +
'分'
)
}
}
/**
@ -63,18 +64,18 @@ export function formatTime(time, option) {
* @returns {Object}
*/
export function getQueryObject(url) {
url = url == null ? window.location.href : url
const search = url.substring(url.lastIndexOf('?') + 1)
const obj = {}
const reg = /([^?&=]+)=([^?&=]*)/g
search.replace(reg, (rs, $1, $2) => {
const name = decodeURIComponent($1)
let val = decodeURIComponent($2)
val = String(val)
obj[name] = val
return rs
})
return obj
url = url == null ? window.location.href : url
const search = url.substring(url.lastIndexOf('?') + 1)
const obj = {}
const reg = /([^?&=]+)=([^?&=]*)/g
search.replace(reg, (rs, $1, $2) => {
const name = decodeURIComponent($1)
let val = decodeURIComponent($2)
val = String(val)
obj[name] = val
return rs
})
return obj
}
/**
@ -82,15 +83,15 @@ export function getQueryObject(url) {
* @returns {number} output value
*/
export function byteLength(str) {
// returns the byte length of an utf8 string
let s = str.length
for (var i = str.length - 1; i >= 0; i--) {
const code = str.charCodeAt(i)
if (code > 0x7f && code <= 0x7ff) s++
else if (code > 0x7ff && code <= 0xffff) s += 2
if (code >= 0xDC00 && code <= 0xDFFF) i--
}
return s
// returns the byte length of an utf8 string
let s = str.length
for (var i = str.length - 1; i >= 0; i--) {
const code = str.charCodeAt(i)
if (code > 0x7f && code <= 0x7ff) s++
else if (code > 0x7ff && code <= 0xffff) s += 2
if (code >= 0xDC00 && code <= 0xDFFF) i--
}
return s
}
/**
@ -98,13 +99,13 @@ export function byteLength(str) {
* @returns {Array}
*/
export function cleanArray(actual) {
const newArray = []
for (let i = 0; i < actual.length; i++) {
if (actual[i]) {
newArray.push(actual[i])
}
}
return newArray
const newArray = []
for (let i = 0; i < actual.length; i++) {
if (actual[i]) {
newArray.push(actual[i])
}
}
return newArray
}
/**
@ -112,13 +113,13 @@ export function cleanArray(actual) {
* @returns {Array}
*/
export function param(json) {
if (!json) return ''
return cleanArray(
Object.keys(json).map(key => {
if (json[key] === undefined) return ''
return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
})
).join('&')
if (!json) return ''
return cleanArray(
Object.keys(json).map(key => {
if (json[key] === undefined) return ''
return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
})
).join('&')
}
/**
@ -126,21 +127,21 @@ export function param(json) {
* @returns {Object}
*/
export function param2Obj(url) {
const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
if (!search) {
return {}
}
const obj = {}
const searchArr = search.split('&')
searchArr.forEach(v => {
const index = v.indexOf('=')
if (index !== -1) {
const name = v.substring(0, index)
const val = v.substring(index + 1, v.length)
obj[name] = val
}
})
return obj
const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
if (!search) {
return {}
}
const obj = {}
const searchArr = search.split('&')
searchArr.forEach(v => {
const index = v.indexOf('=')
if (index !== -1) {
const name = v.substring(0, index)
const val = v.substring(index + 1, v.length)
obj[name] = val
}
})
return obj
}
/**
@ -148,9 +149,9 @@ export function param2Obj(url) {
* @returns {string}
*/
export function html2Text(val) {
const div = document.createElement('div')
div.innerHTML = val
return div.textContent || div.innerText
const div = document.createElement('div')
div.innerHTML = val
return div.textContent || div.innerText
}
/**
@ -160,21 +161,21 @@ export function html2Text(val) {
* @returns {Object}
*/
export function objectMerge(target, source) {
if (typeof target !== 'object') {
target = {}
}
if (Array.isArray(source)) {
return source.slice()
}
Object.keys(source).forEach(property => {
const sourceProperty = source[property]
if (typeof sourceProperty === 'object') {
target[property] = objectMerge(target[property], sourceProperty)
} else {
target[property] = sourceProperty
}
})
return target
if (typeof target !== 'object') {
target = {}
}
if (Array.isArray(source)) {
return source.slice()
}
Object.keys(source).forEach(property => {
const sourceProperty = source[property]
if (typeof sourceProperty === 'object') {
target[property] = objectMerge(target[property], sourceProperty)
} else {
target[property] = sourceProperty
}
})
return target
}
/**
@ -182,19 +183,19 @@ export function objectMerge(target, source) {
* @param {string} className
*/
export function toggleClass(element, className) {
if (!element || !className) {
return
}
let classString = element.className
const nameIndex = classString.indexOf(className)
if (nameIndex === -1) {
classString += '' + className
} else {
classString =
classString.substr(0, nameIndex) +
classString.substr(nameIndex + className.length)
}
element.className = classString
if (!element || !className) {
return
}
let classString = element.className
const nameIndex = classString.indexOf(className)
if (nameIndex === -1) {
classString += '' + className
} else {
classString =
classString.substr(0, nameIndex) +
classString.substr(nameIndex + className.length)
}
element.className = classString
}
/**
@ -202,11 +203,11 @@ export function toggleClass(element, className) {
* @returns {Date}
*/
export function getTime(type) {
if (type === 'start') {
return new Date().getTime() - 3600 * 1000 * 24 * 90
} else {
return new Date(new Date().toDateString())
}
if (type === 'start') {
return new Date().getTime() - 3600 * 1000 * 24 * 90
} else {
return new Date(new Date().toDateString())
}
}
/**
@ -216,38 +217,38 @@ export function getTime(type) {
* @return {*}
*/
export function debounce(func, wait, immediate) {
let timeout, args, context, timestamp, result
const later = function() {
// 据上一次触发时间间隔
const last = +new Date() - timestamp
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last)
} else {
timeout = null
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
if (!immediate) {
result = func.apply(context, args)
if (!timeout) context = args = null
}
}
}
return function(...args) {
context = this
timestamp = +new Date()
const callNow = immediate && !timeout
// 如果延时不存在,重新设定延时
if (!timeout) timeout = setTimeout(later, wait)
if (callNow) {
result = func.apply(context, args)
context = args = null
}
return result
}
let timeout, args, context, timestamp, result
const later = function () {
// 据上一次触发时间间隔
const last = +new Date() - timestamp
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last)
} else {
timeout = null
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
if (!immediate) {
result = func.apply(context, args)
if (!timeout) context = args = null
}
}
}
return function (...args) {
context = this
timestamp = +new Date()
const callNow = immediate && !timeout
// 如果延时不存在,重新设定延时
if (!timeout) timeout = setTimeout(later, wait)
if (callNow) {
result = func.apply(context, args)
context = args = null
}
return result
}
}
/**
@ -258,18 +259,18 @@ export function debounce(func, wait, immediate) {
* @returns {Object}
*/
export function deepClone(source) {
if (!source && typeof source !== 'object') {
throw new Error('error arguments', 'deepClone')
}
const targetObj = source.constructor === Array ? [] : {}
Object.keys(source).forEach(keys => {
if (source[keys] && typeof source[keys] === 'object') {
targetObj[keys] = deepClone(source[keys])
} else {
targetObj[keys] = source[keys]
}
})
return targetObj
if (!source && typeof source !== 'object') {
throw new Error('error arguments', 'deepClone')
}
const targetObj = source.constructor === Array ? [] : {}
Object.keys(source).forEach(keys => {
if (source[keys] && typeof source[keys] === 'object') {
targetObj[keys] = deepClone(source[keys])
} else {
targetObj[keys] = source[keys]
}
})
return targetObj
}
/**
@ -277,16 +278,16 @@ export function deepClone(source) {
* @returns {Array}
*/
export function uniqueArr(arr) {
return Array.from(new Set(arr))
return Array.from(new Set(arr))
}
/**
* @returns {string}
*/
export function createUniqueString() {
const timestamp = +new Date() + ''
const randomNum = parseInt((1 + Math.random()) * 65536) + ''
return (+(randomNum + timestamp)).toString(32)
const timestamp = +new Date() + ''
const randomNum = parseInt((1 + Math.random()) * 65536) + ''
return (+(randomNum + timestamp)).toString(32)
}
/**
@ -296,7 +297,7 @@ export function createUniqueString() {
* @returns {boolean}
*/
export function hasClass(ele, cls) {
return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
}
/**
@ -305,7 +306,7 @@ export function hasClass(ele, cls) {
* @param {string} cls
*/
export function addClass(ele, cls) {
if (!hasClass(ele, cls)) ele.className += ' ' + cls
if (!hasClass(ele, cls)) ele.className += ' ' + cls
}
/**
@ -314,98 +315,106 @@ export function addClass(ele, cls) {
* @param {string} cls
*/
export function removeClass(ele, cls) {
if (hasClass(ele, cls)) {
const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
ele.className = ele.className.replace(reg, ' ')
}
if (hasClass(ele, cls)) {
const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
ele.className = ele.className.replace(reg, ' ')
}
}
export function makeMap(str, expectsLowerCase) {
const map = Object.create(null)
const list = str.split(',')
for (let i = 0; i < list.length; i++) {
map[list[i]] = true
}
return expectsLowerCase
? val => map[val.toLowerCase()]
: val => map[val]
const map = Object.create(null)
const list = str.split(',')
for (let i = 0; i < list.length; i++) {
map[list[i]] = true
}
return expectsLowerCase
? val => map[val.toLowerCase()]
: val => map[val]
}
export const exportDefault = 'export default '
export const beautifierConf = {
html: {
indent_size: '2',
indent_char: ' ',
max_preserve_newlines: '-1',
preserve_newlines: false,
keep_array_indentation: false,
break_chained_methods: false,
indent_scripts: 'separate',
brace_style: 'end-expand',
space_before_conditional: true,
unescape_strings: false,
jslint_happy: false,
end_with_newline: true,
wrap_line_length: '110',
indent_inner_html: true,
comma_first: false,
e4x: true,
indent_empty_lines: true
},
js: {
indent_size: '2',
indent_char: ' ',
max_preserve_newlines: '-1',
preserve_newlines: false,
keep_array_indentation: false,
break_chained_methods: false,
indent_scripts: 'normal',
brace_style: 'end-expand',
space_before_conditional: true,
unescape_strings: false,
jslint_happy: true,
end_with_newline: true,
wrap_line_length: '110',
indent_inner_html: true,
comma_first: false,
e4x: true,
indent_empty_lines: true
}
html: {
indent_size: '2',
indent_char: ' ',
max_preserve_newlines: '-1',
preserve_newlines: false,
keep_array_indentation: false,
break_chained_methods: false,
indent_scripts: 'separate',
brace_style: 'end-expand',
space_before_conditional: true,
unescape_strings: false,
jslint_happy: false,
end_with_newline: true,
wrap_line_length: '110',
indent_inner_html: true,
comma_first: false,
e4x: true,
indent_empty_lines: true
},
js: {
indent_size: '2',
indent_char: ' ',
max_preserve_newlines: '-1',
preserve_newlines: false,
keep_array_indentation: false,
break_chained_methods: false,
indent_scripts: 'normal',
brace_style: 'end-expand',
space_before_conditional: true,
unescape_strings: false,
jslint_happy: true,
end_with_newline: true,
wrap_line_length: '110',
indent_inner_html: true,
comma_first: false,
e4x: true,
indent_empty_lines: true
}
}
// 首字母大小
export function titleCase(str) {
return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
}
// 下划转驼峰
export function camelCase(str) {
return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
}
export function isNumberStr(str) {
return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
}
// 编码
export function caesarCipher(str) {
return btoa(encrypt(str))
return btoa(encrypt(str))
}
// 解码
export function caesarDecipher(str) {
return decrypt(atob(str));
return decrypt(atob(str));
}
//比较值是否相等,不需要比较类型
export const isEqual = (oldValue, nowValue) =>{
if (oldValue === null || nowValue === null) {
return oldValue === nowValue;
}
if (typeof oldValue === 'object' && typeof nowValue === 'object') {
return JSON.stringify(oldValue) === JSON.stringify(nowValue);
}
return oldValue == nowValue;
export const isEqual = (oldValue, nowValue) => {
if (oldValue === null || nowValue === null) {
return oldValue === nowValue;
}
if (typeof oldValue === 'object' && typeof nowValue === 'object') {
return JSON.stringify(oldValue) === JSON.stringify(nowValue);
}
return oldValue == nowValue;
}
//计算过期时间
export const getExpireDate = (startDate, effectivePeriod, effectivePeriodUnit) => {
const start = moment(startDate)
const unit = effectivePeriodUnit === '天' ? 'days' : 'hours';
const end = start
.add(Number(effectivePeriod), unit)
.format('YYYY-MM-DD HH:mm:ss');
return end;
}

+ 29
- 4
src/views/business/comps/template/comps/sp/SWYPBQGZYZBB.vue View File

@ -16,7 +16,7 @@
<div class="template-form-item">
<BaseInfoFormPcakge @clickable="handleClickable" ref="stepFormPackageRef" :formConfig="stepFormConfig" @blur="onHandleBlur"
:formData="formData" />
<CustomTable fieldItemLabel = "操作步骤" @blur="onHandleTableBlur" :showOperation="false" ref="stepTableRef" :columns="stepColumns"
<CustomTable fieldItemLabel = "操作步骤" @blur="onHandleTableBlur" :showAddRow="false" :showOperation="false" ref="stepTableRef" :columns="stepColumns"
:formData="formData" >
<template slot="operation" slot-scope="{ row, rowIndex}">
<TableOpertaion :fillType="fillType" :row="row" :rowIndex="rowIndex" @deleteRow="deleteRow"></TableOpertaion>
@ -28,7 +28,7 @@
</div>
</div>
<button @click="onSave">保存</button>
<!-- <button @click="onSave">保存</button> -->
</div>
<SelectReagentDialog
@submit="onSelectReagentSubmit"
@ -45,7 +45,8 @@ import Step from "@/components/Template/Step";
import templateMixin from "../../mixins/templateMixin";
import CustomTable from '@/components/Template/CustomTable.vue';
import SelectReagentDialog from '../../dialog/SelectReagentDialog.vue';
import TableOpertaion from "@/components/Template/operation/TableOpertaion.vue"
import TableOpertaion from "@/components/Template/operation/TableOpertaion.vue";
import {EventBus} from "@/utils/eventBus";
export default {
name: "SWYPBQGZYZBB",
@ -61,7 +62,9 @@ export default {
fillType: {
immediate: true,
handler(v) {
console.log(v,"fillType")
if(v &&this.fillType === "actFill"){
this.handleUpdateCode();
}
}
},
},
@ -409,6 +412,28 @@ export default {
},
methods: {
//
async handleUpdateCode() {
const ref = this.$refs.stepTableRef;
const {stepTableFormData} = this.formData;
const snList = await this.getLatestSn(stepTableFormData.length);
stepTableFormData.forEach((item,index) => {
ref.updateDataSourceByRowIndex(index,{subTargetSolutionCode: stepTableFormData.length==1?snList:snList[index]});
})
this.$nextTick(() => {
//
const params = {
type: "fieldChanged",
newRecord: null,
resourceList: null,
}
EventBus.$emit('onModifyRecord', params,)
})
},
//
getFilledFormData(){
return this.getFilledFormDataByRefs(["baseInfoRef", "storageConditionRef", "stepFormPackageRef", "stepRef", "remarkRef","stepTableRef"])
},
handleClickable(item) {
if(this.fillType === "preFill"){
return;

+ 17
- 6
src/views/business/comps/template/comps/sp/SWYPNBGZYZBB.vue View File

@ -98,7 +98,8 @@ import Step from "@/components/Template/Step";
import templateMixin from "../../mixins/templateMixin";
import CustomTable from '@/components/Template/CustomTable.vue';
import SelectReagentDialog from '../../dialog/SelectReagentDialog.vue';
import TableOpertaion from "@/components/Template/operation/TableOpertaion.vue"
import TableOpertaion from "@/components/Template/operation/TableOpertaion.vue";
import {getExpireDate} from "@/utils/index.js";
import { getLadderColumnsConfig, getParallelColumnsConfig, getLadderFormConfig, getBaseInfoFormConfig, getRemarkFormConfig, getStorageConditionFormConfig, getParalleStepFormConfig } from "../../formConfig/paralleAndLadderConfig.js";
export default {
name: "SWYPBQGZYZBB",
@ -172,12 +173,16 @@ export default {
//
async assignNumbersToTableData(config) {
const configs = this.formData[config]
const {startDate} = this.formData;
// paralleConfigsparalleTableFormData
if (configs && configs.length > 0) {
for (let i = 0; i < configs.length; i++) {
const ref = config === "paralleConfigs" ? `paralleStepTableRef_${i}` : `ladderStepTableRef_${i}`;
const {stepTableFormData = []} = configs[i];
const {stepTableFormData = [], effectivePeriod, effectivePeriodUnit,expireDate} = configs[i];
if(!expireDate && config === "ladderConfigs"){
const date = getExpireDate(startDate, effectivePeriod, effectivePeriodUnit);
configs[i].expireDate = date;
}
if (stepTableFormData && stepTableFormData.length > 0) {
const tableDataArray = stepTableFormData;
// subTargetSolutionCode
@ -188,7 +193,14 @@ export default {
const length = tableDataArray.length;
const snList = await this.getLatestSn(length);
tableDataArray.forEach((row, idx) => {
this.$refs[ref][0]?.updateDataSourceByRowIndex(idx,{subTargetSolutionCode: length==1?snList:snList[idx]});
let expDate = {};
if(config === "paralleConfigs" && !row.targetSolutionExpirationDate){
let date = getExpireDate(startDate, row.targetSolutionCycle, row.targetSolutionCyclePrecision);
expDate = {
targetSolutionExpirationDate: date
}
}
this.$refs[ref][0]?.updateDataSourceByRowIndex(idx,{subTargetSolutionCode: length==1?snList:snList[idx],...expDate});
});
}
}
@ -331,7 +343,7 @@ export default {
const ref = this.currentType === "ladder" ?"ladderStepFormPackageRef_":"paralleStepFormPackageRef_"
const packageRef = this.$refs[`${ref}${this.currentRowIndex}`][0];
if(currentSubKey === "subStartSolution"){
packageRef.updateFormData("targetAcSolution", row.nd);
packageRef.updateFormData("targetAcSolution", row.nd,["targetAcSolution"]);
packageRef.onValueChangeCompareTo("targetAcSolution", row.nd,"targetStartSolution");
}
packageRef.updateFormData(currentSubKey, code);
@ -370,7 +382,6 @@ export default {
refsToValidate.push(`paralleStepRef_${i}`);
}
}
console.log(refsToValidate,"refsToValidate")
return await this.validFormFields(refsToValidate);
},
getFilledFormData() {

+ 1
- 1
src/views/business/comps/template/formConfig/paralleAndLadderConfig.js View File

@ -236,7 +236,7 @@ export const getParallelColumnsConfig = ($this) => {
{
label: '目标溶液失效日',
prop: 'targetSolutionExpirationDate',
width: 280,
width: 180,
bodyType: 'span'
},
{

+ 3
- 2
src/views/business/comps/template/mixins/templateMixin.js View File

@ -87,9 +87,10 @@ export default {
effectivePeriodUnit &&
!expireDate
) {
const start = moment(startDate)
const start = moment(startDate);
const unit = effectivePeriodUnit === '天' ? 'days' : 'hours';
const end = start
.add(Number(effectivePeriod), effectivePeriodUnit)
.add(Number(effectivePeriod), unit)
.format('YYYY-MM-DD HH:mm:ss')
this.formData = { ...this.formData, expireDate: end }
}

Loading…
Cancel
Save