Sfoglia il codice sorgente

4.0.52 修改审批待处理

liuyanpeng 2 anni fa
parent
commit
b9a6b2b0e3

+ 1 - 1
package.json

@@ -1,7 +1,7 @@
 {
   "name": "client-base-v4",
   "description": "Leanwo Prodog Client",
-  "version": "4.0.50",
+  "version": "4.0.52",
   "author": "yangzhijie1488 <yangzhijie1488@163.com>",
   "scripts": {
     "dev": "cross-env webpack serve --config ./webpack.dev.js",

+ 8 - 1
src/App.vue

@@ -23,7 +23,9 @@
       <div :class="{'grid-item-row2-column2' : isShowTopNavigation}">
         <div id="grid-item-center" :class="{'grid-center-container' : isShowTopNavigation}" />
         <div :class="{'center-container-single' : !isShowTopNavigation, 'center-container' : isShowTopNavigation }">
-          <router-view />
+          <a-config-provider :locale="locale">
+            <router-view />
+          </a-config-provider>
         </div>
       </div>
     </div>
@@ -33,6 +35,10 @@
 <script>
 import MenuWidget from './client/MenuWidget.vue';
 import TopNavigation from './client/TopNavigation.vue';
+import zhCN from 'ant-design-vue/es/locale/zh_CN';
+import dayjs from 'dayjs';
+import 'dayjs/locale/zh-cn';
+dayjs.locale('zh-cn');
 
 export default {
 
@@ -46,6 +52,7 @@ export default {
       isShowMenu: false,
       // 是否显示上导航栏
       isShowTopNavigation: false,
+      locale: zhCN,
     };
   },
 

+ 24 - 0
src/api/workflow/workflow.js

@@ -0,0 +1,24 @@
+import Common from '../../common/Common';
+
+export const ajaxApi = (url, datas) => {
+  return new Promise((resolve, reject) => {
+    $.ajax({
+      url: Common.getApiUrl2(url),
+      type: 'post',
+      contentType: 'application/json',
+
+
+      data: JSON.stringify(datas),
+
+      beforeSend: function (request) {
+        Common.addTokenToRequest(request);
+      },
+      success: function (data) {
+        resolve(data);
+      },
+      error: function (XMLHttpRequest, textStatus, errorThrown) {
+        reject(XMLHttpRequest);
+      },
+    });
+  });
+};

+ 88 - 92
src/workflow/CustomerTask.vue

@@ -1,6 +1,13 @@
 <template>
-  <Modal v-model:show="showModal" :show-ok-button="false" :show-canel-button="false" :large="true">
-    <template #header> {{ selectedTask != null ? selectedTask.title : "" }} </template>
+  <Modal
+    v-model:show="showModal"
+    :show-ok-button="false"
+    :show-canel-button="false"
+    :large="true"
+  >
+    <template #header>
+      {{ selectedTask != null ? selectedTask.title : "" }}
+    </template>
     <div>
       <component :is="currentComponent" @finish-task="finishTask" />
     </div>
@@ -9,8 +16,7 @@
 </template>
 
 
-<script>
-
+<script setup>
 import Common from '../common/Common.js';
 import PrivacyStatement from '../confirm/privacy-statement.vue';
 import StudyVideo from '../confirm/StudyVideo.vue';
@@ -19,103 +25,93 @@ import KnowledgeTrain from '../confirm/KnowledgeTrain1.vue';
 import WorkflowResource from '../api/workflow/WorkflowResource.js';
 import { Notify, Uuid } from 'pc-component-v3';
 
-export default {
-
-  components: {
-    PrivacyStatement,
-    StudyVideo,
-    ResetPassword,
-    KnowledgeTrain,
-  },
-
-  props: {
-    taskId: {
-      type: String,
-      default: null,
-    },
-  },
-
-  data: function () {
-    return {
-      selectedTask: null,
-      currentComponent: null,
-      showModal: false,
-    };
-  },
+import { ref, defineEmits, defineProps, defineExpose, watch } from 'vue';
 
-  watch: {
-    taskId: {
-      handler: function(newValue, oldValue){
-        this.fecthTask();
-      },
-      immediate: false,
-    },
+const props = defineProps({
+  taskId: {
+    type: String,
+    default: null,
   },
+});
+const emit = defineEmits(['closed']);
 
+const selectedTask = ref('');
+const currentComponent = ref('');
+const showModal = ref(false);
 
-  methods: {
-    show: function(){
-      this.fecthTask();
-      this.showModal = true;
-    },
-    /**
-     * 获取任务
-     */
-    fecthTask:function(){
-      let _self = this;
-      if(this.taskId == null){
-        _self.selectedTask = null;
-        _self.currentComponent = null;
-        _self.showModal = false;
-        _self.$emit('closed');
-        return;
-      }
-      WorkflowResource.uniqueTaskInfoByTaskIdUserId(this.taskId).then(successData => {
-        if(successData != null){
-          _self.selectedTask = successData;
-          if(_self.selectedTask.formKey == 'ConfirmPrivacy'){
-            _self.currentComponent = 'PrivacyStatement';
-          }else if(_self.selectedTask.formKey == 'TrainApprove'){
-            _self.currentComponent = 'StudyVideo';
-          }else if(_self.selectedTask.formKey == 'ResetPassword'){
-            _self.currentComponent = 'ResetPassword';
-          }else if(_self.selectedTask.formKey == 'KnowledgeTrain'){
-            _self.currentComponent = 'KnowledgeTrain';
-          }
-          _self.showModal = true;
-        }else{
-          _self.selectedTask = null;
-          _self.currentComponent = null;
-          _self.showModal = false;
-          _self.$emit('closed');
+/**
+ * 获取任务
+ */
+const fetchTask = () => {
+  if (props.taskId == null) {
+    selectedTask.value = null;
+    currentComponent.value = null;
+    showModal.value = false;
+    emit('closed');
+    return;
+  }
+  WorkflowResource.uniqueTaskInfoByTaskIdUserId(this.taskId).then(
+    successData => {
+      if (successData != null) {
+        selectedTask.value = successData;
+        if (selectedTask.value.formKey == 'ConfirmPrivacy') {
+          currentComponent.value = 'PrivacyStatement';
+        } else if (selectedTask.value.formKey == 'TrainApprove') {
+          currentComponent.value = 'StudyVideo';
+        } else if (selectedTask.value.formKey == 'ResetPassword') {
+          currentComponent.value = 'ResetPassword';
+        } else if (selectedTask.value.formKey == 'KnowledgeTrain') {
+          currentComponent.value = 'KnowledgeTrain';
         }
-      }, errorData => {
-        console.error(errorData);
-      });
+        showModal.value = true;
+      } else {
+        selectedTask.value = null;
+        currentComponent.value = null;
+        showModal.value = false;
+        emit('closed');
+      }
+    },
+    errorData => {
+      console.error(errorData);
     },
+  );
+};
+/**
+ * 完成任务
+ */
+const finishTask = () => {
+  if (selectedTask.value == null) {
+    Notify.error('错误', '请先选择任务。', true);
+    return;
+  }
 
-    /**
-     * 完成任务
-     */
-    finishTask: function(){
-      let _self = this;
-      if(_self.selectedTask == null){
-        Notify.error('错误', '请先选择任务。', true);
-        return;
+  WorkflowResource.finishTask(selectedTask.value.id).then(
+    successData => {
+      if (successData.errorCode == 0) {
+        showModal.value = false;
+        emit('closed');
+      } else {
+        Notify.error('错误', successData.errorMessage, true);
       }
-
-      WorkflowResource.finishTask(_self.selectedTask.id).then(successData => {
-        if(successData.errorCode == 0){
-          _self.showModal = false;
-          _self.$emit('closed');
-        }else{
-          Notify.error('错误', successData.errorMessage, true);
-        }
-      }, errorData => {
-        Common.processException(errorData);
-      });
     },
-  },
+    errorData => {
+      Common.processException(errorData);
+    },
+  );
 };
 
+watch(
+  props.taskId,
+  newData => {
+    if (newData) {
+      fetchTask();
+    }
+  },
+  { immediate: true },
+);
+const show = () => {
+  fetchTask();
+  showModal.value = true;
+};
+defineExpose({ show });
 </script>

+ 163 - 406
src/workflow/NeedApproveWorkflow.vue

@@ -1,431 +1,188 @@
 <template>
-  <div>
-    <div class="container-fluid">
-      <div class="row m-row">
-        <div class="col-md-12 col-sm-12 col-xs-12">
-          <input
-            v-model="needApproveRequest.condition"
-            autocomplete="off"
-            type="text"
-            :placeholder="$t('lang.NeedApproveWorkflow.describe1')"
-            class="form-control"
-          />
-        </div>
-      </div>
-
-      <div
-        v-if="needApproveRequest.advancedQuery"
-        class="row m-row"
-      >
-        <div class="col-md-2 col-sm-2 col-xs-4">
-          <label class="form-control-static">{{ $t("lang.NeedApproveWorkflow.startTime") }}</label>
-        </div>
-
-        <div class="col-md-5 col-sm-5 col-xs-4">
-          <DateTime
-            v-model="needApproveRequest.processInstanceStartAfter"
-          />
-        </div>
-
-        <div class="col-md-5 col-sm-5 col-xs-4">
-          <DateTime
-            v-model="needApproveRequest.processInstanceStartBefore"
-          />
-        </div>
-      </div>
-
-      <div
-        v-if="needApproveRequest.advancedQuery"
-        class="row m-row"
-      >
-        <div class="col-md-2 col-sm-2 col-xs-4">
-          <label class="form-control-static">{{ $t("lang.NeedApproveWorkflow.approvalOriginator") }}</label>
-        </div>
-        <div class="col-md-10 col-sm-10 col-xs-8">
-          <input
-            id="applyUser"
-            v-model="userName"
-            autocomplete="off"
-            type="text"
-            class="form-control"
-          />
-        </div>
-      </div>
-
-      <div class="row m-row">
-        <div class="col-md-2 col-sm-2 col-xs-4">
-          <label class="form-control-static">{{ $t("lang.NeedApproveWorkflow.subject") }}</label>
-        </div>
-        <div class="col-md-10 col-sm-10 col-xs-8">
-          <WorkflowType v-model="needApproveRequest.windowNo" />
-        </div>
-      </div>
-
-      <div class="row m-row">
-        <div class="col-md-12 col-sm-12 col-xs-10">
-          <button
-            role="button"
-            target="_self"
-            class="btn btn-primary"
-            @click="search()"
-          >
-            {{ $t("lang.NeedApproveWorkflow.search") }}
-          </button>
-          <a
-            class="form-label"
-            @click="needApproveRequest.advancedQuery = !needApproveRequest.advancedQuery"
-          >{{ (needApproveRequest.advancedQuery) ? $t("lang.NeedApproveWorkflow.closeAdvancedSearch") : $t("lang.NeedApproveWorkflow.advancedSearch") }}</a>
-          <a
-            id="clearSearchCondition"
-            class="form-label"
-            @click="clean()"
-          >{{ $t("lang.NeedApproveWorkflow.clearSearchCriteria") }}</a>
-        </div>
-      </div>
-
-      <div class="row m-row">
-        <div class="table-responsive">
-          <table class="table table-bordered table-hover ">
-            <thead>
-              <tr>
-                <td>{{ $t("lang.NeedApproveWorkflow.documentCode") }}</td>
-                <td>{{ $t("lang.NeedApproveWorkflow.subject") }}</td>
-                <td>{{ $t("lang.NeedApproveWorkflow.approvalSummary") }}</td>
-                <td>{{ $t("lang.NeedApproveWorkflow.originatingTime") }}</td>
-                <td>{{ $t("lang.NeedApproveWorkflow.endTime") }}</td>
-                <td>{{ $t("lang.NeedApproveWorkflow.operation") }}</td>
-              </tr>
-            </thead>
-            <tbody>
-              <tr
-                v-for="item in taskInfos.taskInfo"
-                :key="item.id"
-                class="m-tr"
-              >
-                <td>
-                  {{ item.no }}
-                </td>
-                <td>
-                  <span v-if="item.category != 'CurdWindow'">
-                    {{ item.name }}
-                  </span>
-                  <span v-else>
-                    {{ item.title }}
-                  </span>
-                </td>
-                <td>
-                  <span v-if="item.category != 'CurdWindow'" style="white-space: pre-line">{{ item.description }}</span>
-                  <span v-else style="white-space: pre-line">{{ item.content }}</span>
-                </td>
-                <td>
-                  {{ item.startDate }}
-                </td>
-                <td>
-                  {{ item.dueDate }}
-                </td>
-                <td>
-                  <button class="btn btn-link" @click="selectTaskInfo(item)">{{ $t("lang.NeedApproveWorkflow.viewTasks") }}</button>
-                </td>
-              </tr>
-            </tbody>
-          </table>
-        </div>
-      </div>
-
-      <VueBootstrapPagination
-        :pagination="pagination"
-        :callback="changePage"
+  <a-row type="flex" justify="space-between">
+    <a-col>
+      <a-input-search
+        v-model:value="searchParams.condition"
+        :placeholder="$t('lang.NeedApproveWorkflow.describe1')"
+        enter-button="搜索"
+        allow-clear
+        style="width: 300px;"
+        @search="searchDatas"
       />
-    </div>
-    <Loading v-if="loading" />
-    <CustomerTask ref="customerTask" :task-id="selectedTaskId" @closed="search" />
-  </div>
+    </a-col>
+    <a-col>
+      <WorkflowType @get-type="getTypeNo" />
+      <WorkflowSearch @get-search-params="searchWorkflow" />
+    </a-col>
+  </a-row>
+  <CommonTable
+    ref="table"
+    :total="total"
+    :columns="approveColumns"
+    :data-source="approveDatas"
+    @get-pager="getPageParams"
+  >
+    <template #bodyCell="{ column, record }">
+      <template v-if="column.key === 'title'">
+        <span v-if="record.category != 'CurdWindow'">
+          {{ record.name }}
+        </span>
+        <span v-else>
+          {{ record.title }}
+        </span>
+      </template>
+      <template v-if="column.key === 'description'">
+        <span
+          v-if="record.category != 'CurdWindow'"
+          style="white-space: pre-line"
+        >{{ record.description }}</span>
+        <span v-else style="white-space: pre-line">{{ record.content }}</span>
+      </template>
+      <template v-if="column.key === 'operation'">
+        <button class="btn btn-link" @click="selectTaskInfo(record)">
+          {{ $t("lang.NeedApproveWorkflow.viewTasks") }}
+        </button>
+      </template>
+    </template>
+  </CommonTable>
+  <Loading v-if="isLoading" />
+  <CustomerTask
+    ref="customerTask"
+    :task-id="selectedTaskId"
+    @closed="() => searchDatas"
+  />
 </template>
 
-<script>
-import Common from '../common/Common.js';
-
+<script setup>
+import { ref, reactive, defineEmits, onMounted } from 'vue';
+import Common from '../common/Common';
+import WorkflowType from './WorkflowType.vue';
+import WorkflowSearch from './WorkflowSearch.vue';
+import CommonTable from '../common/CommonTable.vue';
+import { ajaxApi } from '../api/workflow/workflow.js';
+import { message } from 'ant-design-vue';
+import { needApproveColumns } from './configData.js';
+import TaskOpenUtil from './TaskOpenUtil.js';
 import WindowService from '../common/WindowService.js';
-
-
-
-import WorkflowResource from '../api/workflow/WorkflowResource.js';
 import CustomerTask from './CustomerTask.vue';
-import { Notify, Uuid } from 'pc-component-v3';
-import TaskOpenUtil from './TaskOpenUtil.js';
-import * as dayjs from 'dayjs';
-import WorkflowType from './WorkflowType.vue';
-
-export default {
-
-  components: {
-    CustomerTask, WorkflowType,
-  },
-  data: function () {
-    return {
-      'defaultStartAfter': '',   //默认开始日期
-      'defaultStartBefore': '',  //默认结束日期
-      'startAfter': '',          //开始日期
-      'startBefore': '',         //结束日期
-      'needApproveRequest': { 
-        'condition': null,
-        'windowNo': null,
-        'startUserId': null,
-        'processInstanceStartAfter': null,
-        'processInstanceStartBefore': null,
-        'taskCreateTimeAfter': null,
-        'taskCreateTimeBefore': null,
-        'start': 0,
-        'length': 10,
-      },
-
-      'taskInfos': [],
-      'userName': '',
-      'windowNo': '',
-      'approveType': [],
-      pagination: {
-        total: 0,
-        per_page: 20,    // required
-        current_page: 1, // required
-        last_page: 0,    // required
-      },
-      selectedTaskId: null,
-      loading: false,
-    };
-  },
-
-  mounted: function () {
-    this.init();
-  },
-
-  methods: {
-    // 加载数据
-    init: function () {
-      var _self = this;
-      _self.defaultStartAfter = dayjs().add(-1, 'month').format('YYYY-MM-DD HH:mm:ss');
-      _self.defaultStartBefore = dayjs().format('YYYY-MM-DD HH:mm:ss');
-      _self.needApproveRequest = {
-        'condition': '',         //查询条件(主题、文件编码、正文内容、审批意见).
-        'startAfter': _self.defaultStartAfter,
-        'startBefore': _self.defaultStartBefore,
-        'advancedQuery': false,    //是否高级查询
-        //"startUserId" : "",     //审批单发起人
-        'windowNo': '',      //工作流部署Id
-        'processStatusQuery': 'RUNNING',  //审批状态
-        'range': {               //查询区间
-          'length': 100,
-          'start': 0,
-        },
-      };
-      console.log(JSON.stringify(_self.needApproveRequest));
+import { Notify } from 'pc-component-v3';
+
+const emit = defineEmits(['refreshStasticCount']);
+const total = ref(0);
+const table = ref(null);
+const customerTask = ref(null);
+const selectedTaskId = ref(null);
+const isLoading = ref(false);
+const approveDatas = ref([]);
+const approveColumns = ref(needApproveColumns);
+const searchParams = ref({});
+const filterParams = ref({});
+const pager = reactive({
+  start: 1,
+  length: 20,
+});
+
+onMounted(() => {
+  searchDatas();
+});
+
+// 查询,回到第一页
+const searchDatas = () => {
+  table.value.backFirstPage();
+};
 
-    },
+// 获取分页
+const getPageParams = (start, length) => {
+  pager.start = (start - 1) * length;
+  pager.length = length;
+  const params = { ...searchParams.value, ...filterParams.value, ...pager };
+  searchApprove(params);
+};
 
+// 获取类型no
+const getTypeNo = windowNo => {
+  searchParams.value.windowNo = windowNo;
+  searchDatas();
+};
 
-    //搜索
-    search: function () {
-      var _self = this;
-      _self.loading=true;
+// 通过高级查询搜索
+const searchWorkflow = value => {
+  filterParams.value = value;
+  searchDatas();
+};
 
-      _self.pagination.current_page = 1;
-      _self.needApproveRequest.range.start = 0;
-      _self.needApproveRequest.range.length = _self.pagination.per_page;
-      if (_self.needApproveRequest.advancedQuery) {
-        _self.getStartUserId();
-        _self.needApproveRequest.startAfter = _self.startAfter;
-        _self.needApproveRequest.startBefore = _self.startBefore;
-      }
-      _self.needApproveRequest.windowNo = _self.windowNo;
-      $.ajax({
-        url: Common.getApiURL('WorkflowResource/needApprove'),
-        type: 'post',
-        dataType: 'json',
-        beforeSend: function (request) {
-          Common.addTokenToRequest(request);
-        },
-        contentType: 'application/json',
-        data: JSON.stringify(_self.needApproveRequest),
-        success: function (data) {
-          _self.loading=false;
-          _self.taskInfos = data;
-          _self.taskInfos.taskInfo.forEach(item => {
-            try{
-              var content = JSON.parse(item.content);
-              var parentForm = '';
-              if(content != null && content.parentForm != null){
-                content.parentForm.forEach(item => {
-                  parentForm = parentForm + item.title + ':' + item.content + ',\n';
-                });
-                item.content = parentForm;
-              }else{
-                item.content = null;
-              }
-            // eslint-disable-next-line no-empty
-            }catch(e){
-              
-            }
+// 查询数据API
+const searchApprove = params => {
+  isLoading.value = true;
+  const url = 'api/WorkflowResource/needApprove';
+  ajaxApi(url, params).then(
+    success => {
+      if (success.errorCode === 0) {
+        if (success.datas && success.datas.length > 0) {
+          success.datas.forEach(item => {
+            item.content = parseContent(item.content);
           });
-          _self.pagination.total = data.totalCount;
-          _self.pagination.last_page = Math.ceil(data.totalCount / _self.needApproveRequest.range.length);
-        },
-        error: function (XMLHttpRequest, textStatus, errorThrown) {
-          _self.loading=false;
-          Common.processException(XMLHttpRequest, textStatus, errorThrown);
-        },
-      });
-    },
-
-
-    getStartUserId: function () {
-      var _self = this;
-
-      if (_self.userName != null && _self.userName != '') {
-        _self.loading=true;
-        var infoQueryParam = {};
-        infoQueryParam.infoWindowNo = 11531;
-        infoQueryParam.start = 0;
-        infoQueryParam.length = 1;
-        infoQueryParam.sortClause = '';
-        infoQueryParam.infoFilterFieldValues = [];
-        infoQueryParam.infoFilterFieldValues[0] = {};
-        infoQueryParam.infoFilterFieldValues[0].infoFilterFieldId = 11532;
-        infoQueryParam.infoFilterFieldValues[0].value1 = _self.userName;
-        $.ajax({
-          url: Common.getApiURL('InfoWindowResource/QueryInfoWindowData2'),
-          type: 'post',
-          dataType: 'json',
-          beforeSend: function (request) {
-            Common.addTokenToRequest(request);
-          },
-          contentType: 'application/json',
-          data: JSON.stringify(infoQueryParam),
-          async: false,
-          success: function (data) {
-            _self.loading=false;
-            _self.needApproveRequest.startUserId = '';
-            if (data.dataList[0].id != null) {
-              _self.needApproveRequest.startUserId = data.dataList[0].id;
-            }
-          },
-          error: function (XMLHttpRequest, textStatus, errorThrown) {
-            _self.loading=false;
-            _self.$refs.common.processException(XMLHttpRequest, textStatus, errorThrown);
-          },
-        });
+          total.value = success.total;
+          approveDatas.value = success.datas;
+        } else {
+          total.value = 0;
+          approveDatas.value = [];
+        }
+      } else {
+        message.warning(success.errorMessage);
       }
+      isLoading.value = false;
     },
-
-    //是否开启高级查询
-    isAdvancedQuery: function (flag) {
-      let _self = this;
-      _self.needApproveRequest.advancedQuery = flag;
-      if (!flag) {
-        //初始化日期
-        _self.needApproveRequest.startAfter = _self.defaultStartAfter;
-        _self.needApproveRequest.startBefore = _self.defaultStartBefore;
-
-      }
+    error => {
+      isLoading.value = false;
+      Common.processException(error);
     },
+  );
+};
 
-    clean: function () {   //清空搜索条件
-      var _self = this;
-      _self.userName = '';
-      _self.needApproveRequest.condition = '';
-      _self.defaultStartAfter = dayjs().add(-1, 'month').format('YYYY-MM-DD HH:mm:ss');
-      _self.defaultStartBefore = dayjs().format('YYYY-MM-DD HH:mm:ss');
-      _self.startAfter = '';
-      _self.startBefore = '';
+// 选择了taskInfo
+const selectTaskInfo = taskInfo => {
+  TaskOpenUtil.openTask(taskInfo).then(
+    successData => {
+      if (successData.type === 'newWindow') {
+        WindowService.open(successData.url, '待处理', function () {
+          searchDatas();
+          emit('refreshStasticCount');
+        });
+      } else if (successData.type === 'customerTask') {
+        // 打开自定义的界面
+        selectedTaskId.value = taskInfo.id;
+        customerTask.value.show();
+        searchDatas();
+        emit('refreshStasticCount');
+      }
     },
-    changePage: function () {
-      var _self = this;
-      _self.loading=true;
-      _self.needApproveRequest.range.start = (_self.pagination.current_page - 1) * _self.pagination.per_page;
-      _self.needApproveRequest.range.length = _self.pagination.per_page;
-      _self.needApproveRequest.startAfter = _self.defaultStartAfter;
-      _self.needApproveRequest.startBefore = _self.defaultStartBefore;
-      _self.needApproveRequest.finishAfter = _self.defaultFinishAfter;
-      _self.needApproveRequest.finishBefore = _self.defaultFinishBefore;
-      if (_self.needApproveRequest.advancedQuery) {
-        _self.needApproveRequest.startAfter = _self.startAfter;
-        _self.needApproveRequest.startBefore = _self.startBefore;
-        _self.needApproveRequest.finishAfter = _self.finishAfter;
-        _self.needApproveRequest.finishBefore = _self.finishBefore;
+    errorData => {
+      if (errorData != null) {
+        Notify.error(errorData.title, errorData.message, false);
       }
-      console.log(JSON.stringify(_self.needApproveRequest));
-      $.ajax({
-        url: Common.getApiURL('WorkflowResource/needApprove'),
-        type: 'post',
-        dataType: 'json',
-        contentType: 'application/json',
-        beforeSend: function (request) {
-          Common.addTokenToRequest(request);
-        },
-        data: JSON.stringify(_self.needApproveRequest),
-        success: function (data) {
-          _self.loading=false;
-          _self.taskInfos = data;
-          _self.taskInfos.taskInfo.forEach(item => {
-            
-            try{
-
-              var content = JSON.parse(item.content);
-              var parentForm = '';
-              content.parentForm.forEach(item => {
-                parentForm = parentForm + item.title + ':' + item.content + ',\n';
-              });
-              item.content = parentForm;
-            // eslint-disable-next-line no-empty
-            }catch(e){
-              
-            }
-
-
-          });
-          _self.pagination.total = data.totalCount;
-          _self.pagination.last_page = Math.ceil(data.totalCount / _self.needApproveRequest.range.length);
-          console.log('totalCount=' + _self.pagination.total);
-          console.log('totalPage=' + _self.pagination.last_page);
-        },
-        error: function (XMLHttpRequest, textStatus, errorThrown) {
-          _self.loading=false;
-          _self.$refs.common.processException(XMLHttpRequest, textStatus, errorThrown);
-        },
-      });
     },
+  );
+};
 
-    // 选择了taskInfo
-    selectTaskInfo: function (taskInfo) {
-      let _self = this;
-      TaskOpenUtil.openTask(taskInfo).then(successData => {
-        if(successData.type === 'newWindow'){
-          WindowService.open(successData.url, '待处理', function(){
-            _self.$emit('refreshStasticCount');
-            _self.search();
-          });
-        }else if(successData.type === 'customerTask'){
-          // 打开自定义的界面
-          _self.selectedTaskId = taskInfo.id;
-          _self.$refs.customerTask.show();
-          _self.$emit('refreshStasticCount');
-          _self.search();
-        }
-      }, errorData => {
-        if(errorData != null){
-          Notify.error(errorData.title, errorData.message, false);
-        }
+// 处理content json
+const parseContent = content => {
+  const x = content;
+  try {
+    let content = JSON.parse(x);
+    let parentForm = '';
+    if (content != null && content.parentForm != null) {
+      content.parentForm.forEach(item => {
+        parentForm = parentForm + item.title + ':' + item.content + ',\n';
       });
-    },
-  },
+      return parentForm;
+    } else {
+      return null;
+    }
+    // eslint-disable-next-line no-empty
+  } catch (e) {}
 };
 </script>
 
 <style scoped>
-.form-label {
-    margin-left: 10px;
-    cursor: pointer;
-}
-
-.m-tr {
-    cursor: pointer;
-}
 </style>

+ 431 - 0
src/workflow/NeedApproveWorkflowOld.vue

@@ -0,0 +1,431 @@
+<template>
+  <div>
+    <div class="container-fluid">
+      <div class="row m-row">
+        <div class="col-md-12 col-sm-12 col-xs-12">
+          <input
+            v-model="needApproveRequest.condition"
+            autocomplete="off"
+            type="text"
+            :placeholder="$t('lang.NeedApproveWorkflow.describe1')"
+            class="form-control"
+          />
+        </div>
+      </div>
+
+      <div
+        v-if="needApproveRequest.advancedQuery"
+        class="row m-row"
+      >
+        <div class="col-md-2 col-sm-2 col-xs-4">
+          <label class="form-control-static">{{ $t("lang.NeedApproveWorkflow.startTime") }}</label>
+        </div>
+
+        <div class="col-md-5 col-sm-5 col-xs-4">
+          <DateTime
+            v-model="needApproveRequest.processInstanceStartAfter"
+          />
+        </div>
+
+        <div class="col-md-5 col-sm-5 col-xs-4">
+          <DateTime
+            v-model="needApproveRequest.processInstanceStartBefore"
+          />
+        </div>
+      </div>
+
+      <div
+        v-if="needApproveRequest.advancedQuery"
+        class="row m-row"
+      >
+        <div class="col-md-2 col-sm-2 col-xs-4">
+          <label class="form-control-static">{{ $t("lang.NeedApproveWorkflow.approvalOriginator") }}</label>
+        </div>
+        <div class="col-md-10 col-sm-10 col-xs-8">
+          <input
+            id="applyUser"
+            v-model="userName"
+            autocomplete="off"
+            type="text"
+            class="form-control"
+          />
+        </div>
+      </div>
+
+      <div class="row m-row">
+        <div class="col-md-2 col-sm-2 col-xs-4">
+          <label class="form-control-static">{{ $t("lang.NeedApproveWorkflow.subject") }}</label>
+        </div>
+        <div class="col-md-10 col-sm-10 col-xs-8">
+          <WorkflowType v-model="needApproveRequest.windowNo" />
+        </div>
+      </div>
+
+      <div class="row m-row">
+        <div class="col-md-12 col-sm-12 col-xs-10">
+          <button
+            role="button"
+            target="_self"
+            class="btn btn-primary"
+            @click="search()"
+          >
+            {{ $t("lang.NeedApproveWorkflow.search") }}
+          </button>
+          <a
+            class="form-label"
+            @click="needApproveRequest.advancedQuery = !needApproveRequest.advancedQuery"
+          >{{ (needApproveRequest.advancedQuery) ? $t("lang.NeedApproveWorkflow.closeAdvancedSearch") : $t("lang.NeedApproveWorkflow.advancedSearch") }}</a>
+          <a
+            id="clearSearchCondition"
+            class="form-label"
+            @click="clean()"
+          >{{ $t("lang.NeedApproveWorkflow.clearSearchCriteria") }}</a>
+        </div>
+      </div>
+
+      <div class="row m-row">
+        <div class="table-responsive">
+          <table class="table table-bordered table-hover ">
+            <thead>
+              <tr>
+                <td>{{ $t("lang.NeedApproveWorkflow.documentCode") }}</td>
+                <td>{{ $t("lang.NeedApproveWorkflow.subject") }}</td>
+                <td>{{ $t("lang.NeedApproveWorkflow.approvalSummary") }}</td>
+                <td>{{ $t("lang.NeedApproveWorkflow.originatingTime") }}</td>
+                <td>{{ $t("lang.NeedApproveWorkflow.endTime") }}</td>
+                <td>{{ $t("lang.NeedApproveWorkflow.operation") }}</td>
+              </tr>
+            </thead>
+            <tbody>
+              <tr
+                v-for="item in taskInfos.taskInfo"
+                :key="item.id"
+                class="m-tr"
+              >
+                <td>
+                  {{ item.no }}
+                </td>
+                <td>
+                  <span v-if="item.category != 'CurdWindow'">
+                    {{ item.name }}
+                  </span>
+                  <span v-else>
+                    {{ item.title }}
+                  </span>
+                </td>
+                <td>
+                  <span v-if="item.category != 'CurdWindow'" style="white-space: pre-line">{{ item.description }}</span>
+                  <span v-else style="white-space: pre-line">{{ item.content }}</span>
+                </td>
+                <td>
+                  {{ item.startDate }}
+                </td>
+                <td>
+                  {{ item.dueDate }}
+                </td>
+                <td>
+                  <button class="btn btn-link" @click="selectTaskInfo(item)">{{ $t("lang.NeedApproveWorkflow.viewTasks") }}</button>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+
+      <VueBootstrapPagination
+        :pagination="pagination"
+        :callback="changePage"
+      />
+    </div>
+    <Loading v-if="loading" />
+    <CustomerTask ref="customerTask" :task-id="selectedTaskId" @closed="search" />
+  </div>
+</template>
+
+<script>
+import Common from '../common/Common.js';
+
+import WindowService from '../common/WindowService.js';
+
+
+
+import WorkflowResource from '../api/workflow/WorkflowResource.js';
+import CustomerTask from './CustomerTask.vue';
+import { Notify, Uuid } from 'pc-component-v3';
+import TaskOpenUtil from './TaskOpenUtil.js';
+import * as dayjs from 'dayjs';
+import WorkflowType from './WorkflowType.vue';
+
+export default {
+
+  components: {
+    CustomerTask, WorkflowType,
+  },
+  data: function () {
+    return {
+      'defaultStartAfter': '',   //默认开始日期
+      'defaultStartBefore': '',  //默认结束日期
+      'startAfter': '',          //开始日期
+      'startBefore': '',         //结束日期
+      'needApproveRequest': { 
+        'condition': null,
+        'windowNo': null,
+        'startUserId': null,
+        'processInstanceStartAfter': null,
+        'processInstanceStartBefore': null,
+        'taskCreateTimeAfter': null,
+        'taskCreateTimeBefore': null,
+        'start': 0,
+        'length': 10,
+      },
+
+      'taskInfos': [],
+      'userName': '',
+      'windowNo': '',
+      'approveType': [],
+      pagination: {
+        total: 0,
+        per_page: 20,    // required
+        current_page: 1, // required
+        last_page: 0,    // required
+      },
+      selectedTaskId: null,
+      loading: false,
+    };
+  },
+
+  mounted: function () {
+    this.init();
+  },
+
+  methods: {
+    // 加载数据
+    init: function () {
+      var _self = this;
+      _self.defaultStartAfter = dayjs().add(-1, 'month').format('YYYY-MM-DD HH:mm:ss');
+      _self.defaultStartBefore = dayjs().format('YYYY-MM-DD HH:mm:ss');
+      _self.needApproveRequest = {
+        'condition': '',         //查询条件(主题、文件编码、正文内容、审批意见).
+        'startAfter': _self.defaultStartAfter,
+        'startBefore': _self.defaultStartBefore,
+        'advancedQuery': false,    //是否高级查询
+        //"startUserId" : "",     //审批单发起人
+        'windowNo': '',      //工作流部署Id
+        'processStatusQuery': 'RUNNING',  //审批状态
+        'range': {               //查询区间
+          'length': 100,
+          'start': 0,
+        },
+      };
+      console.log(JSON.stringify(_self.needApproveRequest));
+
+    },
+
+
+    //搜索
+    search: function () {
+      var _self = this;
+      _self.loading=true;
+
+      _self.pagination.current_page = 1;
+      _self.needApproveRequest.range.start = 0;
+      _self.needApproveRequest.range.length = _self.pagination.per_page;
+      if (_self.needApproveRequest.advancedQuery) {
+        _self.getStartUserId();
+        _self.needApproveRequest.startAfter = _self.startAfter;
+        _self.needApproveRequest.startBefore = _self.startBefore;
+      }
+      _self.needApproveRequest.windowNo = _self.windowNo;
+      $.ajax({
+        url: Common.getApiURL('WorkflowResource/needApprove'),
+        type: 'post',
+        dataType: 'json',
+        beforeSend: function (request) {
+          Common.addTokenToRequest(request);
+        },
+        contentType: 'application/json',
+        data: JSON.stringify(_self.needApproveRequest),
+        success: function (data) {
+          _self.loading=false;
+          _self.taskInfos = data;
+          _self.taskInfos.taskInfo.forEach(item => {
+            try{
+              var content = JSON.parse(item.content);
+              var parentForm = '';
+              if(content != null && content.parentForm != null){
+                content.parentForm.forEach(item => {
+                  parentForm = parentForm + item.title + ':' + item.content + ',\n';
+                });
+                item.content = parentForm;
+              }else{
+                item.content = null;
+              }
+            // eslint-disable-next-line no-empty
+            }catch(e){
+              
+            }
+          });
+          _self.pagination.total = data.totalCount;
+          _self.pagination.last_page = Math.ceil(data.totalCount / _self.needApproveRequest.range.length);
+        },
+        error: function (XMLHttpRequest, textStatus, errorThrown) {
+          _self.loading=false;
+          Common.processException(XMLHttpRequest, textStatus, errorThrown);
+        },
+      });
+    },
+
+
+    getStartUserId: function () {
+      var _self = this;
+
+      if (_self.userName != null && _self.userName != '') {
+        _self.loading=true;
+        var infoQueryParam = {};
+        infoQueryParam.infoWindowNo = 11531;
+        infoQueryParam.start = 0;
+        infoQueryParam.length = 1;
+        infoQueryParam.sortClause = '';
+        infoQueryParam.infoFilterFieldValues = [];
+        infoQueryParam.infoFilterFieldValues[0] = {};
+        infoQueryParam.infoFilterFieldValues[0].infoFilterFieldId = 11532;
+        infoQueryParam.infoFilterFieldValues[0].value1 = _self.userName;
+        $.ajax({
+          url: Common.getApiURL('InfoWindowResource/QueryInfoWindowData2'),
+          type: 'post',
+          dataType: 'json',
+          beforeSend: function (request) {
+            Common.addTokenToRequest(request);
+          },
+          contentType: 'application/json',
+          data: JSON.stringify(infoQueryParam),
+          async: false,
+          success: function (data) {
+            _self.loading=false;
+            _self.needApproveRequest.startUserId = '';
+            if (data.dataList[0].id != null) {
+              _self.needApproveRequest.startUserId = data.dataList[0].id;
+            }
+          },
+          error: function (XMLHttpRequest, textStatus, errorThrown) {
+            _self.loading=false;
+            _self.$refs.common.processException(XMLHttpRequest, textStatus, errorThrown);
+          },
+        });
+      }
+    },
+
+    //是否开启高级查询
+    isAdvancedQuery: function (flag) {
+      let _self = this;
+      _self.needApproveRequest.advancedQuery = flag;
+      if (!flag) {
+        //初始化日期
+        _self.needApproveRequest.startAfter = _self.defaultStartAfter;
+        _self.needApproveRequest.startBefore = _self.defaultStartBefore;
+
+      }
+    },
+
+    clean: function () {   //清空搜索条件
+      var _self = this;
+      _self.userName = '';
+      _self.needApproveRequest.condition = '';
+      _self.defaultStartAfter = dayjs().add(-1, 'month').format('YYYY-MM-DD HH:mm:ss');
+      _self.defaultStartBefore = dayjs().format('YYYY-MM-DD HH:mm:ss');
+      _self.startAfter = '';
+      _self.startBefore = '';
+    },
+    changePage: function () {
+      var _self = this;
+      _self.loading=true;
+      _self.needApproveRequest.range.start = (_self.pagination.current_page - 1) * _self.pagination.per_page;
+      _self.needApproveRequest.range.length = _self.pagination.per_page;
+      _self.needApproveRequest.startAfter = _self.defaultStartAfter;
+      _self.needApproveRequest.startBefore = _self.defaultStartBefore;
+      _self.needApproveRequest.finishAfter = _self.defaultFinishAfter;
+      _self.needApproveRequest.finishBefore = _self.defaultFinishBefore;
+      if (_self.needApproveRequest.advancedQuery) {
+        _self.needApproveRequest.startAfter = _self.startAfter;
+        _self.needApproveRequest.startBefore = _self.startBefore;
+        _self.needApproveRequest.finishAfter = _self.finishAfter;
+        _self.needApproveRequest.finishBefore = _self.finishBefore;
+      }
+      console.log(JSON.stringify(_self.needApproveRequest));
+      $.ajax({
+        url: Common.getApiURL('WorkflowResource/needApprove'),
+        type: 'post',
+        dataType: 'json',
+        contentType: 'application/json',
+        beforeSend: function (request) {
+          Common.addTokenToRequest(request);
+        },
+        data: JSON.stringify(_self.needApproveRequest),
+        success: function (data) {
+          _self.loading=false;
+          _self.taskInfos = data;
+          _self.taskInfos.taskInfo.forEach(item => {
+            
+            try{
+
+              var content = JSON.parse(item.content);
+              var parentForm = '';
+              content.parentForm.forEach(item => {
+                parentForm = parentForm + item.title + ':' + item.content + ',\n';
+              });
+              item.content = parentForm;
+            // eslint-disable-next-line no-empty
+            }catch(e){
+              
+            }
+
+
+          });
+          _self.pagination.total = data.totalCount;
+          _self.pagination.last_page = Math.ceil(data.totalCount / _self.needApproveRequest.range.length);
+          console.log('totalCount=' + _self.pagination.total);
+          console.log('totalPage=' + _self.pagination.last_page);
+        },
+        error: function (XMLHttpRequest, textStatus, errorThrown) {
+          _self.loading=false;
+          _self.$refs.common.processException(XMLHttpRequest, textStatus, errorThrown);
+        },
+      });
+    },
+
+    // 选择了taskInfo
+    selectTaskInfo: function (taskInfo) {
+      let _self = this;
+      TaskOpenUtil.openTask(taskInfo).then(successData => {
+        if(successData.type === 'newWindow'){
+          WindowService.open(successData.url, '待处理', function(){
+            _self.$emit('refreshStasticCount');
+            _self.search();
+          });
+        }else if(successData.type === 'customerTask'){
+          // 打开自定义的界面
+          _self.selectedTaskId = taskInfo.id;
+          _self.$refs.customerTask.show();
+          _self.$emit('refreshStasticCount');
+          _self.search();
+        }
+      }, errorData => {
+        if(errorData != null){
+          Notify.error(errorData.title, errorData.message, false);
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style scoped>
+.form-label {
+    margin-left: 10px;
+    cursor: pointer;
+}
+
+.m-tr {
+    cursor: pointer;
+}
+</style>

+ 194 - 0
src/workflow/WorkflowSearch.vue

@@ -0,0 +1,194 @@
+<template>
+  <a-dropdown v-model:visible="visible" :trigger="['click']">
+    <a-button v-if="!isShowClear" style="margin-left: 12px">
+      <align-center-outlined />
+      高级筛选
+    </a-button>
+    <a-button v-else style="margin-left: 12px; color: #40a9ff">
+      <align-center-outlined />
+      高级筛选
+    </a-button>
+    <template #overlay>
+      <a-form
+        :model="formState"
+        name="basic"
+        autocomplete="off"
+        style="width: 500px; padding: 20px"
+      >
+        <a-form-item
+          label="审批单发起人:"
+          name="startUserId"
+          style="margin-bottom: 12px"
+        >
+          <a-select
+            v-model:value="formState.startUserId"
+            show-search
+            placeholder="请选择审批人"
+            style="width: 418px"
+            :options="copyUserIds"
+            :field-names="{ label: 'text', value: 'id' }"
+            :filter-option="filterOption"
+          />
+        </a-form-item>
+        <a-form-item label="提交审批时间:">
+          <a-date-picker
+            v-model:value="formState.processInstanceStartAfter"
+            @change="(_, str) => dateChange(str, 'processInstanceStartAfter')"
+          />
+          至
+          <a-date-picker
+            v-model:value="formState.processInstanceStartBefore"
+            @change="(_, str) => dateChange(str, 'processInstanceStartBefore')"
+          />
+        </a-form-item>
+        <a-form-item label="审批任务时间:">
+          <a-date-picker
+            v-model:value="formState.taskCreateTimeAfter"
+            @change="(_, str) => dateChange(str, 'taskCreateTimeAfter')"
+          />
+          至
+          <a-date-picker
+            v-model:value="formState.taskCreateTimeBefore"
+            @change="(_, str) => dateChange(str, 'taskCreateTimeBefore')"
+          />
+        </a-form-item>
+        <a-divider />
+        <a-row type="flex" align="middle" justify="space-between">
+          <a-col>
+            <span v-if="!isShowClear" style="color: #c8c8c9">清空搜索条件</span>
+            <a v-else @click="clearFilter"> 清空搜索条件</a>
+          </a-col>
+          <a-col>
+            <a-button @click="visible = false">取消</a-button>
+            <a-button
+              type="primary"
+              style="margin-left: 12px"
+              @click="searchWorkflow"
+            >
+              确认
+            </a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </template>
+  </a-dropdown>
+</template>
+
+<script setup>
+import Common from '../common/Common';
+import { ref, defineEmits, watch, onMounted } from 'vue';
+import UserResource from '../api/base/UserResource.js';
+import { AlignCenterOutlined } from '@ant-design/icons-vue';
+
+const emit = defineEmits(['getSearchParams']);
+
+const formState = ref({});
+const visible = ref(false);
+const searchParams = ref({});
+const isShowClear = ref(false);
+const copyUserIds = ref([]);
+
+// 获取日期string格式
+const dateChange = (value, key) => {
+  if (value) {
+    if (key === 'processInstanceStartAfter' || key === 'taskCreateTimeAfter') {
+      searchParams.value[key] = value + ' 00:00:00';
+    } else {
+      searchParams.value[key] = value + ' 23:59:59';
+    }
+  } else {
+    searchParams.value[key] = value;
+  }
+};
+// 将搜索参数传过去
+const searchWorkflow = () => {
+  visible.value = false;
+  const params = JSON.parse(
+    JSON.stringify({ ...formState.value, ...searchParams.value }),
+  );
+  emit('getSearchParams', params);
+};
+
+onMounted(() => {
+  getUsers();
+});
+
+// 筛选
+const filterOption = (input, option) => {
+  return option.text.toLowerCase().indexOf(input.toLowerCase()) >= 0;
+};
+
+// 清空搜索条件
+const clearFilter = () => {
+  formState.value = {};
+  searchParams.value = {};
+  isShowClear.value = false;
+};
+
+watch(
+  formState,
+  newData => {
+    const obj = JSON.parse(JSON.stringify(newData));
+    isShowClear.value = validValue(obj);
+  },
+  { deep: true },
+);
+
+// 用来判断是否有高级搜索条件
+const validValue = obj => {
+  for (const [key, value] of Object.entries(obj)) {
+    if (value !== undefined && value !== null && value !== '') {
+      return true;
+    }
+  }
+  return false;
+};
+
+// 查询审批人
+const getUsers = () => {
+  const params = {
+    range: {
+      start: 0,
+      length: 99999,
+    },
+    conditional: '',
+  };
+  UserResource.listInGroupCompanyByCondition(params).then(
+    successData => {
+      if (successData != null && successData.resultList != null) {
+        successData.resultList.forEach(function (user) {
+          user.text = user.name + '(';
+          if (user.organizations != null && user.organizations.length > 0) {
+            let isFirst = true;
+            user.organizations.forEach(item => {
+              if (isFirst === true) {
+                user.text += item.organizationName;
+                isFirst = false;
+              } else {
+                user.text += ',' + item.organizationName;
+              }
+            });
+          }
+          user.text += ')';
+        });
+        copyUserIds.value = successData.resultList;
+      } else {
+        copyUserIds.value = [];
+      }
+    },
+    errorData => {
+      Common.processException(errorData);
+    },
+  );
+};
+</script>
+
+<style scoped>
+:deep(.ant-form-item-label) > label {
+  font-weight: 500;
+  font-size: 14px !important;
+}
+.ant-divider-horizontal {
+  margin: 12px 0;
+}
+</style>

+ 11 - 5
src/workflow/WorkflowType.vue

@@ -5,19 +5,25 @@
     :placeholder="$t('lang.NeedApproveWorkflow.all')"
     style="width: 200px"
     :options="approveTypes"
-    :field-names="{ label: 'windowName', value: 'windwowNo'}"
+    :field-names="{ label: 'windowName', value: 'windowNo' }"
     :filter-option="filterOption"
+    @change="getWindowNo"
   />
 </template>
 <script setup>
-
-
-import { ref, defineModel } from 'vue';
+import { ref, defineEmits } from 'vue';
 import Common from '../common/Common.js';
 import { message } from 'ant-design-vue';
 
-const model = defineModel();
+const emit = defineEmits(['getType']);
+// const model = defineModel();
 const approveTypes = ref([]);
+const value = ref(undefined);
+
+// 获取所选类型
+const getWindowNo = windowNo => {
+  emit('getType', windowNo);
+};
 
 // 加载工作流类型
 const loadWorkflowTypes = () => {

+ 45 - 0
src/workflow/configData.js

@@ -0,0 +1,45 @@
+export const needApproveColumns = [
+
+  {
+    title: '文件编码',
+    dataIndex: 'no',
+    key: 'no',
+    width: 160,
+  },
+  {
+    title: '主题',
+    dataIndex: 'title',
+    key: 'title',
+    width: 160,
+  },
+  {
+    title: '审批摘要',
+    dataIndex: 'description',
+    key: 'description',
+    width: 160,
+  },
+  {
+    title: '发起时间',
+    dataIndex: 'startDate',
+    key: 'startDate',
+    width: 160,
+  },
+  {
+    title: '截止时间',
+    dataIndex: 'dueDate',
+    key: 'dueDate',
+    width: 160,
+  },
+  {
+    title: '操作',
+    dataIndex: 'operation',
+    key: 'operation',
+    width: 160,
+  },
+
+].map(item => ({
+  ...item,
+  resizable: true,
+  mainWidth: 75,
+  maxWidth: 400,
+}));