| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538 |
- <template>
- <tr v-if="showTabGridTitleFields" height="40px" :style="{ 'background-color': warningColor }" :class="{ 'warning': isSelected }">
- <td rowspan="2" class="sticky-col" style="text-align: center;">{{ serialNumber }}</td>
- <td rowspan="2" class="text-center sticky-col" style="left:50px">
- <input v-model="isSelected" autocomplete="off" type="checkbox" @click="clickModelData(modelData)" />
- </td>
- <td v-if="isShowEdit == undefined || isShowEdit" rowspan="2" class="sticky-col" style="left:80px">
- <template v-if="showEditButton">
- <span class="operation-delete" aria-hidden="true" @click="editRecord">
- <i class="fa" :class="{ 'fa-pencil': !modelData.editMode, 'fa-check': modelData.editMode }" />
- </span>
- <span class="operation-edit" aria-hidden="true" @click="deleteRecord">
- <i class="fa fa-remove" />
- </span>
- </template>
- </td>
- <td :colspan="tabGridFields.length + 1" style="text-align: left; padding-left: 2rem;">
- <a-space align="center">
- <div v-for="tabGridTitleField in tabGridTitleFields" :key="tabGridTitleField.fieldName" @click="clickRecord">
- <a-space align="center">
- <span style="font-weight: normal;">{{ Language.getDisplayNameTrl($i18n.locale, tabGridTitleField) }}</span>
- <CellTextItem
- v-if="!modelData.editMode" :grid-field-item="tabGridTitleField" :model-data="modelData"
- :class-name="className" style="display: inline-block; font-weight: normal; padding-top: 3px;"
- @execute-callout="executeCallout(tabGridTitleField)"
- />
- <CellItem
- v-else :ref="'cellItem' + index" :scroll-object="scrollObject" :field-item="tabGridTitleField"
- :model-data="modelData" :parent-model-data="parentModelData" :class-name="className" :window-no="windowNo"
- :tab-index="tabIndex" style="display: inline-block; min-width: 200px;"
- :class="{ 'table-cell-searchwidget': fieldUtil.isSearchType(tabGridTitleField) }"
- @value-changed="valueChanged($event, tabGridTitleField)"
- @execute-callout="executeCallout(tabGridTitleField)"
- />
- </a-space>
- </div>
- </a-space>
- </td>
- </tr>
- <tr :style="{ 'background-color': warningColor }" :class="{ 'warning': isSelected }" height="40px">
- <template v-if="!showTabGridTitleFields">
- <td class="text-center sticky-col">{{ serialNumber }}</td>
- <td class="text-center sticky-col" style="left:50px">
- <input v-model="isSelected" autocomplete="off" type="checkbox" @click="clickModelData(modelData)" />
- </td>
- <td v-if="isShowEdit == undefined || isShowEdit" class="sticky-col" style="left:80px">
- <template v-if="showEditButton">
- <span class="operation-delete" aria-hidden="true" @click="editRecord">
- <i class="fa" :class="{ 'fa-pencil': !modelData.editMode, 'fa-check': modelData.editMode }" />
- </span>
- <span class="operation-edit" aria-hidden="true" @click="deleteRecord">
- <i class="fa fa-remove" />
- </span>
- </template>
- </td>
- </template>
- <template
- v-for="(gridFieldItem, index) in tabGridFields"
- :key="'TabGridField_' + gridFieldItem.fieldName + '_' + index"
- >
- <template
- v-if="gridFieldItem.groupNames == null || gridFieldItem.groupNames.length == 0 || (nowTab != null && (gridFieldItem.groupNames.indexOf(nowTab) >= 0))"
- >
- <td v-if="!modelData.editMode" v-show="gridFieldItem.visible" @click="clickRecord">
- <div>
- <CellTextItem
- ref="cellTextItem"
- :grid-field-item="gridFieldItem" :model-data="modelData" :class-name="className"
- :simple-filter-params="simpleFilterParams" :complex-filter-params="complexFilterParams"
- :model-datas="modelDatas" :js-url="jsUrl"
- :index="index" @execute-callout="executeCallout(gridFieldItem)" @delete-record="deleteRecord"
- @refresh-datas="refreshDatas"
- @edit-record="editRecord"
- @read-record="readRecord"
- />
- </div>
- </td>
- <td
- v-else v-show="gridFieldItem.visible"
- :class="{ 'table-cell-searchwidget': fieldUtil.isSearchType(gridFieldItem) }" @click="clickRecord"
- >
- <CellItem
- :ref="'cellItem' + index" :scroll-object="scrollObject" :field-item="gridFieldItem"
- :model-data="modelData" :parent-model-data="parentModelData" :class-name="className" :window-no="windowNo"
- :tab-index="tabIndex" @value-changed="valueChanged($event, gridFieldItem)"
- @execute-callout="executeCallout(gridFieldItem)"
- />
- </td>
- </template>
- </template>
- </tr>
- <Modal v-model:show="modal" :full="true">
- <ProcessReportResultPreview
- v-if="
- processReportResult != null &&
- (processReportResult.reportResults != null ||
- processReportResult.processResult != null)
- "
- :process-report-result="processReportResult"
- :pdf-only="false"
- :excel-only="false"
- />
- <template #header>
- {{ $t("lang.tabButton.executeResult") }}
- </template>
- </Modal>
- <Modal
- v-model:show="titleModal"
- :show-canel-button="false"
- :show-ok-button="false"
- >
- <template #header>
- {{ tabButtonModel.tipsTitle }}
- </template>
- {{ tabButtonModel.tipsContent }}
- <template #footer>
- <button type="button" class="btn btn-default" @click="titleModalClose">
- {{ $t("lang.tabButton.cancel") }}
- </button>
- <button type="primary" class="btn btn-default" @click="executeProcess">
- 确认
- </button>
- </template>
- </Modal>
- </template>
- <script>
- import WindowClientUtil from '../../resource/dictionary/WindowClientUtil.js';
- import FieldUtil from '../../resource/dictionary/FieldUtil.js';
- import CellItem from './CellItem.vue';
- import CellTextItem from './CellTextItem.vue';
- import Common from '../../common/Common.js';
- import Context from '../common/Context.js';
- import JsUtil from '../../common/JsUtil.js';
- import Language from '../../common/Language.js';
- import { Notify} from 'pc-component-v3';
- export default {
- components: {
- CellItem, CellTextItem,
- },
- props: {
- windowNo: {
- type: String,
- default: null,
- },
- tabIndex: {
- type: Number,
- default: null,
- },
- /** 表格标题字段 */
- tabGridTitleFields: {
- type: Array,
- default: function () {
- return null;
- },
- },
- /** 表格字段 */
- tabGridFields: {
- type: Array,
- default: function () {
- return null;
- },
- },
- modelData: {
- type: Object,
- default: function () {
- return null;
- },
- },
- parentModelData: {
- type: Object,
- default: function () {
- return null;
- },
- },
- className: {
- type: String,
- default: null,
- },
- isShowEdit: {
- type: Boolean,
- default: false,
- },
- scrollObject: {
- type: Object,
- default: null,
- },
- serialNumber: {
- type: Number,
- default: null,
- },
- jsUrl: {
- type: String,
- default: null,
- },
- simpleFilterParams: {
- type: String,
- default: null,
- },
- complexFilterParams: {
- type: Array,
- default: () => {
- return [];
- },
- },
- modelDatas: {
- type: Array,
- default: () => {
- return [];
- },
- },
- // 当前的页签
- nowTab: {
- type: String,
- default: '',
- },
- },
- emits: ['deleteRecord', 'editRecord', 'readRecord', 'clickModelData', 'executeCallout', 'valueChanged', 'refreshDatas'],
- data: function () {
- return {
- tabGridFields1: this.tabGridFields,
- lastClickTime: 0,
- fieldUtil: FieldUtil,
- Language: Language,
- processReportResult: {},
- modal: false,
- titleModal: false,
- tabButtonModel:{},
- };
- },
- computed: {
- modelDataCopy: function () {
- return JSON.parse(JSON.stringify(this.modelData));
- },
- isSelected: {
- get: function () {
- return this.modelData.select == true;
- },
- set: function () {
- },
- },
- /**
- * 获取报警颜色
- */
- warningColor: function () {
- if (this.modelData.data['warningColor'] != undefined && this.modelData.data['warningColor'].displayValue.length > 0) {
- return this.modelData.data['warningColor'].displayValue[0];
- } else {
- return 'none';
- }
- },
- /**
- * 是否显示编辑按钮
- */
- showEditButton: function () {
- if (this.isShowEdit == undefined || this.isShowEdit) {
- if (this.modelData != undefined
- && this.modelData.data != undefined
- && this.modelData.data['documentStatus'] != undefined
- && this.modelData.data['documentStatus'].displayValue != undefined
- && (this.modelData.data['documentStatus'].displayValue[0] == 'APPROVED'
- || this.modelData.data['documentStatus'].displayValue[0] == 'REJECTED'
- || this.modelData.data['documentStatus'].displayValue[0] == 'PROCESSING')) {
- return false;
- }
- return true;
- }
- return false;
- },
- /**
- * 是否显示标题行
- */
- showTabGridTitleFields: function () {
- if (this.tabGridTitleFields == null || this.tabGridTitleFields.length == 0) {
- return false;
- } else {
- return true;
- }
- },
- },
- watch: {
- 'parentModelData': {
- deep: true,
- handler(curVal, oldVal) {
- var _self = this;
- for (let index = 0; index < _self.tabGridFields.length; index++) {
- const tabGridField = _self.tabGridFields[index];
- let oldTabGridFieldString = JSON.stringify(tabGridField);
- const columnShowLogical = tabGridField.columnShowLogical;
- if (columnShowLogical != null && columnShowLogical.length > 0) {
- let functionName = tabGridField.fieldName.replace('.', '_') + '_showLogical';
- let executeFunction = function () {
- let parentCtx = new _self.getContext(_self.parentModelData);
- try {
- tabGridField.visible = _self[functionName](null, parentCtx.modelData);
- } catch (e) {
- console.error('js代码 %s 执行异常 %o', columnShowLogical, e);
- tabGridField.visible = true;
- }
- };
- if (_self[functionName] == null) {
- // 执行服务端的脚本
- const jsUrl = _self.jsUrl;
- if (jsUrl == null || jsUrl == undefined) {
- Notify.error('数据字典定义异常', '【' + tabGridField.fieldName + '】列显示逻辑的JS文件不存在,请联系管理员检查数据字典是否JS文件。', false);
- return;
- }
- let promise = JsUtil.dynamicLoadJsFunction(jsUrl, columnShowLogical);
- promise.then(dynamicFunction => {
- let targetFunction = dynamicFunction;
- if (targetFunction == null) {
- Notify.error('数据字典定义异常', '【' + tabGridField.fieldName + '】列显示逻辑定义异常,请联系管理员检查数据字典的定义。', false);
- return;
- }
- _self[functionName] = targetFunction;
- executeFunction();
- }, errorData => {
- console.error(errorData);
- });
- } else {
- executeFunction();
- }
- } else {
- tabGridField.visible = true;
- }
- let newTabGridFieldString = JSON.stringify(tabGridField);
- // bug fixed by jack 2022-01-17
- // 只有当数据发生改变以后,才重新设置数据,解决当子表数据量很打的时候,输入卡顿的问题。
- if (oldTabGridFieldString != newTabGridFieldString) {
- _self.tabGridFields[index] = tabGridField;
- }
- }
- console.log(_self.tabGridFields);
- },
- },
- },
- methods: {
- /**
- * 获取Context
- */
- getContext: Context,
- deleteRecord: function () {
- this.$emit('deleteRecord');
- },
- refreshDatas: function(){
- this.$emit('refreshDatas');
- },
- buttonClick: function(){
- Notify.error('提示', '暂不支持该组件', false);
- },
- // 改变表格行元素的编辑状态
- editRecord: function (modelData, index) {
- this.$emit('editRecord', modelData, index);
- },
- readRecord: function (isRead, modelData, index) {
- this.$emit('readRecord', isRead, modelData, index);
- },
- clickModelData: function () {
- this.$emit('clickModelData');
- this.$emit('readRecord', false);
- },
- // 值发生改变
- valueChanged: function (newFieldValue, gridFieldItem) {
- var valueObject = {
- newFieldValue: newFieldValue,
- gridFieldItem: gridFieldItem,
- };
- this.$emit('valueChanged', valueObject);
- this.refreshSelectField(this.modelData, gridFieldItem.fieldName);
- },
- // 刷新下拉选择框keyValues
- refreshSelectField: function (modelData, valueChangedFieldName) {
- var _self = this;
- if (_self.tabGridFields1) {
- _self.tabGridFields1.forEach(function (item) {
- if (item.displayType == 'ListBoxEditor') {
- var name1 = ':' + valueChangedFieldName;
- var showLogical = item.showLogical;
- if (showLogical != undefined && showLogical.indexOf(name1) >= 0) {
- refresh(item);
- }
- }
- });
- }
- function refresh(item) {
- var obj = {
- fieldId: item.id,
- modelData: modelData,
- };
- console.log('GridBody RefreshField');
- $.ajax({
- url: Common.getApiURL('FieldResource/refreshField'),
- async: false,
- dataType: 'json',
- type: 'post',
- data: JSON.stringify(obj),
- contentType: 'application/json',
- beforeSend: function (request) {
- Common.addTokenToRequest(request);
- },
- success: function (data) {
- if (data != undefined) {
- item.keyValues = data.keyValues;
- }
- },
- error: function (XMLHttpRequest, textStatus, errorThrown) {
- Common.processException(XMLHttpRequest, textStatus, errorThrown);
- },
- });
- }
- },
- performValidate: function () {
- var validateResults = [];
- for (var i = 0; i < this.tabGridFields1.length; i++) {
- let cellId = 'cellItem' + i;
- if (this.$refs[cellId] && this.$refs[cellId][0]) {
- var result = this.$refs[cellId][0].performValidate();
- validateResults.push(result);
- }
- }
- return validateResults;
- },
- clickRecord: function () {
- // 暂时取消双击打开
- var now = new Date().getTime();
- // if (now - this.lastClickTime < 500) {
- // this.readRecord();
- // }
- // this.lastClickTime = now;
- },
- /**
- * 执行Callout
- */
- executeCallout: function (gridFieldItem) {
- this.$emit('executeCallout', gridFieldItem);
- },
-
- /**
- * 获取字符串的哈希值
- * @param input
- */
- getHash: function (input) {
- let hash = 0;
- if (input.length === 0) {
- return hash;
- }
- for (let i = 0; i < input.length; i++) {
- const char = input.charCodeAt(i);
- hash = (hash << 5) - hash + char;
- hash = hash & hash; // 确保返回值是一个32位有符号整数
- }
- return Math.abs(hash).toString();
- },
-
- },
- };
- </script>
- <style scoped>
- .table-cell-text {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- text-align: center;
- }
- /** 搜索框,自动提示表格, */
- .table-cell-searchwidget {
- position: relative;
- }
- .text-center {
- text-align: center;
- }
- .warning {
- background-color: #fcf8e3 !important;
- }
- .operation-delete {
- margin-left: 10px;
- margin-right: 5px;
- }
- .operation-edit {
- margin-left: 5px;
- margin-right: 10px;
- }
- /* 固定列 */
- .sticky-col {
- position: -webkit-sticky; /* Safari */
- position: sticky;
- left: 0;
- background: #fafafa;
- z-index: 1; /* 确保固定列在其他内容之上 */
- }
- </style>
|