소스 검색

档案移交修改

duy 5 달 전
부모
커밋
591b8887ed

+ 1 - 1
package.json

@@ -25,7 +25,7 @@
         "dayjs": "^1.11.13",
         "echarts": "^5.5.1",
         "element-plus": "^2.8.5",
-        "hc-vue3-ui": "^4.4.9",
+        "hc-vue3-ui": "^4.5.3",
         "js-base64": "^3.7.7",
         "js-cookie": "^3.0.5",
         "js-fast-way": "^0.5.6",

+ 1 - 1
public/version.json

@@ -1,3 +1,3 @@
 {
-  "value": "20250320142022"
+  "value": "20250325102557"
 }

BIN
src/assets/hande-over/box.png


BIN
src/assets/hande-over/checkbox.png


+ 121 - 0
src/components/plugins/table-form/echart.vue

@@ -0,0 +1,121 @@
+<template>
+    <div class="hc-echarts-box">
+        <div :id="`${isKeyName}_echart`" ref="echart" class="hc-echarts" :style="`width : ${chart?.clientWidth}px`" />
+    </div>
+</template>
+
+<script setup>
+import * as echarts from 'echarts'
+import { getObjValue } from 'js-fast-way'
+import { nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
+
+const props = defineProps({
+    option: {
+        type: [Object, String],
+        default: () => ({}),
+    },
+    keyname: {
+        type: [Number, String],
+        default: '',
+    },
+})
+
+//初始变量
+let chart = null
+const echart = ref(null)
+const isKeyName = ref(props.keyname)
+const options = ref(getObjValue(props.option))
+
+//监听
+watch(() => [
+    props.keyname,
+], ([keyname]) => {
+    isKeyName.value = keyname
+})
+
+//深度监听
+watch(() => [
+    props.option,
+], ([option]) => {
+    options.value = getObjValue(option)
+    setOptions(options.value)
+}, { deep: true })
+
+//初始化图表
+const initChart = () => {
+    chart = echarts.init(echart.value)
+    setOptions(options.value)
+}
+
+//监听浏览器窗口变化
+const windowResize = () => {
+    window.addEventListener('resize', resizeEvent)
+}
+
+const resizeEvent = () => {
+    window.requestAnimationFrame(() => {
+        chart.resize()
+    })
+}
+
+//设置图表
+const setOptions = (option) => {
+    chart.clear()
+    nextTick(() => {
+        chart.setOption(option)
+    })
+}
+
+//渲染完成
+onMounted(() => {
+    nextTick(() => {
+        initChart()
+        windowResize()
+    })
+})
+
+//被卸载
+onUnmounted(() => {
+    window.removeEventListener('resize', resizeEvent)
+    chart.dispose()
+    chart = null
+})
+
+const onResize = () => {
+    nextTick(() => {
+        chart.resize()
+    })
+}
+
+const getImage = () => {
+    return chart.getDataURL({
+        type: 'png',
+        pixelRatio: 2,
+    })
+}
+
+// 暴露出去
+defineExpose({
+    onResize,
+    getImage,
+    setOptions,
+})
+</script>
+
+<style lang="scss" scoped>
+.hc-echarts-box {
+    display: block;
+    height: 100%;
+    overflow: hidden;
+    position: relative;
+    .hc-echarts {
+        position: absolute;
+        bottom: 0;
+        left: 0;
+        right: 0;
+        z-index: 2;
+        width: 100%;
+        height: 100%;
+    }
+}
+</style>

+ 121 - 0
src/components/plugins/table-form/hc-date-picker-1.vue

@@ -0,0 +1,121 @@
+<template>
+    <ElDatePicker
+        :id="keyname"
+        v-model="modelValues"
+        :clearable="clearable"
+        :disabled="disabled"
+        :end-placeholder="endPlaceholder"
+        :format="format"
+        :keyname="keyname"
+        :placeholder="placeholder"
+        :range-separator="rangeSeparator"
+        :readonly="readonly"
+        :start-placeholder="startPlaceholder"
+        :type="type"
+        :value-format="valueFormat"
+        style="width: 100%;height: 100%;"
+        @change="timePickerChange"
+        @keydown.shift.up="keyupShiftUp"
+        @keydown.shift.down="keyupShiftDown"
+        @keydown.shift.left="keyupShiftLeft"
+        @keydown.shift.right="keyupShiftRight"
+    />
+</template>
+
+<script>
+export default {
+    inheritAttrs: false,
+}
+</script>
+
+<script setup>
+import { ref, watch } from 'vue'
+import { ElDatePicker } from 'z-element-plus'
+import 'dayjs/locale/zh-cn'
+
+const props = defineProps({
+    modelValue: {
+        type: [Date, String, Number, Array],
+    },
+    type: {
+        type: String,
+        default: 'date',
+    },
+    rangeSeparator: {
+        type: String,
+        default: '-',
+    },
+    startPlaceholder: {
+        type: String,
+        default: '',
+    },
+    endPlaceholder: {
+        type: String,
+        default: '',
+    },
+    format: {
+        type: String,
+        default: 'YYYY:MM:DD',
+    },
+    valueFormat: {
+        type: String,
+        default: 'YYYY年MM月DD日',
+    },
+    keyname: {
+        type: String,
+        default: '',
+    },
+    readonly: {
+        type: Boolean,
+        default: false,
+    },
+    disabled: {
+        type: Boolean,
+        default: false,
+    },
+    clearable: {
+        type: Boolean,
+        default: true,
+    },
+    placeholder: {
+        type: String,
+        default: '',
+    },
+})
+
+//事件
+const emit = defineEmits(['update:modelValue', 'change', 'keydowns'])
+
+//变量
+const modelValues = ref(props.modelValue)
+
+//监听
+watch(() => props.modelValue, (val) => {
+    modelValues.value = val
+})
+
+const timePickerChange = (val) => {
+    emit('update:modelValue', val)
+    emit('change', val)
+}
+
+//向上
+const keyupShiftUp = (e) => {
+    emit('keydowns', { type: 'up', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向下
+const keyupShiftDown = (e) => {
+    emit('keydowns', { type: 'down', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向左
+const keyupShiftLeft = (e) => {
+    emit('keydowns', { type: 'left', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向右
+const keyupShiftRight = (e) => {
+    emit('keydowns', { type: 'right', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+</script>

+ 168 - 0
src/components/plugins/table-form/hc-form-checkbox-group.vue

@@ -0,0 +1,168 @@
+<template>
+    <div
+        :class="isFocus ? 'is-focus' : ''" class="hc-form-checkbox-group-box"
+        @keydown.shift.up="keyupShiftUp"
+        @keydown.shift.down="keyupShiftDown"
+        @keydown.shift.left="keyupShiftLeft"
+        @keydown.shift.right="keyupShiftRight"
+    >
+        <ElCheckbox
+            v-for="item in checkboxDatas" :key="item.key" :checked="item.checked"
+            @change="onCheckboxChange($event, item)"
+        >
+            {{ item.name }}
+        </ElCheckbox>
+        <input :id="keyname" class="hc-checkbox-group-input" @blur="handleBlur" @focus="handleFocus">
+    </div>
+</template>
+
+<script>
+export default {
+    inheritAttrs: false,
+}
+</script>
+
+<script setup>
+import { nextTick, ref, watch } from 'vue'
+import { ElCheckbox } from 'element-plus'
+import { arrIndex, deepClone, isNullES } from 'js-fast-way'
+
+const props = defineProps({
+    ui: {
+        type: String,
+        default: '',
+    },
+    datas: {
+        type: Array,
+        default: () => ([]),
+    },
+    objs: {
+        type: Array,
+        default: () => ([]),
+    },
+    val: {
+        type: [String, Number],
+        default: '',
+    },
+    keyname: {
+        type: [String, Number],
+        default: '',
+    },
+})
+
+//事件
+const emit = defineEmits(['change', 'keydowns'])
+
+//变量
+const checkboxDatas = ref([])
+
+//渲染完成
+nextTick(() => {
+    setInitDatas(deepClone(props.datas), deepClone(props.objs))
+})
+
+//监听表头
+watch(() => [
+    props.val,
+], ([val]) => {
+    setModelVal(val)
+})
+
+//处理初始数据
+const setInitDatas = (datas, objs) => {
+    for (let i = 0; i < datas.length; i++) {
+        objs.push({ key: String(datas[i]), name: datas[i] })
+    }
+    checkboxDatas.value = objs
+    setModelVal(props.val)
+}
+
+//处理数据
+const setModelVal = (val) => {
+    const datas = deepClone(checkboxDatas.value)
+    if (!isNullES(val)) {
+        const arr = String(val).split(',')
+        for (let i = 0; i < arr.length; i++) {
+            const item = String(arr[i])
+            const index = arrIndex(datas, 'key', item)
+            datas[index].checked = true
+        }
+    }
+    checkboxDatas.value = datas
+}
+
+//当绑定值变化时触发的事件
+const onCheckboxChange = (val, item) => {
+    item.checked = val
+    getCheckedValue()
+}
+
+//取选中的值
+const getCheckedValue = () => {
+    let valString = ''
+    const datas = checkboxDatas.value
+    for (let i = 0; i < datas.length; i++) {
+        if (datas[i].checked) {
+            const key = String(datas[i].key)
+            valString = valString ? `${valString},${key}` : key
+        }
+    }
+    //事件返回
+    emit('change', {
+        key: props.keyname,
+        val: valString,
+    })
+}
+
+//向上
+const keyupShiftUp = (e) => {
+    emit('keydowns', { type: 'up', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向下
+const keyupShiftDown = (e) => {
+    emit('keydowns', { type: 'down', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向左
+const keyupShiftLeft = (e) => {
+    emit('keydowns', { type: 'left', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向右
+const keyupShiftRight = (e) => {
+    emit('keydowns', { type: 'right', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+
+//获得焦点
+const isFocus = ref(false)
+const handleFocus = () => {
+    isFocus.value = true
+}
+
+//失去焦点
+const handleBlur = () => {
+    isFocus.value = false
+}
+</script>
+
+<style lang="scss" scoped>
+.hc-form-checkbox-group-box {
+    position: relative;
+    width: 100%;
+    height: initial;
+    border-radius: 4px;
+    transition: box-shadow 0.3s, background-color 0.3s;
+    &.is-focus, &:hover {
+        background-color: #eddac4;
+        box-shadow: 0 0 0 1.5px var(--el-color-primary) inset;
+    }
+    .hc-checkbox-group-input {
+        position: absolute;
+        z-index: -1;
+        right: 10px;
+        width: 10px;
+    }
+}
+</style>

+ 119 - 0
src/components/plugins/table-form/hc-form-radio-group.vue

@@ -0,0 +1,119 @@
+<template>
+    <div
+        :class="isFocus ? 'is-focus' : ''" class="hc-form-radio-group-box"
+        @keydown.shift.up="keyupShiftUp"
+        @keydown.shift.down="keyupShiftDown"
+        @keydown.shift.left="keyupShiftLeft"
+        @keydown.shift.right="keyupShiftRight"
+    >
+        <ElRadioGroup
+            v-model="modelValues"
+            :disabled="disabled"
+            :keyname="keyname"
+            :placeholder="placeholder"
+            @change="radioGroupChange"
+        >
+            <slot />
+        </ElRadioGroup>
+        <input :id="keyname" class="hc-radio-group-input" @blur="handleBlur" @focus="handleFocus">
+    </div>
+</template>
+
+<script>
+export default {
+    inheritAttrs: false,
+}
+</script>
+
+<script setup>
+import { ref, watch } from 'vue'
+import { ElRadio, ElRadioGroup } from 'element-plus'
+
+const props = defineProps({
+    modelValue: {
+        type: [String, Number, Boolean],
+    },
+    keyname: {
+        type: String,
+        default: '',
+    },
+    placeholder: {
+        type: String,
+        default: '',
+    },
+    disabled: {
+        type: Boolean,
+        default: false,
+    },
+})
+
+//事件
+const emit = defineEmits(['update:modelValue', 'change', 'keydowns'])
+
+//变量
+const modelValues = ref(props.modelValue)
+
+//监听
+watch(() => [
+    props.modelValue,
+], ([val]) => {
+    modelValues.value = val
+})
+
+const radioGroupChange = (val) => {
+    emit('update:modelValue', val)
+    emit('change', val)
+}
+
+//向上
+const keyupShiftUp = (e) => {
+    emit('keydowns', { type: 'up', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向下
+const keyupShiftDown = (e) => {
+    emit('keydowns', { type: 'down', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向左
+const keyupShiftLeft = (e) => {
+    emit('keydowns', { type: 'left', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向右
+const keyupShiftRight = (e) => {
+    emit('keydowns', { type: 'right', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+
+//获得焦点
+const isFocus = ref(false)
+const handleFocus = () => {
+    isFocus.value = true
+}
+
+//失去焦点
+const handleBlur = () => {
+    isFocus.value = false
+}
+</script>
+
+<style lang="scss" scoped>
+.hc-form-radio-group-box {
+    position: relative;
+    width: 100%;
+    height: initial;
+    border-radius: 4px;
+    transition: box-shadow 0.3s, background-color 0.3s;
+    &.is-focus, &:hover {
+        background-color: #eddac4;
+        box-shadow: 0 0 0 1.5px var(--el-color-primary) inset;
+    }
+    .hc-radio-group-input {
+        position: absolute;
+        z-index: -1;
+        right: 10px;
+        width: 10px;
+    }
+}
+</style>

+ 111 - 0
src/components/plugins/table-form/hc-form-select-search.vue

@@ -0,0 +1,111 @@
+<template>
+    <ElSelect
+        :id="keyname" v-model="selectVal" :keyname="keyname" :placeholder="placeholder" clearable filterable
+        @change="formRemoteChange"
+    >
+        <ElOption v-for="item in selectDatas" :key="item.value" :label="item.label" :value="item.value" />
+    </ElSelect>
+</template>
+
+<script setup>
+import { nextTick, ref } from 'vue'
+import { getDapSiteData, getDesignStrengthList } from '~api/other'
+import { ElOption, ElSelect } from 'z-element-plus'
+import { arrIndex, getObjVal, getObjValue } from 'js-fast-way'
+
+const props = defineProps({
+    val: {
+        type: [Number, String],
+        default: '',
+    },
+    type: {
+        type: [Number, String],
+        default: '',
+    },
+    keyname: {
+        type: [Number, String],
+        default: '',
+    },
+    placeholder: {
+        type: [Number, String],
+        default: '搜索',
+    },
+    contractId: {
+        type: [Number, String],
+        default: '',
+    },
+    pkeyId: {
+        type: [Number, String],
+        default: '',
+    },
+})
+
+//事件
+const emit = defineEmits(['change'])
+
+//变量
+const selectVal = ref(props.val)
+
+//加载完成
+nextTick(() => {
+    console.log(props, 'props')
+    if (props.keyname && props.type) {
+        setTableFormRemoteMethod(props.keyname, props.type)
+    }
+})
+
+//获取下拉框测站点筛选数据
+const setTableFormRemoteMethod = async (key, type) => {
+    if (type === 'dap_site_data') {
+        await getDapSiteDataApi(key)
+    } 
+    
+  
+}
+
+//获取数据源
+const selectDatas = ref([])
+const getDapSiteDataApi = async (key) => {
+    const datas = selectDatas.value
+    if (datas.length > 0) {
+        return datas
+    } else {
+        const { error, code, data } = await getDapSiteData({
+            contractId: props.contractId,
+            pkId: props.pkeyId,
+            key: key,
+        }, false)
+        //处理数据
+        const resData = getObjVal(data)
+        if (!error && code === 200 && resData) {
+            selectDatas.value = await objToArr(resData, key)
+        } else {
+            selectDatas.value = []
+        }
+    }
+}
+
+//对象转数组
+const objToArr = async (obj) => {
+    let newArr = []
+    Object.keys(obj).forEach(key => {
+        newArr.push({
+            label: key,
+            value: key,
+            data: {
+                ...obj[key],
+            },
+        })
+    })
+    return newArr
+}
+
+//当前被选中的事件
+const formRemoteChange = (val) => {
+    const datas = selectDatas.value
+    const index = arrIndex(datas, 'value', val)
+    if (index >= 0) {
+        emit('change', getObjValue(datas[index].data))
+    }
+}
+</script>

+ 110 - 0
src/components/plugins/table-form/hc-form-select-search2.vue

@@ -0,0 +1,110 @@
+<template>
+    <ElSelect
+        :id="keyname" v-model="selectVal" :keyname="keyname" :placeholder="placeholder" clearable filterable
+        @change="formRemoteChange"
+    >
+        <ElOption v-for="item in selectDatas" :key="item.value" :label="item.label" :value="item.value" />
+    </ElSelect>
+</template>
+
+<script setup>
+import { nextTick, ref } from 'vue'
+import { getDapSiteData, getDesignStrengthList } from '~api/other'
+import { ElOption, ElSelect } from 'z-element-plus'
+import { arrIndex, getObjVal, getObjValue } from 'js-fast-way'
+import { setStoreValue } from '~src/utils/storage'
+
+const props = defineProps({
+    val: {
+        type: [Number, String],
+        default: '',
+    },
+    type: {
+        type: [Number, String],
+        default: '',
+    },
+    keyname: {
+        type: [Number, String],
+        default: '',
+    },
+    placeholder: {
+        type: [Number, String],
+        default: '选择设计强度',
+    },
+    contractId: {
+        type: [Number, String],
+        default: '',
+    },
+    pkeyId: {
+        type: [Number, String],
+        default: '',
+    },
+})
+
+//事件
+const emit = defineEmits(['change'])
+
+//变量
+const selectVal = ref(props.val)
+
+//加载完成
+nextTick(() => {
+ 
+    if (props.keyname && props.type) {
+        setTableFormRemoteMethod(props.keyname, props.type)
+    }
+})
+
+//获取下拉框设计强度筛选数据
+const setTableFormRemoteMethod = async (key, type) => {
+ if (type === 'strength_search') {
+    console.log(key, 'key')
+        await getDesignStrengthListApi(key)//设计强度搜索
+        setStoreValue('strengthKeys', key)//存储设计强度值
+    }
+}
+
+//获取数据源
+const selectDatas = ref([])
+const getDesignStrengthListApi = async (key) => {
+    const datas = selectDatas.value
+    if (datas.length > 0) {
+        return datas
+    } else {
+        const { error, code, data } = await getDesignStrengthList({
+            contractId: props.contractId,
+            key: key,
+        }, false)
+        //处理数据
+        const resData = getObjVal(data)
+        if (!error && code === 200 && resData) {
+            selectDatas.value = await objToArr(resData, key)
+        } else {
+            selectDatas.value = []
+        }
+    }
+}
+//对象转数组
+const objToArr = async (obj) => {
+    let newArr = []
+    Object.keys(obj).forEach(key => {
+        newArr.push({
+            label: key,
+            value: key,
+            data: {
+                ...obj[key],
+            },
+        })
+    })
+    return newArr
+}
+
+//当前被选中的事件
+const formRemoteChange = (val) => {
+    const datas = selectDatas.value
+    const index = arrIndex(datas, 'value', val)
+    if (index >= 0) {
+        emit('change', getObjValue(datas[index].data))
+    }
+}
+</script>

+ 122 - 0
src/components/plugins/table-form/hc-form-upload.vue

@@ -0,0 +1,122 @@
+<template>
+    <el-upload
+        v-loading="isLoading" :accept="accept" :action="action" :class="isFocus ? 'is-focus' : ''"
+        :disabled="isLoading" :headers="getHeader()" :keyname="isKeyName"
+        :on-error="formUploadError"
+        :on-progress="uploadprogress" :placeholder="placeholder" :show-file-list="false"
+        class="hc-upload-table-form"
+        element-loading-text="上传中..." @exceed="formUploadExceed" @success="formUploadSuccess"
+    >
+        <img v-if="isSrc" :src="isSrc" alt="" class="hc-table-form-img">
+        <div v-else class="hc-table-form-icon">
+            点此选择文件并上传
+        </div>
+        <div v-if="isSrc" class="hc-table-form-del">
+            <el-button plain type="danger" @click.stop="delTableFormFile">
+                删除当前文件
+            </el-button>
+        </div>
+        <input :id="isKeyName" v-model="isSrc" class="hc-upload-input-src" @blur="handleBlur" @focus="handleFocus">
+    </el-upload>
+</template>
+
+<script setup>
+import { ref, watch } from 'vue'
+import { getHeader } from 'hc-vue3-ui'
+
+const props = defineProps({
+    src: {
+        type: [Number, String],
+        default: '',
+    },
+    keyname: {
+        type: [Number, String],
+        default: '',
+    },
+    placeholder: {
+        type: [Number, String],
+        default: '相片',
+    },
+})
+
+//事件
+const emit = defineEmits(['success', 'del'])
+//变量
+const isLoading = ref(false)
+const isSrc = ref(props.src)
+const isKeyName = ref(props.keyname)
+
+const action = '/api/blade-manager/exceltab/add-buss-imginfo'
+const accept = 'image/png,image/jpg,image/jpeg'
+
+//监听
+watch(() => [
+    props.src,
+    props.keyname,
+], ([src, keyname]) => {
+    isSrc.value = src
+    isKeyName.value = keyname
+})
+
+//上传进度
+const uploadprogress = () => {
+    isLoading.value = true
+}
+
+//上传完成
+const formUploadSuccess = (res) => {
+    isLoading.value = false
+    if (res.code === 200) {
+        const link = res.data?.link || ''
+        emit('success', {
+            res,
+            src: link,
+            key: isKeyName.value,
+        })
+    }
+}
+
+//上传失败
+const formUploadError = () => {
+    isLoading.value = false
+}
+
+//格式错误
+const formUploadExceed = () => {
+    isLoading.value = false
+}
+
+//删除上传的文件
+const delTableFormFile = () => {
+    emit('del', isKeyName.value)
+}
+
+const isFocus = ref(false)
+
+//获得焦点
+const handleFocus = () => {
+    isFocus.value = true
+}
+
+//失去焦点
+const handleBlur = () => {
+    isFocus.value = false
+}
+</script>
+
+<style lang="scss" scoped>
+.hc-upload-table-form {
+    border-radius: 3px;
+    transition: box-shadow 0.3s, background-color 0.3s;
+    &.is-focus, &:hover {
+        background-color: #eddac4;
+        box-shadow: 0 0 0 1.5px var(--el-color-primary) inset;
+    }
+    .hc-upload-input-src {
+        position: absolute;
+        z-index: -1;
+        right: 10px;
+        width: 10px;
+    }
+}
+</style>

+ 103 - 0
src/components/plugins/table-form/hc-time-picker.vue

@@ -0,0 +1,103 @@
+<template>
+    <ElTimePicker
+        :id="keyname"
+        v-model="modelValues"
+        :clearable="clearable"
+        :disabled="disabled"
+        :format="format"
+        :keyname="keyname"
+        :placeholder="placeholder"
+        :readonly="readonly"
+        :value-format="valueFormat"
+        style="width: 100%;height: 100%;"
+        @change="timePickerChange"
+        @keydown.shift.up="keyupShiftUp"
+        @keydown.shift.down="keyupShiftDown"
+        @keydown.shift.left="keyupShiftLeft"
+        @keydown.shift.right="keyupShiftRight"
+    />
+</template>
+
+<script>
+export default {
+    inheritAttrs: false,
+}
+</script>
+
+<script setup>
+import { ref, watch } from 'vue'
+import { ElTimePicker } from 'z-element-plus'
+import 'dayjs/locale/zh-cn'
+
+const props = defineProps({
+    modelValue: {
+        type: [Date, String, Number, Array],
+    },
+    format: {
+        type: String,
+        default: 'HH:mm:ss',
+    },
+    valueFormat: {
+        type: String,
+        default: 'HH:mm:ss',
+    },
+    keyname: {
+        type: String,
+        default: '',
+    },
+    readonly: {
+        type: Boolean,
+        default: false,
+    },
+    disabled: {
+        type: Boolean,
+        default: false,
+    },
+    clearable: {
+        type: Boolean,
+        default: true,
+    },
+    placeholder: {
+        type: String,
+        default: '',
+    },
+})
+
+//事件
+const emit = defineEmits(['update:modelValue', 'change', 'keydowns'])
+
+//变量
+const modelValues = ref(props.modelValue)
+
+//监听
+watch(() => [
+    props.modelValue,
+], ([val]) => {
+    modelValues.value = val
+})
+
+const timePickerChange = (val) => {
+    emit('update:modelValue', val)
+    emit('change', val)
+}
+
+//向上
+const keyupShiftUp = (e) => {
+    emit('keydowns', { type: 'up', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向下
+const keyupShiftDown = (e) => {
+    emit('keydowns', { type: 'down', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向左
+const keyupShiftLeft = (e) => {
+    emit('keydowns', { type: 'left', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+
+//向右
+const keyupShiftRight = (e) => {
+    emit('keydowns', { type: 'right', name: { target: { id: props.keyname } }, key: props.keyname, e })
+}
+</script>

+ 2 - 1
src/config/index.json

@@ -2,8 +2,9 @@
     "version": "202304141558",
     "target6": "http://219.151.181.73:8090",
     "target2": "http://192.168.0.125:8090",
-    "target": "http://219.151.181.73:8090",
+    "target22": "http://219.151.181.73:8090",
     "target11": "http://39.108.216.210:8090",
+    "target": "http://219.151.185.227:8090",
     "target7": "http://192.168.0.114:8090",
     "targe77t": "http://192.168.0.110:8090",
     "target8": "http://183.247.216.148:28090",

+ 50 - 35
src/views/transfer/hand-over.vue

@@ -12,43 +12,36 @@
 
             <div v-if="stepsKey === 0" class="hc-body-center-box">
                 <div class="hc-content-box">
-                    <div class="text-gray mb-5">当前项目档案未通过验收,未达到移交条件</div>
-                    <el-button type="primary" hc-btn @click="toTransferInitial">去申请验收</el-button>
+                    <div class="mb-5 text-gray">当前项目档案未通过验收,未达到移交条件</div>
+                    <el-button type="primary" hc-btn style="width: 268px;height: 68px;font-weight: bold;" @click="toTransferInitial">去申请验收</el-button>
                 </div>
             </div>
 
             <div v-if="stepsKey === 1" class="hc-body-center-box">
-                <div class="hc-content-box">
-                    <div class="text-gray mb-5">当前项目档案未通过四性检测,未达到移交条件</div>
-                    <el-button type="primary" hc-btn>重新检测</el-button>
+                <div v-if="!isCustodyTest" class="hc-content-box">
+                    <img :src="bgColor" alt="">
+                   
+                    <div class="mb-5 text-3xl text-black">专家验收已通过</div>
+                    <el-button type="primary" hc-btn style="width: 268px;height: 68px;font-weight: bold;" @click="custodyTesting">点击进入四性检测</el-button>
+                </div>
+                <div v-else class="hc-content-box">
+                    <div class="mb-5 text-gray">当前项目档案未通过四性检测,未达到移交条件</div>
+                    <el-button type="primary" hc-btn style="width: 268px;height: 68px;font-weight: bold;" @click="custodyTesting">重新检测</el-button>
                 </div>
             </div>
 
-            <div v-if="stepsKey === 2 && stepsKeys === 1 " class="hc-body-center-box is-action">
-                <div class="hc-content-box form-apply">
-                    <el-form ref="formApplyRef" :model="formApplyModel" :rules="formApplyRules" label-width="auto" size="large">
-                        <el-form-item label="项目名称">
-                            <el-input v-model="formApplyModel.name" placeholder="请输入项目名称" />
-                        </el-form-item>
-                        <el-form-item label="档案形成时间">
-                            <el-date-picker v-model="formApplyModel.date" class="block" type="datetime" format="YYYY-MM-DD hh:mm:ss" value-format="YYYY-MM-DD hh:mm:ss" />
-                        </el-form-item>
-                        <el-form-item label="电子档案目录">
-                            <el-input v-model="formApplyModel.num" placeholder="请填写份数" />
-                        </el-form-item>
-                        <el-form-item label="档案移交时间">
-                            <el-date-picker v-model="formApplyModel.date1" class="block" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
-                        </el-form-item>
-                        <el-form-item label="档案卷数">
-                            <el-input v-model="formApplyModel.num1" placeholder="请填写档案卷数" />
-                        </el-form-item>
-                    </el-form>
-                </div>
-                <div class="hc-action-box">
-                    <el-button type="primary" hc-btn @click="stepsKeysClick(2)">下一步</el-button>
-                    <el-button hc-btn>取消</el-button>
+            <div v-if="stepsKey === 2 && stepsKeys === 1 && !isShowMoveSubmit " class="hc-body-center-box">
+                <div class="hc-content-box">
+                    <img :src="bgColor" alt="">
+                    <div class="mb-5 text-3xl text-black">
+                        四性检测已通过
+                    </div>
+                    <el-button type="primary" hc-btn style="width: 268px;height: 68px;font-weight: bold;" @click="moveClick">点击进入移交登记</el-button>
                 </div>
             </div>
+            <div v-if="stepsKey === 2 && stepsKeys === 1 && isShowMoveSubmit" class="hc-content-box-submit">
+                <moveSubmit />
+            </div>
 
             <div v-if="stepsKey === 2 && stepsKeys === 2" class="hc-body-box is-action is-header">
                 <div class="hc-header-box">
@@ -97,12 +90,12 @@
             <div v-if="stepsKey === 2 && stepsKeys === 3" class="hc-body-box is-action">
                 <div class="hc-content-box">
                     <div class="is-xml-data flex">
-                        <div class="flex-1 mr-6">
+                        <div class="mr-6 flex-1">
                             <el-progress :text-inside="true" :stroke-width="20" :percentage="50" status="exception" />
                         </div>
                         <el-button type="primary" round>封装XML信息包</el-button>
                     </div>
-                    <div class="mt-5 text-dark-5 text-center">系统封装信息中........</div>
+                    <div class="mt-5 text-center text-dark-5">系统封装信息中........</div>
                 </div>
                 <div class="hc-action-box">
                     <el-button type="primary" hc-btn @click="stepClick(3)">下一步</el-button>
@@ -123,7 +116,8 @@
 import { onMounted, ref } from 'vue'
 import { useRouter } from 'vue-router'
 import { useAppStore } from '~src/store'
-
+import bgColor from '~src/assets/hande-over/checkbox.png'
+import moveSubmit from './move-submit.vue'
 //变量
 const router = useRouter()
 const useAppState = useAppStore()
@@ -147,18 +141,25 @@ const stepsKeysClick = (val) => {
     stepsKeys.value = val
 }
 
-
+const isCustodyTest = ref(false)
 //去申请验收
 const toTransferInitial = () => {
     router.push({
         name: 'transfer-initial',
     })
 }
+//去四性检测
+const custodyTesting = () => {
+    router.push({
+        name: 'custody-testing',
+    })
+}
+
 
 //提交验收报告
-const formApplyRef = ref(null)
-const formApplyModel = ref({})
-const formApplyRules = {}
+
+
+
 
 const checked2 = ref(false)
 //tab数据和相关处理
@@ -207,6 +208,13 @@ const tableSelectionChange = (rows) => {
     })
     console.log(tableRows)
 }
+//点击进入移交登记
+const moveClick = () => {
+    console.log('移交登记')
+    isShowMoveSubmit.value = true
+    
+}
+const isShowMoveSubmit = ref(false)
 </script>
 
 <style lang="scss" scoped>
@@ -216,6 +224,9 @@ const tableSelectionChange = (rows) => {
     margin-bottom: 24px;
     border-bottom: 1px solid #e9e9e9;
 }
+.hc-content-box-submit{
+    height: calc(100% - 105px);
+}
 .hc-body-center-box {
     position: relative;
     display: flex;
@@ -284,6 +295,10 @@ const tableSelectionChange = (rows) => {
         text-align: right;
         border-top: 1px solid #e9e9e9;
     }
+    .jc-btn{
+        width: 268px;
+        height: 68px;
+    }
 }
 .hc-body-box.is-action .hc-content-box {
     height: calc(100% - 90px);

+ 46 - 0
src/views/transfer/move-submit.vue

@@ -0,0 +1,46 @@
+<template>
+    <div class="hc-docs-tabs-box">
+        <hc-tab-card :tabs="tabsData" :tab-key="tabsKey" @change="tabsChange">
+            555555555
+            <template #extra>
+                <el-button type="primary" @click="reportClick">
+                    <span>上报</span>
+                </el-button>
+                <el-button type="warning" class="ml-2" @click="saveClick">
+                    <span>保存</span>
+                </el-button>
+            </template>
+        </hc-tab-card>
+    </div>
+</template>
+
+<script setup>
+import { ref } from 'vue'
+//类型处理
+const tabsKey = ref('one')
+const tabsData = ref([
+    { name: '电子档案移交接收意记表', key: 'one' },
+    { name: '电子档案移交清单', key: 'two' },
+  
+])
+
+const tabsChange = (item) => {
+    console.log(item)
+}
+const saveClick = () => {
+    console.log('保存')
+}
+
+const reportClick = () => {
+ console.log('上报')   
+}
+</script>
+
+<style>
+.hc-docs-tabs-box {
+    position: relative;
+    height: 100%;
+    overflow: auto;
+   
+}
+</style>

+ 25 - 20
yarn.lock

@@ -1061,7 +1061,7 @@
 
 "@vue/compiler-core@3.5.13":
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05"
+  resolved "http://219.151.185.227:9000/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05"
   integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==
   dependencies:
     "@babel/parser" "^7.25.3"
@@ -1080,7 +1080,7 @@
 
 "@vue/compiler-dom@3.5.13":
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58"
+  resolved "http://219.151.185.227:9000/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58"
   integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==
   dependencies:
     "@vue/compiler-core" "3.5.13"
@@ -1103,7 +1103,7 @@
 
 "@vue/compiler-sfc@3.5.13":
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46"
+  resolved "http://219.151.185.227:9000/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46"
   integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==
   dependencies:
     "@babel/parser" "^7.25.3"
@@ -1126,7 +1126,7 @@
 
 "@vue/compiler-ssr@3.5.13":
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba"
+  resolved "http://219.151.185.227:9000/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba"
   integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==
   dependencies:
     "@vue/compiler-dom" "3.5.13"
@@ -1151,7 +1151,7 @@
 
 "@vue/reactivity@3.5.13":
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/@vue/reactivity/-/reactivity-3.5.13.tgz#b41ff2bb865e093899a22219f5b25f97b6fe155f"
+  resolved "http://219.151.185.227:9000/@vue/reactivity/-/reactivity-3.5.13.tgz#b41ff2bb865e093899a22219f5b25f97b6fe155f"
   integrity sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==
   dependencies:
     "@vue/shared" "3.5.13"
@@ -1166,7 +1166,7 @@
 
 "@vue/runtime-core@3.5.13":
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/@vue/runtime-core/-/runtime-core-3.5.13.tgz#1fafa4bf0b97af0ebdd9dbfe98cd630da363a455"
+  resolved "http://219.151.185.227:9000/@vue/runtime-core/-/runtime-core-3.5.13.tgz#1fafa4bf0b97af0ebdd9dbfe98cd630da363a455"
   integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==
   dependencies:
     "@vue/reactivity" "3.5.13"
@@ -1184,7 +1184,7 @@
 
 "@vue/runtime-dom@3.5.13":
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz#610fc795de9246300e8ae8865930d534e1246215"
+  resolved "http://219.151.185.227:9000/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz#610fc795de9246300e8ae8865930d534e1246215"
   integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==
   dependencies:
     "@vue/reactivity" "3.5.13"
@@ -1202,7 +1202,7 @@
 
 "@vue/server-renderer@3.5.13":
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7"
+  resolved "http://219.151.185.227:9000/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7"
   integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==
   dependencies:
     "@vue/compiler-ssr" "3.5.13"
@@ -1215,7 +1215,7 @@
 
 "@vue/shared@3.5.13":
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
+  resolved "http://219.151.185.227:9000/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
   integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==
 
 "@vueuse/core@^9.1.0":
@@ -2164,10 +2164,10 @@ has-flag@^4.0.0:
   resolved "http://39.108.216.210:9000/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
   integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 
-hc-vue3-ui@^4.4.9:
-  version "4.4.9"
-  resolved "http://39.108.216.210:9000/hc-vue3-ui/-/hc-vue3-ui-4.4.9.tgz#cfd5f50888e873fcc8d89f7c7335d85a10baafd6"
-  integrity sha512-O4x+izXF21Y9ciM0Py1AQkzSyw/Po8D4fvSiSuHedz3X2jAfEXtxHWCSmz8WYn/FKXFIw9WZ9GL9cB04yfCMJA==
+hc-vue3-ui@^4.5.3:
+  version "4.5.3"
+  resolved "http://219.151.185.227:9000/hc-vue3-ui/-/hc-vue3-ui-4.5.3.tgz#de054eb645776fc0c28cd4e3cbf5f51abed4b96a"
+  integrity sha512-+LtP9kjayReZnDAfCNRBW/Ok3FIYkHPpqDuinVKjX/rMtih31f2AL5Bi/ZyrDXUBRieQVfZLi9WAcyQ1dcNV1w==
   dependencies:
     axios "^1.7.7"
     dayjs "^1.11.13"
@@ -2312,7 +2312,7 @@ js-fast-way@^0.5.6:
 
 js-fast-way@^0.5.7:
   version "0.5.7"
-  resolved "http://39.108.216.210:9000/js-fast-way/-/js-fast-way-0.5.7.tgz#d5095a80a5a8b5a5d9e28c7339961d2482aea658"
+  resolved "http://219.151.185.227:9000/js-fast-way/-/js-fast-way-0.5.7.tgz#d5095a80a5a8b5a5d9e28c7339961d2482aea658"
   integrity sha512-OI3Pyq+jXQY/CL5Slk+E4gKsHPHIFxX2Pzd25ZrMeGt+qMpnPA5qTsHk2QKjgDPEPqY21ui6/BCSFQ59kBUfZg==
 
 js-md5@^0.8.3:
@@ -2565,6 +2565,11 @@ nanoid@^3.3.7:
   resolved "http://39.108.216.210:9000/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
   integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
 
+nanoid@^3.3.8:
+  version "3.3.11"
+  resolved "http://219.151.185.227:9000/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
+  integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
+
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "http://39.108.216.210:9000/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -2730,7 +2735,7 @@ picocolors@^1.1.0:
 
 picocolors@^1.1.1:
   version "1.1.1"
-  resolved "http://39.108.216.210:9000/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+  resolved "http://219.151.185.227:9000/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
   integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
 
 picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
@@ -2796,11 +2801,11 @@ postcss@^8.4.47:
     source-map-js "^1.2.1"
 
 postcss@^8.4.48:
-  version "8.4.49"
-  resolved "http://39.108.216.210:9000/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19"
-  integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==
+  version "8.5.3"
+  resolved "http://219.151.185.227:9000/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb"
+  integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
   dependencies:
-    nanoid "^3.3.7"
+    nanoid "^3.3.8"
     picocolors "^1.1.1"
     source-map-js "^1.2.1"
 
@@ -3361,7 +3366,7 @@ vue@3.5.12:
 
 vue@3.5.13:
   version "3.5.13"
-  resolved "http://39.108.216.210:9000/vue/-/vue-3.5.13.tgz#9f760a1a982b09c0c04a867903fc339c9f29ec0a"
+  resolved "http://219.151.185.227:9000/vue/-/vue-3.5.13.tgz#9f760a1a982b09c0c04a867903fc339c9f29ec0a"
   integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==
   dependencies:
     "@vue/compiler-dom" "3.5.13"