监管端八项作业支持

八项作业
liujun 2024-10-28 14:20:35 +08:00
parent 6ea70cf5ae
commit d30c328e6b
62 changed files with 8133 additions and 0 deletions

View File

@ -108,3 +108,34 @@ export const getPromiseView = (params) => post("/app/corppromise/goEdit", params
export const setPromiseIsRead = (params) => post("/app/corppromise/editIsRead", params); // 承诺书设置阅读状态
export const editHiddenIspunish = (params) => post("/app/keyprojectcheck/editHiddenIspunish", params); // 修改隐患信息
export const getPERSONNELMANAGEMENTID = (params) => post("/app/keyProjects/goEdit", params); // 重点工程默认回显负责人
// 以下接口八项作业流程使用
export const getCorpList = (params) => post("/app/util/getCorp", params) //获取公司列表
export const getConfinedSpaceSelectList = (params) => post("/app/csSpe/getSpace", params) //获取受限空间名称选择列表
export const getConfinedSpaceGasInfo = (params) => post("/app/csSpe/getGasInfo",params) //获取受限空间气体检测详情
export const setConfinedSpaceGasInfoSave = (params) => post("/app/csSpe/initGas", params) //受限空间气体检测详情保存
export const setConfinedSpaceGasDelete = (params) => post("/app/csSpe/deleteGas", params) //保存受限空间气体检测删除
export const getHotWorkGasAll = (params) => post("/app/elSpe/getAll", params) // 获取动火作业的所有受限空间气体检测数据
export const getHotWorkGasInfo = (params) => post("/app/elSpe/getInfo", params) //获取动火作业的受限空间气体检测详情
export const getHotWorkGasInfoSave = (params) => post("/app/elSpe/init", params) //获取动火作业的受限空间气体检测详情保存
export const getHotWorkGasDelete = (params) => post("/app/elSpe/delete", params) // 动火作业的受限空间气体检测删除
export const setHotWorkRecord = (params) => post("/app/deHw/initRecord", params) // 动火作业延迟监火保存记录
export const deleteHotWorkRecord = (params) => post("/app/deHw/deleteRecord", params) //获取动火作业的受限空间气体检测详情
export const getHotWorkRecord = (params) => post("/app/deHw/getRecords", params) //获取动火作业的受限空间气体检测详情保存
export const getOtherAssignmentsSelectList = (params) => post("/app/Task/getAllUnEndList", params) //关联的其他特殊作业及安全作业票编号选择列表
export const getRiskIdentificationResultsSelectList = (params) => post("/app/eightWork/getInfo", params) //风险辨识结果选择列表
export const getHotWorkMethodSelectList = (params) => post("/app/util/getDicList", params) // 动火方法选择列表
export const getQyDicList = (params) => post("/app/util/otherSysDic", params) // 动火方法选择列表
export const setTaskSave = (params) => post("/app/Task/init", params) //八项作业、隐患整改、安全环保检查任务保存更新接口
export const getCurrentNextOperation = (params) => post("/app/Task/getSupplementInfo", params) //获取当前任务的下一步操作
export const addFormInfo = (params) => post("/app/Task/addSupplementInfo", params) //审批过程中添加其他信息
export const getDepartmentTree = (params) => post("/app/util/getDepartmentTree", params) //获取部门树
export const getUserList = (params) => post("/app/util/getUserList", params) //获取人员
export const getToDoTaskList = (params) => post("/app/Task/getAllList", params) //获取待办列表
export const getTaskTechnologicalProcess = (params) => post("/app/Task/getAgencyList", params) //获取流程
export const getTaskInfo = (params) => post("/app/Task/getInfo", params) //查看信息
export const setTaskFile = (params) => upload("/app/util/uploadFile", params) //上传文件
export const setTaskSign = (params) => post("/app/Task/sign", params) //审批意见签字提交
export const setSecurityMeasuresSave = (params) => post("/app/Task/setQues", params) //安全措施提交
export const setOtherSecurityMeasuresSave = (params) => post("/app/Task/setOtherQues", params) //其它安全措施提交
export const getHistoricalApprovalRecords = (params) => post("/app/Task/getHis", params); // 历史审批记录
// 结束

View File

@ -0,0 +1,125 @@
<template>
<u-popup :show="visible" mode="center">
<scroll-view scroll-y style="width: 100vw;height: 100vh;">
<view class="container">
<u-checkbox-group v-model="selectValue" placement="column">
<u-checkbox :customStyle="{marginBottom: '8px'}" v-for="(item, index) in list" :key="index"
:label="type === 'assignments' ? item.TYPE_NAME : item.NAME"
:name="type === 'assignments' ? item.TYPE_NAME : item.NAME">
</u-checkbox>
</u-checkbox-group>
<view class="button_group_placeholder"></view>
<view class="button_group">
<u-button type="primary" text="确定" @click="determine" :customStyle="{width:'48%'}"></u-button>
<u-button text="关闭" @click="close" :customStyle="{width:'48%'}"></u-button>
</view>
</view>
</scroll-view>
</u-popup>
</template>
<script>
import {
getOtherAssignmentsSelectList,
getRiskIdentificationResultsSelectList,
getQyDicList,
getUserList
} from '@/api'
export default {
props: {
visible: {
type: Boolean,
required: true,
},
value: {
type: String,
required: true,
},
type: {
type: String,
required: true,
}
},
data() {
return {
list: [],
selectValue: [],
}
},
watch: {
visible: {
handler(newValue) {
if (newValue) {
this.selectValue = this.value.split(',')
this.getData()
}
},
immediate: true
}
},
methods: {
async getData() {
if (this.type === 'assignments') {
const resData = await getOtherAssignmentsSelectList()
this.list = resData.list
} else if (this.type === 'identification') {
const resData = await getRiskIdentificationResultsSelectList({
vectors: JSON.stringify(['accidentType'])
})
this.list = resData.accidentType
} else if (this.type === 'hotWorkMethod') {
const resData = await getQyDicList({
DICTIONARIES_ID: "63cf39931a89467594efc441bf67f6dd",
});
this.list = resData.list
} else if (this.type === 'userNameSelect') {
const resData = await getUserList({
DEPARTMENT_ID: this.$store.state.userInfo.DEPARTMENT_ID,
TYPE: 2
});
this.list = resData.list.list
}
},
close() {
this.selectValue = []
this.$emit('update:visible', false)
},
determine() {
// const value = []
// for (let i = 0; i < this.selectValue.length; i++) {
// if (this.value.indexOf(this.selectValue[i]) === -1) {
// value.push(this.selectValue[i])
// }
// }
// this.value && value.unshift(this.value)
// const emitValue = value.join(',')
const emitValue = this.selectValue.join(',')
this.$emit('input', emitValue)
this.close()
}
},
}
</script>
<style scoped lang="scss">
.container {
padding: 30upx;
.button_group_placeholder {
height: 100upx;
background-color: #fff;
}
.button_group {
background-color: #fff;
display: flex;
position: fixed;
bottom: 0;
padding: 20upx 5%;
width: 90%;
left: 0;
right: 0;
}
}
</style>

View File

@ -0,0 +1,367 @@
<template>
<view class="content" style="margin-left: 10px">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="申请单位" prop="APPLY_DEPARTMENT_NAME" borderBottom required>
<u-input v-model="form.APPLY_DEPARTMENT_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="申请人" prop="APPLY_USER_NAME" borderBottom required>
<u-input v-model="form.APPLY_USER_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="作业分公司" prop="CORP_NAME" borderBottom required>
<u-input v-model="form.CORP_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="作业类别" prop="WORK_TYPE_NAME" borderBottom required
@click="fnSingleChoiceClick('WORK_TYPE_NAME')">
<u-input v-model="form.WORK_TYPE_NAME" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="设备管道名称" prop="NAME" borderBottom required>
<u-input v-model="form.NAME" border="none" />
</u-form-item>
<u-form-item label="实际作业开始时间" prop="BOARD_INSTALL_TIME" borderBottom required
@click="fnDateTimePickerClick('BOARD_INSTALL_TIME')">
<u-input v-model="form.BOARD_INSTALL_TIME" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业结束时间" prop="WORK_END_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_END_DATE')">
<u-input v-model="form.WORK_END_DATE" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业人" prop="WORK_USER" borderBottom required>
<u-input v-model="form.WORK_USER" border="none" />
</u-form-item>
<u-form-item label="地点坐标" borderBottom required>
<u-button type="primary" size="small" text="定位" :customStyle="{ width: '100upx', margin: 0 }"
@click="fnLocation" />
</u-form-item>
<u-form-item label="经度" prop="WORK_LONGITUDE" borderBottom required>
<u-input v-model="form.WORK_LONGITUDE" border="none" readonly />
</u-form-item>
<u-form-item label="纬度" prop="WORK_LATITUDE" borderBottom required>
<u-input v-model="form.WORK_LATITUDE" border="none" readonly />
</u-form-item>
<u-divider text="管道参数" textPosition="left" textColor="#3c9cff" lineColor="#3c9cff" />
<u-form-item label="介质" prop="MEDIUM" borderBottom required>
<u-input v-model="form.MEDIUM" border="none" />
</u-form-item>
<u-form-item label="温度" prop="TEMPERATURE" borderBottom required>
<u-input v-model="form.TEMPERATURE" border="none" />
</u-form-item>
<u-form-item label="压力" prop="PRESSURE" borderBottom required>
<u-input v-model="form.PRESSURE" border="none" />
</u-form-item>
<u-divider text="盲板抽堵参数" textPosition="left" textColor="#3c9cff" lineColor="#3c9cff" />
<view v-for="(item, index) in form.boardList" :key="item.ID" class="mt-10 p-10"
style="background-color: #f9f9f9;border-radius: 4px">
<view style="display: flex;justify-content: end">
<u-button v-if="index === 0" type="primary" size="small" text="新增"
:customStyle="{ width: '100upx', margin: 0 }" @click="fnAddBoardList" />
<u-button v-if="index !== 0" type="error" size="small" text="删除"
:customStyle="{ width: '100upx', margin: 0 }" @click="fnDeleteBoardList(index)" />
</view>
<u-form-item label="材质" prop="BOARD_MATERIAL" borderBottom required>
<u-input v-model="item.BOARD_MATERIAL" border="none" />
</u-form-item>
<u-form-item label="规格" prop="BOARD_SPECIFICATION" borderBottom required>
<u-input v-model="item.BOARD_SPECIFICATION" border="none" />
</u-form-item>
<u-form-item label="编号" prop="BOARD_NO" borderBottom required>
<u-input v-model="item.BOARD_NO" border="none" />
</u-form-item>
</view>
<u-divider text="盲板抽堵位置及安全措施" textPosition="left" textColor="#3c9cff" lineColor="#3c9cff" />
<u-form-item label="盲板抽堵位置图" prop="BOARD_PATH" borderBottom required labelPosition="top" labelWidth="auto">
<u-upload class="mt-10" :fileList="form.BOARD_PATH" @afterRead="fnAfterRead($event, 'BOARD_PATH')"
@delete="fnDeletePic($event, 'BOARD_PATH')" multiple :maxCount="1"></u-upload>
</u-form-item>
<u-form-item label="关联的其他特殊作业及安全作业票编号" prop="SPECIAL_WORK" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{ position: 'absolute', top: '-46upx', right: '20upx', width: '150upx' }"
@click="otherAssignmentsShow = true" />
<u-textarea v-model="form.SPECIAL_WORK" border="none" autoHeight maxlength="-1" />
</u-form-item>
<u-form-item label="风险辨识结果" prop="RISK_IDENTIFICATION" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{ position: 'absolute', top: '-46upx', right: '20upx', width: '150upx' }"
@click="otherIdentificationShow = true" />
<u-textarea v-model="form.RISK_IDENTIFICATION" border="none" autoHeight maxlength="-1" />
</u-form-item>
<u-form-item label="申请单位负责人签字" prop="SIGN" borderBottom required labelPosition="top" labelWidth="auto">
<view style="flex: 1">
<view>
<u-button type="primary" size="mini" text="签字"
:customStyle="{ position: 'absolute', top: '-46upx', right: '20upx', width: '100upx' }"
@click="signVisible = true" />
</view>
<view v-if="form.SIGN">
<u-image width="400rpx" height="200rpx" :src="form.SIGN" />
</view>
</view>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000, true)" />
</view>
</view>
<u-picker :show="picker.show" :columns="picker.columns" :keyName="picker.key" :key="picker.type"
:defaultIndex="picker.defaultIndex" @confirm="fnSingleChoiceConfirm" @cancel="fnSingleChoiceCancel" />
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:minDate="dateTimePicker.min" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel" />
<other-select :visible.sync="otherAssignmentsShow" v-model="form.SPECIAL_WORK" type="assignments" />
<other-select :visible.sync="otherIdentificationShow" v-model="form.RISK_IDENTIFICATION" type="identification" />
<sign :signShow.sync="signVisible" @confirm="fnSign" />
</view>
</template>
<script>
import OtherSelect from '@/components/other-select/index.vue';
import Sign from '@/components/sign/sign.vue'
import {getData, setSubmitForm} from "@/utils/submitHomeworkProcess";
export default {
components: {
OtherSelect,
Sign
},
data() {
return {
type: '',
formItems: [
{ name: '申请单位', key_name: 'APPLY_DEPARTMENT_NAME', key_id: 'APPLY_DEPARTMENT_ID', type: 0 },
{ name: '申请人', key_name: 'APPLY_USER_NAME', key_id: 'APPLY_USER_ID', type: 0 },
{ name: '作业分公司', key_name: 'CORP_NAME', key_id: 'CORP_ID', type: 0 },
{ name: '作业类别', key_name: 'WORK_TYPE_NAME', key_id: 'WORK_TYPE', type: 0 },
{ name: '设备管道名称', key_name: 'NAME', type: 0 },
{ name: '实际作业开始时间', key_name: 'BOARD_INSTALL_TIME', type: 0 },
{ name: '作业结束时间', key_name: 'WORK_END_DATE', type: 0 },
{ name: '作业人', key_name: 'WORK_USER', type: 0 },
{ name: '经度', key_name: 'WORK_LONGITUDE', type: 0 },
{ name: '纬度', key_name: 'WORK_LATITUDE', type: 0 },
{ name: '管道参数', type: 3 },
{ name: '介质', key_name: 'MEDIUM', type: 0 },
{ name: '温度', key_name: 'TEMPERATURE', type: 0 },
{ name: '压力', key_name: 'PRESSURE', type: 0 },
{ name: '盲板抽堵参数', type: 3 },
{
key_name: 'boardList',
type: 4,
listStructure: [
{ name: '材质', key_name: 'BOARD_MATERIAL', type: 0 },
{ name: '规格', key_name: 'BOARD_SPECIFICATION', type: 0 },
{ name: '编号', key_name: 'BOARD_NO', type: 0 },
]
},
{ name: '盲板抽堵位置及安全措施', type: 3 },
{ name: '盲板抽堵位置图', key_name: 'BOARD_PATH', type: 1 },
{ name: '关联的其他特殊作业及安全作业票编号', key_name: 'SPECIAL_WORK', type: 0 },
{ name: '风险辨识结果', key_name: 'RISK_IDENTIFICATION', type: 0 },
{ name: '申请单位负责人签字', key_name: 'SIGN', type: 5 },
],
form: {
APPLY_DEPARTMENT_ID: this.$store.getters.getUserInfo.DEPARTMENT_ID,
APPLY_DEPARTMENT_NAME: this.$store.getters.getUserInfo.DEPARTMENT_NAME,
APPLY_USER_ID: this.$store.getters.getUserInfo.USER_ID,
APPLY_USER_NAME: this.$store.getters.getUserInfo.NAME,
CORP_ID: '',
CORP_NAME: '',
WORK_TYPE: '',
WORK_TYPE_NAME: '',
NAME: '',
BOARD_INSTALL_TIME: '',
WORK_END_DATE: '',
WORK_USER: '',
WORK_LONGITUDE: '1',
WORK_LATITUDE: '2',
MEDIUM: '',
TEMPERATURE: '',
PRESSURE: '',
boardList: [],
BOARD_PATH: [],
SPECIAL_WORK: '',
RISK_IDENTIFICATION: '',
SIGN: '',
},
rules: {
APPLY_DEPARTMENT_ID: [{ type: 'string', required: true, message: '请选择申请单位', trigger: ['blur', 'change'] }],
APPLY_USER_NAME: [{ type: 'string', required: true, message: '请选择申请人', trigger: ['blur', 'change'] }],
CORP_NAME: [{ type: 'string', required: true, message: '请选择作业分公司', trigger: ['blur', 'change'] }],
WORK_TYPE_NAME: [{ type: 'string', required: true, message: '请选择作业类别', trigger: ['blur', 'change'] }],
NAME: [{ type: 'string', required: true, message: '请输入设备管道名称', trigger: ['blur', 'change'] }],
BOARD_INSTALL_TIME: [{
type: 'string',
required: true,
message: '请选择实际作业开始时间',
trigger: ['blur', 'change']
}],
WORK_END_DATE: [{ type: 'string', required: true, message: '请选择作业结束时间', trigger: ['blur', 'change'] }],
WORK_USER: [{ type: 'string', required: true, message: '请输入作业人', trigger: ['blur', 'change'] }],
WORK_LONGITUDE: [{ type: 'string', required: true, message: '请输入经度', trigger: ['blur', 'change'] }],
WORK_LATITUDE: [{ type: 'string', required: true, message: '请输入纬度', trigger: ['blur', 'change'] }],
MEDIUM: [{ type: 'string', required: true, message: '请输入介质', trigger: ['blur', 'change'] }],
TEMPERATURE: [{ type: 'string', required: true, message: '请输入温度', trigger: ['blur', 'change'] }],
PRESSURE: [{ type: 'string', required: true, message: '请输入压力', trigger: ['blur', 'change'] }],
BOARD_PATH: [{
type: 'array',
required: true,
message: '请上传盲板抽堵位置图',
trigger: ['blur', 'change']
}],
SPECIAL_WORK: [{
type: 'string',
required: true,
message: '请输入关联的其他特殊作业及安全作业票编号',
trigger: ['blur', 'change']
}],
RISK_IDENTIFICATION: [{
type: 'string',
required: true,
message: '请输入风险辨识结果',
trigger: ['blur', 'change']
}],
SIGN: [{
type: 'string',
required: true,
message: '请签字',
trigger: ['blur', 'change']
}],
},
picker: {
show: false,
columns: [],
key: 'NAME',
type: 'picker',
defaultIndex: []
},
dateTimePicker: {
show: false,
value: Number(new Date()),
min: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
otherAssignmentsShow: false,
otherIdentificationShow: false,
signVisible: false,
}
},
async onLoad(options) {
this.form.CORP_ID = options.CORPINFO_ID
this.form.CORP_NAME = options.CORP_NAME
this.type = options.type
this.fnAddBoardList()
if (options.taskId) {
this.form = await getData(options.taskId)
}
},
methods: {
fnSingleChoiceClick(event) {
this.picker.type = event
if (event === 'WORK_TYPE_NAME') {
this.picker.columns = [[{ NAME: "堵盲板", ID: '0' }, { NAME: "抽盲板", ID: '1' }]]
}
this.picker.show = true
},
fnSingleChoiceConfirm(event) {
if (this.picker.type === 'WORK_TYPE_NAME') {
this.form.WORK_TYPE = event.value[0].ID
this.form.WORK_TYPE_NAME = event.value[0].NAME
}
this.fnSingleChoiceCancel()
},
fnSingleChoiceCancel() {
this.picker.show = false
},
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
fnLocation() {
uni.navigateTo({
url: '/pages/map/index',
events: {
acceptLocationData: (event) => {
this.form.WORK_LONGITUDE = event.data.longitue;
this.form.WORK_LATITUDE = event.data.latitude;
}
},
})
},
fnAddBoardList() {
this.form.boardList.push({ BOARD_MATERIAL: '', BOARD_SPECIFICATION: '', BOARD_NO: '', ID: uni.$u.guid() })
},
fnDeleteBoardList(index) {
uni.showModal({
title: '提示',
content: '确定删除该条信息吗?',
success: (res) => {
if (res.confirm) {
this.form.boardList.splice(index, 1)
}
}
})
},
fnAfterRead(event, key) {
this.form[key].push(...event.file)
},
fnDeletePic(event, key) {
uni.showModal({
title: '提示',
content: '确定删除该图片吗?',
success: (res) => {
if (res.confirm) {
this.form[key].splice(event.index, 1)
}
}
})
},
fnSign(event) {
this.form.SIGN = event.filePath
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
for (let i = 0; i < this.form.boardList.length; i++) {
if (!this.form.boardList[i].BOARD_MATERIAL) {
uni.$u.toast(`盲板抽堵参数第${i + 1}项中,请输入管道材质`)
return
}
if (!this.form.boardList[i].BOARD_SPECIFICATION) {
uni.$u.toast(`盲板抽堵参数第${i + 1}项中,请输入管道规格`)
return
}
if (!this.form.boardList[i].BOARD_NO) {
uni.$u.toast(`盲板抽堵参数第${i + 1}项中,请输入管道编号`)
return
}
}
try {
await setSubmitForm({
form: this.form,
formItems: this.formItems,
TYPE: this.type,
CORP_ID: this.form.CORP_ID
})
} catch {
}
} catch {
uni.$u.toast('请补全必填项')
}
}
}
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,259 @@
<template>
<view class="content" style="margin-left: 10px">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="申请单位" prop="APPLY_DEPARTMENT_NAME" borderBottom required>
<u-input v-model="form.APPLY_DEPARTMENT_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="申请人" prop="APPLY_USER_NAME" borderBottom required>
<u-input v-model="form.APPLY_USER_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="作业分公司" prop="CORP_NAME" borderBottom required>
<u-input v-model="form.CORP_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="作业开始时间" prop="WORK_START_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_START_DATE')">
<u-input v-model="form.WORK_START_DATE" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业结束时间" prop="WORK_END_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_END_DATE')">
<u-input v-model="form.WORK_END_DATE" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="地点坐标" borderBottom required>
<u-button type="primary" size="small" text="定位" :customStyle="{width:'100upx',margin:0}"
@click="fnLocation"/>
</u-form-item>
<u-form-item label="经度" prop="WORK_LONGITUDE" borderBottom required>
<u-input v-model="form.WORK_LONGITUDE" border="none" readonly/>
</u-form-item>
<u-form-item label="纬度" prop="WORK_LATITUDE" borderBottom required>
<u-input v-model="form.WORK_LATITUDE" border="none" readonly/>
</u-form-item>
<u-form-item label="作业地点" prop="WORK_PLACE" borderBottom required>
<u-input v-model="form.WORK_PLACE" border="none"/>
</u-form-item>
<u-form-item label="作业内容" prop="JOB_CONTENT" borderBottom required labelPosition="top" labelWidth="auto">
<u-textarea v-model="form.JOB_CONTENT" border="none" autoHeight/>
</u-form-item>
<u-form-item label="作业内容、范围、方式" prop="WORK_CONTENT" borderBottom required labelPosition="top" labelWidth="auto">
<u-textarea v-model="form.WORK_CONTENT" border="none" autoHeight/>
</u-form-item>
<u-form-item label="作业内容、范围、方式简图" prop="CONTENT_IMG_PATH" borderBottom required labelPosition="top" labelWidth="auto">
<u-upload
class="mt-10"
:fileList="form.CONTENT_IMG_PATH"
@afterRead="fnAfterRead($event,'CONTENT_IMG_PATH')"
@delete="fnDeletePic($event,'CONTENT_IMG_PATH')"
multiple
:maxCount="1"
></u-upload>
</u-form-item>
<u-form-item label="关联的其他特殊作业及安全作业票编号" prop="SPECIAL_WORK" borderBottom required
labelPosition="top" labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '150upx'}"
@click="otherAssignmentsShow = true"/>
<u-textarea v-model="form.SPECIAL_WORK" border="none" autoHeight maxlength="-1"/>
</u-form-item>
<u-form-item label="风险辨识结果" prop="RISK_IDENTIFICATION" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '150upx'}"
@click="otherIdentificationShow = true"/>
<u-textarea v-model="form.RISK_IDENTIFICATION" border="none" autoHeight maxlength="-1"/>
</u-form-item>
<u-form-item label="申请人签字" prop="SIGN" borderBottom required labelPosition="top" labelWidth="auto">
<view style="flex: 1">
<view>
<u-button type="primary" size="mini" text="签字"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '100upx'}"
@click="signVisible = true"/>
</view>
<view v-if="form.SIGN">
<u-image width="400rpx" height="200rpx" :src="form.SIGN"/>
</view>
</view>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:minDate="dateTimePicker.min" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel"/>
<other-select :visible.sync="otherAssignmentsShow" v-model="form.SPECIAL_WORK" type="assignments"/>
<other-select :visible.sync="otherIdentificationShow" v-model="form.RISK_IDENTIFICATION" type="identification"/>
<sign :signShow.sync="signVisible" @confirm="fnSign"/>
</view>
</template>
<script>
import OtherSelect from '@/components/other-select/index.vue';
import Sign from '@/components/sign/sign.vue'
import {getData, setSubmitForm} from "@/utils/submitHomeworkProcess";
export default {
components: {
OtherSelect,
Sign
},
data() {
return {
type: '',
formItems: [
{name: '申请单位', key_name: 'APPLY_DEPARTMENT_NAME', key_id: 'APPLY_DEPARTMENT_ID', type: 0},
{name: '申请人', key_name: 'APPLY_USER_NAME', key_id: 'APPLY_USER_ID', type: 0},
{name: '作业分公司', key_name: 'CORP_NAME', key_id: 'CORP_ID', type: 0},
{name: '作业开始时间', key_name: 'WORK_START_DATE', type: 0},
{name: '作业结束时间', key_name: 'WORK_END_DATE', type: 0},
{name: '经度', key_name: 'WORK_LONGITUDE', type: 0},
{name: '纬度', key_name: 'WORK_LATITUDE', type: 0},
{name: '作业地点', key_name: 'WORK_PLACE', type: 0},
{name: '作业内容', key_name: 'JOB_CONTENT', type: 0},
{name: '作业内容、范围、方式', key_name: 'WORK_CONTENT', type: 0},
{name: '作业内容、范围、方式简图', key_name: 'CONTENT_IMG_PATH', type: 1},
{name: '关联的其他特殊作业及安全作业票编号', key_name: 'SPECIAL_WORK', type: 0},
{name: '风险辨识结果', key_name: 'RISK_IDENTIFICATION', type: 0},
{name: '申请人签字', key_name: 'SIGN', type: 5},
],
form: {
APPLY_DEPARTMENT_ID: this.$store.getters.getUserInfo.DEPARTMENT_ID,
APPLY_DEPARTMENT_NAME: this.$store.getters.getUserInfo.DEPARTMENT_NAME,
APPLY_USER_ID: this.$store.getters.getUserInfo.USER_ID,
APPLY_USER_NAME: this.$store.getters.getUserInfo.NAME,
CORP_ID: '',
CORP_NAME: '',
WORK_START_DATE: '',
WORK_END_DATE: '',
WORK_LONGITUDE: '1',
WORK_LATITUDE: '2',
WORK_PLACE: '',
JOB_CONTENT: '',
WORK_CONTENT: '',
CONTENT_IMG_PATH: [],
SPECIAL_WORK: '',
RISK_IDENTIFICATION: '',
SIGN: '',
},
rules: {
APPLY_DEPARTMENT_ID: [{type: 'string', required: true, message: '请选择申请单位', trigger: ['blur', 'change']}],
APPLY_USER_NAME: [{type: 'string', required: true, message: '请选择申请人', trigger: ['blur', 'change']}],
CORP_NAME: [{type: 'string', required: true, message: '请选择作业分公司', trigger: ['blur', 'change']}],
WORK_START_DATE: [{type: 'string', required: true, message: '请选择作业开始时间', trigger: ['blur', 'change']}],
WORK_END_DATE: [{type: 'string', required: true, message: '请选择作业结束时间', trigger: ['blur', 'change']}],
WORK_LONGITUDE: [{type: 'string', required: true, message: '请输入经度', trigger: ['blur', 'change']}],
WORK_LATITUDE: [{type: 'string', required: true, message: '请输入纬度', trigger: ['blur', 'change']}],
WORK_PLACE: [{type: 'string', required: true, message: '请输入作业地点', trigger: ['blur', 'change']}],
JOB_CONTENT: [{type: 'string', required: true, message: '请输入作业内容', trigger: ['blur', 'change']}],
WORK_CONTENT: [{type: 'string', required: true, message: '请输入作业内容、范围、方式', trigger: ['blur', 'change']}],
CONTENT_IMG_PATH: [{
type: 'array',
required: true,
message: '请上传作业内容、范围、方式简图',
trigger: ['blur', 'change']
}],
SPECIAL_WORK: [{
type: 'string',
required: true,
message: '请输入关联的其他特殊作业及安全作业票编号',
trigger: ['blur', 'change']
}],
RISK_IDENTIFICATION: [{
type: 'string',
required: true,
message: '请输入风险辨识结果',
trigger: ['blur', 'change']
}],
SIGN: [{
type: 'string',
required: true,
message: '请签字',
trigger: ['blur', 'change']
}],
},
dateTimePicker: {
show: false,
value: Number(new Date()),
min: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
otherAssignmentsShow: false,
otherIdentificationShow: false,
signVisible: false,
}
},
async onLoad(options) {
this.form.CORP_ID = options.CORPINFO_ID
this.form.CORP_NAME = options.CORP_NAME
this.type = options.type
if (options.taskId) {
this.form = await getData(options.taskId)
}
},
methods: {
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
fnLocation() {
uni.navigateTo({
url: '/pages/map/index',
events: {
acceptLocationData: (event) => {
this.form.WORK_LONGITUDE = event.data.longitue;
this.form.WORK_LATITUDE = event.data.latitude;
}
},
})
},
fnAfterRead(event, key) {
this.form[key].push(...event.file)
},
fnDeletePic(event, key) {
uni.showModal({
title: '提示',
content: '确定删除该图片吗?',
success: (res) => {
if (res.confirm) {
this.form[key].splice(event.index, 1)
}
}
})
},
fnSign(event) {
this.form.SIGN = event.filePath
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
await setSubmitForm({
form: this.form,
formItems: this.formItems,
TYPE: this.type,
CORP_ID: this.form.CORP_ID
})
} catch {
}
} catch {
uni.$u.toast('请补全必填项')
}
}
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,87 @@
<template>
<view class="content">
<u-list @scrolltolower="scrolltolower" v-if="list.length > 0">
<u-list-item v-for="(item, index) in list" :key="index">
<view class="flex-between main-title">
<text>申请人{{ item.jobName }}</text>
</view>
<view class="flex-between main-title">
<text>身份{{ item.taskName }}</text>
</view>
<view class="flex-between main-title">
<text>作业编号{{ item.id }}</text>
</view>
<view class="flex-between main-title">
<text>作业分公司{{ item.corpName }}</text>
</view>
<view class="flex-between main-title">
<text>申请时间{{ item.createdTime }}</text>
</view>
<view class="flex-between mt-10 subtitle">
<view></view>
<view class="flex-between">
<u-button type="primary" text="流程" size="mini" class="bth-mini"
@click="$u.route({
url: '/pages/eight_assignments/technological_process',
params: {taskId:item.taskId,type,title}
})"/>
</view>
</view>
</u-list-item>
</u-list>
<empty v-else></empty>
</view>
</template>
<script>
import {getToDoTaskList} from "@/api";
export default {
data() {
return {
type: '',
title: '',
pageSize: 10,
currentPage: 1,
totalPage: 0,
list: []
}
},
onLoad(query) {
this.type = query.type
this.title = query.title
uni.setNavigationBarTitle({
title: this.title + '已办'
})
},
onShow() {
this.resetList()
},
methods: {
async getData() {
let resData = await getToDoTaskList({
showCount: this.pageSize,
currentPage: this.currentPage,
TYPE: this.type,
vectors: '1'
});
this.list = [...this.list, ...resData.list.list];
this.totalPage = resData.list.totalPage;
},
resetList() {
this.pageSize = 10
this.currentPage = 1
this.list = []
this.getData()
},
scrolltolower() {
this.currentPage++;
if (this.totalPage >= this.currentPage) this.getData();
},
},
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,248 @@
<template>
<view class="content" style="margin-left: 10px">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="申请单位" prop="APPLY_DEPARTMENT_NAME" borderBottom required>
<u-input v-model="form.APPLY_DEPARTMENT_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="申请人" prop="APPLY_USER_NAME" borderBottom required>
<u-input v-model="form.APPLY_USER_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="作业分公司" prop="CORP_NAME" borderBottom required>
<u-input v-model="form.CORP_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="受限空间所属单位" prop="BELONG_CORP" borderBottom required>
<u-input v-model="form.BELONG_CORP" border="none"/>
</u-form-item>
<u-form-item label="受限空间名称" prop="LIMITSPACE_NAME" borderBottom required
@click="fnSingleChoiceClick('LIMITSPACE_NAME')">
<u-input v-model="form.LIMITSPACE_NAME" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="受限空间内原有介质名称" prop="MEDIUM_NAME" borderBottom required>
<u-input v-model="form.MEDIUM_NAME" border="none"/>
</u-form-item>
<u-form-item label="作业内容" prop="WORK_CONTENT" borderBottom required labelPosition="top" labelWidth="auto">
<u-textarea v-model="form.WORK_CONTENT" border="none" autoHeight/>
</u-form-item>
<u-form-item label="作业开始时间" prop="WORK_START_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_START_DATE')">
<u-input v-model="form.WORK_START_DATE" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业结束时间" prop="WORK_END_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_END_DATE')">
<u-input v-model="form.WORK_END_DATE" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="地点坐标" borderBottom required>
<u-button type="primary" size="small" text="定位" :customStyle="{width:'100upx',margin:0}"
@click="fnLocation"/>
</u-form-item>
<u-form-item label="经度" prop="WORK_LONGITUDE" borderBottom required>
<u-input v-model="form.WORK_LONGITUDE" border="none" readonly/>
</u-form-item>
<u-form-item label="纬度" prop="WORK_LATITUDE" borderBottom required>
<u-input v-model="form.WORK_LATITUDE" border="none" readonly/>
</u-form-item>
<u-form-item label="作业人" prop="WORK_USER" borderBottom required>
<u-input v-model="form.WORK_USER" border="none"/>
</u-form-item>
<u-form-item label="关联的其他特殊作业及安全作业票编号" prop="SPECIAL_WORK" borderBottom required
labelPosition="top" labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '150upx'}"
@click="otherAssignmentsShow = true"/>
<u-textarea v-model="form.SPECIAL_WORK" border="none" autoHeight maxlength="-1"/>
</u-form-item>
<u-form-item label="风险辨识结果" prop="RISK_IDENTIFICATION" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '150upx'}"
@click="otherIdentificationShow = true"/>
<u-textarea v-model="form.RISK_IDENTIFICATION" border="none" autoHeight maxlength="-1"/>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
<u-picker :show="picker.show" :columns="picker.columns" :keyName="picker.key" :key="picker.type"
@confirm="fnSingleChoiceConfirm" @cancel="fnSingleChoiceCancel"/>
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:minDate="dateTimePicker.min" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel"/>
<other-select :visible.sync="otherAssignmentsShow" v-model="form.SPECIAL_WORK" type="assignments"/>
<other-select :visible.sync="otherIdentificationShow" v-model="form.RISK_IDENTIFICATION" type="identification"/>
</view>
</template>
<script>
import {getConfinedSpaceSelectList} from '@/api'
import OtherSelect from '@/components/other-select/index.vue';
import {getData, setSubmitForm} from "@/utils/submitHomeworkProcess";
export default {
components: {
OtherSelect
},
data() {
return {
type: '',
formItems: [
{name: '申请单位', key_name: 'APPLY_DEPARTMENT_NAME', key_id: 'APPLY_DEPARTMENT_ID', type: 0},
{name: '申请人', key_name: 'APPLY_USER_NAME', key_id: 'APPLY_USER_ID', type: 0},
{name: '作业分公司', key_name: 'CORP_NAME', key_id: 'CORP_ID', type: 0},
{name: '受限空间所属单位', key_name: 'BELONG_CORP', type: 0},
{name: '受限空间名称', key_name: 'LIMITSPACE_NAME', key_id: 'LIMITSPACE_ID', type: 0},
{name: '受限空间内原有介质名称', key_name: 'MEDIUM_NAME', type: 0},
{name: '作业内容', key_name: 'WORK_CONTENT', type: 0},
{name: '作业开始时间', key_name: 'WORK_START_DATE', type: 0},
{name: '作业结束时间', key_name: 'WORK_END_DATE', type: 0},
{name: '经度', key_name: 'WORK_LONGITUDE', type: 0},
{name: '纬度', key_name: 'WORK_LATITUDE', type: 0},
{name: '作业人', key_name: 'WORK_USER', type: 0},
{name: '关联的其他特殊作业及安全作业票编号', key_name: 'SPECIAL_WORK', type: 0},
{name: '风险辨识结果', key_name: 'RISK_IDENTIFICATION', type: 0},
],
form: {
APPLY_DEPARTMENT_ID: this.$store.getters.getUserInfo.DEPARTMENT_ID,
APPLY_DEPARTMENT_NAME: this.$store.getters.getUserInfo.DEPARTMENT_NAME,
APPLY_USER_ID: this.$store.getters.getUserInfo.USER_ID,
APPLY_USER_NAME: this.$store.getters.getUserInfo.NAME,
CORP_ID: '',
CORP_NAME: '',
BELONG_CORP: '',
LIMITSPACE_NAME: '',
LIMITSPACE_ID: '',
MEDIUM_NAME: '',
WORK_CONTENT: '',
WORK_START_DATE: '',
WORK_END_DATE: '',
WORK_LONGITUDE: '1',
WORK_LATITUDE: '2',
WORK_USER: '',
SPECIAL_WORK: '',
RISK_IDENTIFICATION: '',
},
rules: {
APPLY_DEPARTMENT_ID: [{type: 'string', required: true, message: '请选择申请单位', trigger: ['blur', 'change']}],
APPLY_USER_NAME: [{type: 'string', required: true, message: '请选择申请人', trigger: ['blur', 'change']}],
CORP_NAME: [{type: 'string', required: true, message: '请选择作业分公司', trigger: ['blur', 'change']}],
BELONG_CORP: [{type: 'string', required: true, message: '请输入受限空间所属单位', trigger: ['blur', 'change']}],
LIMITSPACE_NAME: [{type: 'string', required: true, message: '请选择受限空间名称', trigger: ['blur', 'change']}],
MEDIUM_NAME: [{
type: 'string',
required: true,
message: '请输入受限空间内原有介质名称',
trigger: ['blur', 'change']
}],
WORK_CONTENT: [{type: 'string', required: true, message: '请输入作业内容', trigger: ['blur', 'change']}],
WORK_START_DATE: [{type: 'string', required: true, message: '请选择作业开始时间', trigger: ['blur', 'change']}],
WORK_END_DATE: [{type: 'string', required: true, message: '请选择作业结束时间', trigger: ['blur', 'change']}],
WORK_LONGITUDE: [{type: 'string', required: true, message: '请选择经度', trigger: ['blur']}],
WORK_LATITUDE: [{type: 'string', required: true, message: '请选择纬度', trigger: ['blur']}],
WORK_USER: [{type: 'string', required: true, message: '请输入作业人', trigger: ['blur', 'change']}],
SPECIAL_WORK: [{
type: 'string',
required: true,
message: '请输入关联的其他特殊作业及安全作业票编号',
trigger: ['blur', 'change']
}],
RISK_IDENTIFICATION: [{
type: 'string',
required: true,
message: '请输入风险辨识结果',
trigger: ['blur', 'change']
}],
},
picker: {
show: false,
columns: [],
key: 'NAME',
type: 'picker'
},
dateTimePicker: {
show: false,
value: Number(new Date()),
min: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
otherAssignmentsShow: false,
otherIdentificationShow: false,
}
},
async onLoad(options) {
this.form.CORP_ID = options.CORPINFO_ID
this.form.CORP_NAME = options.CORP_NAME
this.type = options.type
if (options.taskId) {
this.form = await getData(options.taskId)
}
},
methods: {
async fnGetConfinedSpaceSelectList() {
const resData = await getConfinedSpaceSelectList({TYPE: 2, CORP_ID: this.form.CORP_ID})
this.picker.columns = [resData.varList]
},
fnSingleChoiceClick(event) {
this.picker.type = event
if (event === 'LIMITSPACE_NAME') this.fnGetConfinedSpaceSelectList()
this.picker.show = true
},
fnSingleChoiceConfirm(event) {
if (this.picker.type === 'LIMITSPACE_NAME') {
this.form.LIMITSPACE_ID = event.value[0].LIMITSPACE_ID
this.form.LIMITSPACE_NAME = event.value[0].NAME
}
this.fnSingleChoiceCancel()
},
fnSingleChoiceCancel() {
this.picker.show = false
},
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
fnLocation() {
uni.navigateTo({
url: '/pages/map/index',
events: {
acceptLocationData: (event) => {
this.form.WORK_LONGITUDE = event.data.longitue;
this.form.WORK_LATITUDE = event.data.latitude;
}
},
})
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
await setSubmitForm({
form: this.form,
formItems: this.formItems,
TYPE: this.type,
CORP_ID: this.form.CORP_ID
})
} catch {
}
} catch {
uni.$u.toast('请补全必填项')
}
}
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,138 @@
<template>
<view class="content">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<block v-if="GAS_NAME1">
<u-form-item :label="GAS_NAME1" prop="GAS_NAME1" borderBottom>
<u-input v-model="form.DATA1" border="none"/>
</u-form-item>
</block>
<block v-if="GAS_NAME2">
<u-form-item :label="GAS_NAME2" prop="GAS_NAME1" borderBottom>
<u-input v-model="form.DATA2" border="none"/>
</u-form-item>
</block>
<block v-if="GAS_NAME3">
<u-form-item :label="GAS_NAME3" prop="GAS_NAME1" borderBottom>
<u-input v-model="form.DATA3" border="none"/>
</u-form-item>
</block>
<block v-if="GAS_NAME4">
<u-form-item :label="GAS_NAME4" prop="GAS_NAME1" borderBottom>
<u-input v-model="form.DATA4" border="none"/>
</u-form-item>
</block>
<u-form-item label="取样分析时间" prop="ANALYZE_TIME" borderBottom required
@click="fnDateTimePickerClick('ANALYZE_TIME')">
<u-input v-model="form.ANALYZE_TIME" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="分析部位" prop="ANALYZE_PLACE" borderBottom required>
<u-input v-model="form.ANALYZE_PLACE" border="none"/>
</u-form-item>
<u-form-item label="氧气含量" prop="OXYGEN_CONTENT" borderBottom required>
<u-input v-model="form.OXYGEN_CONTENT" border="none"/>
</u-form-item>
<u-form-item label="分析人" prop="ANALYZE_USER" borderBottom>
<u-input v-model="form.ANALYZE_USER" border="none" readonly/>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="保存" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:maxDate="dateTimePicker.max" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel"/>
</view>
</template>
<script>
import {setConfinedSpaceGasInfoSave} from "@/api";
export default {
data() {
return {
form: {
DATA1: '',
DATA2: '',
DATA3: '',
DATA4: '',
ANALYZE_TIME: '',
ANALYZE_PLACE: '',
OXYGEN_CONTENT: '',
ANALYZE_USER: this.$store.getters.getUserInfo.NAME,
},
rules: {
ANALYZE_TIME: [{type: 'string', required: true, message: '请选择分析时间', trigger: ['blur', 'change']}],
ANALYZE_PLACE: [{type: 'string', required: true, message: '请输入分析部位', trigger: ['blur', 'change']}],
OXYGEN_CONTENT: [{type: 'string', required: true, message: '请输入氧气含量', trigger: ['blur', 'change']}],
},
GAS_NAME1: '',
GAS_NAME2: '',
GAS_NAME3: '',
GAS_NAME4: '',
EW_RU_TASK_ID: '',
EW_RU_JOB_ID: '',
dateTimePicker: {
show: false,
value: Number(new Date()),
max: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
}
},
onLoad(query) {
this.GAS_NAME1 = query.GAS_NAME1
this.GAS_NAME2 = query.GAS_NAME2
this.GAS_NAME3 = query.GAS_NAME3
this.GAS_NAME4 = query.GAS_NAME4
this.EW_RU_TASK_ID = query.EW_RU_TASK_ID;
this.EW_RU_JOB_ID = query.EW_RU_JOB_ID;
},
methods: {
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
for (let i = 0; i < 4; i++) {
if (this[`GAS_NAME${i + 1}`] && !this.form[`DATA${i + 1}`]) this.form[`DATA${i + 1}`] = 0
}
await setConfinedSpaceGasInfoSave({
data: {...this.form},
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
postMethod: 'application/json',
})
uni.$u.toast('保存成功')
setTimeout(() => {
uni.switchTab({
url: '/pages/index/index'
})
}, 2000)
} catch {
}
} catch (e) {
uni.$u.toast('请补全必填项')
}
}
},
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,120 @@
<template>
<view class="content">
<u-list v-if="list.length > 0">
<u-list-item v-for="(item, index) in list" :key="index">
<view class="flex-between main-title">
<text>分析时间{{ item.ANALYZE_TIME }}</text>
</view>
<view class="flex-between main-title">
<text>分析地点{{ item.ANALYZE_PLACE }}</text>
</view>
<view class="flex-between main-title" v-if="GAS_NAME1 && item.DATA1">
<text>{{ GAS_NAME1 }}{{ item.DATA1 }}</text>
</view>
<view class="flex-between main-title" v-if="GAS_NAME2 && item.DATA2">
<text>{{ GAS_NAME2 }}{{ item.DATA2 }}</text>
</view>
<view class="flex-between main-title" v-if="GAS_NAME3 && item.DATA3">
<text>{{ GAS_NAME3 }}{{ item.DATA3 }}</text>
</view>
<view class="flex-between main-title" v-if="GAS_NAME4 && item.DATA4">
<text>{{ GAS_NAME4 }}{{ item.DATA4 }}</text>
</view>
<view class="flex-between main-title">
<text>含氧量{{ item.OXYGEN_CONTENT }}</text>
</view>
<view class="flex-between main-title">
<text>分析人{{ item.ANALYZE_USER_NAME }}</text>
</view>
<view class="flex-between mt-10 subtitle">
<view></view>
<view class="flex-between">
<u-button type="error" text="删除" size="mini" class="bth-mini"
@click="fnDelete(item)"/>
</view>
</view>
</u-list-item>
</u-list>
<empty v-else></empty>
</view>
</template>
<script>
import {getConfinedSpaceGasInfo, setConfinedSpaceGasDelete} from "@/api";
export default {
data() {
return {
GAS_NAME1: '',
GAS_NAME2: '',
GAS_NAME3: '',
GAS_NAME4: '',
EW_RU_TASK_ID: '',
EW_RU_JOB_ID: '',
list: []
}
},
onLoad(query) {
this.GAS_NAME1 = query.GAS_NAME1;
this.GAS_NAME2 = query.GAS_NAME2;
this.GAS_NAME3 = query.GAS_NAME3;
this.GAS_NAME4 = query.GAS_NAME4;
this.EW_RU_TASK_ID = query.EW_RU_TASK_ID;
this.EW_RU_JOB_ID = query.EW_RU_JOB_ID;
},
onNavigationBarButtonTap(e) {
if (e.index === 0) {
uni.$u.route({
url: '/pages/eight_assignments/confined_space/gas/add',
params: {
GAS_NAME1: this.GAS_NAME1,
GAS_NAME2: this.GAS_NAME2,
GAS_NAME3: this.GAS_NAME3,
GAS_NAME4: this.GAS_NAME4,
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
}
})
}
},
onShow() {
this.resetList()
},
methods: {
async getData() {
let resData = await getConfinedSpaceGasInfo({
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
postMethod: 'application/json',
});
this.list = [...this.list, ...resData.data.main];
},
resetList() {
this.list = []
this.getData()
},
fnDelete(item) {
uni.showModal({
title: '提示',
content: '确定要删除这条记录?',
success: async res => {
if (res.confirm) {
await setConfinedSpaceGasDelete({
data: item,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
postMethod: 'application/json',
})
uni.$u.toast('删除成功')
this.resetList()
}
}
})
}
},
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,116 @@
<template>
<view class="content">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="有毒有害气体名称1" prop="GAS_NAME1" borderBottom>
<u-input v-model="form.GAS_NAME1" border="none"/>
</u-form-item>
<u-form-item label="合格标准" prop="GAS_STANDARD1" borderBottom>
<u-input v-model="form.GAS_STANDARD1" border="none"/>
</u-form-item>
<u-form-item label="有毒有害气体名称2" prop="GAS_NAME2" borderBottom>
<u-input v-model="form.GAS_NAME2" border="none"/>
</u-form-item>
<u-form-item label="合格标准" prop="GAS_STANDARD2" borderBottom>
<u-input v-model="form.GAS_STANDARD2" border="none"/>
</u-form-item>
<u-form-item label="可燃气体名称1" prop="GAS_NAME3" borderBottom>
<u-input v-model="form.GAS_NAME3" border="none"/>
</u-form-item>
<u-form-item label="合格标准" prop="GAS_STANDARD3" borderBottom>
<u-input v-model="form.GAS_STANDARD3" border="none"/>
</u-form-item>
<u-form-item label="可燃气体名称2" prop="GAS_NAME4" borderBottom>
<u-input v-model="form.GAS_NAME4" border="none"/>
</u-form-item>
<u-form-item label="合格标准" prop="GAS_STANDARD4" borderBottom>
<u-input v-model="form.GAS_STANDARD4" border="none"/>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="气体分析" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
</view>
</template>
<script>
import {
getConfinedSpaceGasInfo,
setConfinedSpaceGasInfoSave,
} from "@/api";
export default {
data() {
return {
EW_RU_JOB_ID: '',
EW_RU_TASK_ID: '',
form: {
GAS_NAME1: '',
GAS_STANDARD1: '',
GAS_NAME2: '',
GAS_STANDARD2: '',
GAS_NAME3: '',
GAS_STANDARD3: '',
GAS_NAME4: '',
GAS_STANDARD4: '',
},
rules: {},
}
},
onLoad(query) {
this.EW_RU_TASK_ID = query.taskId
this.EW_RU_JOB_ID = query.EW_RU_JOB_ID
},
onShow() {
this.fnGetData()
},
methods: {
async fnGetData() {
let resData = await getConfinedSpaceGasInfo({
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
postMethod: 'application/json',
})
this.form = resData.data.aux[0] || {}
},
async fnSubmit() {
if (!this.form.GAS_NAME1 && !this.form.GAS_NAME2 && !this.form.GAS_NAME3 && !this.form.GAS_NAME4) {
uni.$u.toast('最少填写一项气体名称')
return
}
for (let i = 0; i < 4; i++) {
if (this.form['GAS_NAME' + (i + 1)] && !this.form['GAS_STANDARD' + (i + 1)]) {
uni.$u.toast('请填写气体名称(' + this.form['GAS_NAME' + (i + 1)] + ')的合格标准')
return
}
if (this.form['GAS_STANDARD' + (i + 1)] && !this.form['GAS_NAME' + (i + 1)]) {
uni.$u.toast('请填写合格标准(' + this.form['GAS_STANDARD' + (i + 1)] + ')的气体名称')
return
}
}
await setConfinedSpaceGasInfoSave({
wh: {...this.form},
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
postMethod: 'application/json',
})
uni.$u.route({
url: '/pages/eight_assignments/confined_space/gas/list',
params: {
GAS_NAME1: this.form.GAS_NAME1,
GAS_NAME2: this.form.GAS_NAME2,
GAS_NAME3: this.form.GAS_NAME3,
GAS_NAME4: this.form.GAS_NAME4,
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
}
})
}
},
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,259 @@
<template>
<view class="content" style="margin-left: 10px">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="申请单位" prop="APPLY_DEPARTMENT_NAME" borderBottom required>
<u-input v-model="form.APPLY_DEPARTMENT_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="申请人" prop="APPLY_USER_NAME" borderBottom required>
<u-input v-model="form.APPLY_USER_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="作业分公司" prop="CORP_NAME" borderBottom required>
<u-input v-model="form.CORP_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="作业开始时间" prop="WORK_START_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_START_DATE')">
<u-input v-model="form.WORK_START_DATE" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业结束时间" prop="WORK_END_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_END_DATE')">
<u-input v-model="form.WORK_END_DATE" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="地点坐标" borderBottom required>
<u-button type="primary" size="small" text="定位" :customStyle="{width:'100upx',margin:0}"
@click="fnLocation"/>
</u-form-item>
<u-form-item label="经度" prop="WORK_LONGITUDE" borderBottom required>
<u-input v-model="form.WORK_LONGITUDE" border="none" readonly/>
</u-form-item>
<u-form-item label="纬度" prop="WORK_LATITUDE" borderBottom required>
<u-input v-model="form.WORK_LATITUDE" border="none" readonly/>
</u-form-item>
<u-form-item label="涉及相关单位(部门)" prop="OTHER_DEPT" borderBottom required labelPosition="top" labelWidth="auto">
<u-textarea v-model="form.OTHER_DEPT" border="none" autoHeight/>
</u-form-item>
<u-form-item label="断路原因" prop="WORK_REASON" borderBottom required labelPosition="top" labelWidth="auto">
<u-textarea v-model="form.WORK_REASON" border="none" autoHeight/>
</u-form-item>
<u-form-item label="断路地段示意图相关说明" prop="WORK_CONTENT" borderBottom required labelPosition="top" labelWidth="auto">
<u-textarea v-model="form.WORK_CONTENT" border="none" autoHeight/>
</u-form-item>
<u-form-item label="断路地段示意图" prop="CONTENT_IMG_PATH" borderBottom required labelPosition="top" labelWidth="auto">
<u-upload
class="mt-10"
:fileList="form.CONTENT_IMG_PATH"
@afterRead="fnAfterRead($event,'CONTENT_IMG_PATH')"
@delete="fnDeletePic($event,'CONTENT_IMG_PATH')"
multiple
:maxCount="1"
></u-upload>
</u-form-item>
<u-form-item label="关联的其他特殊作业及安全作业票编号" prop="SPECIAL_WORK" borderBottom required
labelPosition="top" labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '150upx'}"
@click="otherAssignmentsShow = true"/>
<u-textarea v-model="form.SPECIAL_WORK" border="none" autoHeight maxlength="-1"/>
</u-form-item>
<u-form-item label="风险辨识结果" prop="RISK_IDENTIFICATION" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '150upx'}"
@click="otherIdentificationShow = true"/>
<u-textarea v-model="form.RISK_IDENTIFICATION" border="none" autoHeight maxlength="-1"/>
</u-form-item>
<u-form-item label="申请人签字" prop="SIGN" borderBottom required labelPosition="top" labelWidth="auto">
<view style="flex: 1">
<view>
<u-button type="primary" size="mini" text="签字"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '100upx'}"
@click="signVisible = true"/>
</view>
<view v-if="form.SIGN">
<u-image width="400rpx" height="200rpx" :src="form.SIGN"/>
</view>
</view>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:minDate="dateTimePicker.min" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel"/>
<other-select :visible.sync="otherAssignmentsShow" v-model="form.SPECIAL_WORK" type="assignments"/>
<other-select :visible.sync="otherIdentificationShow" v-model="form.RISK_IDENTIFICATION" type="identification"/>
<sign :signShow.sync="signVisible" @confirm="fnSign"/>
</view>
</template>
<script>
import OtherSelect from '@/components/other-select/index.vue';
import Sign from '@/components/sign/sign.vue'
import {getData, setSubmitForm} from "@/utils/submitHomeworkProcess";
export default {
components: {
OtherSelect,
Sign
},
data() {
return {
type: '',
formItems: [
{name: '申请单位', key_name: 'APPLY_DEPARTMENT_NAME', key_id: 'APPLY_DEPARTMENT_ID', type: 0},
{name: '申请人', key_name: 'APPLY_USER_NAME', key_id: 'APPLY_USER_ID', type: 0},
{name: '作业分公司', key_name: 'CORP_NAME', key_id: 'CORP_ID', type: 0},
{name: '作业开始时间', key_name: 'WORK_START_DATE', type: 0},
{name: '作业结束时间', key_name: 'WORK_END_DATE', type: 0},
{name: '经度', key_name: 'WORK_LONGITUDE', type: 0},
{name: '纬度', key_name: 'WORK_LATITUDE', type: 0},
{name: '涉及相关单位(部门)', key_name: 'OTHER_DEPT', type: 0},
{name: '断路原因', key_name: 'WORK_REASON', type: 0},
{name: '断路地段示意图相关说明', key_name: 'WORK_CONTENT', type: 0},
{name: '断路地段示意图', key_name: 'CONTENT_IMG_PATH', type: 1},
{name: '关联的其他特殊作业及安全作业票编号', key_name: 'SPECIAL_WORK', type: 0},
{name: '风险辨识结果', key_name: 'RISK_IDENTIFICATION', type: 0},
{name: '申请人签字', key_name: 'SIGN', type: 5},
],
form: {
APPLY_DEPARTMENT_ID: this.$store.getters.getUserInfo.DEPARTMENT_ID,
APPLY_DEPARTMENT_NAME: this.$store.getters.getUserInfo.DEPARTMENT_NAME,
APPLY_USER_ID: this.$store.getters.getUserInfo.USER_ID,
APPLY_USER_NAME: this.$store.getters.getUserInfo.NAME,
CORP_ID: '',
CORP_NAME: '',
WORK_START_DATE: '',
WORK_END_DATE: '',
WORK_LONGITUDE: '1',
WORK_LATITUDE: '2',
OTHER_DEPT: '',
WORK_REASON: '',
WORK_CONTENT: '',
CONTENT_IMG_PATH: [],
SPECIAL_WORK: '',
RISK_IDENTIFICATION: '',
SIGN: '',
},
rules: {
APPLY_DEPARTMENT_ID: [{type: 'string', required: true, message: '请选择申请单位', trigger: ['blur', 'change']}],
APPLY_USER_NAME: [{type: 'string', required: true, message: '请选择申请人', trigger: ['blur', 'change']}],
CORP_NAME: [{type: 'string', required: true, message: '请选择作业分公司', trigger: ['blur', 'change']}],
WORK_START_DATE: [{type: 'string', required: true, message: '请选择作业开始时间', trigger: ['blur', 'change']}],
WORK_END_DATE: [{type: 'string', required: true, message: '请选择作业结束时间', trigger: ['blur', 'change']}],
WORK_LONGITUDE: [{type: 'string', required: true, message: '请输入经度', trigger: ['blur', 'change']}],
WORK_LATITUDE: [{type: 'string', required: true, message: '请输入纬度', trigger: ['blur', 'change']}],
OTHER_DEPT: [{type: 'string', required: true, message: '请输入涉及相关单位(部门)', trigger: ['blur', 'change']}],
WORK_REASON: [{type: 'string', required: true, message: '请输入断路原因', trigger: ['blur', 'change']}],
WORK_CONTENT: [{type: 'string', required: true, message: '请输入断路地段示意图相关说明', trigger: ['blur', 'change']}],
CONTENT_IMG_PATH: [{
type: 'array',
required: true,
message: '请上传断路地段示意图',
trigger: ['blur', 'change']
}],
SPECIAL_WORK: [{
type: 'string',
required: true,
message: '请输入关联的其他特殊作业及安全作业票编号',
trigger: ['blur', 'change']
}],
RISK_IDENTIFICATION: [{
type: 'string',
required: true,
message: '请输入风险辨识结果',
trigger: ['blur', 'change']
}],
SIGN: [{
type: 'string',
required: true,
message: '请签字',
trigger: ['blur', 'change']
}],
},
dateTimePicker: {
show: false,
value: Number(new Date()),
min: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
otherAssignmentsShow: false,
otherIdentificationShow: false,
signVisible: false,
}
},
async onLoad(options) {
this.form.CORP_ID = options.CORPINFO_ID
this.form.CORP_NAME = options.CORP_NAME
this.type = options.type
if (options.taskId) {
this.form = await getData(options.taskId)
}
},
methods: {
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
fnLocation() {
uni.navigateTo({
url: '/pages/map/index',
events: {
acceptLocationData: (event) => {
this.form.WORK_LONGITUDE = event.data.longitue;
this.form.WORK_LATITUDE = event.data.latitude;
}
},
})
},
fnAfterRead(event, key) {
this.form[key].push(...event.file)
},
fnDeletePic(event, key) {
uni.showModal({
title: '提示',
content: '确定删除该图片吗?',
success: (res) => {
if (res.confirm) {
this.form[key].splice(event.index, 1)
}
}
})
},
fnSign(event) {
this.form.SIGN = event.filePath
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
await setSubmitForm({
form: this.form,
formItems: this.formItems,
TYPE: this.type,
CORP_ID: this.form.CORP_ID
})
} catch {
}
} catch {
uni.$u.toast('请补全必填项')
}
}
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,273 @@
<template>
<view class="content" style="margin-left: 10px">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="申请单位" prop="APPLY_DEPARTMENT_NAME" borderBottom required>
<u-input v-model="form.APPLY_DEPARTMENT_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="申请人" prop="APPLY_USER_NAME" borderBottom required>
<u-input v-model="form.APPLY_USER_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="作业分公司" prop="CORP_NAME" borderBottom required>
<u-input v-model="form.CORP_NAME" border="none" readonly/>
</u-form-item>
<u-form-item label="作业实施开始时间" prop="WORK_START_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_START_DATE')">
<u-input v-model="form.WORK_START_DATE" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业实施结束时间" prop="WORK_END_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_END_DATE')">
<u-input v-model="form.WORK_END_DATE" border="none" readonly/>
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="地点坐标" borderBottom required>
<u-button type="primary" size="small" text="定位" :customStyle="{width:'100upx',margin:0}"
@click="fnLocation"/>
</u-form-item>
<u-form-item label="经度" prop="WORK_LONGITUDE" borderBottom required>
<u-input v-model="form.WORK_LONGITUDE" border="none" readonly/>
</u-form-item>
<u-form-item label="纬度" prop="WORK_LATITUDE" borderBottom required>
<u-input v-model="form.WORK_LATITUDE" border="none" readonly/>
</u-form-item>
<u-form-item label="作业地点" prop="WORK_PLACE" borderBottom required>
<u-input v-model="form.WORK_PLACE" border="none"/>
</u-form-item>
<u-form-item label="作业内容" prop="WORK_CONTENT" borderBottom required labelPosition="top" labelWidth="auto">
<u-textarea v-model="form.WORK_CONTENT" border="none" autoHeight/>
</u-form-item>
<u-form-item label="作业人" prop="WORK_USER" borderBottom required>
<u-input v-model="form.WORK_USER" border="none"/>
</u-form-item>
<u-form-item label="电工证号" prop="CARD_NO" borderBottom required>
<u-input v-model="form.CARD_NO" border="none"/>
</u-form-item>
<u-form-item label="电源接入点及许可用电功率" prop="ALLOW_POWER" borderBottom required>
<u-input v-model="form.ALLOW_POWER" border="none"/>
</u-form-item>
<u-form-item label="用电设备名称及额定功率" prop="RATED_POWER" borderBottom required>
<u-input v-model="form.RATED_POWER" border="none"/>
</u-form-item>
<u-form-item label="工作电压" prop="WORK_VOLTAGE" borderBottom required>
<u-input v-model="form.WORK_VOLTAGE" border="none"/>
</u-form-item>
<u-form-item label="用电人" prop="ELECTRICITY_USER" borderBottom required>
<u-input v-model="form.ELECTRICITY_USER" border="none"/>
</u-form-item>
<u-form-item label="负责人电工号" prop="LEADER_CARD_NO" borderBottom required>
<u-input v-model="form.LEADER_CARD_NO" border="none"/>
</u-form-item>
<u-form-item label="是否进行气体分析" prop="ISANALYZE" borderBottom required>
<u-radio-group v-model="form.ISANALYZE" :customStyle="{'justify-content': 'flex-end'}" @change="fnIsAnalyzeChange">
<u-radio label="是" name="1"/>
<u-radio :customStyle="{marginLeft: '8px'}" label="否" name="0"/>
</u-radio-group>
</u-form-item>
<u-form-item label="关联的其他特殊作业及安全作业票编号" prop="SPECIAL_WORK" borderBottom required
labelPosition="top" labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '150upx'}"
@click="otherAssignmentsShow = true"/>
<u-textarea v-model="form.SPECIAL_WORK" border="none" autoHeight maxlength="-1"/>
</u-form-item>
<u-form-item label="风险辨识结果" prop="RISK_IDENTIFICATION" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '150upx'}"
@click="otherIdentificationShow = true"/>
<u-textarea v-model="form.RISK_IDENTIFICATION" border="none" autoHeight maxlength="-1"/>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:minDate="dateTimePicker.min" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel"/>
<other-select :visible.sync="otherAssignmentsShow" v-model="form.SPECIAL_WORK" type="assignments"/>
<other-select :visible.sync="otherIdentificationShow" v-model="form.RISK_IDENTIFICATION" type="identification"/>
</view>
</template>
<script>
import OtherSelect from '@/components/other-select/index.vue';
import {getData, setSubmitForm} from "@/utils/submitHomeworkProcess";
export default {
components: {
OtherSelect,
},
data() {
return {
type: '',
formItems: [
{name: '申请单位', key_name: 'APPLY_DEPARTMENT_NAME', key_id: 'APPLY_DEPARTMENT_ID', type: 0},
{name: '申请人', key_name: 'APPLY_USER_NAME', key_id: 'APPLY_USER_ID', type: 0},
{name: '作业分公司', key_name: 'CORP_NAME', key_id: 'CORP_ID', type: 0},
{name: '作业实施开始时间', key_name: 'WORK_START_DATE', type: 0},
{name: '作业实施结束时间', key_name: 'WORK_END_DATE', type: 0},
{name: '经度', key_name: 'WORK_LONGITUDE', type: 0},
{name: '纬度', key_name: 'WORK_LATITUDE', type: 0},
{name: '作业地点', key_name: 'WORK_PLACE', type: 0},
{name: '作业内容', key_name: 'WORK_CONTENT', type: 0},
{name: '作业人', key_name: 'WORK_USER', type: 0},
{name: '电工证号', key_name: 'CARD_NO', type: 0},
{name: '电源接入点及许可用电功率', key_name: 'ALLOW_POWER', type: 0},
{name: '用电设备名称及额定功率', key_name: 'RATED_POWER', type: 0},
{name: '工作电压', key_name: 'WORK_VOLTAGE', type: 0},
{name: '用电人', key_name: 'ELECTRICITY_USER', type: 0},
{name: '负责人电工号', key_name: 'LEADER_CARD_NO', type: 0},
{name: '是否进行气体分析', key_name: 'ISANALYZE_NAME',key_id: 'ISANALYZE', type: 0},
{name: '关联的其他特殊作业及安全作业票编号', key_name: 'SPECIAL_WORK', type: 0},
{name: '风险辨识结果', key_name: 'RISK_IDENTIFICATION', type: 0},
],
form: {
APPLY_DEPARTMENT_ID: this.$store.getters.getUserInfo.DEPARTMENT_ID,
APPLY_DEPARTMENT_NAME: this.$store.getters.getUserInfo.DEPARTMENT_NAME,
APPLY_USER_ID: this.$store.getters.getUserInfo.USER_ID,
APPLY_USER_NAME: this.$store.getters.getUserInfo.NAME,
CORP_ID: '',
CORP_NAME: '',
WORK_START_DATE: '',
WORK_END_DATE: '',
WORK_LONGITUDE: '1',
WORK_LATITUDE: '2',
WORK_PLACE: '',
WORK_CONTENT: '',
WORK_USER: '',
CARD_NO: '',
ALLOW_POWER: '',
RATED_POWER: '',
WORK_VOLTAGE: '',
ELECTRICITY_USER: '',
LEADER_CARD_NO: '',
ISANALYZE: '',
ISANALYZE_NAME: '',
SPECIAL_WORK: '',
RISK_IDENTIFICATION: '',
},
rules: {
APPLY_DEPARTMENT_ID: [{type: 'string', required: true, message: '请选择申请单位', trigger: ['blur', 'change']}],
APPLY_USER_NAME: [{type: 'string', required: true, message: '请选择申请人', trigger: ['blur', 'change']}],
CORP_NAME: [{type: 'string', required: true, message: '请选择作业分公司', trigger: ['blur', 'change']}],
WORK_START_DATE: [{
type: 'string',
required: true,
message: '请选择作业实施开始时间',
trigger: ['blur', 'change']
}],
WORK_END_DATE: [{
type: 'string',
required: true,
message: '请选择作业实施结束时间',
trigger: ['blur', 'change']
}],
WORK_LONGITUDE: [{type: 'string', required: true, message: '请输入经度', trigger: ['blur', 'change']}],
WORK_LATITUDE: [{type: 'string', required: true, message: '请输入纬度', trigger: ['blur', 'change']}],
WORK_PLACE: [{type: 'string', required: true, message: '请输入作业地点', trigger: ['blur', 'change']}],
WORK_CONTENT: [{type: 'string', required: true, message: '请输入作业内容', trigger: ['blur', 'change']}],
WORK_USER: [{type: 'string', required: true, message: '请输入作业人', trigger: ['blur', 'change']}],
CARD_NO: [{type: 'string', required: true, message: '请输入电工证号', trigger: ['blur', 'change']}],
ALLOW_POWER: [{
type: 'string',
required: true,
message: '请输入电源接入点及许可用电功率',
trigger: ['blur', 'change']
}],
RATED_POWER: [{
type: 'string',
required: true,
message: '请输入用电设备名称及额定功率',
trigger: ['blur', 'change']
}],
WORK_VOLTAGE: [{type: 'string', required: true, message: '请输入工作电压', trigger: ['blur', 'change']}],
ELECTRICITY_USER: [{type: 'string', required: true, message: '请输入用电人', trigger: ['blur', 'change']}],
LEADER_CARD_NO: [{type: 'string', required: true, message: '请输入负责人电工号', trigger: ['blur', 'change']}],
ISANALYZE: [{type: 'string', required: true, message: '请选择是否进行气体分析', trigger: ['blur', 'change']}],
SPECIAL_WORK: [{
type: 'string',
required: true,
message: '请输入关联的其他特殊作业及安全作业票编号',
trigger: ['blur', 'change']
}],
RISK_IDENTIFICATION: [{
type: 'string',
required: true,
message: '请输入风险辨识结果',
trigger: ['blur', 'change']
}],
},
dateTimePicker: {
show: false,
value: Number(new Date()),
min: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
otherAssignmentsShow: false,
otherIdentificationShow: false,
}
},
async onLoad(options) {
this.form.CORP_ID = options.CORPINFO_ID
this.form.CORP_NAME = options.CORP_NAME
this.type = options.type
if (options.taskId) {
this.form = await getData(options.taskId)
}
},
methods: {
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
fnLocation() {
uni.navigateTo({
url: '/pages/map/index',
events: {
acceptLocationData: (event) => {
this.form.WORK_LONGITUDE = event.data.longitue;
this.form.WORK_LATITUDE = event.data.latitude;
}
},
})
},
fnIsAnalyzeChange(event){
if(event === '1'){
this.form.ISANALYZE_NAME = '是'
} else{
this.form.ISANALYZE_NAME = '否'
}
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
await setSubmitForm({
form: this.form,
formItems: this.formItems,
TYPE: this.type,
CORP_ID: this.form.CORP_ID
})
} catch {
}
} catch {
uni.$u.toast('请补全必填项')
}
}
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,247 @@
<template>
<view class="content" style="margin-left: 10px">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="申请单位" prop="APPLY_DEPARTMENT_NAME" borderBottom required>
<u-input v-model="form.APPLY_DEPARTMENT_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="申请人" prop="APPLY_USER_NAME" borderBottom required>
<u-input v-model="form.APPLY_USER_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="作业分公司" prop="CORP_NAME" borderBottom required>
<u-input v-model="form.CORP_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="作业地点" prop="WORK_PLACE" borderBottom required>
<u-input v-model="form.WORK_PLACE" border="none" />
</u-form-item>
<u-form-item label="作业人" prop="PROJECT_MANAGER" borderBottom required>
<u-input v-model="form.PROJECT_MANAGER" border="none" />
</u-form-item>
<u-form-item label="作业高度(米)" prop="WORK_HIGH" borderBottom required>
<u-input v-model="form.WORK_HIGH" border="none" type="number" />
</u-form-item>
<u-form-item label="高处作业级别" prop="WORK_LEVEL_NAME" borderBottom required
@click="fnSingleChoiceClick('WORK_LEVEL_NAME')">
<u-input v-model="form.WORK_LEVEL_NAME" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业内容" prop="WORK_CONTENT" borderBottom required labelPosition="top" labelWidth="auto">
<u-textarea v-model="form.WORK_CONTENT" border="none" autoHeight maxlength="-1" />
</u-form-item>
<u-form-item label="作业实施开始时间" prop="WORK_START_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_START_DATE')">
<u-input v-model="form.WORK_START_DATE" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业实施结束时间" prop="WORK_END_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_END_DATE')">
<u-input v-model="form.WORK_END_DATE" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="地点坐标" borderBottom required>
<u-button type="primary" size="small" text="定位" :customStyle="{ width: '100upx', margin: 0 }"
@click="fnLocation" />
</u-form-item>
<u-form-item label="经度" prop="WORK_LONGITUDE" borderBottom required>
<u-input v-model="form.WORK_LONGITUDE" border="none" readonly />
</u-form-item>
<u-form-item label="纬度" prop="WORK_LATITUDE" borderBottom required>
<u-input v-model="form.WORK_LATITUDE" border="none" readonly />
</u-form-item>
<u-form-item label="关联的其他特殊作业及安全作业票编号" prop="SPECIAL_WORK" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{ position: 'absolute', top: '-46upx', right: '20upx', width: '150upx' }"
@click="otherAssignmentsShow = true" />
<u-textarea v-model="form.SPECIAL_WORK" border="none" autoHeight maxlength="-1" />
</u-form-item>
<u-form-item label="风险辨识结果" prop="RISK_IDENTIFICATION" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{ position: 'absolute', top: '-46upx', right: '20upx', width: '150upx' }"
@click="otherIdentificationShow = true" />
<u-textarea v-model="form.RISK_IDENTIFICATION" border="none" autoHeight maxlength="-1" />
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000, true)" />
</view>
</view>
<u-picker :show="picker.show" :columns="picker.columns" :keyName="picker.key" :key="picker.type" :defaultIndex="picker.defaultIndex"
@confirm="fnSingleChoiceConfirm" @cancel="fnSingleChoiceCancel" />
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:minDate="dateTimePicker.min" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel" />
<other-select :visible.sync="otherAssignmentsShow" v-model="form.SPECIAL_WORK" type="assignments" />
<other-select :visible.sync="otherIdentificationShow" v-model="form.RISK_IDENTIFICATION" type="identification" />
</view>
</template>
<script>
import OtherSelect from '@/components/other-select/index.vue';
import Sign from '@/components/sign/sign.vue'
import {getData, setSubmitForm} from "@/utils/submitHomeworkProcess";
export default {
components: {
OtherSelect,
Sign
},
data() {
return {
type: '',
formItems: [
{ name: '申请单位', key_name: 'APPLY_DEPARTMENT_NAME', key_id: 'APPLY_DEPARTMENT_ID', type: 0 },
{ name: '申请人', key_name: 'APPLY_USER_NAME', key_id: 'APPLY_USER_ID', type: 0 },
{ name: '作业分公司', key_name: 'CORP_NAME', key_id: 'CORP_ID', type: 0 },
{ name: '作业地点', key_name: 'WORK_PLACE', type: 0 },
{ name: '作业人', key_name: 'PROJECT_MANAGER', type: 0 },
{ name: '作业高度(米)', key_name: 'WORK_HIGH', type: 0 },
{ name: '高处作业级别', key_name: 'WORK_LEVEL_NAME', key_id: 'WORK_LEVEL', type: 0 },
{ name: '作业内容', key_name: 'WORK_CONTENT', type: 0 },
{ name: '作业实施开始时间', key_name: 'WORK_START_DATE', type: 0 },
{ name: '作业实施结束时间', key_name: 'WORK_END_DATE', type: 0 },
{ name: '经度', key_name: 'WORK_LONGITUDE', type: 0 },
{ name: '纬度', key_name: 'WORK_LATITUDE', type: 0 },
{ name: '关联的其他特殊作业及安全作业票编号', key_name: 'SPECIAL_WORK', type: 0 },
{ name: '风险辨识结果', key_name: 'RISK_IDENTIFICATION', type: 0 },
],
form: {
APPLY_DEPARTMENT_ID: this.$store.getters.getUserInfo.DEPARTMENT_ID,
APPLY_DEPARTMENT_NAME: this.$store.getters.getUserInfo.DEPARTMENT_NAME,
APPLY_USER_ID: this.$store.getters.getUserInfo.USER_ID,
APPLY_USER_NAME: this.$store.getters.getUserInfo.NAME,
CORP_ID: '',
CORP_NAME: '',
WORK_PLACE: '',
PROJECT_MANAGER: '',
WORK_HIGH: '',
WORK_LEVEL_NAME: '',
WORK_LEVEL: '',
WORK_CONTENT: '',
WORK_START_DATE: '',
WORK_END_DATE: '',
WORK_LONGITUDE: '1',
WORK_LATITUDE: '2',
SPECIAL_WORK: '',
RISK_IDENTIFICATION: '',
},
rules: {
APPLY_DEPARTMENT_ID: [{ type: 'string', required: true, message: '请选择申请单位', trigger: ['blur', 'change'] }],
APPLY_USER_NAME: [{ type: 'string', required: true, message: '请选择申请人', trigger: ['blur', 'change'] }],
CORP_NAME: [{ type: 'string', required: true, message: '请选择作业分公司', trigger: ['blur', 'change'] }],
WORK_PLACE: [{ type: 'string', required: true, message: '请输入作业地点', trigger: ['blur', 'change'] }],
PROJECT_MANAGER: [{ type: 'string', required: true, message: '请输入作业人', trigger: ['blur', 'change'] }],
WORK_HIGH: [{ type: 'string', required: true, message: '请输入作业高度(米)', trigger: ['blur', 'change'] }],
WORK_LEVEL_NAME: [{ type: 'string', required: true, message: '请选择高处作业级别', trigger: ['blur', 'change'] }],
WORK_CONTENT: [{ type: 'string', required: true, message: '请输入作业内容', trigger: ['blur', 'change'] }],
WORK_START_DATE: [{ type: 'string', required: true, message: '请选择作业实施开始时间', trigger: ['blur', 'change'] }],
WORK_END_DATE: [{ type: 'string', required: true, message: '请选择作业实施结束时间', trigger: ['blur', 'change'] }],
WORK_LONGITUDE: [{ type: 'string', required: true, message: '请输入经度', trigger: ['blur', 'change'] }],
WORK_LATITUDE: [{ type: 'string', required: true, message: '请输入纬度', trigger: ['blur', 'change'] }],
SPECIAL_WORK: [{
type: 'string',
required: true,
message: '请输入关联的其他特殊作业及安全作业票编号',
trigger: ['blur', 'change']
}],
RISK_IDENTIFICATION: [{
type: 'string',
required: true,
message: '请输入风险辨识结果',
trigger: ['blur', 'change']
}],
},
picker: {
show: false,
columns: [],
key: 'NAME',
type: 'picker',
defaultIndex: []
},
dateTimePicker: {
show: false,
value: Number(new Date()),
min: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
otherAssignmentsShow: false,
otherIdentificationShow: false,
}
},
async onLoad(options) {
this.form.CORP_ID = options.CORPINFO_ID
this.form.CORP_NAME = options.CORP_NAME
this.type = options.type
if (options.taskId) {
this.form = await getData(options.taskId)
}
},
methods: {
fnSingleChoiceClick(event) {
this.picker.type = event
if (event === 'WORK_LEVEL_NAME') {
this.picker.columns = [[
{ NAME: 'I级高处作业', ID: '0' },
{ NAME: 'II级高处作业', ID: '1' },
{ NAME: 'III级高处作业', ID: '2' },
{ NAME: 'IV级高处作业', ID: '3' },
]];
}
this.picker.show = true
},
fnSingleChoiceConfirm(event) {
if (this.picker.type === 'WORK_LEVEL_NAME') {
this.form.WORK_LEVEL = event.value[0].ID
this.form.WORK_LEVEL_NAME = event.value[0].NAME
}
this.fnSingleChoiceCancel()
},
fnSingleChoiceCancel() {
this.picker.show = false
},
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
fnLocation() {
uni.navigateTo({
url: '/pages/map/index',
events: {
acceptLocationData: (event) => {
this.form.WORK_LONGITUDE = event.data.longitue;
this.form.WORK_LATITUDE = event.data.latitude;
}
},
})
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
await setSubmitForm({
form: this.form,
formItems: this.formItems,
TYPE: this.type,
CORP_ID: this.form.CORP_ID
})
} catch {
}
} catch {
uni.$u.toast('请补全必填项')
}
}
}
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,60 @@
<template>
<view class="container">
<view class="card">
<u-cell-group>
<view v-for="(item, index) in list" :key="index">
<u-cell :title="item.JOB_TYPE_DESCRIBE">
<template #label>
<view class="mt-10">
<view>部门{{ item.JOB_DEPARTMENT_NAME }}</view>
<view>人员{{ item.JOB_NAME }}</view>
<view>
审批结果{{ item.PASS_FLAG === 0 ? "不通过" : "通过" }}
</view>
<view v-if="item.SIGN_PICTURE">
<u-image
width="400rpx"
height="200rpx"
:src="$filePath + item.SIGN_PICTURE"
mode="widthFix"
/>
<view>审批意见{{ item.APPROVAL_OPINIONS }}</view>
<view>时间{{ item.CREATE_TIME }}</view>
</view>
</view>
</template>
</u-cell>
</view>
</u-cell-group>
</view>
</view>
</template>
<script>
import {getHistoricalApprovalRecords} from "@/api";
export default {
data() {
return {
list: [],
EW_RU_TASK_ID: '',
EW_RU_JOB_ID: ''
}
},
onLoad(query) {
this.EW_RU_TASK_ID = query.taskId;
this.EW_RU_JOB_ID = query.EW_RU_JOB_ID;
this.fnGetData();
},
methods: {
async fnGetData() {
let resData = await getHistoricalApprovalRecords({
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
});
this.list = resData.list;
},
}
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,266 @@
<template>
<view class="content" style="margin-left: 10px">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="申请单位" prop="APPLY_DEPARTMENT_NAME" borderBottom required>
<u-input v-model="form.APPLY_DEPARTMENT_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="申请人" prop="APPLY_USER_NAME" borderBottom required>
<u-input v-model="form.APPLY_USER_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="作业分公司" prop="CORP_NAME" borderBottom required>
<u-input v-model="form.CORP_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="吊装地点" prop="WORK_PLACE" borderBottom required>
<u-input v-model="form.WORK_PLACE" border="none" />
</u-form-item>
<u-form-item label="吊具名称" prop="TOOL_NAME" borderBottom required>
<u-input v-model="form.TOOL_NAME" border="none" />
</u-form-item>
<u-form-item label="吊装作业人" prop="WORK_USER" borderBottom required>
<u-input v-model="form.WORK_USER" border="none" />
</u-form-item>
<u-form-item label="司索人" prop="SISUO_USER" borderBottom required>
<u-input v-model="form.SISUO_USER" border="none" />
</u-form-item>
<u-form-item label="指挥人员" prop="PROJECT_MANAGER" borderBottom required>
<u-input v-model="form.PROJECT_MANAGER" border="none" />
</u-form-item>
<u-form-item label="吊物质量(吨)" prop="PART_WEIGHT" borderBottom required>
<u-input v-model="form.PART_WEIGHT" border="none" type="number" />
</u-form-item>
<u-form-item label="作业级别" prop="WORK_LEVEL_NAME" borderBottom required
@click="fnSingleChoiceClick('WORK_LEVEL_NAME')">
<u-input v-model="form.WORK_LEVEL_NAME" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="吊物内容" prop="WORK_CONTENT" borderBottom required labelPosition="top" labelWidth="auto">
<u-textarea v-model="form.WORK_CONTENT" border="none" autoHeight maxlength="-1" />
</u-form-item>
<u-form-item label="作业开始时间" prop="WORK_START_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_START_DATE')">
<u-input v-model="form.WORK_START_DATE" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业结束时间" prop="WORK_END_DATE" borderBottom required
@click="fnDateTimePickerClick('WORK_END_DATE')">
<u-input v-model="form.WORK_END_DATE" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="地点坐标" borderBottom required>
<u-button type="primary" size="small" text="定位" :customStyle="{ width: '100upx', margin: 0 }"
@click="fnLocation" />
</u-form-item>
<u-form-item label="经度" prop="WORK_LONGITUDE" borderBottom required>
<u-input v-model="form.WORK_LONGITUDE" border="none" readonly />
</u-form-item>
<u-form-item label="纬度" prop="WORK_LATITUDE" borderBottom required>
<u-input v-model="form.WORK_LATITUDE" border="none" readonly />
</u-form-item>
<u-form-item label="关联的其他特殊作业及安全作业票编号" prop="SPECIAL_WORK" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{ position: 'absolute', top: '-46upx', right: '20upx', width: '150upx' }"
@click="otherAssignmentsShow = true" />
<u-textarea v-model="form.SPECIAL_WORK" border="none" autoHeight maxlength="-1" />
</u-form-item>
<u-form-item label="风险辨识结果" prop="RISK_IDENTIFICATION" borderBottom required labelPosition="top"
labelWidth="auto">
<u-button type="primary" size="mini" text="选择其它"
:customStyle="{ position: 'absolute', top: '-46upx', right: '20upx', width: '150upx' }"
@click="otherIdentificationShow = true" />
<u-textarea v-model="form.RISK_IDENTIFICATION" border="none" autoHeight maxlength="-1" />
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000, true)" />
</view>
</view>
<u-picker :show="picker.show" :columns="picker.columns" :keyName="picker.key" :key="picker.type"
:defaultIndex="picker.defaultIndex" @confirm="fnSingleChoiceConfirm" @cancel="fnSingleChoiceCancel" />
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:minDate="dateTimePicker.min" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel" />
<other-select :visible.sync="otherAssignmentsShow" v-model="form.SPECIAL_WORK" type="assignments" />
<other-select :visible.sync="otherIdentificationShow" v-model="form.RISK_IDENTIFICATION" type="identification" />
</view>
</template>
<script>
import OtherSelect from '@/components/other-select/index.vue';
import Sign from '@/components/sign/sign.vue'
import {getData, setSubmitForm} from "@/utils/submitHomeworkProcess";
export default {
components: {
OtherSelect,
Sign
},
data() {
return {
type: '',
formItems: [
{ name: '申请单位', key_name: 'APPLY_DEPARTMENT_NAME', key_id: 'APPLY_DEPARTMENT_ID', type: 0 },
{ name: '申请人', key_name: 'APPLY_USER_NAME', key_id: 'APPLY_USER_ID', type: 0 },
{ name: '作业分公司', key_name: 'CORP_NAME', key_id: 'CORP_ID', type: 0 },
{ name: '吊装地点', key_name: 'WORK_PLACE', type: 0 },
{ name: '吊具名称', key_name: 'TOOL_NAME', type: 0 },
{ name: '吊装作业人', key_name: 'WORK_USER', type: 0 },
{ name: '司索人', key_name: 'SISUO_USER', type: 0 },
{ name: '指挥人员', key_name: 'PROJECT_MANAGER', type: 0 },
{ name: '吊物质量(吨)', key_name: 'PART_WEIGHT', type: 0 },
{ name: '作业级别', key_name: 'WORK_LEVEL_NAME', key_id: 'WORK_LEVEL_ID', type: 0 },
{ name: '吊物内容', key_name: 'WORK_CONTENT', type: 0 },
{ name: '作业开始时间', key_name: 'WORK_START_DATE', type: 0 },
{ name: '作业结束时间', key_name: 'WORK_END_DATE', type: 0 },
{ name: '经度', key_name: 'WORK_LONGITUDE', type: 0 },
{ name: '纬度', key_name: 'WORK_LATITUDE', type: 0 },
{ name: '关联的其他特殊作业及安全作业票编号', key_name: 'SPECIAL_WORK', type: 0 },
{ name: '风险辨识结果', key_name: 'RISK_IDENTIFICATION', type: 0 },
],
form: {
APPLY_DEPARTMENT_ID: this.$store.getters.getUserInfo.DEPARTMENT_ID,
APPLY_DEPARTMENT_NAME: this.$store.getters.getUserInfo.DEPARTMENT_NAME,
APPLY_USER_ID: this.$store.getters.getUserInfo.USER_ID,
APPLY_USER_NAME: this.$store.getters.getUserInfo.NAME,
CORP_ID: '',
CORP_NAME: '',
WORK_PLACE: '',
TOOL_NAME: '',
WORK_USER: '',
SISUO_USER: '',
PROJECT_MANAGER: '',
PART_WEIGHT: '',
WORK_LEVEL_ID: '',
WORK_LEVEL_NAME: '',
WORK_CONTENT: '',
WORK_START_DATE: '',
WORK_END_DATE: '',
WORK_LONGITUDE: '1',
WORK_LATITUDE: '2',
SPECIAL_WORK: '',
RISK_IDENTIFICATION: '',
},
rules: {
APPLY_DEPARTMENT_ID: [{ type: 'string', required: true, message: '请选择申请单位', trigger: ['blur', 'change'] }],
APPLY_USER_NAME: [{ type: 'string', required: true, message: '请选择申请人', trigger: ['blur', 'change'] }],
CORP_NAME: [{ type: 'string', required: true, message: '请选择作业分公司', trigger: ['blur', 'change'] }],
WORK_PLACE: [{ type: 'string', required: true, message: '请输入吊装地点', trigger: ['blur', 'change'] }],
TOOL_NAME: [{ type: 'string', required: true, message: '请输入吊具名称', trigger: ['blur', 'change'] }],
WORK_USER: [{ type: 'string', required: true, message: '请输入吊装作业人', trigger: ['blur', 'change'] }],
SISUO_USER: [{ type: 'string', required: true, message: '请输入司索人', trigger: ['blur', 'change'] }],
PROJECT_MANAGER: [{ type: 'string', required: true, message: '请输入指挥人员', trigger: ['blur', 'change'] }],
PART_WEIGHT: [{ type: 'string', required: true, message: '请输入吊物质量(吨)', trigger: ['blur', 'change'] }],
WORK_LEVEL_NAME: [{ type: 'string', required: true, message: '请选择作业级别', trigger: ['blur', 'change'] }],
WORK_CONTENT: [{ type: 'string', required: true, message: '请输入吊物内容', trigger: ['blur', 'change'] }],
WORK_START_DATE: [{ type: 'string', required: true, message: '请选择作业开始时间', trigger: ['blur', 'change'] }],
WORK_END_DATE: [{ type: 'string', required: true, message: '请选择作业结束时间', trigger: ['blur', 'change'] }],
WORK_LONGITUDE: [{ type: 'string', required: true, message: '请输入经度', trigger: ['blur', 'change'] }],
WORK_LATITUDE: [{ type: 'string', required: true, message: '请输入纬度', trigger: ['blur', 'change'] }],
SPECIAL_WORK: [{
type: 'string',
required: true,
message: '请输入关联的其他特殊作业及安全作业票编号',
trigger: ['blur', 'change']
}],
RISK_IDENTIFICATION: [{
type: 'string',
required: true,
message: '请输入风险辨识结果',
trigger: ['blur', 'change']
}],
},
picker: {
show: false,
columns: [],
key: 'NAME',
type: 'picker',
defaultIndex: [] // ,,, picker ,, fnGetData ,
},
dateTimePicker: {
show: false,
value: Number(new Date()),
min: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
otherAssignmentsShow: false,
otherIdentificationShow: false,
}
},
async onLoad(options) {
this.form.CORP_ID = options.CORPINFO_ID
this.form.CORP_NAME = options.CORP_NAME
this.type = options.type
if (options.taskId) {
this.form = await getData(options.taskId)
}
},
methods: {
fnSingleChoiceClick(event) {
this.picker.type = event
if (event === 'WORK_LEVEL_NAME') {
this.picker.columns = [[
{ NAME: 'I级高处作业', ID: '0' },
{ NAME: 'II级高处作业', ID: '1' },
{ NAME: 'III级高处作业', ID: '2' },
{ NAME: 'IV级高处作业', ID: '3' },
]];
}
this.picker.show = true
},
fnSingleChoiceConfirm(event) {
if (this.picker.type === 'WORK_LEVEL_NAME') {
this.form.WORK_LEVEL_ID = event.value[0].ID
this.form.WORK_LEVEL_NAME = event.value[0].NAME
this.picker.defaultIndex = event.indexs; // picker , this.picker.defaultIndex
}
this.fnSingleChoiceCancel()
},
fnSingleChoiceCancel() {
this.picker.show = false
},
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
fnLocation() {
uni.navigateTo({
url: '/pages/map/index',
events: {
acceptLocationData: (event) => {
this.form.WORK_LONGITUDE = event.data.longitue;
this.form.WORK_LATITUDE = event.data.latitude;
}
},
})
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
await setSubmitForm({
form: this.form,
formItems: this.formItems,
TYPE: this.type,
CORP_ID: this.form.CORP_ID
})
} catch {
}
} catch (err) {
uni.$u.toast('请补全必填项')
}
}
}
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,276 @@
<template>
<view class="content" style="margin-left: 10px">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="申请单位" prop="APPLY_DEPARTMENT_NAME" borderBottom required>
<u-input v-model="form.APPLY_DEPARTMENT_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="申请办理人" prop="APPLY_USER_NAME" borderBottom required>
<u-input v-model="form.APPLY_USER_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="作业分公司" prop="CORP_NAME" borderBottom required>
<u-input v-model="form.CORP_NAME" border="none" readonly />
</u-form-item>
<u-form-item v-if="false" label="作业编号" prop="JOB_NUMBER" borderBottom>
<u-input v-model="form.JOB_NUMBER" border="none" placeholder="请输入作业编号" />
</u-form-item>
<u-form-item label="申请日期" prop="APPLICATION_DATE" borderBottom required
@click="fnDateTimePickerClick('APPLICATION_DATE')">
<u-input v-model="form.APPLICATION_DATE" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业类型" prop="JOB_TYPE_NAME" borderBottom required
@click="fnSingleChoiceClick('JOB_TYPE_NAME')">
<u-input v-model="form.JOB_TYPE_NAME" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="动火部位" prop="HOT_WORK_POSITION" borderBottom required>
<u-input v-model="form.HOT_WORK_POSITION" border="none" placeholder="请输入动火部位" />
</u-form-item>
<u-form-item label="动火方法" prop="HOT_WORK_METHOD_ID" borderBottom labelPosition="top" labelWidth="auto" required>
<u-button type="primary" size="mini" text="选择其它动火方法"
:customStyle="{ position: 'absolute', top: '-46upx', right: '20upx', width: '180upx' }"
@click="otherWorkMethodShow = true" />
<u-textarea v-model="form.HOT_WORK_METHOD_ID" border="none" autoHeight maxlength="-1" />
</u-form-item>
<u-form-item label="动火等级" prop="HOT_WORK_LEVEL_INDEX" borderBottom required
@click="fnSingleChoiceClick('HOT_WORK_LEVEL_INDEX')">
<u-input v-model="form.HOT_WORK_LEVEL_INDEX" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="动火开始时间" prop="HOT_WORK_TIME_START" borderBottom required
@click="fnDateTimePickerClick('HOT_WORK_TIME_START')">
<u-input v-model="form.HOT_WORK_TIME_START" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="动火结束时间" prop="HOT_WORK_TIME_END" borderBottom required
@click="fnDateTimePickerClick('HOT_WORK_TIME_END')">
<u-input v-model="form.HOT_WORK_TIME_END" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="作业内容" prop="JOB_CONTENT" borderBottom required>
<u-input v-model="form.JOB_CONTENT" border="none" placeholder="请输入作业内容" />
</u-form-item>
<u-form-item label="动火操作人" prop="USER_NAME" borderBottom required labelPosition="top" labelWidth="auto">
<u-button type="primary" size="mini" text="添加"
:customStyle="{ position: 'absolute', top: '-46upx', right: '20upx', width: '90upx' }"
@click="otherUserNameSelectShow = true" />
<u-textarea v-model="form.USER_NAME" border="none" autoHeight maxlength="-1" />
</u-form-item>
<u-form-item label="动火监火人" prop="SUPERVISOR_OF_HOT_WORK_UNIT" borderBottom required>
<u-input v-model="form.SUPERVISOR_OF_HOT_WORK_UNIT" border="none" placeholder="请输入动火监火人" />
</u-form-item>
<u-form-item label="是否安全总监审批" prop="IS_SAFETY_DIRECTOR" borderBottom required>
<u-radio-group v-model="form.IS_SAFETY_DIRECTOR" :customStyle="{ 'justify-content': 'flex-end' }">
<u-radio label="是" name="1" />
<u-radio :customStyle="{ marginLeft: '8px' }" label="否" name="0" />
</u-radio-group>
</u-form-item>
<u-form-item label="是否需要气体检测" props="IS_GAS_TESTING" borderBottom required>
<u-radio-group v-model="form.IS_GAS_TESTING" :customStyle="{ 'justify-content': 'flex-end' }" @change="fnRadioChange($event, 'IS_GAS_TESTING_NAME')">
<u-radio label="是" name="1" />
<u-radio :customStyle="{ marginLeft: '8px' }" label="否" name="0" />
</u-radio-group>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000, true)" />
</view>
</view>
<u-picker :show="picker.show" :columns="picker.columns" :keyName="picker.key" :key="picker.type"
:defaultIndex="picker.defaultIndex" @confirm="fnSingleChoiceConfirm" @cancel="fnSingleChoiceCancel" />
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:minDate="dateTimePicker.min" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel" />
<other-select :visible.sync="otherWorkMethodShow" v-model="form.HOT_WORK_METHOD_ID" type="hotWorkMethod" />
<other-select :visible.sync="otherUserNameSelectShow" v-model="form.USER_NAME" type="userNameSelect" />
</view>
</template>
<script>
import OtherSelect from '@/components/other-select/index.vue';
import {getData, setSubmitForm} from "@/utils/submitHomeworkProcess";
import useFormValidate from "@/utils/useFormValidate";
export default {
components: { OtherSelect },
data() {
return {
type: '',
formItems: [
{name: '申请单位', key_name: 'APPLY_DEPARTMENT_NAME', key_id: 'APPLY_DEPARTMENT_ID', type: 0},
{name: '申请办理人', key_name: 'APPLY_USER_NAME', key_id: 'APPLY_USER_ID', type: 0},
{name: "作业分公司", key_name: "CORP_NAME", key_id: "CORP_ID", type: 0},
{name: '作业编号', key_name: 'JOB_NUMBER', key_id: 'JOB_NUMBER_ID', type: 0},
{name: '申请日期', key_name: 'APPLICATION_DATE', type: 0},
{name: '作业类型', key_name: 'JOB_TYPE_NAME', key_id: 'JOB_TYPE_INDEX', type: 0},
{name: '动火部位', key_name: 'HOT_WORK_POSITION', type: 0},
{name: '动火方法', key_id: "HOT_WORK_METHOD_ID", key_name: "HOT_WORK_METHOD_NAME", type: 0},
{name: '动火等级', key_name: 'HOT_WORK_LEVEL_INDEX', key_id: 'HOT_WORK_LEVEL_NAME', type: 0},
{name: '动火开始时间', key_name: 'HOT_WORK_TIME_START', type: 0},
{name: '动火结束时间', key_name: 'HOT_WORK_TIME_END', type: 0},
{name: '作业内容', key_name: 'JOB_CONTENT', type: 0},
{
key_name: "hotWorkOperatorList",
type: 4,
listStructure: [
{name: "动火操作人部门", key_name: "DEPARTMENT_NAME", key_id: "DEPARTMENT_ID", type: 0},
{name: "动火操作人", key_name: "USER_NAME", key_id: "USER_ID", type: 0},
{name: "所属端", key_name: "TYPE", type: 0, IS_NOT_SHOW: "1"},
],
},
{name: '动火操作人', key_name: 'SUPERVISOR_OF_HOT_WORK_UNIT', type: 0},
{name: "是否安全总监审批", key_name: "IS_SAFETY_DIRECTOR_NAME", key_id: "IS_SAFETY_DIRECTOR", type: 0},
{name: "是否需要气体检测", key_name: "IS_GAS_TESTING_NAME", key_id: "IS_GAS_TESTING", type: 0},
],
form: {
//
APPLY_DEPARTMENT_NAME: this.$store.getters.getUserInfo.DEPARTMENT_NAME,
APPLY_DEPARTMENT_ID: this.$store.getters.getUserInfo.DEPARTMENT_ID,
//
APPLY_USER_NAME: this.$store.getters.getUserInfo.NAME,
APPLY_USER_ID: this.$store.getters.getUserInfo.USER_ID,
//
JOB_NUMBER: '',
//
APPLICATION_DATE: '',
//
JOB_TYPE_ID: '',
JOB_TYPE_NAME: '',
//
HOT_WORK_POSITION: '',
//
HOT_WORK_METHOD_ID: '',
//
HOT_WORK_LEVEL_ID: '',
HOT_WORK_LEVEL_INDEX: '',
/** 动火开始时间 */
HOT_WORK_TIME_START: '',
/** 动火结束时间 */
HOT_WORK_TIME_END: '',
/** 作业内容 */
JOB_CONTENT: '',
/** 动火操作人 */
USER_NAME: '',
/** 动火监火人 */
SUPERVISOR_OF_HOT_WORK_UNIT: '',
/** 是否安全总监审批 */
IS_SAFETY_DIRECTOR: '',
/** 是否需要气体检测 */
IS_GAS_TESTING: '',
hotWorkOperatorList: []
},
rules: {
APPLY_DEPARTMENT_NAME: [{ type: 'string', required: true, message: '请选择申请单位', trigger: ['blur', 'change'] }],
APPLY_USER_NAME: [{ type: 'string', required: true, message: '请选择申请办理人', trigger: ['blur', 'change'] }],
JOB_NUMBER: [{ type: 'string', required: false, message: '请输入作业编号', trigger: ['blur', 'change'] }],
APPLICATION_DATE: [{ type: 'string', required: true, message: '请选择申请日期', trigger: ['blur', 'change'] }],
JOB_TYPE_NAME: [{ type: 'string', required: true, message: '请选择作业类型', trigger: ['blur', 'change'] }],
HOT_WORK_POSITION: [{ type: 'string', required: true, message: '请输入动火部位', trigger: ['blur', 'change'] }],
HOT_WORK_METHOD_ID: [{ type: 'string', required: true, message: '请选择动火方法', trigger: ['blur', 'change'] }],
HOT_WORK_LEVEL_INDEX: [{ type: 'string', required: true, message: '请选择动火等级', trigger: ['blue', 'change'] }],
HOT_WORK_TIME_START: [{ type: 'string', required: true, message: '请选择动火开始时间', trigger: ['blur', 'change'] }],
HOT_WORK_TIME_END: [{ type: 'string', required: true, message: '请选择动火结束时间', trigger: ['blur', 'change'] }],
JOB_CONTENT: [{ type: 'string', required: true, message: '请输入作业内容', trigger: ['blur', 'change'] }],
USER_NAME: [{ type: 'string', required: true, message: '请选择动火操作人', trigger: ['blur', 'change'] }],
SUPERVISOR_OF_HOT_WORK_UNIT: [{ type: 'string', required: true, message: '请输入动火监火人', trigger: ['blur', 'change'] }],
IS_SAFETY_DIRECTOR: [{ type: 'string', required: true, message: '请选择是否安全总监审批', trigger: ['blur', 'change'] }],
IS_GAS_TESTING: [{ type: 'string', required: true, message: '请选择是否需要气体检测', trigger: ['blur', 'change'] }],
},
picker: {
show: false,
columns: [],
key: 'NAME',
type: 'picker',
defaultIndex: []
},
dateTimePicker: {
show: false,
value: Number(new Date()),
min: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
/** 其他动火方法选择器是否显示 */
otherWorkMethodShow: false,
/** 其他动火操作人选择器是否展示 */
otherUserNameSelectShow: false,
taskId: null
}
},
async onLoad(options) {
this.form.CORP_ID = options.CORPINFO_ID
this.form.CORP_NAME = options.CORP_NAME
this.type = options.type
if (options.taskId) {
this.taskId = options.taskId
this.form = await getData(options.taskId)
}
},
methods: {
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnSingleChoiceClick(event) {
this.picker.type = event;
if (event === 'JOB_TYPE_NAME') {
this.picker.columns = [[{ ID: '0', NAME: '内部作业' }, { ID: '1', NAME: '相关方作业' }]]
};
if (event === 'HOT_WORK_LEVEL_INDEX') {
this.picker.columns = [[{ ID: '0', NAME: '特级' }, { ID: '1', NAME: '一级' }, { ID: '2', NAME: '二级' }, { ID: '3', NAME: '三级' }]]
}
this.picker.show = true;
},
fnSingleChoiceConfirm(event) {
if (this.picker.type === 'JOB_TYPE_NAME') {
this.form.JOB_TYPE_ID = event.value[0].ID
this.form.JOB_TYPE_NAME = event.value[0].NAME
this.picker.defaultIndex = event.indexs
}
if (this.picker.type === 'HOT_WORK_LEVEL_INDEX') {
this.form.HOT_WORK_LEVEL_ID = event.value[0].ID
this.form.HOT_WORK_LEVEL_INDEX = event.value[0].NAME
this.picker.defaultIndex = event.indexs
}
this.fnSingleChoiceCancel()
},
fnSingleChoiceCancel() {
this.picker.show = false
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
fnRadioChange(event, key){
if (event === "1") {
this.form[key] = "是";
} else {
this.form[key] = "否";
}
},
/**
* 下一步所触发的按钮事件
*/
async fnSubmit() {
await this.$refs.formRef.validate()
uni.navigateTo({
url: "/pages/eight_assignments/hot_work/select_operator",
success: ({ eventChannel }) => {
eventChannel.emit("data", {
form: this.form,
formItems: this.formItems,
EW_RU_TASK_ID: this.taskId
});
},
});
}
}
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,122 @@
<!-- 延时监火的添加页面 -->
<template>
<view class="content">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="监火人" prop="USER_NAME" borderBottom required>
<u-input v-model="form.USER_NAME" border="none" readonly />
</u-form-item>
<u-form-item label="时间" prop="TIME" borderBottom required
@click="fnDateTimePickerClick('TIME')">
<u-input v-model="form.TIME" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="照片" prop="imgList" borderBottom required labelPosition="top" labelWidth="auto">
<u-upload class="mt-10" :fileList="form.imgList" @afterRead="fnAfterRead($event, 'imgList')"
@delete="fnDeletePic($event, 'imgList')" multiple :maxCount="1"></u-upload>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="提交" @click="$u.debounce(fnSubmit, 1000, true)" />
</view>
</view>
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:maxDate="dateTimePicker.max" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel" />
</view>
</template>
<script>
import { formatDate } from '@/utils/tools';
import {setHotWorkRecord, setTaskFile} from "../../../../api";
export default {
onLoad(event) {
this.EW_RU_TASK_ID = event.taskId
this.EW_RU_JOB_ID = event.EW_RU_JOB_ID
this.TYPE = event.TYPE
},
data() {
return {
EW_RU_JOB_ID: '',
EW_RU_TASK_ID: '',
form:{
EW_SP_DHW_MONITOR_ID: '',
EW_RU_JOB_ID: '',
EW_RU_TASK_ID: '',
/** 监火人 */
USER_NAME: this.$store.getters.getUserInfo.NAME,
USER_ID: this.$store.getters.getUserInfo.USER_ID,
/** 时间 */
TIME: formatDate(new Date(), 'yyyy-MM-dd hh:mm'),
/** 照片 */
imgList: [],
FILE_PATH: ''
},
rules: {
USER_NAME: [{ type: 'string', required: true, message: '请输入监火人', trigger: ['blur', 'change'] }],
TIME: [{ type: 'string', required: true, message: '请选择时间', trigger: ['blur', 'change'] }],
imgList: [{ type: 'array', required: true, message: '请上传照片', trigger: ['blur', 'change'] }],
},
dateTimePicker: {
show: false,
value: Number(new Date()),
min: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
}
},
methods: {
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
const {CODE} = await setTaskFile({formData: {type: 0}, name: 'files', filePath: this.form.imgList[0].url})
this.form.FILE_PATH = CODE
await setHotWorkRecord({
EW_SP_DHW_MONITOR_ID: this.form.EW_SP_DHW_MONITOR_ID,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
USER_NAME: this.form.USER_NAME,
USER_ID: this.form.USER_ID,
TIME: this.form.TIME,
FILE_PATH: this.form.FILE_PATH
})
uni.navigateBack(); //
} catch {
}
} catch {
uni.$u.toast('请补全必填项')
}
},
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
fnAfterRead(event, key) {
this.form[key].push(...event.file)
},
fnDeletePic(event, key) {
uni.showModal({
title: '提示',
content: '确定删除该图片吗?',
success: (res) => {
if (res.confirm) {
this.form[key].splice(event.index, 1)
}
}
})
},
}
}
</script>

View File

@ -0,0 +1,150 @@
<template>
<view class="content">
<view v-if="isView !== '1'" class="flex-end padding">
<u-button type="primary" text="添加" size="mini" class="bth-mini" @click="goToAdd"/>
<u-button type="primary" text="任务转发" size="mini" class="bth-mini ml-10" @click="goToTaskForword"/>
</view>
<view>
<view class="form" v-if="list.length > 0">
<view class="wui-form-list" v-for="(item, index) in list" :key="index">
<view class="cu-form-group">
<view class="title">监火人</view>
{{ item.USER_NAME }}
</view>
<view class="cu-form-group">
<view class="title">时间</view>
{{ item.TIME }}
</view>
<view class="cu-form-group">
<view class="title">照片</view>
<view><u-button size="mini" type="primary" text="查看图片" @click="ViewImage1(item.FILE_PATH)" /></view>
</view>
</view>
<view style="margin-top: 30upx;" v-show="list.length !== 0 && isView !== '1'">
<u-button class="bg-green" style="max-width: 50%;" @click="$u.debounce(goSubmit, 1000, true)">完成延时监火</u-button>
</view>
</view>
<empty v-else></empty>
</view>
</view>
</template>
<script>
import { getHotWorkRecord, setTaskSign} from "../../../../api";
export default {
data() {
return {
list: [],
STATE: '',
EW_RU_TASK_ID: '',
EW_RU_JOB_ID: '',
TYPE: '',
isView: '1'
}
},
onLoad(event) {
this.STATE = event.state;
this.EW_RU_TASK_ID = event.taskId
this.EW_RU_JOB_ID = event.EW_RU_JOB_ID
this.TYPE = event.TYPE
},
onShow() {
this.resetList()
},
methods: {
async getData() {
let resData = await getHotWorkRecord({
EW_RU_TASK_ID: this.EW_RU_TASK_ID
});
this.list = [...this.list, ...resData.list];
},
resetList() {
this.list = []
this.getData()
},
/**
* 跳转到延时监火的添加页面
*/
goToAdd() {
uni.$u.route({
url: '/pages/eight_assignments/hot_work/delay_fire_monitoring/add',
params: {taskId: this.EW_RU_TASK_ID, EW_RU_JOB_ID:this.EW_RU_JOB_ID,TYPE:this.TYPE}
});
},
/**
* 跳转到延时监火的任务转发页面
*/
goToTaskForword() {
uni.$u.route({
url: '/pages/eight_assignments/hot_work/delay_fire_monitoring/task_forward',
params: {taskId: this.EW_RU_TASK_ID, EW_RU_JOB_ID:this.EW_RU_JOB_ID,TYPE:this.TYPE}
});
},
/**
* 图片预览
*/
ViewImage1(urls) {
uni.previewImage({
urls: [this.$filePath + urls]
});
},
/**
* 完成延时监火的确认按钮事件
*/
async goSubmit() {
await setTaskSign({
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
})
uni.$u.toast('保存成功')
setTimeout(() => {
uni.switchTab({
url: '/pages/index/index'
})
}, 2000)
},
}
}
</script>
<style scoped lang="scss">
.content {
.padding {
padding: 20upx;
}
.wui-form-list {
background-color: #FFFFFF;
border-radius: 10upx;
margin: 20upx;
}
.wui-form-list .cu-form-group {
color: #808080;
font-size: 28upx;
padding: 30upx;
display: flex;
justify-content: space-between;
}
.wui-form-list .cu-form-group .title {
min-width: 200upx;
width: max-content;
font-weight: bold;
color: #000000;
font-size: 28upx;
/* white-space: nowrap; */
}
.cu-form-group+.cu-form-group {
border-top: 1px solid #eee;
}
.bg-green {
background-color: #39b54a;
color: #fff;
border-radius: 16upx;
}
}
</style>

View File

@ -0,0 +1,97 @@
<template>
<view class="content">
<view class="card">
<u-cell-group>
<block v-for="(item, index) in form" :key="index">
<u-cell v-if="item.TYPE === 0" :key="index" :title="item.ITEM" :value="item.ITEM_VALUE"></u-cell>
</block>
</u-cell-group>
<u-divider text="安全措施" textPosition="left" textColor="#3c9cff" lineColor="#3c9cff" />
<u-cell-group>
<u-cell v-for="(item, index) in questionnaires" :key="index" :title="item.QUESTION">
<template #title>
<view style="display: flex;justify-content: space-between">
<view>{{ item.QUESTION }}</view>
<view>{{ item.TEXT_INFO || item.ANSWER }}</view>
</view>
</template>
<template #label>
<block v-for="(item1, index1) in item.answers" :key="index1">
<view>{{ item1.TEXT_INFO }}{{ item1.ANSWER }}</view>
</block>
</template>
</u-cell>
</u-cell-group>
<u-divider text="审批人员" textPosition="left" textColor="#3c9cff" lineColor="#3c9cff" />
<u-cell-group>
<block v-for="(item, index) in jobs" :key="index">
<u-cell :key="index" :title="item.TYPE_DESCRIBE">
<template #label>
<view class="mt-10">
<view>部门{{ item.DEPARTMENT_NAME }}</view>
<view>人员{{ item.USER_NAME }}</view>
<view v-if="item.SIGN_PICTURE">
<u-image width="400rpx" height="200rpx" :src="$filePath + '/' + item.SIGN_PICTURE" mode="widthFix" />
<view>审批意见{{ item.APPROVAL_OPINIONS }}</view>
<view>审批意见{{ item.APPROVAL_TIME }}</view>
</view>
</view>
</template>
</u-cell>
</block>
</u-cell-group>
</view>
</view>
</template>
<script>
import { getTaskInfo } from "@/api";
import { resolveNextOperation } from "@/utils/submitHomeworkProcess";
export default {
data() {
return {
taskId: '',
type: '',
jobId: '',
form: [],
jobs: [],
questionnaires: [],
}
},
onLoad(query) {
this.taskId = query.taskId
this.type = query.type
this.jobId = query.jobId
this.fnGetData(query.taskId)
uni.setNavigationBarTitle({
title: query.title + '查看'
})
},
methods: {
async fnGetData(taskId) {
let resData = await getTaskInfo({ EW_RU_TASK_ID: taskId })
this.form = resData.list.form
this.jobs = resData.list.jobs
this.questionnaires = resData.list.simpleQues[0]
},
async fnSubmit() {
let CORP_ID = ''
for (let i = 0; i < this.form.length; i++) {
if (this.form[i].FK_NAME === 'CORP_ID') {
CORP_ID = this.form[i].FK_VALUE
break
}
}
await resolveNextOperation({
EW_RU_TASK_ID: this.taskId,
TYPE: this.type,
CORP_ID,
EW_RU_JOB_ID: this.jobId,
})
},
},
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,125 @@
<!-- 延时监火页面 列表 -->
<template>
<view class="content">
<u-list @scrolltolower="scrolltolower" v-if="list.length > 0">
<u-list-item v-for="(item, index) in list" :key="index">
<view @click="goToDetail(item)">
<view class="flex-between main-title bold">
<text>作业证编号: {{ item.JOB_NUMBER }}</text>
<text>动火等级: {{ item.HOT_WORK_LEVEL_NAME }}</text>
</view>
<view class="flex-between main-title">
<text>申请办理人: {{ item.APPLY_USER_NAME }}</text>
<text>作业类型: {{ item.JOB_TYPE_NAME }}</text>
</view>
<view class="flex-between main-title">
<text>现场负责人{{ item.SITE_LEADER_NAME }}</text>
<text>动火单位负责人{{ item.HOT_WORK_UNIT_LEADER_NAME }}</text>
</view>
<view class="flex-between main-title">
<text>动火部位{{ item.HOT_WORK_POSITION }}</text>
<text>作业内容{{ item.JOB_CONTENT }}</text>
</view>
<view class="flex-between main-title">
<text>审核状态延时监火</text>
</view>
</view>
<view class="flex-between mt-10 subtitle">
<view></view>
<view class="flex-between">
<u-button type="primary" text="延时监火" size="mini" class="bth-mini ml-10"
@click="goToDelay(item.HOTWORKAPPLICATION_ID)" />
</view>
</view>
</u-list-item>
</u-list>
<empty v-else></empty>
</view>
</template>
<script>
export default {
data() {
return {
type: '',
title: '',
pageSize: 10,
currentPage: 1,
totalPage: 0,
list: [],
EW_RU_TASK_ID: '',
EW_RU_JOB_ID: '',
TYPE: ''
}
},
onLoad(query) {
this.type = query.type
this.title = query.title
this.EW_RU_TASK_ID = query.taskId
this.EW_RU_JOB_ID = query.EW_RU_JOB_ID
this.TYPE = query.TYPE
},
onShow() {
this.resetList()
},
methods: {
async getData() {
//
// let resData = await getToDoTaskList({
// showCount: this.pageSize,
// currentPage: this.currentPage,
// TYPE: this.type,
// vectors: '0'
// });
const mockData = [
{
HOTWORKAPPLICATION_ID: '0',
JOB_NUMBER: 'DFIO-FPI',
HOT_WORK_LEVEL_NAME: '一级',
APPLY_USER_NAME: '孙喊问',
JOB_TYPE_NAME: '内部作业',
SITE_LEADER_NAME: '王某某',
HOT_WORK_UNIT_LEADER_NAME: '王某某',
HOT_WORK_POSITION: '测试',
JOB_CONTENT: '测试',
taskId: 'f4eb31f4b61b408e8a88e849017558d4',
jobId: 'c4f007f2ef5c487d96c31e297f5ff29b'
}
]
this.list = mockData || [];
this.totalPage = 0;
},
resetList() {
this.pageSize = 10
this.currentPage = 1
this.list = []
this.getData()
},
goToDetail(item) {
uni.$u.route({
url: '/pages/eight_assignments/hot_work/delay_fire_monitoring/detail',
params: {
taskId: item.taskId,
jobId: item.jobId,
type: this.type,
title: this.title
}
})
},
goToDelay(HOTWORKAPPLICATION_ID) {
uni.$u.route({
url: '/pages/eight_assignments/hot_work/delay_fire_monitoring/delay',
params: { id: HOTWORKAPPLICATION_ID }
})
}
}
}
</script>
<style lang="scss" scoped>
.content {
.bold {
font-weight: bold;
}
}
</style>

View File

@ -0,0 +1,95 @@
<!-- 延时监火的任务转发 -->
<template>
<view class="content">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="接班监火人部门:" prop="PYROMANCER" borderBottom required @click="fnSelect">
<u-input v-model="form.DEPARTMENT_NAME" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
</u-form>
</view>
<view style="margin-top: 30upx;">
<u-button class="bg-green" style="max-width: 50%;"
@click="$u.debounce(goSubmit, 1000, true)">确认</u-button>
</view>
</view>
</template>
<script>
import {setTaskSign} from "../../../../api";
export default {
data() {
return {
form: {
DEPARTMENT_NAME: '',
DEPARTMENT_ID: ''
},
rules: {
DEPARTMENT_NAME: [{ type: 'string', required: true, message: '请输入监火人', trigger: ['blur', 'change'] }]
},
EW_RU_TASK_ID: '',
EW_RU_JOB_ID: '',
TYPE: ''
}
},
onLoad(event) {
this.STATE = event.state;
this.EW_RU_TASK_ID = event.taskId
this.EW_RU_JOB_ID = event.EW_RU_JOB_ID
this.TYPE = event.TYPE
},
methods: {
fnSelect() {
uni.navigateTo({
url: `/pages/eight_assignments/select_department?CORP_ID=${this.CORP_ID}`,
events: {
confirm: (event) => {
console.log(event)
this.form.DEPARTMENT_NAME = event.DEPARTMENT_NAME
this.form.DEPARTMENT_ID = event.DEPARTMENT_ID
}
},
})
},
async goSubmit(){
const JOB_DTO = {
DEPARTMENT_ID: this.form.DEPARTMENT_ID,
DEPARTMENT_NAME: this.form.DEPARTMENT_NAME,
CORP_ID: this.$store.getters.getUserInfo.CORPINFO_ID,
CORP_NAME: this.$store.getters.getUserInfo.CORP_NAME
}
try {
await this.$refs.formRef.validate()
try {
await setTaskSign({
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
SIGN_FLAG: 1,
JOB_DTO: JSON.stringify(JOB_DTO)
})
uni.$u.toast('保存成功')
setTimeout(() => {
uni.switchTab({
url: '/pages/index/index'
})
}, 2000)
} catch {
}
} catch {
uni.$u.toast('请补全必填项')
}
}
}
}
</script>
<style scoped lang="scss">
.bg-green {
background-color: #39b54a;
color: #fff;
border-radius: 16upx;
}
</style>

View File

@ -0,0 +1,107 @@
<template>
<view class="content">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="动火分析时间" prop="ANALYZE_TIME" borderBottom required @click="fnDateTimePickerClick('ANALYZE_TIME')">
<u-input v-model="form.ANALYZE_TIME" border="none" readonly />
<u-icon name="arrow-right"></u-icon>
</u-form-item>
<u-form-item label="分析点名称" prop="ANALYZE_PLACE" borderBottom required>
<u-input v-model="form.ANALYZE_PLACE" border="none" />
</u-form-item>
<u-form-item label="分析数据(%LEL)" prop="ANALYZE_RESULT" borderBottom required>
<u-input v-model="form.ANALYZE_RESULT" border="none" type="number" placeholder="0" />
<view class="title">(%LEL)</view>
</u-form-item>
<u-form-item label="分析人" prop="ANALYZE_USER_NAME" borderBottom required>
<u-input v-model="form.ANALYZE_USER_NAME" border="none" />
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="保存" @click="$u.debounce(fnSubmit, 1000, true)" />
</view>
</view>
<u-datetime-picker :show="dateTimePicker.show" v-model="dateTimePicker.value" :mode="dateTimePicker.mode"
:maxDate="dateTimePicker.max" :key="dateTimePicker.type" @confirm="fnDateTimePickerConfirm"
@cancel="fnDateTimePickerCancel" />
</view>
</template>
<script>
import { getHotWorkGasInfoSave } from "@/api";
export default {
data() {
return {
form: {
/** 动火分析时间 */
ANALYZE_TIME: '',
/** 分析点名称 */
ANALYZE_PLACE: '',
/** 分析数据(%LEL) */
ANALYZE_RESULT: '',
/** 分析人 */
ANALYZE_USER_NAME: this.$store.getters.getUserInfo.NAME,
ANALYZE_USER_ID: this.$store.getters.getUserInfo.USER_ID,
EW_RU_TASK_ID:'',
EW_RU_JOB_ID:'',
TYPE: ''
},
rules: {
ANALYZE_TIME: [{ type: 'string', required: true, message: '请选择动火分析时间', trigger: ['blur', 'change'] }],
ANALYZE_PLACE: [{ type: 'string', required: true, message: '请输入分析点名称', trigger: ['blur', 'change'] }],
ANALYZE_RESULT: [{ type: 'string', required: true, message: '请输入分析数据', trigger: ['blur', 'change'] }],
ANALYZE_USER_NAME: [{ type: 'string', required: true, message: '请输入分析人', trigger: ['blur', 'change'] }],
},
dateTimePicker: {
show: false,
value: Number(new Date()),
max: new Date().getTime(),
mode: 'datetime',
type: 'datetime-picker'
},
}
},
onLoad(query) {
this.form.EW_RU_TASK_ID = query.EW_RU_TASK_ID
this.TYPE = query.TYPE
this.form.EW_RU_JOB_ID = query.EW_RU_JOB_ID
},
methods: {
fnDateTimePickerClick(event) {
this.dateTimePicker.type = event
this.dateTimePicker.value = Number(new Date(this.form[event])) || Number(new Date())
this.dateTimePicker.show = true
},
fnDateTimePickerConfirm(event) {
this.form[this.dateTimePicker.type] = uni.$u.timeFormat(event.value, 'yyyy-mm-dd hh:MM')
this.fnDateTimePickerCancel()
},
fnDateTimePickerCancel() {
this.dateTimePicker.show = false
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
await getHotWorkGasInfoSave({
...this.form
})
uni.$u.toast('保存成功')
setTimeout(() => {
uni.switchTab({
url: '/pages/index/index'
})
}, 2000)
} catch {
}
} catch (e) {
uni.$u.toast('请补全必填项')
}
}
}
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,94 @@
<template>
<view class="content">
<view v-if="isView !== '1'" class="flex-end padding" style="padding: 20upx;">
<u-button type="primary" text="添加" size="mini" class="bth-mini" @click="goToAdd"/>
</view>
<u-list v-if="list.length > 0">
<u-list-item v-for="(item, index) in list" :key="index">
<view class="flex-between main-title">
<text>动火分析时间: {{ item.ANALYZE_TIME }}</text>
</view>
<view class="flex-between main-title">
<text>分析点名称: {{ item.ANALYZE_PLACE }}</text>
</view>
<view class="flex-between main-title">
<text>分析数据(%LEL): {{ item.ANALYZE_PLACE }}</text>
</view>
<view class="flex-between main-title">
<text>分析人{{ item.ANALYZE_USER_NAME }}</text>
</view>
<view v-if="isView !== '1'" class="flex-between mt-10 subtitle">
<view></view>
<view class="flex-between">
<u-button type="error" text="删除" size="mini" class="bth-mini" @click="fnDelete(item)"/>
</view>
</view>
</u-list-item>
</u-list>
<empty v-else></empty>
</view>
</template>
<script>
import {getHotWorkGasInfo, getHotWorkGasDelete} from "@/api";
import {getHotWorkGasAll} from "../../../../api";
export default {
data() {
return {
list: [],
EW_RU_TASK_ID: '',
EW_RU_JOB_ID: '',
TYPE: '',
isView: '0'
}
},
onLoad(query) {
this.EW_RU_TASK_ID = query.taskId
this.TYPE = query.type
this.EW_RU_JOB_ID = query.EW_RU_JOB_ID
this.isView = query.isView
},
onShow() {
this.resetList()
},
methods: {
async getData() {
let resData = await getHotWorkGasAll({
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
});
this.list = [...this.list, ...resData.list];
},
resetList() {
this.list = []
this.getData()
},
fnDelete(item) {
uni.showModal({
title: '提示',
content: '确定要删除这条记录?',
success: async res => {
if (res.confirm) {
await getHotWorkGasDelete({
EW_SP_EG_ID: item.EW_SP_EG_ID
})
uni.$u.toast('删除成功')
this.resetList()
}
}
})
},
goToAdd() {
uni.$u.route({
url: '/pages/eight_assignments/hot_work/gas/add',
params: {
EW_RU_TASK_ID: this.EW_RU_TASK_ID,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
TYPE: this.TYPE
}
})
}
}
}
</script>

View File

@ -0,0 +1,13 @@
<template>
<view>name的预留位置</view>
</template>
<script>
export default {
data() {
return {}
}
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,174 @@
<template>
<view class="container">
<view class="card">
<view class="card">
<u-form label-position="left" label-width="auto">
<view class="mt-10 flex-end">
<u-button custom-style="width: 100rpx;margin:0" type="primary" size="mini" text="添加" @click="fnAddHotWorkOperatorList()"/>
</view>
<view v-for="(item, index) in hotWorkOperatorList" :key="item.id" style="position: relative;border: 1px dashed #ccc;padding: 20rpx 20rpx 20rpx 40rpx;" class="mt-10">
<u-form-item label="动火操作人部门" prop="DEPARTMENT_NAME" required @click="fnSelectDepartment(index)">
<view class="select_content">
<u-input v-model="item.DEPARTMENT_NAME || ''" border="none" input-align="right" readonly />
<u-icon name="arrow-right"></u-icon>
</view>
</u-form-item>
<u-line/>
<u-form-item label="动火操作人" prop="USER_NAME" required @click="fnSelectUser(index)">
<view class="select_content">
<u-input v-model="item.USER_NAME || ''" border="none" input-align="right" readonly/>
<u-icon name="arrow-right"></u-icon>
</view>
</u-form-item>
<u-line/>
<u-icon v-if="index !== 0" name="close-circle-fill" color="#ff2929" size="20" custom-style="position: absolute;right: -20rpx;top: -20rpx" @click="hotWorkOperatorList.splice(index, 1)"/>
</view>
<view class="mt-10 flex-between">
<u-button type="primary" shape="circle" text="下一步" :throttle-time="1000" @click="fnSubmit()"/>
</view>
</u-form>
</view>
</view>
<u-picker
:key="picker.key"
:show="picker.show"
:columns="picker.columns"
:default-index="picker.defaultIndex"
key-name="NAME"
@confirm="fnPickerConfirm"
@cancel="fnPickerCancel"
/>
</view>
</template>
<script>
import { setSubmitForm} from "@/utils/submitHomeworkProcess";
import {getUserList} from "@/api";
export default {
components: { setSubmitForm },
data() {
return {
form: {},
formItems: {},
taskId: '',
hotWorkOperatorList: [],
picker: {
show: false,
columns: [],
key: "",
defaultIndex: [0]
}
}
},
mounted() {
const eventChannel = this.getOpenerEventChannel();
eventChannel.on('data', (data) => {
console.log(data)
this.form = data.form;
this.formItems = data.formItems;
this.taskId = data.taskId;
this.hotWorkOperatorList = uni.$u.deepClone(data.form.hotWorkOperatorList);
if (this.hotWorkOperatorList.length === 0) this.fnAddHotWorkOperatorList();
else {
for (let i = 0; i < this.hotWorkOperatorList.length; i++) {
for (let i = 0; i < this.hotWorkOperatorList.length; i++) {
fnGetUserList(this.hotWorkOperatorList.value[i], i);
}
}
}
})
},
methods: {
fnAddHotWorkOperatorList() {
this.hotWorkOperatorList.push({
DEPARTMENT_NAME: "",
DEPARTMENT_ID: "",
USER_NAME: "",
USER_ID: "",
TYPE: "",
id: uni.$u.guid(),
columns: [],
});
},
fnSelectDepartment(index) {
uni.navigateTo({
url: "/pages/eight_assignments/select_department",
events: {
confirm: (event) => {
this.hotWorkOperatorList[index].DEPARTMENT_NAME = event.DEPARTMENT_NAME;
this.hotWorkOperatorList[index].DEPARTMENT_ID = event.DEPARTMENT_ID;
this.hotWorkOperatorList[index].USER_NAME = "";
this.hotWorkOperatorList[index].USER_ID = "";
this.hotWorkOperatorList[index].TYPE = event.TYPE;
this.fnGetUserList(event, index);
},
},
});
},
fnSelectUser(index) {
this.picker.key = index;
this.picker.columns = this.hotWorkOperatorList[index].columns;
this.picker.defaultIndex = [0];
if (this.picker.columns[0].length === 0) {
uni.$u.toast("没有选择部门或当前部门没有人员");
return;
}
for (let i = 0; i < this.picker.columns[0].length; i++) {
if (
this.picker.columns[0][i].USER_ID ===
this.hotWorkOperatorList[index].USER_ID
) {
this.picker.defaultIndex = [i];
break;
}
}
this.picker.show = true;
},
async fnSubmit() {
for (let i = 0; i < this.hotWorkOperatorList.length; i++) {
if (
!this.hotWorkOperatorList[i].DEPARTMENT_ID ||
!this.hotWorkOperatorList[i].USER_ID
) {
uni.$u.toast("请完善动火操作人信息");
return;
}
}
await setSubmitForm({
form: {...this.form, hotWorkOperatorList: this.hotWorkOperatorList},
formItems: this.formItems,
TYPE: "hotWork",
EW_RU_TASK_ID: this.taskId,
});
},
async fnGetUserList({DEPARTMENT_ID, TYPE}, index) {
const resData = await getUserList({DEPARTMENT_ID, TYPE});
for (let i = 0; i < resData.list.list.length; i++) {
resData.list.list[i].NAME = resData.list.list[i].name || resData.list.list[i].NAME;
resData.list.list[i].USER_ID = resData.list.list[i].user_ID || resData.list.list[i].USER_ID;
}
this.hotWorkOperatorList[index].columns = [resData.list.list];
},
fnPickerConfirm(event){
this.hotWorkOperatorList[this.picker.key].USER_ID = event.value[0].USER_ID;
this.hotWorkOperatorList[this.picker.key].USER_NAME = event.value[0].NAME;
this.fnPickerCancel();
},
fnPickerCancel(){
this.picker.show = false;
}
},
}
</script>
<style scoped lang="scss">
.select_content{
display: flex;
align-items: center;
}
</style>

View File

@ -0,0 +1,126 @@
<template>
<view class="content">
<view class="card">
<view class="items">
<view class="item" v-for="(item,index) in baseList" :key="index" @click="fnNavigator(index)">
<image :src="item.img" mode=""></image>
<view class="text">
<text>{{ item.title }}</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
baseList: [
{
img: require('../../static/icon-apps/i1.png'),
title: '受限空间安全作业',
url: '/pages/eight_assignments/subordinate_index',
params: {
type: 'confinedSpace',
}
},
{
img: require('../../static/icon-apps/i2.png'),
title: '盲板抽堵作业',
url: '/pages/eight_assignments/subordinate_index',
params: {
type: 'blindBoard',
}
},
{
img: require('../../static/icon-apps/i3.png'),
title: '动土作业',
url: '/pages/eight_assignments/subordinate_index',
params: {
type: 'breakGround',
}
},
{
img: require('../../static/icon-apps/i4.png'),
title: '高处作业',
url: '/pages/eight_assignments/subordinate_index',
params: {
type: 'highWork',
}
},
{
img: require('../../static/icon-apps/i5.png'),
title: '吊装作业',
url: '/pages/eight_assignments/subordinate_index',
params: {
type: 'hoisting',
}
},
{
img: require('../../static/icon-apps/i6.png'),
title: '临时用电作业',
url: '/pages/eight_assignments/subordinate_index',
params: {
type: 'electricity',
}
},
{
img: require('../../static/icon-apps/i7.png'),
title: '动火作业',
url: '/pages/eight_assignments/subordinate_index',
params: {
type: 'hotWork',
}
},
{
img: require('../../static/icon-apps/i8.png'),
title: '断路作业',
url: '/pages/eight_assignments/subordinate_index',
params: {
type: 'cutRoad',
}
},
]
};
},
methods: {
fnNavigator(e) {
uni.$u.route({
url: this.baseList[e].url,
params: {
title: this.baseList[e].title,
...this.baseList[e].params
}
})
},
}
}
</script>
<style lang="scss" scoped>
.items {
background-color: #fff;
display: flex;
flex-wrap: wrap;
margin-top: -20upx;
.item {
flex-basis: 25%;
text-align: center;
margin-top: 20upx;
image {
width: 110upx;
height: 110upx;
}
.text {
width: 130upx;
font-size: 28upx;
margin: auto;
}
}
}
</style>

View File

@ -0,0 +1,76 @@
<template>
<view class="content">
<view class="card">
<u-form labelPosition="top" :model="form" :rules="rules" ref="formRef" labelWidth="auto">
<u-form-item label="其它安全措施" borderBottom required v-for="(item,index) in form.value" :key="item.id">
<u-button v-if="index === 0" type="primary" size="mini" text="新增"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width:'100upx',margin:0}"
@click="fnAddValue"/>
<u-button v-if="index !== 0" type="error" size="mini" text="删除"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width:'100upx',margin:0}"
@click="fnDeleteValue(index)"/>
<u-textarea v-model="item.value" border="none" autoHeight maxlength="-1"/>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
</view>
</template>
<script>
import {setOtherSecurityMeasures} from "@/utils/submitHomeworkProcess";
export default {
data() {
return {
EW_RU_JOB_ID: '',
taskId: '',
TYPE: '',
CORP_ID: '',
vernier: '',
form: {
value: []
},
rules: {},
}
},
onLoad(query) {
this.EW_RU_JOB_ID = query.EW_RU_JOB_ID
this.taskId = query.taskId
this.TYPE = query.TYPE
this.CORP_ID = query.CORP_ID
this.vernier = query.vernier
this.fnAddValue()
},
methods: {
fnAddValue() {
this.form.value.push({value: '', id: uni.$u.guid()})
},
fnDeleteValue(index) {
this.form.value.splice(index, 1)
},
async fnSubmit() {
for (let i = 0; i < this.form.value.length; i++) {
if (!this.form.value[i].value) {
uni.$u.toast(`${i + 1}项中,请输入内容`)
return
}
}
await setOtherSecurityMeasures({
value: this.form.value,
taskId: this.taskId,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
CORP_ID: this.CORP_ID,
TYPE: this.TYPE,
vernier: this.vernier
})
}
},
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,112 @@
<template>
<view class="content">
<view class="card">
<view class="title">{{ questionnaireInfo.NAME }}</view>
<uni-table border class="mt-10">
<uni-tr>
<uni-th>主要安全措施</uni-th>
<uni-th width="200rpx">是否涉及</uni-th>
</uni-tr>
<uni-tr v-for="(item,index) in items" :key="item.itemInfo.EW_RE_QUES_ITEM_ID">
<uni-td>
<view>{{ item.itemInfo.TEXT_INFO }}</view>
<view v-for="item1 in item.inputBoxes" :key="item1.EW_RE_QUES_ITEM_FILL_ID">
<u-cell :title="item1.TEXT_INFO + ''" :border="false">
<template #value>
<u-input v-model="item1.MARKERS" :customStyle="{marginTop: '8px'}" border="bottom"/>
</template>
</u-cell>
</view>
</uni-td>
<uni-td>
<u-radio-group placement="column" v-model="item.optionsValue" @change="fnRadioChange($event,index)">
<u-radio :customStyle="{marginTop: '8px'}" v-for="item1 in item.options"
:key="item1.EW_RE_QUES_ITEM_FILL_ID" :label="item1.TEXT_INFO" :name="item1.VALUE_INFO"/>
</u-radio-group>
</uni-td>
</uni-tr>
</uni-table>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
</view>
</template>
<script>
import {setSecurityMeasures} from "@/utils/submitHomeworkProcess";
export default {
data() {
return {
EW_RU_JOB_ID: '',
taskId: '',
TYPE: '',
CORP_ID: '',
questionnaireInfo: {},
items: [],
vernier: ''
}
},
onLoad(event) {
this.vernier = event.vernier
const eventChannel = this.getOpenerEventChannel();
eventChannel.on('questionnaire', (data) => {
this.EW_RU_JOB_ID = data.EW_RU_JOB_ID
this.taskId = data.taskId
this.TYPE = data.TYPE
this.CORP_ID = data.CORP_ID
this.questionnaireInfo = data.questionnaire.questionnaire
this.items = data.questionnaire.items
})
},
methods: {
fnRadioChange(event, index) {
for (let i = 0; i < this.items[index].options.length; i++) {
this.items[index].options[i].MARKERS = '0'
if (this.items[index].options[i].VALUE_INFO === event) {
this.items[index].options[i].MARKERS = '1'
}
}
},
async fnSubmit() {
for (let i = 0; i < this.items.length; i++) {
for (let j = 0; j < this.items[i].inputBoxes.length; j++) {
if (!this.items[i].inputBoxes[j].MARKERS) {
uni.$u.toast(`${i + 1}行第${j + 1}项未填写`)
return
}
}
for (let j = 0; j < this.items[i].options.length; j++) {
if (!this.items[i].options[j].MARKERS) {
uni.$u.toast(`${i + 1}行第${j + 1}项未选择`)
return
}
}
}
await setSecurityMeasures({
questionnaires: this.items,
questionnaireInfo: this.questionnaireInfo,
taskId: this.taskId,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
CORP_ID: this.CORP_ID,
TYPE: this.TYPE,
vernier:this.vernier
})
}
},
}
</script>
<style scoped lang="scss">
.title {
text-align: center;
font-size: 36rpx;
}
::v-deep {
.u-cell__body {
padding: 0;
}
}
</style>

View File

@ -0,0 +1,109 @@
<template>
<view class="content">
<view class="card">
<u-radio-group v-model="select_corp" placement="column">
<u-radio :customStyle="{marginBottom: '20rpx'}" v-for="item in list" :key="item.CORPINFO_ID"
:label="item.NAME" :name="item.CORPINFO_ID">
</u-radio>
</u-radio-group>
<view class="button_placeholder"></view>
<view class="button">
<u-button type="primary" text="确定" @click="fnConfirm"></u-button>
</view>
</view>
</view>
</template>
<script>
import {getCorpList} from '@/api'
export default {
data() {
return {
type: '',
list: [],
select_corp: ''
}
},
onLoad(options) {
this.type = options.type
this.fnGetData()
},
methods: {
async fnGetData() {
const resData = await getCorpList()
this.list = resData.list.corpInfoDos
},
fnConfirm() {
if (!this.select_corp) {
uni.$u.toast('请选择作业分公司')
return;
}
const urlByTypeMap = {
'confinedSpace': {
'035958e685cf4850bc40151c5e0617a6': '',
'default': '/pages/eight_assignments/confined_space/apply'
},
'blindBoard': {
'035958e685cf4850bc40151c5e0617a6': '',
'default': '/pages/eight_assignments/blind_board/apply'
},
'breakGround': {
'035958e685cf4850bc40151c5e0617a6': '',
'default': '/pages/eight_assignments/break_ground/apply'
},
'highWork': {
'035958e685cf4850bc40151c5e0617a6': '',
'default': '/pages/eight_assignments/high_work/apply'
},
'hoisting': {
'035958e685cf4850bc40151c5e0617a6': '',
'default': '/pages/eight_assignments/hoisting/apply'
},
'electricity': {
'035958e685cf4850bc40151c5e0617a6': '',
'default': '/pages/eight_assignments/electricity/apply'
},
'cutRoad': {
'035958e685cf4850bc40151c5e0617a6': '',
'default': '/pages/eight_assignments/cut_road/apply'
},
'hotWork': {
'035958e685cf4850bc40151c5e0617a6': '',
'default': '/pages/eight_assignments/hot_work/apply'
},
}
const url = urlByTypeMap[this.type][this.select_corp] ?? urlByTypeMap[this.type].default
let params = {}
for (let i = 0; i < this.list.length; i++) {
if (this.list[i].CORPINFO_ID === this.select_corp) {
params = {
CORPINFO_ID: this.list[i].CORPINFO_ID,
CORP_NAME: this.list[i].NAME,
type: this.type
}
break
}
}
uni.$u.route({
url,
type: 'redirect',
params
})
}
}
}
</script>
<style scoped lang="scss">
.button_placeholder {
height: 100rpx;
}
.button {
position: fixed;
bottom: 0;
left: 0;
right: 0;
}
</style>

View File

@ -0,0 +1,94 @@
<template>
<view>
<u-modal :show="modelShow" title="选择所属端" showCancelButton cancelText="返回" @cancel="fnModalCancel"
@confirm="fnModalConfirm">
<u-radio-group v-model="type" placement="column">
<u-radio :customStyle="{marginBottom: '8px'}" label="企业端" name="0"/>
<u-radio :customStyle="{marginBottom: '8px'}" label="监管端" name="1"/>
<u-radio :customStyle="{marginBottom: '8px'}" label="相关方端" name="2"/>
</u-radio-group>
</u-modal>
<next-tree
v-if="!modelShow"
uiMode="page"
ref="nextTreeRef"
checkStrictly
funcMode="radio"
selectParent
:ifSearch="false"
:treeData="treeData"
themeColor="#2a56f7"
page-height="92vh"
labelKey="DEPARTMENT_NAME"
valueKey="DEPARTMENT_ID"
childrenKey="nodes"
@change="fnTreeChange"
>
<template #fixedBottomBar>
<view style="padding: 20upx;margin-bottom: 20upx;">
<u-button type="primary" text="确定" @click="fnTreeConfirm"/>
</view>
</template>
</next-tree>
</view>
</template>
<script>
import {getDepartmentTree} from "@/api";
export default {
data() {
return {
modelShow: true,
type: '',
CORP_ID: '',
treeData: [],
treeSelectData: []
}
},
onLoad(query) {
this.CORP_ID = query.CORP_ID
},
methods: {
fnModalCancel() {
uni.navigateBack()
},
fnModalConfirm() {
if (!this.type) {
uni.$u.toast('请选择所属端')
return
}
this.modelShow = false
this.fnGetDepartmentTree()
},
async fnGetDepartmentTree() {
let CORP_ID = ''
if (this.type === '0') CORP_ID = this.CORP_ID
if (this.type === '2') CORP_ID = this.$store.getters.getUserInfo.CORPINFO_ID
if (this.type === '1') CORP_ID = '1'
let resData = await getDepartmentTree({TYPE: this.type, CORP_ID})
this.treeData = resData.tree.tree
},
fnTreeChange(event) {
this.treeSelectData = event
},
fnTreeConfirm() {
if (this.treeSelectData.length === 0) {
uni.$u.toast('请选择部门')
return
}
this.getOpenerEventChannel().emit("confirm", {
DEPARTMENT_NAME: this.treeSelectData[0].DEPARTMENT_NAME,
DEPARTMENT_ID: this.treeSelectData[0].DEPARTMENT_ID,
CORP_ID: this.CORP_ID,
TYPE: this.type
});
uni.navigateBack();
}
},
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,260 @@
<template>
<view>
<view class="content">
<view class="card">
<u-form labelPosition="left" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<view v-for="(item, index) in list" :key="index">
<view v-if="item.multiple === '1'" class="mt-10 multiple_btn">
<u-button type="primary" size="mini" :customStyle="{width:'auto',margin:0}"
:text="'添加' + item.list[1].name" @click="fnAdd(index)"/>
</view>
<view v-for="(item1, index1) in item.list"
:key="index.toString() + index1.toString()"
:class="{'mt-10': item.multiple === '1' && index1 % 2 === 0,'multiple_form_item': item.multiple === '1'}">
<u-form-item
:label="item1.name"
:prop="item1.key_name"
borderBottom
:required="item1.isRequired === '1'"
@click="fnSelect(item,item1)">
<u-input v-model="form[item1.key_name]" border="none" readonly/>
<u-icon name="arrow-right"/>
</u-form-item>
<u-icon name="close-circle-fill" color="#ff2929" size="20"
v-if="item.multiple === '1' && index1 !== 0 && index1 % 2 === 0"
:customStyle="{position: 'absolute',top:'-15rpx',right:'0'}"
@click="fnDelete(index,index1)"/>
</view>
</view>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
</view>
<u-picker :show="picker.show" :columns="picker.columns" keyName="NAME"
:key="picker.currentColumnKey" @confirm="fnPickerConfirm" @cancel="fnPickerCancel"/>
</view>
</template>
<script>
import {getUserList} from "@/api";
import {setPersonnelForm} from "@/utils/submitHomeworkProcess";
import {addFlowInfo} from '@/utils/submitHomeworkProcess';
export default {
data() {
return {
taskId: '',
CORP_ID: '',
TYPE: '',
list: [],
form: {},
rules: {},
picker: {
show: false,
columnsAll: {},
columns: [],
currentColumnKey: '',
currentName: '',
currentId: '',
},
initFlag: null,
vernier: null
}
},
onLoad(event) {
this.vernier = event.vernier
const eventChannel = this.getOpenerEventChannel();
eventChannel.on('nextNodes', (data) => {
for (let i = 0; i < data.nextNodes.length; i++) {
if (data.nextNodes[i].multiple === '1') {
const guid = uni.$u.guid()
for (let j = 0; j < data.nextNodes[i].list.length; j++) {
//
data.nextNodes[i].list[j].key_name = data.nextNodes[i].list[j].key_name + `&&${guid}`
data.nextNodes[i].list[j].key_id = data.nextNodes[i].list[j].key_id + `&&${guid}`
}
}
}
this.list = data.nextNodes
this.taskId = data.taskId
this.EW_RU_JOB_ID = data.EW_RU_JOB_ID
this.CORP_ID = data.CORP_ID
this.TYPE = data.TYPE
this.initFlag = data.initFlag
this.fnInitFormAndRules()
})
},
methods: {
fnInitFormAndRules() {
this.list.forEach((item) => {
item.list.forEach((item1) => {
// key_namekey_idformkey
// key_nameruleskey
this.$set(this.form, item1.key_name, '')
this.$set(this.form, item1.key_id, '')
this.$set(this.rules, item1.key_name, [{
required: item1.isRequired === '1',
message: item1.name + '不能为空',
trigger: ['blur', 'change'],
}])
})
})
},
fnAdd(index) {
const currentItem = this.list[index]
//
const currentItemDepartment = uni.$u.deepClone(currentItem.list[0])
const currentItemUser = uni.$u.deepClone(currentItem.list[1])
// key_idkey_name
const guid = uni.$u.guid()
currentItemDepartment.key_id = this.fnReSplicing(currentItemDepartment.key_id, guid)
currentItemDepartment.key_name = this.fnReSplicing(currentItemDepartment.key_name, guid)
currentItemUser.key_id = this.fnReSplicing(currentItemUser.key_id, guid)
currentItemUser.key_name = this.fnReSplicing(currentItemUser.key_name, guid)
//
currentItem.list.push(currentItemDepartment)
currentItem.list.push(currentItemUser)
// key_idkey_nameformrules
this.$set(this.form, currentItemDepartment.key_id, '')
this.$set(this.form, currentItemDepartment.key_name, '')
this.$set(this.form, currentItemUser.key_id, '')
this.$set(this.form, currentItemUser.key_name, '')
this.$set(this.rules, currentItemDepartment.key_name, [{
required: currentItemDepartment.isRequired === '1',
message: currentItemDepartment.name + '不能为空',
trigger: ['blur', 'change'],
}])
this.$set(this.rules, currentItemUser.key_name, [{
required: currentItemUser.isRequired === '1',
message: currentItemUser.name + '不能为空',
trigger: ['blur', 'change'],
}])
},
fnReSplicing(value, guid) {
return value.substring(0, value.indexOf('&&')) + `&&${guid}`
},
fnDelete(index, index1) {
uni.showModal({
title: '提示',
content: '是否删除该条数据?',
success: (res) => {
if (res.confirm) {
const departmentKeyId = this.list[index].list[index1].key_id
const departmentKeyName = this.list[index].list[index1].key_name
const userKeyId = this.list[index].list[index1 + 1].key_id
const userKeyName = this.list[index].list[index1 + 1].key_name
//
this.list[index].list.splice(index1, 1)
this.list[index].list.splice(index1, 1)
// formrules
delete this.form[departmentKeyId]
delete this.form[departmentKeyName]
delete this.form[userKeyId]
delete this.form[userKeyName]
delete this.rules[departmentKeyName]
delete this.rules[userKeyName]
}
}
})
},
fnSelect({multiple}, {key_name, key_id, type, value}) {
const key_value = multiple === '1' ? key_id.substring(key_id.indexOf('&&') + 2) : value
if (type === '1') {
this.fnSelectDepartment(key_name, key_id, key_value)
return
}
if (type === '0') {
this.fnSelectUser(key_name, key_id, key_value)
}
},
fnSelectDepartment(key_name, key_id, value) {
uni.navigateTo({
url: `/pages/eight_assignments/select_department?CORP_ID=${this.CORP_ID}`,
events: {
confirm: (event) => {
this.form[key_name] = event.DEPARTMENT_NAME
this.form[key_id] = event.DEPARTMENT_ID
this.form[value + '_USER_ID'] = ''
this.form[value + '_USER_NAME'] = ''
this.picker.columnsAll[value] = []
this.fnGetUserList(event, value)
}
},
})
},
async fnGetUserList({DEPARTMENT_ID, TYPE}, value) {
let resData = await getUserList({DEPARTMENT_ID, TYPE})
for (let i = 0; i < resData.list.list.length; i++) {
resData.list.list[i].NAME = resData.list.list[i].name || resData.list.list[i].NAME
resData.list.list[i].USER_ID = resData.list.list[i].user_ID || resData.list.list[i].USER_ID
}
this.$set(this.picker.columnsAll, value, [resData.list.list])
},
fnSelectUser(key_name, key_id, value) {
this.picker.currentName = key_name
this.picker.currentId = key_id
this.picker.currentColumnKey = value
this.picker.columns = this.picker.columnsAll[this.picker.currentColumnKey]
if (!this.picker.columnsAll[this.picker.currentColumnKey]) {
uni.$u.toast('没有选择部门或当前部门没有人员')
return
}
this.picker.show = true
},
fnPickerConfirm(event) {
this.form[this.picker.currentId] = event.value[0].USER_ID
this.form[this.picker.currentName] = event.value[0].NAME
this.fnPickerCancel()
},
fnPickerCancel() {
this.picker.show = false
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
if (!this.initFlag || this.initFlag === '1') {
await setPersonnelForm({
form: this.form,
list: this.list,
taskId: this.taskId,
CORP_ID: this.CORP_ID,
TYPE: this.TYPE,
vernier: this.vernier
})
} else {
await addFlowInfo({
form: this.form,
list: this.list,
taskId: this.taskId,
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
TYPE: this.TYPE,
CORP_ID: this.CORP_ID,
vernier: this.vernier
})
}
} catch (e) {
console.log(e)
}
} catch {
uni.$u.toast('请补全必填项')
}
}
},
}
</script>
<style scoped lang="scss">
.multiple_btn {
display: flex;
justify-content: end;
}
.multiple_form_item {
position: relative;
background-color: #f9f9f9;
padding: 0 20rpx;
}
</style>

View File

@ -0,0 +1,106 @@
<template>
<view class="content">
<view class="card">
<u-form labelPosition="top" :model="form" :rules="rules" ref="formRef" labelWidth="140px">
<u-form-item label="审批结果" prop="APPROVAL_RESULTS" borderBottom required labelPosition="left">
<u-radio-group v-model="form.APPROVAL_RESULTS">
<u-radio label="通过" name="1"/>
<u-radio :customStyle="{marginLeft: '8px'}" label="不通过" name="0"/>
</u-radio-group>
</u-form-item>
<u-form-item label="审批意见" prop="APPROVAL_OPINIONS" borderBottom required>
<u-textarea v-model="form.APPROVAL_OPINIONS" border="none" autoHeight/>
</u-form-item>
<u-form-item label="签字" prop="SIGN" borderBottom required>
<view style="flex: 1">
<view>
<u-button type="primary" size="mini" text="签字"
:customStyle="{position: 'absolute',top: '-46upx',right: '20upx',width: '100upx'}"
@click="signVisible = true"/>
</view>
<view v-if="form.SIGN">
<u-image width="400rpx" height="200rpx" :src="form.SIGN"/>
</view>
</view>
</u-form-item>
</u-form>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
<sign :signShow.sync="signVisible" @confirm="fnSign"/>
</view>
</template>
<script>
import Sign from '@/components/sign/sign.vue'
import {setTaskFile, setTaskSign} from "@/api";
import {resolveNextOperation} from "@/utils/submitHomeworkProcess";
export default {
components: {
Sign,
},
data() {
return {
EW_RU_JOB_ID: '',
TYPE: '',
taskId: '',
CORP_ID: '',
vernier: '',
signVisible: false,
form: {
APPROVAL_RESULTS: '',
APPROVAL_OPINIONS: '',
SIGN: '',
},
rules: {
APPROVAL_RESULTS: [{type: 'string', required: true, message: '请选择审批结果', trigger: ['blur', 'change']}],
APPROVAL_OPINIONS: [{type: 'string', required: true, message: '请输入审批意见', trigger: ['blur', 'change']}],
SIGN: [{type: 'string', required: true, message: '请签字', trigger: ['blur', 'change']}],
},
}
},
onLoad(query) {
this.EW_RU_JOB_ID = query.EW_RU_JOB_ID
this.TYPE = query.TYPE
this.taskId = query.taskId
this.vernier = query.vernier
},
methods: {
fnSign(event) {
this.form.SIGN = event.filePath
},
async fnSubmit() {
try {
await this.$refs.formRef.validate()
try {
const {CODE} = await setTaskFile({formData: {type: 0}, name: 'files', filePath: this.form.SIGN})
await setTaskSign({
IMG_CODE: CODE,
...this.form,
SIGN: '',
EW_RU_JOB_ID: this.EW_RU_JOB_ID,
EW_RU_TASK_ID: this.taskId
})
await resolveNextOperation({
EW_RU_TASK_ID: this.taskId,
CORP_ID: null,
TYPE: this.TYPE,
EW_RU_JOB_ID:this.EW_RU_JOB_ID,
vernier: this.vernier
})
} catch(e) {
console.log(e)
}
} catch {
uni.$u.toast('请补全必填项')
}
}
},
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,95 @@
<template>
<view class="content">
<view class="card">
<view class="items">
<view class="item" v-for="(item, index) in baseList" :key="index" @click="fnNavigator(index)">
<image :src="item.img" mode=""></image>
<view class="text">
<text>{{ item.title }}</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
baseList: [
{
img: require('../../static/icon-apps/i9.png'),
title: '申请',
url: '/pages/eight_assignments/select_corp_info'
},
{
img: require('../../static/icon-apps/i10.png'),
title: '待办',
url: '/pages/eight_assignments/to_do_list',
},
{
img: require('../../static/icon-apps/i11.png'),
title: '已办',
url: '/pages/eight_assignments/completed_list',
},
],
type: '',
title: ''
};
},
onLoad(query) {
this.type = query.type;
this.title = query.title;
uni.setNavigationBarTitle({
title: this.title
});
// type [],baseList []
//
if (false) {
this.baseList.push({
img: require('../../static/icon-apps/i12.png'),
title: '延时监火',
url: '/pages/eight_assignments/hot_work/delay_fire_monitoring/list'
})
}
},
methods: {
fnNavigator(e) {
uni.$u.route({
url: this.baseList[e].url,
params: {
type: this.type,
title: this.title,
}
})
},
}
}
</script>
<style lang="scss" scoped>
.items {
background-color: #fff;
display: flex;
flex-wrap: wrap;
margin-top: -20upx;
.item {
flex-basis: calc(100% / 3);
text-align: center;
margin-top: 20upx;
image {
width: 110upx;
height: 110upx;
}
.text {
width: 130upx;
font-size: 28upx;
margin: auto;
}
}
}
</style>

View File

@ -0,0 +1,33 @@
<template>
<view class="content">
<cc-defineStep colors="#fa436a" :stepData="stepData"></cc-defineStep>
</view>
</template>
<script>
import {getTaskTechnologicalProcess} from "@/api";
export default {
data() {
return {
stepData: []
}
},
onLoad(query) {
this.fnGetData(query.taskId)
uni.setNavigationBarTitle({
title: query.title + '流程'
})
},
methods: {
async fnGetData(taskId) {
let resData = await getTaskTechnologicalProcess({ID: taskId})
this.stepData = resData.list
}
},
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,114 @@
<template>
<view class="content">
<u-list @scrolltolower="scrolltolower" v-if="list.length > 0">
<u-list-item v-for="(item, index) in list" :key="index">
<view class="flex-between main-title">
<text>申请人{{ item.jobName }}</text>
</view>
<view class="flex-between main-title">
<text>作业编号{{ item.id }}</text>
</view>
<view class="flex-between main-title">
<text>作业分公司{{ item.corpName }}</text>
</view>
<view class="flex-between main-title">
<text>申请时间{{ item.createdTime }}</text>
</view>
<view class="flex-between main-title">
<text>当前步骤{{ item.taskName }}</text>
</view>
<view class=" mt-10 flex_btn">
<view class="flex_btn">
<u-button type="primary" text="修改" size="mini" class="bth-mini" v-if="item.canEditFlag === '1'" @click="handleEditTask(item)" />
<u-button type="primary" text="流程" size="mini" class="bth-mini ml-10"
@click="$u.route({
url: '/pages/eight_assignments/technological_process',
params: {taskId:item.taskId,type,title}
})"/>
<u-button type="primary" text="审批" size="mini" class="bth-mini ml-10" v-if="item.canEditFlag !== '1'"
@click="$u.route({
url: '/pages/eight_assignments/view_info',
params: {taskId:item.taskId,jobId:item.jobId,type,title}
})"/>
</view>
<view v-for="(item1, index1) in item.buttons" :key="index1" class="flex_btn">
<u-button type="primary" size="mini" shape="circle" :text="item1.name" class="bth-mini ml-10"
@click="$u.route({
url: item1.route,
params: {taskId: item.taskId,EW_RU_JOB_ID: item.jobId, isView: '1'},
})"
/>
</view>
</view>
</u-list-item>
</u-list>
<empty v-else></empty>
</view>
</template>
<script>
import {getToDoTaskList} from "@/api";
export default {
data() {
return {
type: '',
title: '',
pageSize: 10,
currentPage: 1,
totalPage: 0,
list: []
}
},
onLoad(query) {
this.type = query.type
this.title = query.title
uni.setNavigationBarTitle({
title: this.title + '待办'
})
},
onShow() {
this.resetList()
},
methods: {
async getData() {
let resData = await getToDoTaskList({
showCount: this.pageSize,
currentPage: this.currentPage,
TYPE: this.type,
vectors: '0',
REQUEST_SOURCE: '2'
});
this.list = [...this.list, ...resData.list.list];
this.totalPage = resData.list.totalPage;
},
resetList() {
this.pageSize = 10
this.currentPage = 1
this.list = []
this.getData()
},
scrolltolower() {
this.currentPage++;
if (this.totalPage >= this.currentPage) this.getData();
},
handleEditTask(value) {
let tempUrlStr = this.type.replace(/([a-z])([A-Z])/g, '\$1_\$2').toLowerCase()
uni.$u.route({
url: `/pages/eight_assignments/${tempUrlStr}/apply`,
params: { taskId: value.taskId, CORPINFO_ID: value.corpId }
})
}
},
}
</script>
<style scoped>
.flex_btn{
display: flex;
justify-content: flex-end;
}
</style>

View File

@ -0,0 +1,142 @@
<template>
<view class="content">
<view class="card">
<u-cell-group>
<view v-for="(item, index) in form" :key="index">
<u-cell v-if="item.TYPE === 0" :title="item.ITEM" :value="item.ITEM_VALUE"></u-cell>
<view v-if="item.TYPE === 1">
<u-cell :title="item.ITEM">
<template #label>
<view class="mt-5">
<view v-for="(item1, index1) in item.list" :key="index1">
<u-image
width="400rpx"
height="200rpx"
:src="$filePath + item1.ITEM_VALUE"
mode="widthFix"
/>
</view>
</view>
</template>
</u-cell>
</view>
<view v-if="item.TYPE === 3">
<u-divider text-position="left" :text="item.ITEM" />
</view>
<view v-if="item.TYPE === 4">
<view v-for="(item1, index1) in item.list" :key="index1">
<view v-for="(item2, index2) in item1.list" :key="index2">
<u-cell :title="item2.ITEM" :value="item2.ITEM_VALUE" />
</view>
</view>
</view>
<view v-if="item.TYPE === 5">
<u-cell :title="item.ITEM">
<template #label>
<view class="mt-5">
<u-image
width="400rpx"
height="200rpx"
:src="$filePath + item.ITEM_VALUE"
mode="widthFix"
/>
</view>
</template>
</u-cell>
</view>
</view>
</u-cell-group>
<u-divider text="安全措施" textPosition="left" textColor="#3c9cff" lineColor="#3c9cff"/>
<u-cell-group>
<u-cell v-for="(item,index) in questionnaires" :key="index" :title="item.QUESTION">
<template #title>
<view style="display: flex;justify-content: space-between">
<view style="width: 75%;">{{ item.QUESTION }}</view>
<view>{{ item.TEXT_INFO || item.ANSWER }}</view>
</view>
</template>
<template #label>
<block v-for="(item1,index1) in item.answers" :key="index1">
<view>{{ item1.TEXT_INFO }}{{ item1.ANSWER }}</view>
</block>
</template>
</u-cell>
</u-cell-group>
<u-divider text="审批人员" textPosition="left" textColor="#3c9cff" lineColor="#3c9cff"/>
<u-cell-group>
<block v-for="(item, index) in jobs" :key="index">
<u-cell :key="index" :title="item.TYPE_DESCRIBE">
<template #label>
<view class="mt-10">
<view>部门{{ item.DEPARTMENT_NAME }}</view>
<view>人员{{ item.USER_NAME }}</view>
<view v-if="item.SIGN_PICTURE">
<u-image width="400rpx" height="200rpx" :src="$filePath + '/' +item.SIGN_PICTURE" mode="widthFix"/>
<view>审批意见{{ item.APPROVAL_OPINIONS }}</view>
<view>审批意见{{ item.APPROVAL_TIME }}</view>
</view>
</view>
</template>
</u-cell>
</block>
</u-cell-group>
<view class="mt-10">
<u-button type="primary" text="下一步" @click="$u.debounce(fnSubmit, 1000,true)"/>
</view>
</view>
</view>
</template>
<script>
import {getTaskInfo} from "@/api";
import {resolveNextOperation} from "@/utils/submitHomeworkProcess";
export default {
data() {
return {
taskId: '',
type: '',
jobId: '',
form: [],
jobs: [],
questionnaires: [],
}
},
onLoad(query) {
this.taskId = query.taskId
this.type = query.type
this.jobId = query.jobId
this.fnGetData(query.taskId)
uni.setNavigationBarTitle({
title: query.title + '查看'
})
},
methods: {
async fnGetData(taskId) {
let resData = await getTaskInfo({EW_RU_TASK_ID: taskId})
this.form = resData.list.fromTrans
this.jobs = resData.list.jobs
this.questionnaires = resData.list.simpleQues[0]
},
async fnSubmit() {
let CORP_ID = ''
for (let i = 0; i < this.form.length; i++) {
if (this.form[i].FK_NAME === 'CORP_ID') {
CORP_ID = this.form[i].FK_VALUE
break
}
}
await resolveNextOperation({
EW_RU_TASK_ID: this.taskId,
TYPE: this.type,
CORP_ID,
EW_RU_JOB_ID: this.jobId,
})
},
},
}
</script>
<style scoped lang="scss">
</style>

View File

@ -178,6 +178,11 @@
title: '秦港站内信',
url: '/pages/information/index/index'
},
{
img: require('../../static/icon-apps/app_icons6.png'),
title: '高危作业',
url: '/pages/eight_assignments/index'
},
],
isPromiseUnsigned: false
}

52
pages/map/index.vue Normal file
View File

@ -0,0 +1,52 @@
<template>
<web-view :src="url" @message="fnMessage"></web-view>
</template>
<script>
import gcoord from '../../utils/gcoord.js'
export default {
data() {
return {
url: '',
longitude: '',
latitude: ''
}
},
onLoad(option) {
uni.getLocation({
type: 'GCJ02',
success: (res) => {
var result = gcoord.transform(
[res.longitude, res.latitude],
gcoord.GCJ02,
gcoord.BD09
);
this.longitude = result[0]
this.latitude = result[1]
this.fnInitMapUrl();
},
fail: () => {
uni.showToast({
title: "获取位置失败",
});
}
});
},
methods: {
fnInitMapUrl() {
this.url = ('/hybrid/html/map.html?longitude=' + this.longitude + '&latitude=' + this.latitude + 't=' +
new Date().getTime());
},
fnMessage(event) {
const eventChannel = this.getOpenerEventChannel();
eventChannel.emit('acceptLocationData', {
data: event.detail.data[0]
});
uni.navigateBack();
},
}
}
</script>
<style>
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
static/icon-apps/i1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

BIN
static/icon-apps/i10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

BIN
static/icon-apps/i11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
static/icon-apps/i12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
static/icon-apps/i13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
static/icon-apps/i14.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
static/icon-apps/i15.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
static/icon-apps/i2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
static/icon-apps/i3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

BIN
static/icon-apps/i4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
static/icon-apps/i5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

BIN
static/icon-apps/i6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
static/icon-apps/i7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
static/icon-apps/i8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
static/icon-apps/i9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -0,0 +1,173 @@
## 1.8.92024-06-28
完善说明文件
## 1.8.82024-06-21
更新插件
## 1.8.72024-05-08
fix bug
## 1.8.62024-04-07
功能更新
## 1.8.52024-04-07
修复bug
## 1.8.32024-04-06
update
## 1.8.22024-04-06
update
## 1.8.12024-04-06
fix bug
## 1.8.02024-04-03
优化
## 1.7.92024-04-03
优化编辑tree功能
## 1.7.82024-04-02
超集功能上线
## 1.7.72024-03-26
增加expandedMode=singe
## 1.7.62024-02-27
修复特殊字符的处理方法
## 1.7.52024-02-26
增加无子节点的父节点配置
## 1.7.42024-02-05
修复vue2语法使用问题
## 1.7.32024-02-05
修复vue2插槽不显示bug
## 1.7.22024-02-05
优化大数据的性能
## 1.7.12024-01-25
优化功能说明
## 1.7.02024-01-24
增加expandedKeys默认展开项目配置
## 1.6.92024-01-23
增加change事件
## 1.6.82024-01-22
搜索模式下,不再响应展开收起逻辑
## 1.6.72024-01-04
修复异步加载节点搜索展示bug
## 1.6.62023-12-29
修复next-tree异步加载节点关闭bug
## 1.6.52023-12-21
fix bug
## 1.6.42023-12-21
fix bug
## 1.6.32023-12-21
更新vue2版本说明文档
## 1.6.22023-12-21
修复说明文档
## 1.6.12023-12-18
增加empty插槽
## 1.6.02023-12-18
增加empty插槽
## 1.5.92023-12-15
修改说明文件
## 1.5.82023-12-15
修复changeVerify函数单选时返回参数bug
## 1.5.72023-12-14
修复checkStrictlyModel === 'strong'的bug
## 1.5.62023-12-13
代码优化
## 1.5.52023-12-13
优化changeVerify的使用
## 1.5.42023-12-12
修复提示层级问题
## 1.5.32023-12-12
优化uiMode=page模式下的使用
## 1.5.22023-12-11
增加uiMode配置实现页面模式展示
## 1.5.12023-12-06
更新说明
## 1.5.02023-12-06
更新插件使用注意事项
## 1.4.92023-12-01
增加topBar插槽
## 1.4.82023-11-30
增加changeVerify验证函数实现change的各种控制
## 1.4.72023-11-30
增加弹层容器高度可配置
## 1.4.62023-11-28
修复bug
## 1.4.52023-11-28
修复disabled是需要显示灰色不可操作
## 1.4.42023-11-28
增加说明
## 1.4.32023-11-28
增加主题配置
## 1.4.22023-11-28
增加异步加载时,子节点说明
## 1.4.12023-11-27
修复说明bug
## 1.4.02023-11-27
next-tree 全面说明文档
## 1.3.62023-11-27
增加远程加载loadData全面实现全功能覆盖
## 1.3.52023-11-27
增加title的定义
## 1.3.42023-11-27
增加title支持自定义定制
## 1.3.32023-11-21
增加搜索模式searchModel=depHighlight模式从属高亮显示模式
## 1.3.22023-11-20
修复valueKey设置bug
## 1.3.12023-11-17
增加说明文件和demo
## 1.3.02023-11-17
修复clear时不支持关联模式的设置
## 1.2.92023-11-17
增加checkStrictlyModel模式设置强关联和弱关联
## 1.2.82023-11-16
增加next-tree的辅助线模式
## 1.2.72023-11-16
优化next-tree
## 1.2.62023-11-16
修复搜索时,隐藏未打开的数据
## 1.2.52023-11-16
修复搜索无法点击,和级联半选不生效问题
## 1.2.42023-11-16
更新新功能插件使用说明
## 1.2.32023-11-16
增加插槽模式只是高ui要求定制
## 1.2.22023-11-15
修复checkStrictly配置下子关联父的选择状态
## 1.2.12023-11-15
增加半选提示功能配置showHalfCheckedTips
## 1.2.02023-11-14
修复disabled配置状态下父子级联不需要改变disabled设置项的选择状态
## 1.1.92023-11-13
增强大数据量体验交互,增加筛选搜索模式
## 1.1.82023-11-13
增加清除clear和取消cancel事件
## 1.1.72023-11-08
更新next-tree插件功能清单说明
## 1.1.62023-11-07
update说明文档
## 1.1.52023-11-07
update
## 1.1.42023-11-07
更新readme.md说明
## 1.1.32023-11-07
更新说明demo
## 1.1.22023-11-07
增加子节点按需渲染演示demo
## 1.1.12023-11-07
增加清空功能
## 1.1.02023-11-07
增加子孙节点按需渲染,扩展本插件支持大数据量渲染;
## 1.0.92023-10-26
增加文件说明
## 1.0.82023-09-14
增加禁用节点属性配置disabledKey
## 1.0.72023-09-06
增加checkStrictly实现父子节点关联
## 1.0.62023-09-06
更新vue2使用过程视图不更新的技术说明
## 1.0.52023-09-06
修复说明文档
## 1.0.42023-06-19
修改demo
## 1.0.32023-06-19
更新vue2的使用demo
## 1.0.22023-06-19
修复说明文档
## 1.0.12023-05-10
更新说明文件
## 1.0.02023-05-09
初始化项目

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,272 @@
@font-face {
font-family: 'iconfont';
src: url('//at.alicdn.com/t/c/font_4110624_qs48wckazsh.ttf?t=1712479573821') format('truetype');
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.iconfont {
font-family: iconfont;
font-style: normal;
}
.iconfont-loading {
font-family: iconfont;
display: inline-block;
font-style: normal;
animation: spin 1s linear infinite;
}
.next-tree-mask {
position: fixed;
top: 0rpx;
right: 0rpx;
bottom: 0rpx;
left: 0rpx;
z-index: 997;
background-color: rgba(0, 0, 0, 0.6);
opacity: 0;
transition: all 0.3s ease;
visibility: hidden;
}
.next-tree-mask.show {
visibility: visible;
opacity: 1;
}
.next-tree-cnt {
position: fixed;
top: 0rpx;
right: 0rpx;
bottom: 0rpx;
left: 0rpx;
z-index: 997;
top: 360rpx;
transition: all 0.3s ease;
transform: translateY(100%);
}
.next-tree-cnt.next-tree-cnt-page {
transition: none;
}
.next-tree-cnt.show {
transform: translateY(0);
}
.next-tree-bar {
background-color: #fff;
height: 72rpx;
padding-left: 20rpx;
padding-right: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
border-bottom-width: 1rpx !important;
border-bottom-style: solid;
border-bottom-color: #f5f5f5;
font-size: 32rpx;
color: #757575;
line-height: 1;
}
.next-tree-bar-btns {
display: inline-block;
display: flex;
flex-direction: row;
}
.btn-divid {
display: inline-block;
width: 1px;
margin: 0 10px;
background-color: #ccc;
}
.next-tree-bar-confirm {
color: #f9ae3d;
}
.next-tree-view {
position: absolute;
top: 0rpx;
right: 0rpx;
bottom: 0rpx;
left: 0rpx;
top: 72rpx;
background-color: #fff;
padding-top: 20rpx;
padding-right: 20rpx;
padding-bottom: 20rpx;
padding-left: 20rpx;
}
.next-tree-view-sc {
height: 100%;
overflow: hidden;
}
.next-tree-view-sc .empty {
text-align: center;
color: #757575;
padding: 30rpx;
}
.next-tree-item-block {
}
.next-tree-item {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 26rpx;
color: #757575;
line-height: 1;
height: 0;
opacity: 0;
transition: 0.2s;
position: relative;
overflow: hidden;
}
.next-tree-item .icon-btn {
font-size: 30rpx;
margin-right: 20rpx;
}
.next-tree-item .left-line {
position: relative;
width: 1rpx;
height: 100%;
box-sizing: border-box;
}
.next-tree-item .left-line::before {
position: absolute;
content: "";
width: 1rpx;
height: 100%;
background-color: rgba(204,204,204,0.9);
box-sizing: border-box;
left: -18rpx;
}
.next-tree-item .parent-horizontal-line {
width: 1rpx;
height: 100%;
position: absolute;
top: 0;
left: 0rpx;
box-sizing: border-box;
background-color: rgba(204,204,204,0.9);
}
.next-tree-item .left-line .horizontal-line {
width: 20rpx;
height: 1rpx;
position: absolute;
top: 40rpx;
left: 0rpx;
background-color: rgba(204,204,204,0.9);
box-sizing: border-box;
}
.next-tree-item.show {
min-height: 80rpx;
margin-top: 10rpx;
height: 100%;
opacity: 1;
}
.next-tree-item.showchild:before {
transform: rotate(90deg);
}
.next-tree-item.border {
border-bottom: 1rpx solid rgba(204,204,204,0.2);
}
.next-tree-item.last:before {
opacity: 0;
}
.next-tree-item.disabled {
color: #ccc!important;
}
.next-tree-icon {
width: 26rpx;
height: 26rpx;
margin-right: 8rpx;
}
.next-tree-label {
flex: 1;
display: flex;
align-items: center;
height: 100%;
line-height: 1.2;
}
.next-tree-label .label-input {
border: 1rpx solid #f0f0f0;
border-radius: 10rpx;
width: 100%;
padding: 12rpx 18rpx;
margin-right: 30rpx;
}
.next-tree-check {
width: 40px;
height: 40px;
display: flex;
justify-content: center;
align-items: center;
}
.next-tree-check-yes,
.next-tree-check-no {
width: 20px;
height: 20px;
border-top-left-radius: 20%;
border-top-right-radius: 20%;
border-bottom-right-radius: 20%;
border-bottom-left-radius: 20%;
border-top-width: 1rpx;
border-left-width: 1rpx;
border-bottom-width: 1rpx;
border-right-width: 1rpx;
border-style: solid;
border-color: #f9ae3d;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.next-tree-check-yes-b {
border-top-left-radius: 20%;
border-top-right-radius: 20%;
border-bottom-right-radius: 20%;
border-bottom-left-radius: 20%;
background-color: #f9ae3d;
color: #fff;
}
.next-tree-check-yes-b .icon-text {
font-size: 14px;
font-weight: normal;
font-family: uicon-iconfont;
display: flex;
flex-direction: row;
align-items: center;
}
.next-tree-check .radio {
border-top-left-radius: 50%;
border-top-right-radius: 50%;
border-bottom-right-radius: 50%;
border-bottom-left-radius: 50%;
}
.next-tree-check .radio .next-tree-check-yes-b {
border-top-left-radius: 50%;
border-top-right-radius: 50%;
border-bottom-right-radius: 50%;
border-bottom-left-radius: 50%;
}
.next-tree-item.disabled .next-tree-check-no {
color: #ccc!important;
}
.next-tree-item.disabled .next-tree-check-yes-b {
background-color: #ccc!important;
}
.hover-c {
opacity: 0.6;
}
.fixed-bottom-bar {
border-top: 1px solid #ccc;
position: fixed;
bottom: 0rpx;
left: 0rpx;
right: 0rpx;
z-index: 998;
}

View File

@ -0,0 +1,84 @@
{
"id": "next-tree",
"displayName": "next-tree超强树选择器、树组件、树插件、无限级联树、单选树、多选树、自定义样式树、树形选择器",
"version": "1.8.9",
"description": "next-tree 弹窗树形选择器,支持多选,支持大数据, 无限级联,单选,父子级级联,远程/ajax加载子节点增量/异步渲染,自定义样式定制,具名插槽等;支持h5/小程序/APP全端通用",
"keywords": [
"树选择",
"tree",
"弹窗树选择器",
"多选树",
"单选树"
],
"engines": {
},
"dcloudext": {
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "修改版本说明",
"permissions": "无"
},
"npmurl": "",
"type": "component-vue"
},
"uni_modules": {
"dependencies": ["next-search-more"],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y",
"alipay": "n"
},
"client": {
"Vue": {
"vue2": "y",
"vue3": "y"
},
"App": {
"app-vue": "y",
"app-nvue": "u"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "n",
"Edge": "y",
"Firefox": "y",
"Safari": "u"
},
"小程序": {
"微信": "y",
"阿里": "y",
"百度": "y",
"字节跳动": "u",
"QQ": "y",
"钉钉": "y",
"快手": "u",
"飞书": "u",
"京东": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
}
}
}
}
}

View File

@ -0,0 +1,843 @@
## next-tree --下拉树
> 遇到问题或有建议可以加入QQ群(<font color=#f00>455948571</font>)反馈
> 如果觉得组件不错,<font color=#f00>给五星鼓励鼓励</font>咯!
## 亮点功能说明(打造你不得不用的好插件)
### 本插件自1.5.0版本后支持一下功能
> 1.大数据量渲染本插件智能判断如果子孙集数据量大于50时会响应等待渲染视图
> 2.子节点按需渲染(自动启用,无需配置)
> 3.父子级联选择设置
> 4.单选多选设置
> 5.父节点是否可选设置
> 6.回显默认选中值
> 7.不可选项disabled设置
> 8.增强大数据量体验交互,增加筛选搜索模式
> 9.增强样式定制,提供自定义插槽,实现高要求样式定制
> 10.增加辅助线模式,外观更加精美
> 11.支持动态配置title
> 12.支持搜索模式searchModel=depHighlight模式从属高亮显示模式
> 13.支持异步加载子节点ajax加载子节点
> 14.增加可配置主题,自由定制插件主题颜色
> 15.支持动态校验,可以进行提示控制校验
> 16.支持页面模式/弹层模式,可以进行单页面展示或者弹层展示
> 17.支持半选提示状态显示
> 18.支持展开项expandedKeys配置
> 19.全面支持vue2/vue3
> 20.增加无子节点的父节点配置支持当item[childrenKey]为null时代表无子节点的父节点
> 21.终极支持超数据量使用增加展开模式配置单链路配置使用expandedMode=singe使得ui组件使用进一步不在限制与数据量
> 22.功能模式再次增强支持单选tree多选tree编辑tree展示tree
## 注意
### 作者不介意你对组件源码进行改造使用,为了开源更加高效,谢谢你的配合;为了节省不必要的沟通浪费,以下情况请不要再反馈给作者,请自行解决;
### 在这感各位的理解,我支持开源,但是作者时间有限;谢谢各位的配合;在这里期望我写的小小插件能为你提供便捷;
> 1.如果你对源码进行了修改使用,请不需要对作者做任何的反馈,作者确实没有空陪你做技术分析解答;
> 2.如果你引入插件连插件是否有正常被uniapp框架识别解析都不清楚请你换个插件使用
> 3.如果你引入插件,针对自己项目进行功能改造的,请自行仔细阅读源码并了解其原理,自行改造;这里作者不愿意浪费过多时间进行技术解答;
> 4.如果你不想进行全局加载next-tree需要按需加载next-tree中有相关依赖的组件需要你自行在组件内部单独引入依赖组件可以在package.json中找到
> 5.理论上作者不再解决由于本地开发环境问题所导致的插件使用问题请自行到uniapp官网学习解决
## 使用
### 超集功能即将不对外开源;
>[从uniapp插件市场导入](https://ext.dcloud.net.cn/plugin?name=next-tree)
## 关注作者的动态
[点击进入主页,关注作者](https://ask.dcloud.net.cn/people/ponder_7464)
## 关注作者其他开源
npm开源包[npm](https://www.npmjs.com/~lixueshiaa);
github开源项目[github](https://github.com/lixueshiaa);
```html
<template>
<view style="padding:10px;color: #333;font-weight: 500;">
<view style="padding: 10px 0"><text>1、设置单选和父级不可选</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(false, false)">设置</button>
<view style="padding: 10px 0"><text>2、设置多选和父级不可选</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, false)">设置</button>
<view style="padding: 10px 0"><text>3、设置单选和父级可选</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(false, true)">设置</button>
<view style="padding: 10px 0"><text>4、设置多选和父级可选</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, true)" >设置</button>
<view style="padding: 10px 0"><text>4、设置多选和父级可选和父级关联子级选择</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, true, true)" >设置</button>
<view style="padding: 10px 0"><text>5、设置默认回显(默认选中: '上海-2', '黄埔区-35')</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="echoDefault()" >设置</button>
<!-- 异步加载demo -->
<view style="padding: 10px 0"><text>6、异步加载渲染demo</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="openTree()" >设置</button>
</view>
<!-- 异步加载demo -->
<next-tree :selectParent="false" :checkStrictly="true" funcMode="checkbox" ref="nextTreeAsyncRef" :treeData="asyncTreeData" :loadData="loadData" />
<next-tree :expandedKeys="['3','3-1']" :changeVerify="changeVerify" :title="getTitle" ref="nextTreeRef" :checkStrictly="checkStrictly" :selectParent="selectParent" :funcMode="funcMode" :treeData="treeData" @cancel="oncancel" @confirm="onconfirm">
<!-- label插槽示意代码 -->
<!-- <template #label="{data: {id, label, iconSrc, prev, post}}">
<view class="line-block">
<image class="img" v-if="iconSrc" :src="iconSrc"></image>
<text space="nbsp" v-if="prev">{{prev}}&nbsp;</text><text>{{label}}</text><text space="nbsp" v-if="post">&nbsp;{{post}}</text>
</view>
</template> -->
<!-- <template #topBar>
<view style="color: #666;padding:5px;"><text style="font-size: 12px;">历史记录</text></view>
<view style="display: flex;justify-content: space-between;padding-bottom: 10px;border-bottom: 1rpx solid #f0f0f0;">
<button @click="checkedFunc('1-3-3-4')" :style="'background-color:'+ (activeId === '1-3-3-4' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">北京区-4</button>
<button @click="checkedFunc('3-1-2')" :style="'background-color:'+ (activeId === '3-1-2' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">海珠区-2</button>
<button @click="checkedFunc('3-1-6')" :style="'background-color:'+ (activeId === '3-1-6' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">海珠区-5</button>
</view>
</template> -->
</next-tree>
</template>
```
### vue3 + ts 使用
```ts
<script setup lang="ts">
import { ref, unref } from 'vue'
import nextTree from '@/components/next-tree/next-tree.vue'
const funcMode = ref('radio');
const selectParent = ref(false)
const nextTreeRef = ref()
const nextTreeAsyncRef = ref()
const activeId = ref('')
const localData: any = {
'a1': [{id: 'a1-1', label: 'a1-1'}, {id: 'a1-2', label: 'a1-2',children: [] },{id: 'a1-3', label: 'a1-3'}],
'b1': [{id: 'b1-1', label: 'b1-1',children: []}, {id: 'b1-2', label: 'b1-2'},{id: 'b1-3', label: 'b1-3'}],
'c1': [{id: 'c1-1', label: 'c1-1'}, {id: 'c1-2', label: 'c1-2'},{id: 'c1-3', label: 'c1-3',children: []}],
'a1-2': [{id: 'a1-2-1', label: 'a1-2-1'}, {id: 'a1-2-2', label: 'a1-2-2'}],
'b1-1': [{id: 'b1-1-1', label: 'b1-1-1'}, {id: 'b1-1-2', label: 'b1-1-2'}],
'c1-3': [{id: 'c1-3-1', label: 'c1-3-1'}, {id: 'c1-3-2', label: 'c1-3-2'}]
}
const checkStrictly = ref(false)
const asyncTreeData = ref([{id: 'a1', label: 'a1', children: []},{id: 'b1', label: 'b1', children: []},{id: 'c1', label: 'c1', children: []}])
const treeData = ref([
{id: '1', label: '北京'},
{id: '2', label: '上海', children: [
{id: '2-1', label: '上海-1'},
{id: '2-2', label: '上海-2'},
{id: '2-3', label: '上海-3'},
] },
{id: '3', label: '广州', children: [
{id: '3-1', label: '海珠区', children: [
{id: '3-1-1', label: '海珠区-1'},
{id: '3-1-2', label: '海珠区-2'},
{id: '3-1-4', label: '海珠区-3'},
{id: '3-1-5', label: '海珠区-4'},
{id: '3-1-6', label: '海珠区-5'},
{id: '3-1-7', label: '海珠区-6'},
{id: '3-1-8', label: '海珠区-7'},
{id: '3-1-9', label: '海珠区-8'},
{id: '3-1-10', label: '海珠区-9'},
{id: '3-1-11', label: '海珠区-10'},
]},
{id: '3-2', label: '番禺区', children: [
{id: '3-2-1', label: '番禺区-1'},
{id: '3-2-2', label: '番禺区-2'},
{id: '3-2-4', label: '番禺区-3', children: null}, // 注意: 当childrenKey的值设为null代表无子节点的父节点
{id: '3-2-5', label: '番禺区-4'},
{id: '3-2-6', label: '番禺区-5'},
{id: '3-2-7', label: '番禺区-6'},
{id: '3-2-8', label: '番禺区-7'},
{id: '3-2-9', label: '番禺区-8'},
{id: '3-2-10', label: '番禺区-9'},
{id: '3-2-11', label: '番禺区-10'},
]},
{id: '3-3', label: '黄埔区', children: [
{id: '3-3-1', label: '黄埔区-1'},
{id: '3-3-2', label: '黄埔区-2'},
{id: '3-3-3', label: '黄埔区-3'},
{id: '3-3-4', label: '黄埔区-4'},
{id: '3-3-5', label: '黄埔区-5'},
{id: '3-3-6', label: '黄埔区-6'},
{id: '3-3-7', label: '黄埔区-7'},
{id: '3-3-8', label: '黄埔区-8'},
{id: '3-3-9', label: '黄埔区-9'},
{id: '3-3-10', label: '黄埔区-10'},
{id: '3-3-12', label: '黄埔区-11'},
{id: '3-3-13', label: '黄埔区-12'},
{id: '3-3-13', label: '黄埔区-13'},
{id: '3-3-14', label: '黄埔区-14'},
{id: '3-3-15', label: '黄埔区-15'},
{id: '3-3-16', label: '黄埔区-16'},
{id: '3-3-17', label: '黄埔区-17'},
{id: '3-3-18', label: '黄埔区-18'},
{id: '3-3-19', label: '黄埔区-19'},
{id: '3-3-20', label: '黄埔区-20'},
{id: '3-3-21', label: '黄埔区-21'},
{id: '3-3-22', label: '黄埔区-22'},
{id: '3-3-23', label: '黄埔区-23'},
{id: '3-3-24', label: '黄埔区-24'},
{id: '3-3-25', label: '黄埔区-25'},
{id: '3-3-26', label: '黄埔区-26'},
{id: '3-3-27', label: '黄埔区-27'},
{id: '3-3-28', label: '黄埔区-28'},
{id: '3-3-29', label: '黄埔区-29'},
{id: '3-3-30', label: '黄埔区-30'},
{id: '3-3-31', label: '黄埔区-31'},
{id: '3-3-32', label: '黄埔区-32'},
{id: '3-3-33', label: '黄埔区-33'},
{id: '3-3-34', label: '黄埔区-34'},
{id: '3-3-35', label: '黄埔区-35'},
{id: '3-3-36', label: '黄埔区-36'},
]},
],
}])
function getTitle(checked) {
return `已选:${checked.length}项`
}
function itemclick (_multiple, _selectParent, _checkStrictly = false) {
funcMode.value = _multiple ? 'checkbox' : 'radio';
selectParent.value = _selectParent
checkStrictly.value = _checkStrictly
unref(nextTreeRef).showTree = true
}
function checkedFunc(id) {
if(unref(activeId) === id) {
activeId.value = '';
unref(nextTreeRef).checkedFunc(id, false)
} else {
activeId.value = id;
unref(nextTreeRef).checkedFunc(id)
}
}
function changeVerify(current, chooseList) {
// 注意:返回非空字符串会阻止原有行为,并提示返回的字符串
// 如果函数体不做return返回值即验证通过控件正常处理业务
console.log('当前变化的数据', current)
console.log('已选择的数据', chooseList)
if(chooseList && chooseList.length > 4) {
return '最多可以选择4个节点'
}
}
function openTree() {
unref(nextTreeAsyncRef).showTree = true
}
function echoDefault () {
const selectIds = ['2-1','3-3-35']
checkedTreeData(unref(treeData), selectIds)
console.log('treeData的数据', unref(treeData))
funcMode.value = 'checkbox'
unref(nextTreeRef).showTree = true
}
function loadData(data) {
const type = data.$type; // 加载类型
const source = data.source // 源数据
// 同步实现的代码处理方式
if (type === 'nodeLoad') {
const nodeItem = source;
// 同步实现的代码处理方式
// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
// if(nodeItem && localData[nodeItem.id]) {
// return localData[nodeItem.id]
// } else {
// return []
// }
// 异步的代码实现方式
// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
return new Promise((resolve, reject) => {
setTimeout(() => {
if(nodeItem && localData[nodeItem.id]) {
return resolve(localData[nodeItem.id])
} else {
return resolve([])
}
}, 1000)
})
} else if(type === 'remoteSearch') { // searchModel=remote的时候会在loadData函数中返回type参数供做业务处理
// ...doing
}
}
function checkedTreeData (treeData, selectIds) {
treeData.map(item => {
if (selectIds.indexOf(item.id) !== -1) {
item.checked = true
} else {
item.checked = false
}
if (item.children && item.children.length) {
checkedTreeData(item.children, selectIds)
}
})
}
function oncancel() {
// 清除treeData的选中状态
checkedTreeData(unref(treeData), [])
}
function onconfirm(list) {
console.log('选中项的数量列表list', list)
}
</script>
<style lang="scss">
.line-block {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
.img {
width: 40rpx;
height: 40rpx;
border-radius: 10rpx;
margin: 0 20rpx;
}
}
</style>
```
### vue2 使用
```html
<template>
<view>
<view style="padding:10px;color: #333;font-weight: 500;">
<view style="padding: 10px 0"><text>1、设置单选和父级不可选</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(false, false)">设置</button>
<view style="padding: 10px 0"><text>2、设置多选和父级不可选</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, false)">设置</button>
<view style="padding: 10px 0"><text>3、设置单选和父级可选</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(false, true)">设置</button>
<view style="padding: 10px 0"><text>4、设置多选和父级可选</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, true)" >设置</button>
<view style="padding: 10px 0"><text>4、设置多选和父级可选和父级关联子级选择</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="itemclick(true, true, true)" >设置</button>
<view style="padding: 10px 0"><text>5、设置默认回显(默认选中: '上海-2', '黄埔区-35')</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="echoDefault()" >设置</button>
<!-- 异步加载demo -->
<view style="padding: 10px 0"><text>6、异步加载渲染demo</text></view>
<button style="width: 100%;background-color: #f9ae3d;color:#fff" size="mini" @click="openTree()" >设置</button>
</view>
<!-- 异步加载demo -->
<next-tree :selectParent="false" :checkStrictly="true" funcMode="checkbox" ref="nextTreeAsyncRef" :treeData="asyncTreeData" :loadData="loadData" />
<next-tree :expandedKeys="['3','3-1']" :changeVerify="changeVerify" :title="getTitle" ref="nextTreeRef" :checkStrictly="checkStrictly" :selectParent="selectParent" :funcMode="funcMode" :treeData="treeData" @cancel="oncancel" @confirm="onconfirm">
<!-- label插槽示意代码 -->
<!-- <template v-slot:label="{data}">
<view class="line-block">
<image class="img" v-if="data.iconSrc" :src="data.iconSrc"></image>
<text space="nbsp" v-if="data.prev">{{data.prev}}&nbsp;</text><text>{{data.label}}</text><text space="nbsp" v-if="data.post">&nbsp;{{data.post}}</text>
</view>
</template> -->
<!-- <template #topBar>
<view style="color: #666;padding:5px;"><text style="font-size: 12px;">历史记录</text></view>
<view style="display: flex;justify-content: space-between;padding-bottom: 10px;border-bottom: 1rpx solid #f0f0f0;">
<button @click="checkedFunc('1-3-3-4')" :style="'background-color:'+ (activeId === '1-3-3-4' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">北京区-4</button>
<button @click="checkedFunc('3-1-2')" :style="'background-color:'+ (activeId === '3-1-2' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">海珠区-2</button>
<button @click="checkedFunc('3-1-6')" :style="'background-color:'+ (activeId === '3-1-6' ? '#f9ae3d' : '#ccc') + ';color:#fff;margin: 5px'" size="mini">海珠区-5</button>
</view>
</template> -->
</next-tree>
</view>
</template>
```
```js
<script>
let self = null;
export default {
data () {
return {
funcMode: 'radio',
selectParent: false,
checkStrictly: false,
activeId: '',
localData:{
'a1': [{id: 'a1-1', label: 'a1-1'}, {id: 'a1-2', label: 'a1-2',children: [] },{id: 'a1-3', label: 'a1-3'}],
'b1': [{id: 'b1-1', label: 'b1-1',children: []}, {id: 'b1-2', label: 'b1-2'},{id: 'b1-3', label: 'b1-3'}],
'c1': [{id: 'c1-1', label: 'c1-1'}, {id: 'c1-2', label: 'c1-2'},{id: 'c1-3', label: 'c1-3',children: []}],
'a1-2': [{id: 'a1-2-1', label: 'a1-2-1'}, {id: 'a1-2-2', label: 'a1-2-2'}],
'b1-1': [{id: 'b1-1-1', label: 'b1-1-1'}, {id: 'b1-1-2', label: 'b1-1-2'}],
'c1-3': [{id: 'c1-3-1', label: 'c1-3-1'}, {id: 'c1-3-2', label: 'c1-3-2'}]
},
asyncTreeData: [{id: 'a1', label: 'a1', children: []},{id: 'b1', label: 'b1', children: []},{id: 'c1', label: 'c1', children: []}],
treeData: [
{id: '1', label: '北京', checked: false},
{id: '2', label: '上海', checked: false, children: [
{id: '2-1', label: '上海-1', checked: false},
{id: '2-2', label: '上海-2', checked: false},
{id: '2-3', label: '上海-3', checked: false},
] },
{id: '3', label: '广州', children: [
{id: '3-1', label: '海珠区', checked: false, children: [
{id: '3-1-1', label: '海珠区-1', checked: false, disabled: true},
{id: '3-1-2', label: '海珠区-2', checked: false},
{id: '3-1-4', label: '海珠区-3', checked: false},
{id: '3-1-5', label: '海珠区-4', checked: false},
{id: '3-1-6', label: '海珠区-5', checked: false},
{id: '3-1-7', label: '海珠区-6', checked: false},
{id: '3-1-8', label: '海珠区-7', checked: false},
{id: '3-1-9', label: '海珠区-8', checked: false},
{id: '3-1-10', label: '海珠区-9', checked: false},
{id: '3-1-11', label: '海珠区-10', checked: false},
]},
{id: '3-2', label: '番禺区', checked: false, children: [
{id: '3-2-1', label: '番禺区-1', checked: false},
{id: '3-2-2', label: '番禺区-2', checked: false},
{id: '3-2-4', label: '番禺区-3', checked: false},
{id: '3-2-5', label: '番禺区-4', checked: false},
{id: '3-2-6', label: '番禺区-5', checked: false},
{id: '3-2-7', label: '番禺区-6', checked: false},
{id: '3-2-8', label: '番禺区-7', checked: false},
{id: '3-2-9', label: '番禺区-8', checked: false},
{id: '3-2-10', label: '番禺区-9', checked: false},
{id: '3-2-11', label: '番禺区-10', checked: false},
]},
{id: '3-3', label: '黄埔区', checked: false, children: [
{id: '3-3-1', label: '黄埔区-1', checked: false},
{id: '3-3-2', label: '黄埔区-2', checked: false},
{id: '3-3-3', label: '黄埔区-3', checked: false},
{id: '3-3-4', label: '黄埔区-4', checked: false},
{id: '3-3-5', label: '黄埔区-5', checked: false},
{id: '3-3-6', label: '黄埔区-6', checked: false},
{id: '3-3-7', label: '黄埔区-7', checked: false},
{id: '3-3-8', label: '黄埔区-8', checked: false},
{id: '3-3-9', label: '黄埔区-9', checked: false},
{id: '3-3-10', label: '黄埔区-10', checked: false},
{id: '3-3-12', label: '黄埔区-11', checked: false},
{id: '3-3-13', label: '黄埔区-12', checked: false},
{id: '3-3-13', label: '黄埔区-13', checked: false},
{id: '3-3-14', label: '黄埔区-14', checked: false},
{id: '3-3-15', label: '黄埔区-15', checked: false},
{id: '3-3-16', label: '黄埔区-16', checked: false},
{id: '3-3-17', label: '黄埔区-17', checked: false},
{id: '3-3-18', label: '黄埔区-18', checked: false},
{id: '3-3-19', label: '黄埔区-19', checked: false},
{id: '3-3-20', label: '黄埔区-20', checked: false},
{id: '3-3-21', label: '黄埔区-21', checked: false},
{id: '3-3-22', label: '黄埔区-22', checked: false},
{id: '3-3-23', label: '黄埔区-23', checked: false},
{id: '3-3-24', label: '黄埔区-24', checked: false},
{id: '3-3-25', label: '黄埔区-25', checked: false},
{id: '3-3-26', label: '黄埔区-26', checked: false},
{id: '3-3-27', label: '黄埔区-27', checked: false},
{id: '3-3-28', label: '黄埔区-28', checked: false},
{id: '3-3-29', label: '黄埔区-29', checked: false},
{id: '3-3-30', label: '黄埔区-30', checked: false},
{id: '3-3-31', label: '黄埔区-31', checked: false},
{id: '3-3-32', label: '黄埔区-32', checked: false},
{id: '3-3-33', label: '黄埔区-33', checked: false},
{id: '3-3-34', label: '黄埔区-34', checked: false},
{id: '3-3-35', label: '黄埔区-35', checked: false},
{id: '3-3-36', label: '黄埔区-36', checked: false},
]},
],
}]
}
},
methods: {
openTree: function() {
this.$refs.nextTreeAsyncRef.showTree = true
},
changeVerify: function(current, chooseList) {
// 注意:返回非空字符串会阻止原有行为,并提示返回的字符串
// 如果函数体不做return返回值即验证通过控件正常处理业务
console.log('当前变化的数据', current)
console.log('已选择的数据', chooseList)
if(chooseList && chooseList.length > 4) {
return '最多可以选择4个节点'
}
},
checkedFunc: function(id) {
if(this.activeId === id) {
this.activeId = '';
this.$refs.nextTreeRef.checkedFunc(id, false)
} else {
this.activeId = id;
this.$refs.nextTreeRef.checkedFunc(id)
}
},
function loadData(data) {
const type = data.$type; // 加载类型
const source = data.source // 源数据
// 同步实现的代码处理方式
if (type === 'nodeLoad') {
const nodeItem = source;
// 同步实现的代码处理方式 可以返回单个子节点的集合也可以返回子孙节点的集合
// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
// if(nodeItem && this.localData[nodeItem.id]) {
// return this.localData[nodeItem.id]
// } else {
// return []
// }
// 异步的代码实现方式 可以返回单个子节点的集合也可以返回子孙节点的集合
// 如果期望子集节点中还存在孙子节点可以打开,请在初始化数据的时候,初始化个空数组的子节点配置值{[this.childrenKey]: []}
return new Promise((resolve, reject) => {
setTimeout(() => {
if(nodeItem && self.localData[nodeItem.id]) {
return resolve(self.localData[nodeItem.id])
} else {
return resolve([])
}
}, 1000)
})
} else if(type === 'remoteSearch') { // searchModel=remote的时候会在loadData函数中返回type参数供做业务处理
// ...doing
}
},
getTitle: function(checked) {
return `已选:${checked.length}项`
},
echoDefault: function() {
const selectIds = ['2-1','3-3-35']
this.checkedTreeData(this.treeData, selectIds)
console.log('treeData的数据', this.treeData)
this.funcMode = 'checkbox'
this.$refs.nextTreeRef.showTree = true
},
itemclick: function(_multiple, _selectParent, _checkStrictly = false) {
this.funcMode = _multiple ? 'checkbox' : 'radio'
this.selectParent = _selectParent
this.checkStrictly = _checkStrictly
this.$refs.nextTreeRef.showTree = true
},
checkedTreeData: function(treeData, selectIds) {
// 注意 vue2当数据深嵌套时如果没有在treeData里面初始化checked属性那在改变数据的时候直接将checked属性赋值为true这时候ui界面有可能不会更新
// 这时候建议使用this.$set去更新checked属性值或者在初始化this.treeData的时候初始化checked属性
(treeData || []).map(item => {
if (selectIds.indexOf(item.id) !== -1) {
item.checked = true
} else {
item.checked = false
}
if (item.children && item.children.length) {
this.checkedTreeData(item.children, selectIds)
}
})
},
onconfirm: function(list) {
console.log('选中项的数量列表list', list)
},
oncancel: function() {
// 清除treeData的选中状态
this.checkedTreeData(this.treeData, [])
}
},
created() {
self = this
}
}
</script>
<style lang="scss">
.line-block {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
.img {
width: 40rpx;
height: 40rpx;
border-radius: 10rpx;
margin: 0 20rpx;
}
}
</style>
```
### 个性化自定义样式渲染
如果你的需求对样式需求比较高请使用插槽模式渲染本组件提供label插槽供你自定义定制
```js
<script>
// 提供参考一组自定义渲染数据demotreeData如下
const treeData = [
{id: '1', label: '北京', prev: 'PonderNext-', iconSrc: 'https://img95.699pic.com/xsj/03/fg/hj.jpg%21/fh/300', children: [
{id: '1-3-3-1', label: '北京区-1', prev: '前置-'},
{id: '1-3-3-2', label: '北京区-2', post: '-后置'},
{id: '1-3-3-3', label: '北京区-3', post: '-后置', prev: '前置-'},
{id: '1-3-3-4', label: '北京区-4'},
{id: '1-3-3-5', label: '北京区-5'},
{id: '1-3-3-6', label: '北京区-6'},
{id: '1-3-3-7', label: '北京区-7'},
{id: '1-3-3-8', label: '北京区-8'},
{id: '1-3-3-9', label: '北京区-9'},
{id: '1-3-3-10', label: '北京区-10'},
{id: '1-3-3-12', label: '北京区-11'},
{id: '1-3-3-13', label: '北京区-12'},
{id: '1-3-3-13', label: '北京区-13'},
{id: '1-3-3-14', label: '北京区-14'},
{id: '1-3-3-15', label: '北京区-15'},
{id: '1-3-3-16', label: '北京区-16'},
{id: '1-3-3-17', label: '北京区-17'},
{id: '1-3-3-18', label: '北京区-18'},
{id: '1-3-3-19', label: '北京区-19'},
{id: '1-3-3-20', label: '北京区-20'},
{id: '1-3-3-21', label: '北京区-21'},
{id: '1-3-3-22', label: '北京区-22'},
{id: '1-3-3-23', label: '北京区-23'},
{id: '1-3-3-24', label: '北京区-24'},
{id: '1-3-3-25', label: '北京区-25'},
{id: '1-3-3-26', label: '北京区-26'},
{id: '1-3-3-27', label: '北京区-27'},
{id: '1-3-3-28', label: '北京区-28'},
{id: '1-3-3-29', label: '北京区-29'},
{id: '1-1-3-3-30', label: '北京区-30'},
{id: '1-3-3-31', label: '北京区-31'},
{id: '1-3-3-32', label: '北京区-32'},
{id: '1-3-3-33', label: '北京区-33'},
{id: '1-3-3-34', label: '北京区-34'},
{id: '1-3-3-35', label: '北京区-35'},
{id: '1-3-3-36', label: '北京区-36'},
{id: '1-3-3-37', label: '北京区-37'},
{id: '1-3-3-38', label: '北京区-38'},
{id: '1-3-3-39', label: '北京区-39'},
{id: '1-3-3-40', label: '北京区-40'},
{id: '1-3-3-41', label: '北京区-41'},
{id: '1-3-3-42', label: '北京区-42'},
{id: '1-3-3-43', label: '北京区-43'},
{id: '1-3-3-44', label: '北京区-44'},
{id: '1-3-3-45', label: '北京区-45'},
{id: '1-3-3-46', label: '北京区-46'},
{id: '1-3-3-47', label: '北京区-47'},
{id: '1-3-3-48', label: '北京区-48'},
{id: '1-3-3-49', label: '北京区-49'},
{id: '1-3-3-50', label: '北京区-50'},
{id: '1-3-3-51', label: '北京区-51'},
{id: '1-3-3-52', label: '北京区-52'},
{id: '1-3-3-53', label: '北京区-53'},
{id: '1-3-3-54', label: '北京区-54'},
]},
{id: '2', label: '上海', prev: 'PonderNext-', iconSrc: 'https://img95.699pic.com/xsj/0g/hb/tc.jpg%21/fh/300', children: [
{id: '2-1', label: '上海-1', iconSrc: 'https://img1.baidu.com/it/u=1997340124,765201109&fm=253&fmt=auto&app=120&f=JPEG?w=285&h=285'},
{id: '2-2', label: '上海-2', iconSrc: 'https://img1.baidu.com/it/u=1997340124,765201109&fm=253&fmt=auto&app=120&f=JPEG?w=285&h=285'},
{id: '2-3', label: '上海-3', iconSrc: 'https://img1.baidu.com/it/u=1997340124,765201109&fm=253&fmt=auto&app=120&f=JPEG?w=285&h=285'},
] },
{id: '3', label: '广州', prev: 'PonderNext-', iconSrc: 'https://storage-public.zhaopin.cn/user/avatar/1589350028141684980/d00a1afa-e3ec-40a5-a68e-aef1f684b189.jpg', children: [
{id: '3-1', label: '海珠区', iconSrc: 'https://img95.699pic.com/xsj/0u/f3/5h.jpg%21/fh/300', children: [
{id: '3-1-1', label: '海珠区-1', disabled: true},
{id: '3-1-2', label: '海珠区-2', post: '-后置', prev: '前置-'},
{id: '3-1-4', label: '海珠区-3', post: '-后置',},
{id: '3-1-5', label: '海珠区-4', children: [
{ id: '3-1-5-1', label: '海珠区-4-200号'},
{ id: '3-1-5-2', label: '海珠区-4-201号', children: [
{ id: '3-1-5-1-1', label: '海珠区-4-200号-2'},
{ id: '3-1-5-2-1', label: '海珠区-4-201号-3'},
]},
]},
{id: '3-1-6', label: '海珠区-5'},
{id: '3-1-7', label: '海珠区-6'},
{id: '3-1-8', label: '海珠区-7', post: '-后置',},
{id: '3-1-9', label: '海珠区-8'},
{id: '3-1-10', label: '海珠区-9'},
{id: '3-1-11', label: '海珠区-10'},
{id: '3-1-1', label: '海珠区-11', disabled: true},
{id: '3-1-2', label: '海珠区-12'},
{id: '3-1-4', label: '海珠区-13'},
{id: '3-1-5', label: '海珠区-14'},
{id: '3-1-6', label: '海珠区-15'},
{id: '3-1-7', label: '海珠区-16'},
{id: '3-1-8', label: '海珠区-17'},
{id: '3-1-9', label: '海珠区-18'},
{id: '3-1-10', label: '海珠区-19', prev: '前置-'},
{id: '3-1-11', label: '海珠区-20'},
{id: '3-1-1', label: '海珠区-21', disabled: true},
{id: '3-1-2', label: '海珠区-22'},
{id: '3-1-4', label: '海珠区-23'},
{id: '3-1-5', label: '海珠区-24'},
{id: '3-1-6', label: '海珠区-25'},
{id: '3-1-7', label: '海珠区-26'},
{id: '3-1-8', label: '海珠区-27'},
{id: '3-1-9', label: '海珠区-28'},
{id: '3-1-10', label: '海珠区-29'},
{id: '3-1-11', label: '海珠区-30'},
{id: '3-1-1', label: '海珠区-31', disabled: true},
{id: '3-1-2', label: '海珠区-32'},
{id: '3-1-4', label: '海珠区-33'},
{id: '3-1-5', label: '海珠区-34'},
{id: '3-1-6', label: '海珠区-35'},
{id: '3-1-7', label: '海珠区-36'},
{id: '3-1-8', label: '海珠区-37'},
{id: '3-1-9', label: '海珠区-38'},
{id: '3-1-10', label: '海珠区-39'},
{id: '3-1-11', label: '海珠区-40'},
{id: '3-1-1', label: '海珠区-41', disabled: true},
{id: '3-1-2', label: '海珠区-42'},
{id: '3-1-4', label: '海珠区-43'},
{id: '3-1-5', label: '海珠区-44'},
{id: '3-1-6', label: '海珠区-45'},
{id: '3-1-7', label: '海珠区-46'},
{id: '3-1-8', label: '海珠区-47'},
{id: '3-1-9', label: '海珠区-48'},
{id: '3-1-10', label: '海珠区-49'},
{id: '3-1-11', label: '海珠区-50'},
{id: '3-1-11', label: '海珠区-51'},
]},
{id: '3-2', label: '番禺区', iconSrc: 'https://img1.baidu.com/it/u=931648192,3196263841&fm=253&fmt=auto&app=120&f=JPEG?w=285&h=285', disabled: true, checked: true, children: [
{id: '3-2-1', label: '番禺区-1'},
{id: '3-2-2', label: '番禺区-2'},
{id: '3-2-4', label: '番禺区-3'},
{id: '3-2-5', label: '番禺区-4'},
{id: '3-2-6', label: '番禺区-5'},
{id: '3-2-7', label: '番禺区-6'},
{id: '3-2-8', label: '番禺区-7'},
{id: '3-2-9', label: '番禺区-8'},
{id: '3-2-10', label: '番禺区-9'},
{id: '3-2-11', label: '番禺区-10'},
]},
{id: '3-3', label: '黄埔区', iconSrc: 'https://img.jiaoyubao.cn/43423/20210423113959473-20210423114005024.jpeg', children: [
{id: '3-3-1', label: '黄埔区-1'},
{id: '3-3-2', label: '黄埔区-2'},
{id: '3-3-3', label: '黄埔区-3'},
{id: '3-3-4', label: '黄埔区-4'},
{id: '3-3-5', label: '黄埔区-5'},
{id: '3-3-6', label: '黄埔区-6'},
{id: '3-3-7', label: '黄埔区-7'},
{id: '3-3-8', label: '黄埔区-8'},
{id: '3-3-9', label: '黄埔区-9'},
{id: '3-3-10', label: '黄埔区-10'},
{id: '3-3-12', label: '黄埔区-11'},
{id: '3-3-13', label: '黄埔区-12'},
{id: '3-3-13', label: '黄埔区-13'},
{id: '3-3-14', label: '黄埔区-14'},
{id: '3-3-15', label: '黄埔区-15'},
{id: '3-3-16', label: '黄埔区-16'},
{id: '3-3-17', label: '黄埔区-17'},
{id: '3-3-18', label: '黄埔区-18'},
{id: '3-3-19', label: '黄埔区-19'},
{id: '3-3-20', label: '黄埔区-20'},
{id: '3-3-21', label: '黄埔区-21'},
{id: '3-3-22', label: '黄埔区-22'},
{id: '3-3-23', label: '黄埔区-23'},
{id: '3-3-24', label: '黄埔区-24'},
{id: '3-3-25', label: '黄埔区-25'},
{id: '3-3-26', label: '黄埔区-26'},
{id: '3-3-27', label: '黄埔区-27'},
{id: '3-3-28', label: '黄埔区-28'},
{id: '3-3-29', label: '黄埔区-29'},
{id: '3-3-30', label: '黄埔区-30'},
{id: '3-3-31', label: '黄埔区-31'},
{id: '3-3-32', label: '黄埔区-32'},
{id: '3-3-33', label: '黄埔区-33'},
{id: '3-3-34', label: '黄埔区-34'},
{id: '3-3-35', label: '黄埔区-35'},
{id: '3-3-36', label: '黄埔区-36'},
{id: '3-3-37', label: '黄埔区-37'},
{id: '3-3-38', label: '黄埔区-38'},
{id: '3-3-39', label: '黄埔区-39'},
{id: '3-3-40', label: '黄埔区-40'},
{id: '3-3-41', label: '黄埔区-41'},
{id: '3-3-42', label: '黄埔区-42'},
{id: '3-3-43', label: '黄埔区-43'},
{id: '3-3-44', label: '黄埔区-44'},
{id: '3-3-45', label: '黄埔区-45'},
{id: '3-3-46', label: '黄埔区-46'},
{id: '3-3-47', label: '黄埔区-47'},
{id: '3-3-48', label: '黄埔区-48'},
{id: '3-3-49', label: '黄埔区-49'},
{id: '3-3-50', label: '黄埔区-50'},
{id: '3-3-51', label: '黄埔区-51'},
{id: '3-3-52', label: '黄埔区-52'},
{id: '3-3-53', label: '黄埔区-53'},
{id: '3-3-54', label: '黄埔区-54'},
]},
],
}]
</script>
```
### 预览
###
***
| 功能预览 | 父子级关联演示 | 全面支持大数据量子孙节点ui按需渲染(按需渲染数据) |
| :------------------------------------------------------------------: | :------------------------------------------------------------------: | :------------------------------------------------------------------: |
| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree.gif) | ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-b.gif) | ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-d.gif) |
| 增强控件交互能力增加筛选search模式全面支持大数据量交互 | 超强的样式定制能力,满足你高精美组件的需求 | 打开精美的辅助线模式,让你的控件更加友好 |
| :------------------------------------------------------------------: | :------------------------------------------------------------------: | :------------------------------------------------------------------: |
| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-e.gif) | ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-f.gif) | ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-u.gif) |
| 增加搜索模式searchModel=depHighlight模式从属高亮显示模式 | 支持异步加载子节点子树集ajax远程加载数据等 | 支持不同主题的切换ui定制更简单 |
| :------------------------------------------------------------------: | :------------------------------------------------------------------: | :------------------------------------------------------------------: |
| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-p.gif) | ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-k.gif) | ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-n.gif) |
| 增加验证函数和topBar插槽使得更加容易和组件进行交互 | 增加页面模式支持整页ui展示模式 | 增加展开模式expandedMode配置支持单链路展开理论上支持几万数据量 |
| :------------------------------------------------------------------: | :------------------------------------------------------------------: | :------------------------------------------------------------------: |
| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-cc.gif)| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-uu.gif)| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-aab.gif) |
### 超集功能预览(增值功能)
###
| 实现tree的功能模式扩展让你的tree组件实现可编辑态 |
| :--------------------------------------------------------------------: |
| ![](https://lixueshiaa.github.io/webtest/www/static/next-tree-eeee.gif)|
## 参数
可选参数属性列表
|参数名 |说明 |类型 |是否必填 |默认值 |可选值 |
|---- |---- |---- |---- |---- |----------------------- |
|uiMode |ui表现方式popup<弹窗> page<页面>;默认是 popup |String |是 |popup |page |
|funcMode |功能模式配置display<展示模式> edit<编辑模式>checkbox<多选模式> radio<单选模式>;默认是 radio |String |是 |radio |dispaly,edit,checkbox |
|treeData |树源数据列表 |Array |是 |[] |- |
|valueKey |绑定value的键属性(项的唯一key标识) |String |否 |id |- |
|labelKey |用于显示的字段 |String |否 |label |- |
|disabledKey |禁用节点绑定属性 |String |否 |disabled |- |
|childrenKey |子节点绑定属性 (注意当item[childrenKey]的值设为null时代表是无下级数据的父节点即非叶子节点) |String |否 |children |- |
|title | 弹出标题(如果是函数时会返回所选项的值作为回调参数如title: (checked):String => {}) |String, Function |否 |'' |- |
|selectParent |作用于funcMode=display模式下是否可以选父级 |Boolean |否 |false |true |
|foldAll| 折叠时关闭所有已经打开的子集,再次打开时需要一级一级打开 |Boolean |否 |false |true |
|themeColor |主题颜色 |String |否 |#f9ae3d |- |
|cancelColor |取消按钮颜色 |String |否 |#757575 |- |
|titleColor |标题颜色 |String |否 |#757575 |- |
|border |是否有分割线 |Boolean |否 |false |true |
|checkStrictly|作用于funcMode=checkbox模式下 状态下节点选择完全受控(父子节点选中状态不再关联) |Boolean |否 |false |true |
|checkStrictlyModel|作用于funcMode=checkbox模式下父子节点关联模式strong:强关联不再受限节点的disabled控制weak弱关联节点关联受disabled控制 |String |是 |weak |strong |
|showHalfCheckedTips|作用于funcMode=checkbox模式下 checkStrictly为false的状态下生效父子节点选中状态不再关联是否展示半选提示 |Boolean |否 |false |true |
|ifSearch| 筛选search模式 |Boolean |否 |true |false |
|searchModel| 搜索模式配置 depHighlight: 从属高亮显示层级并高亮显示common: 一般remote: 远程 |String |否 |common |depHighlight |
|showAuxiliaryLine| 是否打开辅助线 |Boolean |否 |false |true |
|loadData| 异步加载函数 (node):Promise([childData]) => {} // demo有说明 |Function |否 |- |- |
|height| 只在uiMode=popup时生效弹层容器的高度默认是500 |Number |否 |500 |- |
|changeVerify|作用于funcMode=display模式下 验证函数 (current as any, chooseList as any []):String => {} // 验证函数会把当前控件的选择值作为参数返给函数体demo有说明 |Function |否 |- |- |
|expandedKeys| (Controlled) Specifies the keys of the expanded treeNodes 展开配置项,格式为[valueKey] |Array |否 |[] |- |
|expandedMode| 展开模式配置: common: 一般模式singe: 单一模式; |String |否 |common |singe |
# Event 事件
|事件名 |说明 |类型 |回调参数 |
|---- |---- |---- |---- |
|confirm|菜单收起时返回的筛选结果 |emit |array |
|clear|点击清除按钮时触发 |emit |- |
|cancel|关闭弹层和点击取消时触发 |emit |- |
|change|选项改变时触发 |emit |array |
## Slot 插槽
|名称 |说明 |参数 |
|---- |---- |---- |
|label |label插槽 |data(当前项对于treeData里面的数据) |
|topBar |topBar插槽 |----滚动区域顶部topBar插槽 |
|bottomBar |bottomBar插槽 |----滚动区域底部bottomBar插槽 |
|fixedBottomBar |fixedBottomBar插槽 |----固定在页面的底部使用fixed进行定位 |
|empty |empty插槽 |----数据为空的插槽 |

216
utils/gcoord.js Normal file
View File

@ -0,0 +1,216 @@
/* @preserve
* gcoord 0.2.2, geographic coordinate library
* Copyright (c) 2019 Jiulong Hu <me@hujiulong.com>
*/
!function (e, t) {
"object" == typeof exports && "undefined" != typeof module ? t(exports) : "function" == typeof define && define.amd ? define(["exports"], t) : t(e.gcoord = {})
}(this, function (e) {
"use strict";
var t = "WGS84", r = t, n = t, o = "GCJ02", a = o, i = "BD09", u = i, f = i, c = i, s = "BD09MC", l = s,
M = "EPSG3857", g = M, h = M, v = M, d = M;
function m(e) {
throw new Error(e)
}
function G(e) {
return !isNaN(e) && null !== e && !S(e)
}
function S(e) {
return !!e && "[object Array]" === Object.prototype.toString.call(e)
}
function P() {
for (var o = [], e = 0; e < arguments.length; e++) o[e] = arguments[e];
var a = o.length - 1;
return function () {
for (var e = [], t = 0; t < arguments.length; t++) e[t] = arguments[t];
for (var r = a, n = o[a].apply(null, e); r--;) n = o[r].call(null, n);
return n
}
}
var b = Math.sin, y = Math.cos, p = Math.sqrt, B = Math.abs, D = Math.PI, C = 6378245, E = .006693421622965823;
function W(e) {
var t = e[0], r = e[1];
if (!J(t, r)) return [t, r];
for (var n = [t, r], o = n[0], a = n[1], i = x([o, a]), u = i[0] - t, f = i[1] - r; 1e-6 < B(u) || 1e-6 < B(f);) u = (i = x([o -= u, a -= f]))[0] - t, f = i[1] - r;
return [o, a]
}
function x(e) {
var t = e[0], r = e[1];
if (!J(t, r)) return [t, r];
var n = function (e, t) {
var r = function (e, t) {
var r = 300 + e + 2 * t + .1 * e * e + .1 * e * t + .1 * p(B(e));
return r += 2 * (20 * b(6 * e * D) + 20 * b(2 * e * D)) / 3, r += 2 * (20 * b(e * D) + 40 * b(e / 3 * D)) / 3, r += 2 * (150 * b(e / 12 * D) + 300 * b(e / 30 * D)) / 3
}(e - 105, t - 35), n = function (e, t) {
var r = 2 * e - 100 + 3 * t + .2 * t * t + .1 * e * t + .2 * p(B(e));
return r += 2 * (20 * b(6 * e * D) + 20 * b(2 * e * D)) / 3, r += 2 * (20 * b(t * D) + 40 * b(t / 3 * D)) / 3, r += 2 * (160 * b(t / 12 * D) + 320 * b(t * D / 30)) / 3
}(e - 105, t - 35), o = t / 180 * D, a = b(o), i = p(a = 1 - E * a * a);
return [r = 180 * r / (C / i * y(o) * D), n = 180 * n / (C * (1 - E) / (a * i) * D)]
}(t, r);
return [t + n[0], r + n[1]]
}
function J(e, t) {
return 72.004 <= e && e <= 137.8347 && .8293 <= t && t <= 55.8271
}
var k = Math.sin, L = Math.cos, j = Math.atan2, I = Math.sqrt, q = 3e3 * Math.PI / 180;
function w(e) {
var t = e[0] - .0065, r = e[1] - .006, n = I(t * t + r * r) - 2e-5 * k(r * q), o = j(r, t) - 3e-6 * L(t * q);
return [n * L(o), n * k(o)]
}
function N(e) {
var t = e[0], r = e[1], n = I(t * t + r * r) + 2e-5 * k(r * q), o = j(r, t) + 3e-6 * L(t * q);
return [n * L(o) + .0065, n * k(o) + .006]
}
var O = 180 / Math.PI, A = Math.PI / 180, F = 6378137, _ = 20037508.342789244;
function z(e) {
return [e[0] * O / F, (.5 * Math.PI - 2 * Math.atan(Math.exp(-e[1] / F))) * O]
}
function T(e) {
var t = Math.abs(e[0]) <= 180 ? e[0] : e[0] - 360 * (e[0] < 0 ? -1 : 1),
r = [F * t * A, F * Math.log(Math.tan(.25 * Math.PI + .5 * e[1] * A))];
return r[0] > _ && (r[0] = _), r[0] < -_ && (r[0] = -_), r[1] > _ && (r[1] = _), r[1] < -_ && (r[1] = -_), r
}
var U = Math.abs, H = Math.pow, K = [12890594.86, 8362377.87, 5591021, 3481989.83, 1678043.12, 0],
Q = [75, 60, 45, 30, 15, 0],
R = [[1.410526172116255e-8, 898305509648872e-20, -1.9939833816331, 200.9824383106796, -187.2403703815547, 91.6087516669843, -23.38765649603339, 2.57121317296198, -.03801003308653, 17337981.2], [-7.435856389565537e-9, 8983055097726239e-21, -.78625201886289, 96.32687599759846, -1.85204757529826, -59.36935905485877, 47.40033549296737, -16.50741931063887, 2.28786674699375, 10260144.86], [-3.030883460898826e-8, 898305509983578e-20, .30071316287616, 59.74293618442277, 7.357984074871, -25.38371002664745, 13.45380521110908, -3.29883767235584, .32710905363475, 6856817.37], [-1.981981304930552e-8, 8983055099779535e-21, .03278182852591, 40.31678527705744, .65659298677277, -4.44255534477492, .85341911805263, .12923347998204, -.04625736007561, 4482777.06], [3.09191371068437e-9, 8983055096812155e-21, 6995724062e-14, 23.10934304144901, -.00023663490511, -.6321817810242, -.00663494467273, .03430082397953, -.00466043876332, 2555164.4], [2.890871144776878e-9, 8983055095805407e-21, -3.068298e-8, 7.47137025468032, -353937994e-14, -.02145144861037, -1234426596e-14, .00010322952773, -323890364e-14, 826088.5]],
V = [[-.0015702102444, 111320.7020616939, 0x60e374c3105a3, -0x24bb4115e2e164, 0x5cc55543bb0ae8, -0x7ce070193f3784, 0x5e7ca61ddf8150, -0x261a578d8b24d0, 0x665d60f3742ca, 82.5], [.0008277824516172526, 111320.7020463578, 647795574.6671607, -4082003173.641316, 10774905663.51142, -15171875531.51559, 12053065338.62167, -5124939663.577472, 913311935.9512032, 67.5], [.00337398766765, 111320.7020202162, 4481351.045890365, -23393751.19931662, 79682215.47186455, -115964993.2797253, 97236711.15602145, -43661946.33752821, 8477230.501135234, 52.5], [.00220636496208, 111320.7020209128, 51751.86112841131, 3796837.749470245, 992013.7397791013, -1221952.21711287, 1340652.697009075, -620943.6990984312, 144416.9293806241, 37.5], [-.0003441963504368392, 111320.7020576856, 278.2353980772752, 2485758.690035394, 6070.750963243378, 54821.18345352118, 9540.606633304236, -2710.55326746645, 1405.483844121726, 22.5], [-.0003218135878613132, 111320.7020701615, .00369383431289, 823725.6402795718, .46104986909093, 2351.343141331292, 1.58060784298199, 8.77738589078284, .37238884252424, 7.45]];
function X(e, t, r) {
var n = U(t) / r[9], o = r[0] + r[1] * U(e),
a = r[2] + r[3] * n + r[4] * H(n, 2) + r[5] * H(n, 3) + r[6] * H(n, 4) + r[7] * H(n, 5) + r[8] * H(n, 6);
return [o *= e < 0 ? -1 : 1, a *= t < 0 ? -1 : 1]
}
function Y(e) {
for (var t = e[0], r = e[1], n = [], o = 0; o < Q.length; o++) if (U(r) > Q[o]) {
n = V[o];
break
}
return X(t, r, n)
}
function Z(e) {
for (var t = e[0], r = e[1], n = [], o = 0; o < K.length; o++) if (K[o] <= r) {
n = R[o];
break
}
return X(t, r, n)
}
var $ = {to: {GCJ02: x, BD09: P(N, x), BD09MC: P(Y, N, x), EPSG3857: T}},
ee = {to: {WGS84: W, BD09: N, BD09MC: P(Y, N), EPSG3857: P(T, W)}},
te = {to: {WGS84: P(W, w), GCJ02: w, EPSG3857: P(T, W, w), BD09MC: Y}},
re = {to: {WGS84: z, GCJ02: P(x, z), BD09: P(N, x, z), BD09MC: P(Y, N, x, z)}},
ne = {to: {WGS84: P(W, w, Z), GCJ02: P(w, Z), EPSG3857: P(T, W, w, Z), BD09: Z}},
oe = Object.freeze({WGS84: $, GCJ02: ee, BD09: te, EPSG3857: re, BD09MC: ne});
function ae(e, t, r) {
e || m("coordinate is required"), t || m("original coordinate system is required"), r || m("target coordinate system is required");
var n = oe[t];
if (n || m("original coordinate system is invalid"), t === r) return e;
var o = n.to[r];
o || m("target coordinate system is invalid");
var a = typeof e;
if ("string" != a && "object" != a && m("coordinate must be an geojson or an array of position"), "string" == a) try {
e = JSON.parse(e)
} catch (e) {
m("input is not a legal JSON string")
}
var i = !1;
S(e) && (e.length < 2 && m("position must be at 2 numbers long"), G(e[0]) && G(e[1]) || m("position must contain numbers"), e = e.map(Number), i = !0);
var u = o;
return i ? u(e) : (function e(t, r, n) {
if (void 0 === n && (n = !1), null !== t) for (var o, a, i, u, f, c, s, l, M = 0, g = 0, h = t.type, v = "FeatureCollection" === h, d = "Feature" === h, G = v ? t.features.length : 1, S = 0; S < G; S++) {
f = (l = !!(s = v ? t.features[S].geometry : d ? t.geometry : t) && "GeometryCollection" === s.type) ? s.geometries.length : 1;
for (var P = 0; P < f; P++) {
var b = 0, y = 0;
if (null !== (u = l ? s.geometries[P] : s)) {
var p = u.type;
switch (M = !n || "Polygon" !== p && "MultiPolygon" !== p ? 0 : 1, p) {
case null:
break;
case"Point":
if (!1 === r(c = u.coordinates, g, S, b, y)) return !1;
g++, b++;
break;
case"LineString":
case"MultiPoint":
for (c = u.coordinates, o = 0; o < c.length; o++) {
if (!1 === r(c[o], g, S, b, y)) return !1;
g++, "MultiPoint" === p && b++
}
"LineString" === p && b++;
break;
case"Polygon":
case"MultiLineString":
for (c = u.coordinates, o = 0; o < c.length; o++) {
for (a = 0; a < c[o].length - M; a++) {
if (!1 === r(c[o][a], g, S, b, y)) return !1;
g++
}
"MultiLineString" === p && b++, "Polygon" === p && y++
}
"Polygon" === p && b++;
break;
case"MultiPolygon":
for (c = u.coordinates, o = 0; o < c.length; o++) {
for (a = y = 0; a < c[o].length; a++) {
for (i = 0; i < c[o][a].length - M; i++) {
if (!1 === r(c[o][a][i], g, S, b, y)) return !1;
g++
}
y++
}
b++
}
break;
case"GeometryCollection":
for (o = 0; o < u.geometries.length; o++) if (!1 === e(u.geometries[o], r, n)) return !1;
break;
default:
m("Unknown Geometry Type")
}
}
}
}
}(e, function (e) {
var t;
t = u(e), e[0] = t[0], e[1] = t[1]
}), e)
}
var ie = {
WGS84: t,
WGS1984: r,
EPSG4326: n,
GCJ02: o,
AMap: a,
BD09: i,
BD09LL: u,
Baidu: f,
BMap: c,
BD09MC: s,
BD09Meter: l,
EPSG3857: M,
EPSG900913: g,
EPSG102100: h,
WebMercator: v,
WM: d,
transform: ae
};
e.WGS84 = t, e.WGS1984 = r, e.EPSG4326 = n, e.GCJ02 = o, e.AMap = a, e.BD09 = i, e.BD09LL = u, e.Baidu = f, e.BMap = c, e.BD09MC = s, e.BD09Meter = l, e.EPSG3857 = M, e.EPSG900913 = g, e.EPSG102100 = h, e.WebMercator = v, e.WM = d, e.transform = ae, e.default = ie, Object.defineProperty(e, "__esModule", {value: !0})
});

View File

@ -0,0 +1,287 @@
import {
getCurrentNextOperation, getTaskInfo,
setOtherSecurityMeasuresSave,
setSecurityMeasuresSave,
setTaskFile,
setTaskSave
} from "@/api";
import {addFormInfo} from "../api";
// 处理表单数据
// TYPE 0 纯文本 1 图片 2 视频 3 divider标签 4 动态添加 5 签字
const processFormData = async (formData, formItems) => {
const form = []
for (let i = 0; i < formItems.length; i++) {
const formItem = formItems[i]
const obj = {
ITEM: formItem.name || '',
ITEM_NAME: formItem.key_name || '',
ITEM_VALUE: formData[formItem.key_name] || '',
FK_NAME: formItem.key_id || '',
FK_VALUE: formData[formItem.key_id] || '',
TYPE: formItem.type,
SORT: i + 1
}
if (formItem.type === 1 || formItem.type === 2) {
if (typeof formData[formItem.key_name] === 'object') {
const currentItem = uni.$u.deepClone(formData[formItem.key_name])
const codeList = []
for (let j = 0; j < currentItem.length; j++) {
const {CODE} = await setTaskFile({formData: {type: 0}, name: 'files', filePath: currentItem[j].url})
codeList.push(CODE)
}
obj.ITEM_VALUE = ''
obj.picList = codeList
} else {
throw Error('图片和视频只支持数组')
}
}
if (formItem.type === 4) {
if (typeof formData[formItem.key_name] === 'object') {
const currentItem = uni.$u.deepClone(formData[formItem.key_name])
const itemList = []
for (let j = 0; j < currentItem.length; j++) {
itemList.push(await processFormData(currentItem[j], formItem.listStructure))
}
obj.ITEM_VALUE = ''
obj.list = itemList
} else {
throw Error('动态表单只支持数组')
}
}
if (formItem.type === 5) {
if (typeof formData[formItem.key_name] === 'string') {
const {CODE} = await setTaskFile({formData: {type: 0}, name: 'files', filePath: formData[formItem.key_name]})
obj.ITEM_VALUE = CODE
} else {
throw Error('签字只支持字符串')
}
}
form.push(obj)
}
return form
}
// 提交表单基础信息
export const setSubmitForm = async ({form, formItems, TYPE, CORP_ID, EW_RU_TASK_ID}) => {
const {taskIds} = await setTaskSave({
data: [{form: await processFormData(form, formItems),task:{EW_RU_TASK_ID:EW_RU_TASK_ID}}],
TYPE,
postMethod: 'application/json',
})
await resolveNextOperation({
EW_RU_TASK_ID: taskIds[0],
CORP_ID,
TYPE
})
}
// 处理选择人员数据
const processSelectedPersonnelData = (formData, list) => {
const form = []
for (let i = 0; i < list.length; i++) {
for (let j = 0; j < list[i].list.length; j++) {
const item = list[i].list[j]
const link = item.key_id.substring(item.key_id.indexOf('&&') + 2)
form.push({
TYPE_NAME: item.value,
TYPE: item.code,
TYPE_DESCRIBE: item.desc,
DEPARTMENT_ID: item.type === '1' ? formData[item.key_id] : '',
DEPARTMENT_NAME: item.type === '1' ? formData[item.key_name] : '',
USER_ID: item.type === '0' ? formData[item.key_id] : '',
USER_NAME: item.type === '0' ? formData[item.key_name] : '',
isDepartment: item.type,
link: list[i].multiple === '1' ? link : '',
})
}
}
return form
}
// 提交人员信息
export const setPersonnelForm = async ({form, list, taskId, CORP_ID, TYPE,vernier}) => {
await addFormInfo({
job: processSelectedPersonnelData(form,list),
EW_RU_TASK_ID: taskId,
TYPE,
postMethod: 'application/json'
}
)
await resolveNextOperation({
EW_RU_TASK_ID: taskId,
CORP_ID,
TYPE,
vernier
})
}
// 提交安全措施
export const setSecurityMeasures = async ({questionnaires, questionnaireInfo, taskId, EW_RU_JOB_ID, CORP_ID, TYPE, vernier}) => {
await setSecurityMeasuresSave({
questionnaires: [{items: questionnaires, questionnaire: questionnaireInfo}],
EW_RU_JOB_ID,
EW_RU_TASK_ID: taskId,
postMethod: 'application/json',
})
await resolveNextOperation({
EW_RU_TASK_ID: taskId,
CORP_ID,
TYPE,
EW_RU_JOB_ID,
vernier
})
}
// 提交其它安全措施
export const setOtherSecurityMeasures = async ({value, taskId, EW_RU_JOB_ID, CORP_ID, TYPE, vernier}) => {
const ADDITIONAL_COMMENT = value.map(item => item.value)
await setOtherSecurityMeasuresSave({
ADDITIONAL_COMMENT,
EW_RU_JOB_ID,
EW_RU_TASK_ID: taskId,
postMethod: 'application/json',
})
await resolveNextOperation({
EW_RU_TASK_ID: taskId,
CORP_ID,
TYPE,
EW_RU_JOB_ID,
vernier
})
}
// 结束当前操作人流程提交
const endCurrentPersonnelTechnologicalProcess = async ({EW_RU_TASK_ID}) => {
await setTaskSave({
COMPLETE_FLAG: '1',
data: [{task: {EW_RU_TASK_ID}}],
postMethod: 'application/json',
})
}
// 在审批过程中指定下一节点人
export const addFlowInfo = async ({form,list, taskId,EW_RU_JOB_ID, TYPE,CORP_ID, vernier}) => {
// 在审批过程中添加节点信息
await addFormInfo({
job: processSelectedPersonnelData(form,list),
EW_RU_TASK_ID: taskId,
TYPE,
postMethod: 'application/json'
}
)
// 结束后续流程
await resolveNextOperation({
EW_RU_TASK_ID: taskId,
CORP_ID,
TYPE,
EW_RU_JOB_ID,
vernier
})
}
// 决定下一步操作
// EW_RU_TASK_ID当前任务id
// CORP_ID选择的企业id
// TYPE作业类型
// EW_RU_JOB_ID当前操作节点的人员id
// isLastStep是否还有下一步纯前端确定不去后台获取
export const resolveNextOperation = async ({EW_RU_TASK_ID = '', CORP_ID = '', TYPE = '', EW_RU_JOB_ID = '',vernier = ''}, isLastStep = true) => {
let stepNum = 0
if (isLastStep) {
const {info} = await getCurrentNextOperation({EW_RU_TASK_ID, EW_RU_JOB_ID, VERNIER: vernier})
// 选人
if (info.chooseNextFlag === '1') {
uni.navigateTo({
url: '/pages/eight_assignments/select_review_personnel?vernier='+ info.vernier,
success: ({eventChannel}) => {
eventChannel.emit('nextNodes', {
nextNodes: info.nextNodes,
initFlag: info.initFlag,
taskId: EW_RU_TASK_ID,
EW_RU_JOB_ID: EW_RU_JOB_ID,
CORP_ID,
TYPE
})
}
})
return
}
// 填写安全措施
if (info.completeFlag === '1') {
uni.navigateTo({
url: '/pages/eight_assignments/security_measures?vernier=' + info.vernier,
success: ({eventChannel}) => {
eventChannel.emit('questionnaire', {
questionnaire: info.questionnaire[0],
taskId: EW_RU_TASK_ID,
EW_RU_JOB_ID,
TYPE,
CORP_ID,
vernier: info.vernier
})
}
})
return
}
// 填写其它安全措施
if (info.canAddFlag === '1') {
uni.$u.route({
url: '/pages/eight_assignments/other_security_measures',
params: {taskId: EW_RU_TASK_ID, EW_RU_JOB_ID, TYPE, CORP_ID,vernier: info.vernier}
})
return
}
// 签字
if (info.submitFlag === '1') {
uni.$u.route({
url: '/pages/eight_assignments/sign',
params: {taskId: EW_RU_TASK_ID, EW_RU_JOB_ID, TYPE,vernier: info.vernier}
})
return
}
// 流程特殊权限校验
if (info.otherFlag !== null && info.otherFlag.redirectFlag === '1') {
uni.$u.route({
url: info.otherFlag.url,
params: {taskId: EW_RU_TASK_ID, EW_RU_JOB_ID, TYPE,vernier: info.vernier}
})
return
}
// 根据后端返回的页数退回到指定页面
stepNum = info.stepNum
}
uni.$u.toast('提交成功')
setTimeout(() => {
uni.navigateBack(
{
delta: stepNum
}
)
}, 1500)
}
export const getData = async (taskId) => {
const resData = await getTaskInfo({ EW_RU_TASK_ID: taskId });
if (resData.list.fromTrans && resData.list.fromTrans.length > 0) {
const form = {};
resData.list.fromTrans.forEach((item) => {
form[item.ITEM_NAME] = item.ITEM_VALUE;
if (item.FK_NAME) {
form[item.FK_NAME] = item.FK_VALUE;
}
if (item.TYPE === 1) {
form[item.ITEM_NAME] = item.list.map((item) => ({
url: this.$filePath + item.ITEM_VALUE,
}));
}
if (item.TYPE === 4) {
form[item.ITEM_NAME] = [];
for (let i = 0; i < item.list.length; i++) {
form[item.ITEM_NAME].push({});
for (let j = 0; j < item.list[i].list.length; j++) {
form[item.ITEM_NAME][i][item.list[i].list[j].ITEM_NAME] =
item.list[i].list[j].ITEM_VALUE;
}
}
}
if (item.TYPE === 5) {
form[item.ITEM_NAME] = this.$filePath + item.ITEM_VALUE;
}
});
return form;
}
};

27
utils/tools.js Normal file
View File

@ -0,0 +1,27 @@
export function formatDate(date, fmt) {
if(null != JSON.stringify(date) && 'null' != JSON.stringify(date) && undefined != JSON.stringify(date) && 'undefined' != JSON.stringify(date) && JSON.stringify(date) != '' && JSON.stringify(date).length > 0){
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
}
let o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds()
}
for (let k in o) {
if (new RegExp(`(${k})`).test(fmt)) {
let str = o[k] + ''
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str))
}
}
return fmt
} else {
return ''
}
}
function padLeftZero(str) {
return ('00' + str).substr(str.length)
}

15
utils/useFormValidate.js Normal file
View File

@ -0,0 +1,15 @@
const useFormValidate = (ref, message = "请补全必填项!") => {
return new Promise((resolve) => {
ref.value
.validate()
.then(() => {
resolve(true);
})
.catch(() => {
// eslint-disable-next-line prefer-promise-reject-errors
resolve(false);
uni.$u.toast(message);
});
});
};
export default useFormValidate;