|
|
@@ -5,7 +5,8 @@
|
|
|
scope: 'all' 人员范围为全部人员,与申请单位/作业单位无关;改用人员选择弹框
|
|
|
(弹框内可按姓名/工号/账号搜索并分页),点击输入框即打开弹框
|
|
|
multiple: true 多选,提交时名称与 id 用逗号连接
|
|
|
- - 部门字段 dept:提交部门名称并附带部门 id
|
|
|
+ - 部门字段 dept:点击输入框打开部门选择弹框(弹框内可按部门名称搜索),提交部门名称并附带部门 id
|
|
|
+ - 作业类型字段 work_type:锁定不可调整,由申请时选择的作业类型自动带出
|
|
|
- 日期字段 date:el-date-picker 日期时间选择
|
|
|
- 子表:可新增/删除行
|
|
|
-->
|
|
|
@@ -48,6 +49,7 @@
|
|
|
<el-input
|
|
|
v-if="field.type === 'text'"
|
|
|
v-model="formData[field.id]"
|
|
|
+ :disabled="isFieldLocked(field)"
|
|
|
:placeholder="field.placeholder || getPlaceholder(field)"
|
|
|
/>
|
|
|
<el-input
|
|
|
@@ -61,6 +63,7 @@
|
|
|
v-else-if="field.type === 'select'"
|
|
|
v-model="formData[field.id]"
|
|
|
:placeholder="field.placeholder || '请选择'"
|
|
|
+ :disabled="isFieldLocked(field)"
|
|
|
clearable
|
|
|
style="width: 100%"
|
|
|
>
|
|
|
@@ -77,17 +80,25 @@
|
|
|
type="datetime"
|
|
|
placeholder="请选择时间"
|
|
|
value-format="yyyy-MM-dd HH:mm:ss"
|
|
|
+ :disabled="isFieldLocked(field)"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
- <dept-select
|
|
|
+ <!-- 部门字段:点击输入框打开部门选择弹框 -->
|
|
|
+ <el-input
|
|
|
v-else-if="field.type === 'dept'"
|
|
|
- v-model="formData[field.id]"
|
|
|
- :init="false"
|
|
|
- :selectList="deptList"
|
|
|
+ class="dept-picker"
|
|
|
+ :value="getDeptDisplay(field)"
|
|
|
+ readonly
|
|
|
:placeholder="field.placeholder || '请选择部门'"
|
|
|
style="width: 100%"
|
|
|
- @changeGroup="onDeptChange(field, $event)"
|
|
|
- />
|
|
|
+ @click.native="onDeptInputClick(field, $event)"
|
|
|
+ >
|
|
|
+ <i
|
|
|
+ v-if="formData[field.id]"
|
|
|
+ class="el-icon-circle-close dept-clear"
|
|
|
+ @click.stop="clearDept(field)"
|
|
|
+ ></i>
|
|
|
+ </el-input>
|
|
|
<!-- 全量人员:点击输入框打开人员选择弹框(单选/多选同一样式) -->
|
|
|
<el-input
|
|
|
v-else-if="field.type === 'person' && field.scope === 'all'"
|
|
|
@@ -205,12 +216,15 @@
|
|
|
:selected-list="dialogSelectedList"
|
|
|
@changeParent="onUserSelected"
|
|
|
/>
|
|
|
+
|
|
|
+ <!-- 部门选择弹框(部门名称搜索 + 部门树) -->
|
|
|
+ <dept-select-dialog ref="deptSelectRef" @changeParent="onDeptSelected" />
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
import PersonSelect from '@/components/CommomSelect/person-select.vue';
|
|
|
- import DeptSelect from '@/components/CommomSelect/dept-select.vue';
|
|
|
+ import DeptSelectDialog from '@/components/CommomSelect/dept-select-dialog.vue';
|
|
|
import UserSelect from '@/components/user-select/user-select.vue';
|
|
|
import FileMain from '@/components/addDoc/index.vue';
|
|
|
import SignCanvas from '@/components/upload/signCanvas.vue';
|
|
|
@@ -218,7 +232,13 @@
|
|
|
import { getTemplateFields } from '../templates';
|
|
|
|
|
|
export default {
|
|
|
- components: { PersonSelect, DeptSelect, UserSelect, FileMain, SignCanvas },
|
|
|
+ components: {
|
|
|
+ PersonSelect,
|
|
|
+ DeptSelectDialog,
|
|
|
+ UserSelect,
|
|
|
+ FileMain,
|
|
|
+ SignCanvas
|
|
|
+ },
|
|
|
props: {
|
|
|
// 模板 schema
|
|
|
template: {
|
|
|
@@ -261,7 +281,9 @@
|
|
|
// 签名文件 id { 字段id: 文件id }
|
|
|
signFileIds: {},
|
|
|
// 当前正在选人的字段
|
|
|
- currentSelectField: null
|
|
|
+ currentSelectField: null,
|
|
|
+ // 当前正在选部门的字段
|
|
|
+ currentDeptField: null
|
|
|
};
|
|
|
},
|
|
|
computed: {
|
|
|
@@ -392,6 +414,11 @@
|
|
|
}
|
|
|
return `请输入${field.label}`;
|
|
|
},
|
|
|
+ // 锁定的字段不允许人工调整:
|
|
|
+ // 作业类型(work_type)由申请时选择的作业类型决定,票面只做展示
|
|
|
+ isFieldLocked(field) {
|
|
|
+ return field.id === 'work_type';
|
|
|
+ },
|
|
|
// 上传、签名字段占满整行,避免控件被压缩
|
|
|
isFullField(field) {
|
|
|
return !!field.full || field.type === 'file' || field.type === 'sign';
|
|
|
@@ -558,10 +585,46 @@
|
|
|
});
|
|
|
this.personList = linked;
|
|
|
},
|
|
|
- // 部门变更
|
|
|
- onDeptChange(field, deptId) {
|
|
|
- const dept = this.deptList.find((item) => item.id === deptId);
|
|
|
- this.setFieldName(field.id, deptId, dept?.name || '');
|
|
|
+ // 部门字段回显文本
|
|
|
+ getDeptDisplay(field) {
|
|
|
+ const value = this.formData[field.id];
|
|
|
+ if (!value) {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
+ return this.getFieldName(field.id, value) || '';
|
|
|
+ },
|
|
|
+ // 点击部门输入框打开部门选择弹框
|
|
|
+ // element-ui 的 el-input 不会向外派发 click 事件,这里用 .native 监听根元素
|
|
|
+ onDeptInputClick(field) {
|
|
|
+ this.openDeptSelect(field);
|
|
|
+ },
|
|
|
+ // 打开部门选择弹框
|
|
|
+ openDeptSelect(field) {
|
|
|
+ this.currentDeptField = field;
|
|
|
+ const value = this.formData[field.id];
|
|
|
+ const current = value
|
|
|
+ ? { id: value, name: this.getFieldName(field.id, value) || '' }
|
|
|
+ : null;
|
|
|
+ // 等当前字段的已选部门同步到弹框后再打开,保证回显正确
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.$refs.deptSelectRef && this.$refs.deptSelectRef.open(current);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 弹框选择结果
|
|
|
+ onDeptSelected(data) {
|
|
|
+ const field = this.currentDeptField;
|
|
|
+ if (!field || !data) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.$set(this.formData, field.id, data.id);
|
|
|
+ this.setFieldName(field.id, data.id, data.name || '');
|
|
|
+ // 部门变更后刷新部门联动的人员候选列表
|
|
|
+ this.loadPersonList(this.getPersonDeptId());
|
|
|
+ },
|
|
|
+ // 清空已选部门
|
|
|
+ clearDept(field) {
|
|
|
+ this.$set(this.formData, field.id, '');
|
|
|
+ this.$set(this.fieldNames, field.id, {});
|
|
|
this.loadPersonList(this.getPersonDeptId());
|
|
|
},
|
|
|
// 人员变更(部门联动字段)
|
|
|
@@ -849,6 +912,22 @@
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
}
|
|
|
+ /* 部门选择输入框:点击打开部门选择弹框 */
|
|
|
+ .dept-picker {
|
|
|
+ ::v-deep .el-input__inner {
|
|
|
+ cursor: pointer;
|
|
|
+ /* 给右侧的清除图标留出空间,避免部门名称被遮挡 */
|
|
|
+ padding-right: 30px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .dept-clear {
|
|
|
+ cursor: pointer;
|
|
|
+ color: #c0c4cc;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ color: #909399;
|
|
|
+ }
|
|
|
+ }
|
|
|
/* 附件上传、手写签名单独占一行 */
|
|
|
.field-upload,
|
|
|
.field-sign {
|